mnemo_cards/lib/pages/settgins_page.dart
2024-08-18 20:02:36 +03:00

192 lines
7.2 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'dart:io';
import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:mnemo_cards/domain/router/dialogs.dart';
import 'package:mnemo_cards/flags.dart';
import 'package:mnemo_cards_frontend_common/mnemo_cards_frontend_common.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:url_launcher/url_launcher.dart';
import '../admin/admin_api.dart';
import '../di/injector.dart';
import '../di/locator.dart';
import '../features/analytics/analytics.dart';
import '../managers/repository/dio_provider.dart';
import '../theme/themes.dart';
import '../widgets/shared_pref_button.dart';
@RoutePage()
class SettingsPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
Analytics.settingsPageOpened(locator.userManager.userStateHolder.user);
return Scaffold(
body: SafeArea(
child: Column(
children: [
Header(
'Настройки',
popText: 'назад',
hasPopButton: true,
),
SizedBox(
height: 8.h,
),
Expanded(
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 10.0.w),
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Divider(
height: 1,
color: borderGray.withOpacity(0.2),
),
SimpleTile.text(
onLongTap: () async {
final r = await locator.userManager.deleteUser();
if (!r) {
showInfoDialog(
'Не удалось удалить аккаунт\nПопробуйте перелогиниться',
);
}
},
text: 'Удалить аккаунт (зажми)',
),
Divider(
height: 1,
color: borderGray.withOpacity(0.2),
),
MobileSharedPrefButton<bool>.builder(
spKey: 'dark_theme',
builder: (enabled, _) => AbsorbPointer(
child: SwitchTile(
text: 'Темная тема',
value: enabled ?? false,
),
),
setOnTap: (v) {
final darkTheme = !(v ?? false);
themeNotifier.value =
darkTheme ? ThemeMode.dark : ThemeMode.light;
return darkTheme;
},
),
Divider(
height: 1,
color: borderGray.withOpacity(0.2),
),
MobileSharedPrefButton<bool>.builder(
spKey: 'sound_on',
builder: (enabled, _) => AbsorbPointer(
child: SwitchTile(
text: 'Звук',
value: enabled ?? false,
),
),
setOnTap: (v) => !(v ?? false),
),
Divider(
height: 1,
color: borderGray.withOpacity(0.2),
),
MobileSharedPrefButton<bool>.builder(
spKey: 'auto_play_sound_view',
builder: (enabled, _) => AbsorbPointer(
child: SwitchTile(
text: 'Авто воспроизведение при просмотре',
value: enabled ?? false,
),
),
setOnTap: (v) => !(v ?? false),
),
Divider(
height: 1,
color: borderGray.withOpacity(0.2),
),
MobileSharedPrefButton<bool>.builder(
spKey: 'auto_play_sound_tests',
builder: (enabled, _) => AbsorbPointer(
child: SwitchTile(
text: 'Авто воспроизведение в тестах',
value: enabled ?? false,
),
),
setOnTap: (v) => !(v ?? false),
),
Divider(
height: 1,
color: borderGray.withOpacity(0.2),
),
SimpleTile.text(
text: 'Скорость чтения',
trail: MobileSharedPrefButton<double>.builder(
spKey: 'sound_speed',
builder: (v, s) => MnemoSlider(
onChanged: (value) => s(value),
value: v ?? 1.0,
),
shouldRebuild: (v) => false,
),
),
Divider(
height: 1,
color: borderGray.withOpacity(0.2),
),
if (ADMIN_BUILD)
MobileSharedPrefButton<bool>.builder(
spKey: 'show_admin',
builder: (enabled, _) => AbsorbPointer(
child: SwitchTile(
text: 'Show admin',
value: enabled ?? false,
),
),
setOnTap: (v) {
final val = !(v ?? false);
if (val && !getIt.isRegistered<AdminApi>()) {
getIt.registerLazySingleton<AdminApi>(
() => AdminApi(getIt.get<DioProvider>().dio));
print('set admin');
}
return val;
},
),
],
),
),
),
Column(
children: [
Padding(
padding:
EdgeInsets.only(left: 10.0.w, right: 10.w, top: 32.h),
child: LinkButton(
'Политика конфиденциальности',
() {
launchUrl(
Uri.parse(
'https://www.freeprivacypolicy.com/live/1c2bce51-86c6-4a36-b226-b6c6f50ebf0f'),
);
},
),
),
const BigBackButton(),
],
),
],
),
),
);
}
Future<void> clearAndExit() async {
final sp = await SharedPreferences.getInstance();
sp.clear();
exit(0);
}
const SettingsPage();
}