166 lines
5.6 KiB
Dart
166 lines
5.6 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
import '../../../../l10n/app_localizations.dart';
|
|
import '../../../../shared/theme/design_tokens.dart';
|
|
import '../../data/models/profile_settings.dart';
|
|
import '../widgets/settings_section_widgets.dart';
|
|
import 'language_settings_screen.dart';
|
|
|
|
class GeneralSettingsScreen extends StatefulWidget {
|
|
const GeneralSettingsScreen({
|
|
super.key,
|
|
required this.settings,
|
|
required this.onSettingsChanged,
|
|
});
|
|
|
|
final ProfileSettingsV1 settings;
|
|
final Future<void> Function(ProfileSettingsV1 settings) onSettingsChanged;
|
|
|
|
@override
|
|
State<GeneralSettingsScreen> createState() => _GeneralSettingsScreenState();
|
|
}
|
|
|
|
class _GeneralSettingsScreenState extends State<GeneralSettingsScreen> {
|
|
late ProfileSettingsV1 _settings;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
_settings = widget.settings;
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final l10n = AppLocalizations.of(context)!;
|
|
final colors = Theme.of(context).colorScheme;
|
|
|
|
return PopScope<ProfileSettingsV1>(
|
|
canPop: false,
|
|
onPopInvokedWithResult: (didPop, result) {
|
|
if (didPop) {
|
|
return;
|
|
}
|
|
Navigator.of(context).pop(_settings);
|
|
},
|
|
child: Scaffold(
|
|
backgroundColor: colors.surfaceContainerLow,
|
|
appBar: AppBar(
|
|
leading: IconButton(
|
|
onPressed: () => Navigator.of(context).pop(_settings),
|
|
icon: const Icon(Icons.arrow_back_ios_new_rounded),
|
|
),
|
|
title: Text(l10n.settingsGeneralTitle),
|
|
centerTitle: true,
|
|
backgroundColor: colors.surfaceContainerLow,
|
|
surfaceTintColor: colors.surfaceContainerLow,
|
|
),
|
|
body: ListView(
|
|
padding: const EdgeInsets.all(AppSpacing.lg),
|
|
children: [
|
|
SectionLabel(text: l10n.settingsSectionGeneral),
|
|
SettingsGroupCard(
|
|
children: [
|
|
SettingsMenuTile(
|
|
icon: Icons.language_rounded,
|
|
title: l10n.settingsInterfaceLanguage,
|
|
subtitle: displayLanguageLabel(
|
|
l10n,
|
|
_settings.preferences.interfaceLanguage,
|
|
),
|
|
tint: colors.primary,
|
|
background: colors.surfaceContainerHighest,
|
|
onTap: () => _selectLanguage(
|
|
_settings.preferences.interfaceLanguage,
|
|
(lang) => setState(() {
|
|
_settings = _settings.copyWith(
|
|
preferences: _settings.preferences.copyWith(
|
|
interfaceLanguage: lang,
|
|
),
|
|
);
|
|
}),
|
|
),
|
|
),
|
|
SettingsMenuTile(
|
|
icon: Icons.smart_toy_rounded,
|
|
title: l10n.settingsAiLanguage,
|
|
subtitle: displayLanguageLabel(
|
|
l10n,
|
|
_settings.preferences.aiLanguage,
|
|
),
|
|
tint: colors.primary,
|
|
background: colors.surfaceContainerHighest,
|
|
showDivider: false,
|
|
onTap: () => _selectLanguage(
|
|
_settings.preferences.aiLanguage,
|
|
(lang) => setState(() {
|
|
_settings = _settings.copyWith(
|
|
preferences: _settings.preferences.copyWith(
|
|
aiLanguage: lang,
|
|
),
|
|
);
|
|
}),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
const SizedBox(height: AppSpacing.lg),
|
|
SectionLabel(text: l10n.settingsSectionNotification),
|
|
SettingsGroupCard(
|
|
children: [
|
|
SettingsSwitchTile(
|
|
icon: Icons.notifications_rounded,
|
|
title: l10n.settingsNotificationAllow,
|
|
value: _settings.notification.allowNotifications,
|
|
tint: colors.primary,
|
|
background: colors.surfaceContainerHighest,
|
|
onChanged: (value) =>
|
|
_updateNotification(allowNotifications: value),
|
|
),
|
|
SettingsSwitchTile(
|
|
icon: Icons.vibration_rounded,
|
|
title: l10n.settingsNotificationVibration,
|
|
value: _settings.notification.allowVibration,
|
|
tint: colors.primary,
|
|
background: colors.surfaceContainerHighest,
|
|
showDivider: false,
|
|
onChanged: (value) =>
|
|
_updateNotification(allowVibration: value),
|
|
),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
Future<void> _selectLanguage(
|
|
String currentLanguage,
|
|
void Function(String) onChanged,
|
|
) async {
|
|
final result = await Navigator.of(context).push<String>(
|
|
MaterialPageRoute<String>(
|
|
builder: (_) =>
|
|
LanguageSettingsScreen(selectedLanguageTag: currentLanguage),
|
|
),
|
|
);
|
|
if (result == null || result == currentLanguage) {
|
|
return;
|
|
}
|
|
onChanged(result);
|
|
await widget.onSettingsChanged(_settings);
|
|
}
|
|
|
|
void _updateNotification({bool? allowNotifications, bool? allowVibration}) {
|
|
final newNotification = _settings.notification.copyWith(
|
|
allowNotifications: allowNotifications,
|
|
allowVibration: allowVibration,
|
|
);
|
|
final newSettings = _settings.copyWith(notification: newNotification);
|
|
setState(() {
|
|
_settings = newSettings;
|
|
});
|
|
widget.onSettingsChanged(newSettings);
|
|
}
|
|
}
|