From a2f09de04d3e3552dce59ded0cd3a0ac9b5bbaf3 Mon Sep 17 00:00:00 2001 From: AlexIves16 Date: Sat, 28 Mar 2026 12:28:14 +0500 Subject: [PATCH] Fix auth redirect after login --- lib/core/router.dart | 17 ++++++++++++++++- lib/providers/auth_provider.dart | 20 +++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/lib/core/router.dart b/lib/core/router.dart index a3751b0..319b6f1 100644 --- a/lib/core/router.dart +++ b/lib/core/router.dart @@ -113,10 +113,12 @@ class AppRouter { final isLoggedIn = GoRouterRefreshNotifier.isAuthenticated; final isLoggingIn = state.matchedLocation == '/auth'; + // Если не авторизован и не на экране входа - redirect на auth if (!isLoggedIn && !isLoggingIn) { return '/auth'; } + // Если авторизован и на экране входа - redirect на home if (isLoggedIn && isLoggingIn) { return '/home'; } @@ -133,15 +135,28 @@ class GoRouterRefreshNotifier extends ChangeNotifier { GoRouterRefreshNotifier() { // Подписка на изменения аутентификации будет добавлена через provider } + + static void setAuthenticated(bool value) { + isAuthenticated = value; + // Роутер обновится автоматически через refreshListenable + // notifyListeners вызывается через provider + } + + @override + void notifyListeners() { + super.notifyListeners(); + } } // Provider для обновления роутера при изменении аутентификации final routerRefreshProvider = ChangeNotifierProvider((ref) { final auth = ref.watch(authProvider); + final notifier = GoRouterRefreshNotifier(); auth.whenData((user) { GoRouterRefreshNotifier.isAuthenticated = user != null; + notifier.notifyListeners(); }); - return GoRouterRefreshNotifier(); + return notifier; }); diff --git a/lib/providers/auth_provider.dart b/lib/providers/auth_provider.dart index 0bc0458..9603ef4 100644 --- a/lib/providers/auth_provider.dart +++ b/lib/providers/auth_provider.dart @@ -3,6 +3,7 @@ import 'package:firebase_auth/firebase_auth.dart'; import 'package:google_sign_in/google_sign_in.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import '../models/user_model.dart'; +import '../core/router.dart'; class AuthNotifier extends StateNotifier> { final FirebaseAuth _auth; @@ -13,6 +14,7 @@ class AuthNotifier extends StateNotifier> { : super(const AsyncValue.data(null)) { // Слушаем изменения состояния аутентификации _auth.authStateChanges().listen((user) async { + print('Auth state changed: ${user?.email}'); if (user != null) { // Загружаем или создаём пользователя в Firestore try { @@ -82,8 +84,20 @@ class AuthNotifier extends StateNotifier> { final userCredential = await _auth.signInWithCredential(credential); - // Пользователь будет загружен через authStateChanges listener + // Обновляем состояние роутера + GoRouterRefreshNotifier.setAuthenticated(true); print('Signed in: ${userCredential.user?.email}'); + // Пользователь будет загружен через authStateChanges listener + + // Обновляем provider для notifyListeners + state = AsyncValue.data(UserModel( + id: userCredential.user!.uid, + email: userCredential.user!.email ?? '', + displayName: userCredential.user!.displayName, + photoUrl: userCredential.user!.photoURL, + createdAt: DateTime.now(), + updatedAt: DateTime.now(), + )); } catch (e, st) { print('Google Sign-In Error: $e'); state = AsyncValue.error(e, st); @@ -94,6 +108,10 @@ class AuthNotifier extends StateNotifier> { try { await _googleSignIn.signOut(); await _auth.signOut(); + + // Обновляем состояние роутера + GoRouterRefreshNotifier.setAuthenticated(false); + state = const AsyncValue.data(null); } catch (e, st) { state = AsyncValue.error(e, st);