mnemo_cards/lib/pages/settgins_page.dart
2024-08-25 00:09:58 +03:00

228 lines
8.7 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/add_plan.dart';
import '../admin/add_promocode_campaign.dart';
import '../admin/admin_api.dart';
import '../admin/all_cards.dart';
import '../admin/all_users.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,
),
Divider(
height: 1,
color: borderGray.withOpacity(0.2),
),
Expanded(
child: ListView(
children: [
Expanded(
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 10.0.w),
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
SimpleTile.text(
onLongTap: () async {
final r = await locator.userManager.deleteUser();
if (!r) {
showInfoDialog(
'Не удалось удалить аккаунт\nПопробуйте перелогиниться',
);
}
},
text: 'Удалить аккаунт (зажми)',
),
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;
},
),
MobileSharedPrefButton<bool>.builder(
spKey: 'sound_on',
builder: (enabled, _) => AbsorbPointer(
child: SwitchTile(
text: 'Звук',
value: enabled ?? false,
),
),
setOnTap: (v) => !(v ?? false),
),
MobileSharedPrefButton<bool>.builder(
spKey: 'auto_play_sound_view',
builder: (enabled, _) => AbsorbPointer(
child: SwitchTile(
text: 'Авто воспроизведение при просмотре',
value: enabled ?? false,
),
),
setOnTap: (v) => !(v ?? false),
),
MobileSharedPrefButton<bool>.builder(
spKey: 'auto_play_sound_tests',
builder: (enabled, _) => AbsorbPointer(
child: SwitchTile(
text: 'Авто воспроизведение в тестах',
value: enabled ?? false,
),
),
setOnTap: (v) => !(v ?? false),
),
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,
),
),
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;
},
),
if (ADMIN_BUILD) ..._adminTiles(context),
].expand((widget) => [
widget,
Divider(
height: 1,
color: borderGray.withOpacity(0.2),
),
]).toList(),
),
),
),
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(),
],
),
),
);
}
List<Widget> _adminTiles(BuildContext context) => [
SimpleTile.text(
text: 'Cards',
onTap: () {
showDialog(context: context, builder: (c) => const AllCards());
},
),
SimpleTile.text(
text: 'Users',
onTap: () {
showDialog(context: context, builder: (c) => const AllUsers());
},
),
SimpleTile.text(
text: 'Plans',
onTap: () {
AddPlan().addPlan(context);
},
),
SimpleTile.text(
text: 'Promo codes',
onTap: () {
AddPromocodeCampaign().addCampaign(context);
},
),
SimpleTile.text(
text: 'Clear cache',
onTap: () {
locator.packManager.clearCache();
},
),
MobileSharedPrefButton<bool>(
builder: (enabled, _) => AbsorbPointer(
child: SwitchTile(
text: 'Use prod',
value: enabled ?? false,
),
),
spKey: 'env',
setOnTap: (v) => !(v ?? false),
),
];
Future<void> clearAndExit() async {
final sp = await SharedPreferences.getInstance();
sp.clear();
exit(0);
}
const SettingsPage();
}