import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:relationship_saver/core/auth/token_store.dart'; import 'package:relationship_saver/integrations/backend/backend_gateway.dart'; import 'package:relationship_saver/integrations/backend/backend_gateway_provider.dart'; import 'package:relationship_saver/integrations/backend/models/backend_models.dart'; /// Manages authenticated session lifecycle for app-level navigation. class SessionController extends AsyncNotifier { @override Future build() async { return ref.read(tokenStoreProvider).read(); } Future signIn({ required SignInMethod method, String? email, String? password, String? idToken, }) async { state = const AsyncLoading(); try { final BackendGateway gateway = ref.read(backendGatewayProvider); final AuthSession session = await gateway.signIn( SignInRequest( method: method, email: email, password: password, idToken: idToken, ), ); // Ensure fake gateway sessions are also persisted. await ref.read(tokenStoreProvider).write(session); state = AsyncData(session); } catch (error, stackTrace) { state = AsyncError(error, stackTrace); } } Future signOut() async { final BackendGateway gateway = ref.read(backendGatewayProvider); final TokenStore tokenStore = ref.read(tokenStoreProvider); try { await gateway.signOut(); } catch (_) { // Offline-first sign-out should always clear local session. } await tokenStore.clear(); state = const AsyncData(null); } Future refreshProfile() async { final AuthSession? current = state.asData?.value; if (current == null) { return; } try { final UserProfile profile = await ref.read(backendGatewayProvider).me(); final AuthSession updated = current.copyWith(user: profile); await ref.read(tokenStoreProvider).write(updated); state = AsyncData(updated); } catch (_) { // Keep current state if profile refresh fails. } } } final AsyncNotifierProvider sessionControllerProvider = AsyncNotifierProvider( SessionController.new, );