Chepuhagram/lib/presentation/screens/account_settings_screen.dart

168 lines
5.5 KiB
Dart
Raw Permalink 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:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:chepuhagram/domain/services/api_service.dart';
import 'package:chepuhagram/logic/auth_provider.dart';
class AccountSettingsScreen extends StatefulWidget {
const AccountSettingsScreen({super.key});
@override
State<AccountSettingsScreen> createState() => _AccountSettingsScreenState();
}
class _AccountSettingsScreenState extends State<AccountSettingsScreen> {
final _formKey = GlobalKey<FormState>();
final _usernameController = TextEditingController();
final _firstNameController = TextEditingController();
final _lastNameController = TextEditingController();
final _phoneController = TextEditingController();
final _emailController = TextEditingController();
final _aboutController = TextEditingController();
bool _isSaving = false;
@override
void initState() {
super.initState();
final auth = context.read<AuthProvider>();
_usernameController.text = auth.username ?? '';
_firstNameController.text = auth.firstName ?? '';
_lastNameController.text = auth.lastName ?? '';
_phoneController.text = auth.phone ?? '';
_emailController.text = auth.email ?? '';
_aboutController.text = auth.about ?? '';
}
@override
void dispose() {
_usernameController.dispose();
_firstNameController.dispose();
_lastNameController.dispose();
_phoneController.dispose();
_emailController.dispose();
_aboutController.dispose();
super.dispose();
}
Future<void> _save() async {
if (!_formKey.currentState!.validate()) return;
setState(() => _isSaving = true);
try {
final api = ApiService();
await api.updateMe(
username: _usernameController.text.trim(),
firstName: _firstNameController.text.trim(),
lastName: _lastNameController.text.trim(),
phone: _phoneController.text,
email: _emailController.text,
about: _aboutController.text,
);
if (!mounted) return;
await context.read<AuthProvider>().refreshMe();
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Сохранено')),
);
Navigator.of(context).pop();
} catch (e) {
if (!mounted) return;
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 : _save,
child: _isSaving
? const SizedBox(
width: 16,
height: 16,
child: CircularProgressIndicator(strokeWidth: 2),
)
: const Text(
'Сохранить',
style: TextStyle(color: Colors.white),
),
),
],
),
body: Form(
key: _formKey,
child: ListView(
padding: const EdgeInsets.all(16),
children: [
TextFormField(
controller: _usernameController,
decoration: const InputDecoration(
labelText: 'Имя пользователя',
hintText: 'Латиница, цифры, подчеркивания',
),
validator: (v) {
if (v == null || v.trim().isEmpty) return 'Введите имя пользователя';
if (!RegExp(r'^[a-zA-Z0-9_]{3,20}$').hasMatch(v.trim())) {
return 'Имя пользователя должно содержать от 3 до 20 символов (латиница, цифры, подчеркивания)';
}
return null;
},
),
const SizedBox(height: 12),
TextFormField(
controller: _firstNameController,
decoration: const InputDecoration(
labelText: 'Имя',
),
validator: (v) {
if (v == null || v.trim().isEmpty) return 'Введите имя';
return null;
},
),
const SizedBox(height: 12),
TextFormField(
controller: _lastNameController,
decoration: const InputDecoration(
labelText: 'Фамилия',
),
),
const SizedBox(height: 12),
TextFormField(
controller: _phoneController,
decoration: const InputDecoration(
labelText: 'Телефон',
),
keyboardType: TextInputType.phone,
),
const SizedBox(height: 12),
TextFormField(
controller: _emailController,
decoration: const InputDecoration(
labelText: 'Почта',
),
keyboardType: TextInputType.emailAddress,
),
const SizedBox(height: 12),
TextFormField(
controller: _aboutController,
decoration: const InputDecoration(
labelText: 'О себе',
),
minLines: 1,
maxLines: 10,
),
],
),
),
);
}
}