import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../core/exceptions.dart'; import 'api_client_provider.dart'; import 'settings_provider.dart'; enum AuthStatus { unknown, authenticated, unauthenticated, offline } final authProvider = NotifierProvider(AuthNotifier.new); class AuthNotifier extends Notifier { @override AuthStatus build() => AuthStatus.unknown; Future verify() async { try { final repo = ref.read(authRepositoryProvider); final ok = await repo.verify(); if (ok) { await ref.read(hasEverLoggedInProvider.notifier).markLoggedIn(); } state = ok ? AuthStatus.authenticated : AuthStatus.unauthenticated; } on NetworkException { state = AuthStatus.offline; } catch (_) { state = AuthStatus.unauthenticated; } } Future login(String username, String password) async { final repo = ref.read(authRepositoryProvider); await repo.login(username, password); await ref.read(hasEverLoggedInProvider.notifier).markLoggedIn(); state = AuthStatus.authenticated; } Future logout() async { try { final repo = ref.read(authRepositoryProvider); await repo.logout(); } finally { state = AuthStatus.unauthenticated; } } }