205 lines
7.2 KiB
Dart
205 lines
7.2 KiB
Dart
import 'package:flutter/material.dart';
|
||
import 'package:shared_preferences/shared_preferences.dart';
|
||
import 'package:chepuhagram/domain/services/api_service.dart';
|
||
|
||
class PrivacySettingsScreen extends StatefulWidget {
|
||
const PrivacySettingsScreen({super.key});
|
||
|
||
@override
|
||
State<PrivacySettingsScreen> createState() => _PrivacySettingsScreenState();
|
||
}
|
||
|
||
class _PrivacySettingsScreenState extends State<PrivacySettingsScreen> {
|
||
static const _showEmailKey = 'privacy_show_email';
|
||
static const _showPhoneKey = 'privacy_show_phone';
|
||
static const _showAvatarKey = 'privacy_show_avatar';
|
||
static const _showAboutKey = 'privacy_show_about';
|
||
static const _showUsernameKey = 'privacy_show_username';
|
||
static const _showLastOnlineKey = 'privacy_show_last_online';
|
||
|
||
bool _showEmail = true;
|
||
bool _showPhone = true;
|
||
bool _showAvatar = true;
|
||
bool _showAbout = true;
|
||
bool _showUsername = true;
|
||
bool _showLastOnline = true;
|
||
bool _isSaving = false;
|
||
|
||
@override
|
||
void initState() {
|
||
super.initState();
|
||
_loadPreferences();
|
||
_loadServerSettings();
|
||
}
|
||
|
||
Future<void> _loadPreferences() async {
|
||
final prefs = await SharedPreferences.getInstance();
|
||
setState(() {
|
||
_showEmail = prefs.getBool(_showEmailKey) ?? true;
|
||
_showPhone = prefs.getBool(_showPhoneKey) ?? true;
|
||
_showAvatar = prefs.getBool(_showAvatarKey) ?? true;
|
||
_showAbout = prefs.getBool(_showAboutKey) ?? true;
|
||
_showUsername = prefs.getBool(_showUsernameKey) ?? true;
|
||
_showLastOnline = prefs.getBool(_showLastOnlineKey) ?? true;
|
||
});
|
||
}
|
||
|
||
Future<void> _loadServerSettings() async {
|
||
try {
|
||
final api = ApiService();
|
||
final data = await api.getPrivacySettings();
|
||
setState(() {
|
||
_showEmail = data['show_email'] ?? true;
|
||
_showPhone = data['show_phone'] ?? true;
|
||
_showAvatar = data['show_avatar'] ?? true;
|
||
_showAbout = data['show_about'] ?? true;
|
||
_showUsername = data['show_username'] ?? true;
|
||
_showLastOnline = data['show_last_online'] ?? true;
|
||
});
|
||
// Сохраняем локально для быстрого доступа
|
||
await _savePreference(_showEmailKey, _showEmail);
|
||
await _savePreference(_showPhoneKey, _showPhone);
|
||
await _savePreference(_showAvatarKey, _showAvatar);
|
||
await _savePreference(_showAboutKey, _showAbout);
|
||
await _savePreference(_showUsernameKey, _showUsername);
|
||
await _savePreference(_showLastOnlineKey, _showLastOnline);
|
||
} catch (e) {
|
||
// Если не удалось загрузить с сервера, используем локальные настройки
|
||
print('Ошибка загрузки настроек с сервера: $e');
|
||
}
|
||
}
|
||
|
||
Future<void> _savePreference(String key, bool value) async {
|
||
final prefs = await SharedPreferences.getInstance();
|
||
await prefs.setBool(key, value);
|
||
}
|
||
|
||
Future<void> _saveToServer() async {
|
||
if (_isSaving) return;
|
||
|
||
setState(() => _isSaving = true);
|
||
|
||
try {
|
||
final api = ApiService();
|
||
final success = await api.updatePrivacySettings(
|
||
showEmail: _showEmail,
|
||
showPhone: _showPhone,
|
||
showAvatar: _showAvatar,
|
||
showAbout: _showAbout,
|
||
showUsername: _showUsername,
|
||
showLastOnline: _showLastOnline,
|
||
);
|
||
|
||
if (success) {
|
||
// Сохраняем локально только после успешного сохранения на сервере
|
||
await _savePreference(_showEmailKey, _showEmail);
|
||
await _savePreference(_showPhoneKey, _showPhone);
|
||
await _savePreference(_showAvatarKey, _showAvatar);
|
||
await _savePreference(_showAboutKey, _showAbout);
|
||
await _savePreference(_showUsernameKey, _showUsername);
|
||
await _savePreference(_showLastOnlineKey, _showLastOnline);
|
||
|
||
if (mounted) {
|
||
ScaffoldMessenger.of(context).showSnackBar(
|
||
const SnackBar(content: Text('Настройки сохранены')),
|
||
);
|
||
}
|
||
} else {
|
||
if (mounted) {
|
||
ScaffoldMessenger.of(context).showSnackBar(
|
||
const SnackBar(content: Text('Не удалось сохранить настройки')),
|
||
);
|
||
}
|
||
}
|
||
} catch (e) {
|
||
if (mounted) {
|
||
ScaffoldMessenger.of(context).showSnackBar(
|
||
SnackBar(content: Text('Ошибка: ${e.toString().replaceAll('Exception: ', '')}')),
|
||
);
|
||
}
|
||
} finally {
|
||
if (mounted) {
|
||
setState(() => _isSaving = false);
|
||
}
|
||
}
|
||
}
|
||
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
return Scaffold(
|
||
appBar: AppBar(
|
||
title: const Text('Конфиденциальность'),
|
||
actions: [
|
||
TextButton(
|
||
onPressed: _isSaving ? null : _saveToServer,
|
||
child: _isSaving
|
||
? const SizedBox(
|
||
width: 16,
|
||
height: 16,
|
||
child: CircularProgressIndicator(strokeWidth: 2, color: Colors.white),
|
||
)
|
||
: const Text(
|
||
'Сохранить',
|
||
style: TextStyle(color: Colors.white),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
body: ListView(
|
||
padding: const EdgeInsets.all(16),
|
||
children: [
|
||
const Text('Настройки видимости', style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold)),
|
||
const SizedBox(height: 12),
|
||
SwitchListTile(
|
||
title: const Text('Показывать имя пользователя (@username)'),
|
||
value: _showUsername,
|
||
onChanged: (value) {
|
||
setState(() => _showUsername = value);
|
||
},
|
||
),
|
||
SwitchListTile(
|
||
title: const Text('Показывать почту другим'),
|
||
value: _showEmail,
|
||
onChanged: (value) {
|
||
setState(() => _showEmail = value);
|
||
},
|
||
),
|
||
SwitchListTile(
|
||
title: const Text('Показывать телефон другим'),
|
||
value: _showPhone,
|
||
onChanged: (value) {
|
||
setState(() => _showPhone = value);
|
||
},
|
||
),
|
||
SwitchListTile(
|
||
title: const Text('Показывать аватар другим'),
|
||
value: _showAvatar,
|
||
onChanged: (value) {
|
||
setState(() => _showAvatar = value);
|
||
},
|
||
),
|
||
SwitchListTile(
|
||
title: const Text('Показывать информацию «О себе»'),
|
||
value: _showAbout,
|
||
onChanged: (value) {
|
||
setState(() => _showAbout = value);
|
||
},
|
||
),
|
||
SwitchListTile(
|
||
title: const Text('Показывать последний онлайн'),
|
||
value: _showLastOnline,
|
||
onChanged: (value) {
|
||
setState(() => _showLastOnline = value);
|
||
},
|
||
),
|
||
const SizedBox(height: 24),
|
||
const Text(
|
||
'Эти настройки влияют на то, какую информацию о вас видят другие пользователи приложения.',
|
||
style: TextStyle(color: Colors.grey),
|
||
),
|
||
],
|
||
),
|
||
);
|
||
}
|
||
}
|