import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:shadcn_ui/shadcn_ui.dart'; import '../../core/app_colors.dart'; import '../../core/app_theme.dart'; import '../../core/navigation_provider.dart'; import '../../providers/auth_provider.dart'; import '../../providers/data_providers.dart' show apiClientProvider; class SettingsPage extends ConsumerWidget { const SettingsPage({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { return GradientScaffold( appBar: AppBar( backgroundColor: Colors.white.withValues(alpha: 0.86), leading: IconButton( icon: const Icon( LucideIcons.chevronLeft, color: AppColors.textPrimary, ), onPressed: () => popRoute(ref), ), title: const Text( '设置', style: TextStyle( fontSize: 20, fontWeight: FontWeight.w800, color: AppColors.textPrimary, ), ), centerTitle: true, ), body: SafeArea( child: SingleChildScrollView( padding: const EdgeInsets.fromLTRB(20, 18, 20, 34), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ const _SettingsHeader(), const SizedBox(height: 18), _SettingsGroup( title: '健康与设备', children: [ _SettingsTile( icon: LucideIcons.bluetooth, title: '蓝牙设备', colors: const [Color(0xFF38BDF8), Color(0xFF2563EB)], onTap: () => pushRoute(ref, 'devices'), ), _SettingsTile( icon: LucideIcons.bell, title: '消息通知', colors: const [Color(0xFFA78BFA), Color(0xFF7C3AED)], onTap: () => pushRoute(ref, 'notificationPrefs'), ), ], ), const SizedBox(height: 16), _SettingsGroup( title: '使用偏好', children: [ _SettingsTile( icon: LucideIcons.type, title: '字体大小', subtitle: '老年友好', colors: const [Color(0xFFFBBF24), Color(0xFFEA580C)], onTap: () {}, ), _SettingsTile( icon: LucideIcons.sprayCan, title: '清除缓存', colors: const [Color(0xFF2DD4BF), Color(0xFF0F766E)], onTap: () {}, ), ], ), const SizedBox(height: 16), _SettingsGroup( title: '关于', children: [ _SettingsTile( icon: LucideIcons.info, title: '关于健康管家', colors: const [Color(0xFF60A5FA), Color(0xFF0891B2)], onTap: () => pushRoute(ref, 'staticText', params: {'type': 'about'}), ), _SettingsTile( icon: LucideIcons.shield, title: '隐私协议', colors: const [Color(0xFFF472B6), Color(0xFFDB2777)], onTap: () => pushRoute( ref, 'staticText', params: {'type': 'privacy'}, ), ), ], ), const SizedBox(height: 14), OutlinedButton.icon( onPressed: () => _deleteAccount(context, ref), icon: const Icon(LucideIcons.trash, size: 19), label: const Text('删除账号'), style: OutlinedButton.styleFrom( foregroundColor: AppColors.error, side: BorderSide(color: AppColors.error.withValues(alpha: 0.34)), minimumSize: const Size.fromHeight(52), textStyle: const TextStyle(fontSize: 16, fontWeight: FontWeight.w800), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(18)), ), ), const SizedBox(height: 10), ElevatedButton.icon( onPressed: () => _logout(context, ref), icon: const Icon(LucideIcons.logOut, size: 19), label: const Text('退出登录'), style: ElevatedButton.styleFrom( backgroundColor: AppColors.error, foregroundColor: Colors.white, minimumSize: const Size.fromHeight(52), textStyle: const TextStyle(fontSize: 16, fontWeight: FontWeight.w800), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(18), ), ), ), ], ), ), ), ); } Future _deleteAccount(BuildContext context, WidgetRef ref) async { final ok = await showDialog( context: context, builder: (ctx) => AlertDialog( shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(AppTheme.rXl)), title: const Text('删除账号', style: TextStyle(color: AppColors.error)), content: const Text('此操作不可恢复,将删除所有健康数据、用药记录、饮食记录、报告等,确定继续?'), actions: [ TextButton(onPressed: () => Navigator.pop(ctx, false), child: const Text('取消')), TextButton(onPressed: () => Navigator.pop(ctx, true), child: const Text('确认删除', style: TextStyle(color: AppColors.error))), ], ), ); if (ok == true) { await ref.read(apiClientProvider).delete('/api/user/account'); await ref.read(authProvider.notifier).logout(); goRoute(ref, 'login'); } } Future _logout(BuildContext context, WidgetRef ref) async { final ok = await showDialog( context: context, builder: (ctx) => AlertDialog( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(AppTheme.rXl), ), title: const Text('退出登录'), content: const Text('确定退出当前账号?'), actions: [ TextButton( onPressed: () => Navigator.pop(ctx, false), child: const Text('取消'), ), TextButton( onPressed: () => Navigator.pop(ctx, true), child: const Text('确定', style: TextStyle(color: AppColors.error)), ), ], ), ); if (ok == true) { await ref.read(authProvider.notifier).logout(); goRoute(ref, 'login'); } } } class _SettingsHeader extends StatelessWidget { const _SettingsHeader(); @override Widget build(BuildContext context) { return Container( padding: const EdgeInsets.all(18), decoration: BoxDecoration( gradient: const LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, colors: [Color(0xFFEEF2FF), Color(0xFFF7ECFF), Color(0xFFEFFBF9)], ), borderRadius: BorderRadius.circular(28), border: Border.all(color: Colors.white, width: 1.5), ), child: Row( children: [ Container( width: 52, height: 52, decoration: BoxDecoration( gradient: const LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, colors: [Color(0xFF38BDF8), Color(0xFFC084FC)], ), borderRadius: BorderRadius.circular(20), ), child: const Icon( LucideIcons.settings, color: Colors.white, size: 25, ), ), const SizedBox(width: 14), const Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( '偏好设置', style: TextStyle( fontSize: 20, fontWeight: FontWeight.w900, color: AppColors.textPrimary, ), ), SizedBox(height: 5), Text( '管理设备、通知和账号安全', style: TextStyle( fontSize: 13, fontWeight: FontWeight.w600, color: AppColors.textSecondary, ), ), ], ), ), ], ), ); } } class _SettingsGroup extends StatelessWidget { final String title; final List children; const _SettingsGroup({required this.title, required this.children}); @override Widget build(BuildContext context) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.only(left: 4, bottom: 8), child: Text( title, style: const TextStyle( fontSize: 14, fontWeight: FontWeight.w900, color: AppColors.textSecondary, ), ), ), Container( padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 8), decoration: BoxDecoration( color: Colors.white.withValues(alpha: 0.88), borderRadius: BorderRadius.circular(26), border: Border.all(color: Colors.white, width: 1.4), boxShadow: AppColors.cardShadowLight, ), child: Column( children: [ for (var i = 0; i < children.length; i++) ...[ children[i], if (i != children.length - 1) const Divider(height: 1, color: Color(0xFFF1F3F8)), ], ], ), ), ], ); } } class _SettingsTile extends StatelessWidget { final IconData icon; final String title; final String? subtitle; final List colors; final VoidCallback onTap; const _SettingsTile({ required this.icon, required this.title, required this.colors, required this.onTap, this.subtitle, }); @override Widget build(BuildContext context) { return InkWell( onTap: onTap, borderRadius: BorderRadius.circular(18), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 2, vertical: 12), child: Row( children: [ Container( width: 42, height: 42, decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, colors: colors, ), borderRadius: BorderRadius.circular(16), ), child: Icon(icon, color: Colors.white, size: 21), ), const SizedBox(width: 13), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( title, style: const TextStyle( fontSize: 16, fontWeight: FontWeight.w800, color: AppColors.textPrimary, ), ), if (subtitle != null) ...[ const SizedBox(height: 3), Text( subtitle!, style: const TextStyle( fontSize: 12, fontWeight: FontWeight.w600, color: AppColors.textHint, ), ), ], ], ), ), const Icon( Icons.arrow_forward_ios_rounded, size: 16, color: AppColors.textHint, ), ], ), ), ); } }