Files
MoneyMgr/moneymgr_mobile/lib/routes/settings/settings_screen.dart
Pierre HUBERT 17a22d7a4c
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
Add an option to start on scans screen instead of capture screen
2025-07-17 18:04:03 +02:00

90 lines
2.5 KiB
Dart

import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:moneymgr_mobile/providers/settings.dart';
import 'package:moneymgr_mobile/services/storage/prefs.dart';
import 'package:moneymgr_mobile/utils/extensions.dart';
class SettingsScreen extends ConsumerWidget {
const SettingsScreen({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final prefs = ref.watch(prefsProvider).requireValue;
final themeMode = ref.watch(currentThemeModeProvider);
void onTapThemeMode() =>
showDialog(context: context, builder: (_) => const _ThemeModeDialog());
void onTapLicenses() => context.showAppLicensePage();
handleToggleStartScreen(v) async {
await prefs.setStartOnScansListScreen(v);
ref.invalidate(prefsProvider);
}
return Scaffold(
appBar: AppBar(title: const Text('Settings')),
body: ListView(
children: [
ListTile(
leading: const Icon(Icons.brightness_6),
title: const Text('Theme mode'),
trailing: Text(themeMode.label),
onTap: onTapThemeMode,
),
SwitchListTile(
value: prefs.startOnScansListScreen(),
onChanged: handleToggleStartScreen,
title: Text("Start on scans screen"),
subtitle: Text(
"Do not start camera automatically on application startup",
),
),
const Divider(),
ListTile(
leading: const Icon(Icons.info_outline),
title: const Text('Licenses'),
onTap: onTapLicenses,
),
],
),
);
}
}
/// Select theme dialog
class _ThemeModeDialog extends ConsumerWidget {
const _ThemeModeDialog();
@override
Widget build(BuildContext context, WidgetRef ref) {
void onTapOption(ThemeMode themeMode) {
ref.read(currentThemeModeProvider.notifier).set(themeMode);
Navigator.of(context).pop();
}
return SimpleDialog(
clipBehavior: Clip.antiAlias,
children: [
for (final themeMode in ThemeMode.values)
_ThemeModeDialogOption(
value: themeMode,
onTap: () => onTapOption(themeMode),
),
],
);
}
}
class _ThemeModeDialogOption extends StatelessWidget {
const _ThemeModeDialogOption({required this.value, required this.onTap});
final ThemeMode value;
final GestureTapCallback? onTap;
@override
Widget build(BuildContext context) {
return ListTile(onTap: onTap, title: Text(value.label));
}
}