/
dbnrbv
/
Habit
Обзор
Документация
Войти
/
dbnrbv
/
Habit
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
lib/features/auth/presentation/auth_controller.dart
143 строки
5 KB
Daba
refactor/rename directories anf files
31 май 2026, 21:01
31 май 2026, 21:01
6f5a8c3
Код
Авторство
О чём код?
import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; enum AuthStatus { initial, loading, failure } class AuthState { final AuthStatus status; final String? errorMessage; const AuthState({ this.status = AuthStatus.initial, this.errorMessage, }); bool get isLoading => status == AuthStatus.loading; factory AuthState.initial() => const AuthState(); factory AuthState.loading() => const AuthState(status: AuthStatus.loading); factory AuthState.failure(String message) => AuthState(status: AuthStatus.failure, errorMessage: message); AuthState copyWith({ AuthStatus? status, String? errorMessage, }) { return AuthState( status: status ?? this.status, errorMessage: errorMessage, ); } } class AuthController extends StateNotifier<AuthState> { AuthController(this._auth) : super(AuthState.initial()); final FirebaseAuth _auth; // ─── Login ────────────────────────────────────────────────────────────── Future<void> login(String email, String password) async { final normalizedEmail = email.trim(); if (normalizedEmail.isEmpty || password.isEmpty) { state = AuthState.failure('Введите email и пароль'); return; } if (!_validateEmail(normalizedEmail)) { state = AuthState.failure('Введите корректный email'); return; } state = AuthState.loading(); try { await _auth.signInWithEmailAndPassword( email: normalizedEmail, password: password, ); state = AuthState.initial(); } on FirebaseAuthException catch (e) { state = AuthState.failure(_firebaseErrorMessage(e)); } catch (_) { state = AuthState.failure('Ошибка входа. Попробуйте позже.'); } } // ─── Register ─────────────────────────────────────────────────────────── Future<void> register( String email, String password, String confirmPassword, ) async { final normalizedEmail = email.trim(); if (normalizedEmail.isEmpty || password.isEmpty || confirmPassword.isEmpty) { state = AuthState.failure('Заполните все поля'); return; } if (!_validateEmail(normalizedEmail)) { state = AuthState.failure('Введите корректный email'); return; } if (password.length < 6) { state = AuthState.failure('Пароль должен быть не меньше 6 символов'); return; } if (password != confirmPassword) { state = AuthState.failure('Пароли не совпадают'); return; } state = AuthState.loading(); try { await _auth.createUserWithEmailAndPassword( email: normalizedEmail, password: password, ); state = AuthState.initial(); } on FirebaseAuthException catch (e) { state = AuthState.failure(_firebaseErrorMessage(e)); } catch (_) { state = AuthState.failure('Ошибка регистрации. Попробуйте позже.'); } } // ─── Logout ───────────────────────────────────────────────────────────── Future<void> logout() async { await _auth.signOut(); state = AuthState.initial(); } // ─── Private helpers ──────────────────────────────────────────────────── bool _validateEmail(String email) { const emailPattern = r'^[\w-.]+@([\w-]+\.)+[\w-]{2,4}$'; return RegExp(emailPattern).hasMatch(email); } String _firebaseErrorMessage(FirebaseAuthException e) { return switch (e.code) { 'invalid-email' => 'Неверный формат email', 'user-disabled' => 'Пользователь отключен', 'user-not-found' => 'Пользователь не найден', 'wrong-password' => 'Неверный пароль', 'email-already-in-use' => 'Email уже используется', 'weak-password' => 'Пароль слишком простой', 'operation-not-allowed' => 'Операция не разрешена', _ => 'Ошибка авторизации. Данные введены неверно или пользователь не существует.', }; } }