import 'package:flutter/material.dart'; import '../../../../l10n/app_localizations.dart'; import '../../../../shared/theme/app_color_palette.dart'; import '../../../../shared/theme/design_tokens.dart'; import '../../data/models/profile_settings.dart'; import '../widgets/settings_section_widgets.dart'; import 'coin_center_screen.dart'; import 'general_settings_screen.dart'; import 'legal_center_screen.dart'; import 'privacy_notification_settings_screen.dart'; class SettingsScreen extends StatefulWidget { const SettingsScreen({ super.key, required this.account, required this.settings, required this.coinBalance, required this.onInterfaceLanguageChanged, required this.onLogout, }); final String account; final ProfileSettingsV1 settings; final int coinBalance; final Future Function(String languageTag) onInterfaceLanguageChanged; final Future Function() onLogout; @override State createState() => _SettingsScreenState(); } class _SettingsScreenState extends State { late ProfileSettingsV1 _settings; bool _isLoggingOut = false; @override void initState() { super.initState(); _settings = widget.settings; } @override Widget build(BuildContext context) { final l10n = AppLocalizations.of(context)!; final colors = Theme.of(context).colorScheme; final palette = Theme.of(context).extension()!; return Scaffold( backgroundColor: colors.surfaceContainerLow, appBar: AppBar( title: Text(l10n.settingsTitle), centerTitle: true, backgroundColor: colors.surfaceContainerLow, surfaceTintColor: colors.surfaceContainerLow, ), body: ListView( padding: const EdgeInsets.fromLTRB( AppSpacing.lg, AppSpacing.md, AppSpacing.lg, AppSpacing.xl, ), children: [ ProfileHeaderCard( account: widget.account, version: _settings.version, ), const SizedBox(height: AppSpacing.lg), WalletHeroCard( balance: widget.coinBalance, subtitle: l10n.settingsCoinHeroSubtitle, onTap: _openCoinCenter, ), const SizedBox(height: AppSpacing.xl), SectionLabel(text: l10n.settingsSectionQuickAccess), SettingsGroupCard( children: [ SettingsMenuTile( icon: Icons.toll_rounded, title: l10n.settingsCoinCenterTitle, subtitle: l10n.settingsCoinCenterSubtitle(widget.coinBalance), tint: palette.historyGoldText, background: palette.historyGoldBg, onTap: _openCoinCenter, ), SettingsMenuTile( icon: Icons.tune_rounded, title: l10n.settingsGeneralTitle, subtitle: l10n.settingsGeneralSubtitle( displayLanguageLabel( l10n, _settings.preferences.interfaceLanguage, ), ), tint: colors.primary, background: colors.surfaceContainerHighest, onTap: _openGeneralSettings, ), SettingsMenuTile( icon: Icons.privacy_tip_outlined, title: l10n.settingsPrivacyAndNotificationTitle, subtitle: l10n.settingsPrivacyAndNotificationSubtitle, tint: palette.warning, background: palette.warningContainer, onTap: _openPrivacyAndNotification, ), SettingsMenuTile( icon: Icons.description_outlined, title: l10n.settingsLegalCenterTitle, subtitle: l10n.settingsLegalCenterSubtitle, tint: colors.secondary, background: colors.surfaceContainerHighest, showDivider: false, onTap: _openLegalCenter, ), ], ), const SizedBox(height: AppSpacing.xl), SectionLabel(text: l10n.settingsSectionAccount), SettingsGroupCard( children: [ SettingsMenuTile( icon: Icons.logout_rounded, title: l10n.logout, subtitle: l10n.settingsLogoutSubtitle, tint: colors.error, background: colors.error.withValues(alpha: 0.08), showDivider: false, onTap: _confirmLogout, ), ], ), const SizedBox(height: AppSpacing.xl), FilledButton( onPressed: _isLoggingOut ? null : _confirmLogout, style: FilledButton.styleFrom( elevation: 0, backgroundColor: colors.error, foregroundColor: colors.onError, padding: const EdgeInsets.symmetric(vertical: AppSpacing.lg), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(AppRadius.full), ), ), child: Text(l10n.logout), ), ], ), ); } Future _openCoinCenter() async { await Navigator.of(context).push( MaterialPageRoute( builder: (_) => CoinCenterScreen(balance: widget.coinBalance), ), ); } Future _openGeneralSettings() async { final result = await Navigator.of(context).push( MaterialPageRoute( builder: (_) => GeneralSettingsScreen( settings: _settings, onInterfaceLanguageChanged: widget.onInterfaceLanguageChanged, ), ), ); if (result == null || !mounted) { return; } setState(() { _settings = result; }); } Future _openPrivacyAndNotification() async { await Navigator.of(context).push( MaterialPageRoute( builder: (_) => PrivacyNotificationSettingsScreen(settings: _settings), ), ); } Future _openLegalCenter() async { await Navigator.of(context).push( MaterialPageRoute(builder: (_) => const LegalCenterScreen()), ); } Future _confirmLogout() async { final l10n = AppLocalizations.of(context)!; final confirmed = await showDialog( context: context, builder: (dialogContext) { return AlertDialog( title: Text(l10n.settingsLogoutDialogTitle), content: Text(l10n.settingsLogoutDialogBody), actions: [ TextButton( onPressed: () => Navigator.of(dialogContext).pop(false), child: Text(l10n.settingsCancel), ), FilledButton( onPressed: () => Navigator.of(dialogContext).pop(true), style: FilledButton.styleFrom( backgroundColor: Theme.of(dialogContext).colorScheme.error, foregroundColor: Theme.of(dialogContext).colorScheme.onError, ), child: Text(l10n.logout), ), ], ); }, ); if (confirmed != true) { return; } setState(() { _isLoggingOut = true; }); try { await widget.onLogout(); } finally { if (mounted) { setState(() { _isLoggingOut = false; }); } } } }