Chepuhagram/lib/presentation/screens/settings_screen.dart

205 lines
6.7 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:chepuhagram/presentation/screens/account_settings_screen.dart';
import 'package:chepuhagram/presentation/screens/login_screen.dart';
import 'package:chepuhagram/presentation/screens/privacy_settings_menu_screen.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '/logic/auth_provider.dart';
import '/core/theme_manager.dart';
import 'package:package_info_plus/package_info_plus.dart';
class SettingsScreen extends StatefulWidget {
const SettingsScreen({super.key});
@override
State<SettingsScreen> createState() => _SettingsScreenState();
}
class _SettingsScreenState extends State<SettingsScreen> {
String? versionCode;
@override
void initState() {
super.initState();
_loadVersion();
}
void _loadVersion() async {
PackageInfo packageInfo = await PackageInfo.fromPlatform();
if (mounted) {
setState(() {
versionCode = packageInfo.version;
});
}
}
@override
Widget build(BuildContext context) {
final themeProv = context.watch<ThemeProvider>();
final authProv = context.watch<AuthProvider>();
final accountEmail = authProv.email?.isNotEmpty == true
? authProv.email!
: authProv.username?.isNotEmpty == true
? '@${authProv.username!}'
: 'Не указано';
final username = authProv.username;
final displayName = authProv.displayName;
final initials = (displayName.isNotEmpty ? displayName : (username ?? 'U'))
.trim()
.split(RegExp(r'\s+'))
.where((p) => p.isNotEmpty)
.take(2)
.map((p) => p[0].toUpperCase())
.join();
return Scaffold(
appBar: AppBar(title: const Text("Настройки")),
body: Column(
children: [
// Секция Профиля
UserAccountsDrawerHeader(
accountName: Text(
authProv.displayName,
style: TextStyle(color: Theme.of(context).colorScheme.onSurface),
),
accountEmail: Text(
accountEmail,
style: TextStyle(color: Theme.of(context).colorScheme.onSurface),
),
currentAccountPicture: CircleAvatar(
child: Text(
initials.isEmpty ? 'U' : initials,
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
color: Theme.of(context).colorScheme.onSurface,
),
),
),
decoration: const BoxDecoration(color: Colors.transparent),
),
const Divider(),
ListTile(
leading: const Icon(Icons.person_outline),
title: const Text('Аккаунт'),
subtitle: const Text('Имя, телефон, почта, информация о себе'),
trailing: const Icon(Icons.chevron_right),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => const AccountSettingsScreen(),
),
);
},
),
const Divider(),
ListTile(
leading: const Icon(Icons.shield_outlined),
title: const Text('Конфиденциальность'),
subtitle: const Text('Безопасность и видимость данных профиля'),
trailing: const Icon(Icons.chevron_right),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => const PrivacySettingsMenuScreen(),
),
);
},
),
const Divider(),
SwitchListTile(
secondary: const Icon(Icons.dark_mode),
title: const Text("Ночной режим"),
value: themeProv.themeMode == ThemeMode.dark,
onChanged: (val) => themeProv.toggleTheme(val),
),
// Выбор цвета акцента
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Icon(
Icons.palette_outlined,
color: Theme.of(context).colorScheme.onSurface,
),
SizedBox(width: 10),
const Text("Цвет темы"),
Spacer(),
_colorCircle(context, const Color(0xFF24A1DE), themeProv),
_colorCircle(context, const Color(0xFF3E8E7E), themeProv),
_colorCircle(context, const Color(0xFF8E3E7E), themeProv),
_colorCircle(context, const Color(0xFFFF9800), themeProv),
_colorCircle(context, const Color(0xFFF44336), themeProv),
],
),
],
),
),
const Divider(),
// Выход
ListTile(
leading: const Icon(Icons.exit_to_app, color: Colors.red),
title: const Text(
"Выйти из аккаунта",
style: TextStyle(color: Colors.red),
),
onTap: () async {
await authProv.logout();
if (context.mounted) {
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (_) => const LoginScreen()),
);
}
},
),
const Spacer(),
Center(
child: Text(
"Chepuhagram for Android v$versionCode",
style: TextStyle(color: Colors.grey, fontSize: 12),
),
),
const Center(
child: Text(
"Made by ArturKarasevich",
style: TextStyle(color: Colors.grey, fontSize: 12),
),
),
const Spacer(),
],
),
);
}
Widget _colorCircle(BuildContext context, Color color, ThemeProvider prov) {
bool isSelected = prov.accentColor == color;
return GestureDetector(
onTap: () => prov.updateAccentColor(color),
child: Container(
padding: const EdgeInsets.all(2),
decoration: BoxDecoration(
shape: BoxShape.circle,
border: Border.all(
color: isSelected ? color : Colors.transparent,
width: 2,
),
),
child: CircleAvatar(backgroundColor: color, radius: 15),
),
);
}
}