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_design_tokens.dart'; import '../../core/app_theme.dart'; import '../../core/navigation_provider.dart'; import '../../providers/auth_provider.dart'; class SettingsPage extends ConsumerWidget { const SettingsPage({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { return Scaffold( backgroundColor: AppColors.background, appBar: AppBar( backgroundColor: Colors.white, elevation: 0, scrolledUnderElevation: 0, surfaceTintColor: Colors.transparent, leading: IconButton( icon: const Icon(Icons.arrow_back, color: AppColors.textPrimary), onPressed: () => popRoute(ref), ), title: const Text( '设置', style: TextStyle( fontSize: 19, fontWeight: FontWeight.w700, color: AppColors.textPrimary, ), ), centerTitle: true, ), body: ColoredBox( color: AppColors.background, child: SafeArea( child: SingleChildScrollView( padding: const EdgeInsets.fromLTRB(16, 18, 16, 32), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ _SettingsGroup( children: [ _SettingsTile( icon: LucideIcons.bluetooth, title: '蓝牙设备', onTap: () => pushRoute(ref, 'devices'), ), _SettingsTile( icon: LucideIcons.bell, title: '消息通知', onTap: () => pushRoute(ref, 'notificationPrefs'), ), _SettingsTile( icon: LucideIcons.info, title: '关于小脉健康', onTap: () => pushRoute( ref, 'staticText', params: {'type': 'about'}, ), ), _SettingsTile( icon: LucideIcons.shield, title: '隐私协议', onTap: () => pushRoute( ref, 'staticText', params: {'type': 'privacy'}, ), ), _SettingsTile( icon: Icons.fact_check_outlined, title: '个人信息收集清单', onTap: () => pushRoute( ref, 'staticText', params: {'type': 'personalInfoList'}, ), ), _SettingsTile( icon: Icons.hub_outlined, title: '第三方 SDK 共享清单', onTap: () => pushRoute( ref, 'staticText', params: {'type': 'thirdPartySdkList'}, ), ), _SettingsTile( icon: Icons.description_outlined, title: '服务协议', onTap: () => pushRoute( ref, 'staticText', params: {'type': 'terms'}, ), ), ], ), const SizedBox(height: 24), 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), ), backgroundColor: Colors.white, minimumSize: const Size.fromHeight(52), textStyle: const TextStyle( fontSize: 16, fontWeight: FontWeight.w800, ), shape: RoundedRectangleBorder( borderRadius: AppRadius.lgBorder, ), ), ), const SizedBox(height: 12), ElevatedButton.icon( onPressed: () => _logout(context, ref), icon: const Icon(LucideIcons.logOut, size: 19), label: const Text('退出登录'), style: ElevatedButton.styleFrom( backgroundColor: Colors.white, foregroundColor: AppColors.textPrimary, elevation: 0, side: const BorderSide(color: AppColors.borderLight), minimumSize: const Size.fromHeight(52), textStyle: const TextStyle( fontSize: 16, fontWeight: FontWeight.w800, ), shape: RoundedRectangleBorder( borderRadius: AppRadius.lgBorder, ), ), ), ], ), ), ), ), ); } 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 _SettingsGroup extends StatelessWidget { final List<_SettingsTile> children; const _SettingsGroup({required this.children}); @override Widget build(BuildContext context) { return Container( clipBehavior: Clip.antiAlias, decoration: BoxDecoration( color: Colors.white, borderRadius: AppRadius.xlBorder, ), child: Column( children: [ for (var i = 0; i < children.length; i++) ...[ children[i], if (i < children.length - 1) const Padding( padding: EdgeInsets.only(left: 52), child: Divider( height: 1, thickness: 0.7, color: Color(0xFFE8ECF2), ), ), ], ], ), ); } } class _SettingsTile extends StatelessWidget { final IconData icon; final String title; final VoidCallback onTap; const _SettingsTile({ required this.icon, required this.title, required this.onTap, }); @override Widget build(BuildContext context) { return Material( color: Colors.white, child: InkWell( onTap: onTap, child: Container( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), child: Row( children: [ Icon(icon, color: Colors.black, size: 22), const SizedBox(width: 14), Expanded( child: Text( title, style: const TextStyle( fontSize: 16, fontWeight: FontWeight.w600, color: AppColors.textPrimary, ), ), ), const Icon( Icons.arrow_forward_ios_rounded, size: 15, color: AppColors.textHint, ), ], ), ), ), ); } }