228 lines
8.7 KiB
Dart
228 lines
8.7 KiB
Dart
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();
|
||
}
|