import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:get_it/get_it.dart'; import 'package:go_router/go_router.dart'; import 'package:maibu_satabot_v2/core/localization/app_localizations.dart'; import 'package:maibu_satabot_v2/core/localization/locale_cubit.dart'; import 'package:maibu_satabot_v2/core/router/route_paths.dart'; import 'package:maibu_satabot_v2/core/storage/user_storage.dart'; import 'package:maibu_satabot_v2/features/auth/presentation/bloc/auth_cubit.dart'; import 'package:maibu_satabot_v2/features/main_container/presentation/cubit/tab_config_cubit.dart'; /// 系统设置综合页面 class SystemSettingsPage extends StatefulWidget { const SystemSettingsPage({super.key}); @override State createState() => _SystemSettingsPageState(); } class _SystemSettingsPageState extends State { @override Widget build(BuildContext context) { return Scaffold( backgroundColor: const Color(0xFFF5F6F8), appBar: AppBar( backgroundColor: Colors.white, elevation: 0, leading: IconButton( icon: const Icon(Icons.arrow_back, color: Color(0xFF1D2129)), onPressed: () => Navigator.pop(context), ), title: Text( AppLocalizations.of(context).translate('my.settings'), style: const TextStyle( fontSize: 18, fontWeight: FontWeight.bold, color: Color(0xFF1D2129), ), ), centerTitle: true, ), body: ListView( padding: const EdgeInsets.all(16), children: [ // Tab 设置 _buildTabSettingsSection(), const SizedBox(height: 12), // 语言设置 _buildLanguageSection(), const SizedBox(height: 12), // 退出登录 _buildLogoutButton(context), const SizedBox(height: 20), ], ), ); } /// Tab 设置 Widget _buildTabSettingsSection() { return Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(12), boxShadow: const [ BoxShadow( color: Color(0x0D000000), blurRadius: 8, offset: Offset(0, 2), ), ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( 'Tab 设置', style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, color: Color(0xFF1D2129), ), ), const SizedBox(height: 16), BlocBuilder( builder: (context, state) { if (state.runtimeType.toString() != 'TabConfigLoaded') { return const Center(child: CircularProgressIndicator()); } final tabs = state.config.items; return ListView.builder( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), itemCount: tabs.length, itemBuilder: (context, index) { final tab = tabs[index]; return Padding( padding: const EdgeInsets.only(bottom: 12), child: Row( children: [ Expanded( child: Text( tab.name, style: const TextStyle( fontSize: 14, color: Color(0xFF1D2129), ), ), ), Switch( value: tab.isEnabled, onChanged: (value) { context.read().toggleTab(tab.id); }, activeColor: const Color(0xFF165DFF), ), ], ), ); }, ); }, ), ], ), ); } /// 语言设置 Widget _buildLanguageSection() { return Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(12), boxShadow: const [ BoxShadow( color: Color(0x0D000000), blurRadius: 8, offset: Offset(0, 2), ), ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( AppLocalizations.of(context).translate('my.language'), style: const TextStyle( fontSize: 16, fontWeight: FontWeight.bold, color: Color(0xFF1D2129), ), ), const SizedBox(height: 16), BlocBuilder( builder: (context, locale) { return Column( children: [ _buildLanguageOption( AppLocalizations.of(context).translate('my.chinese'), 'zh', locale.languageCode == 'zh', () => context.read().setLocale(const Locale('zh', 'CN')), ), const SizedBox(height: 12), _buildLanguageOption( AppLocalizations.of(context).translate('my.english'), 'en', locale.languageCode == 'en', () => context.read().setLocale(const Locale('en', 'US')), ), ], ); }, ), ], ), ); } Widget _buildLanguageOption(String label, String code, bool isSelected, VoidCallback onTap) { return GestureDetector( onTap: onTap, child: Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: isSelected ? const Color(0xFF165DFF).withOpacity(0.1) : Colors.transparent, borderRadius: BorderRadius.circular(8), border: Border.all( color: isSelected ? const Color(0xFF165DFF) : const Color(0xFFE5E6EB), width: 1, ), ), child: Row( children: [ Expanded( child: Text( label, style: TextStyle( fontSize: 14, color: isSelected ? const Color(0xFF165DFF) : const Color(0xFF1D2129), fontWeight: isSelected ? FontWeight.w600 : FontWeight.normal, ), ), ), if (isSelected) const Icon( Icons.check_circle, color: Color(0xFF165DFF), size: 20, ), ], ), ), ); } /// 退出登录按钮 Widget _buildLogoutButton(BuildContext context) { return GestureDetector( onTap: () { _showLogoutDialog(context); }, child: Container( padding: const EdgeInsets.symmetric(vertical: 16), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(12), boxShadow: const [ BoxShadow( color: Color(0x0D000000), blurRadius: 8, offset: Offset(0, 2), ), ], ), child: Center( child: Text( AppLocalizations.of(context).translate('login.logout'), style: const TextStyle( fontSize: 16, fontWeight: FontWeight.w500, color: Color(0xFFF53F3F), ), ), ), ), ); } /// 显示退出登录确认对话框 void _showLogoutDialog(BuildContext context) { showDialog( context: context, builder: (context) => AlertDialog( title: Text(AppLocalizations.of(context).translate('login.logout')), content: const Text('确定要退出登录吗?'), actions: [ TextButton( onPressed: () => Navigator.pop(context), child: const Text('取消'), ), TextButton( onPressed: () async { Navigator.pop(context); // 执行退出登录逻辑 await GetIt.I().deleteUser(); GetIt.I().logout(); context.go(RoutePaths.login); }, style: TextButton.styleFrom( foregroundColor: const Color(0xFFF53F3F), ), child: const Text('确定'), ), ], ), ); } }