import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../core/constants.dart'; import '../../database/database.dart'; import 'database_provider.dart'; import '../../services/auth_service.dart'; import 'sync_provider.dart'; const _kRememberedUsername = 'REMEMBERED_USERNAME'; const _kRememberedPassword = 'REMEMBERED_PASSWORD'; class AuthState { final Agente? agente; final bool isLoading; final bool isInitialized; final String? error; const AuthState({ this.agente, this.isLoading = false, this.isInitialized = false, this.error, }); bool get isLoggedIn => agente != null; } final authServiceProvider = Provider((ref) { return AuthService( ref.read(agentiDaoProvider), ref.read(apiServiceProvider), ref.read(parametriDaoProvider), ); }); class AuthNotifier extends Notifier { @override AuthState build() { _checkInitialized(); return const AuthState(); } Future _checkInitialized() async { final authService = ref.read(authServiceProvider); final initialized = await authService.isInitialized(); state = AuthState(isInitialized: initialized); } Future login( String code, String password, String url, { bool rememberMe = false, }) async { state = const AuthState(isLoading: true); try { final dao = ref.read(parametriDaoProvider); await dao.set(AppConstants.kUrlParam, url); final authService = ref.read(authServiceProvider); //print("Attempting login with code: $code, password: $password, url: $url"); final agente = await authService.login(code, password); print(agente); if (agente != null) { state = AuthState(agente: agente, isInitialized: true); if (rememberMe) { await dao.set(_kRememberedUsername, code); await dao.set(_kRememberedPassword, password); } else { await dao.set(_kRememberedUsername, ''); await dao.set(_kRememberedPassword, ''); } } else { state = const AuthState( error: 'Codice agente o password errati', isInitialized: true, ); } } catch (e) { state = AuthState(error: e.toString(), isInitialized: true); } } Future initialize({ required int idAgente, required String codAgente, required String password, String? ragioneSociale, required String url, }) async { state = const AuthState(isLoading: true); try { final authService = ref.read(authServiceProvider); await authService.initializeAgent( idAgente: idAgente, codAgente: codAgente, pwd: password, ragioneSociale: ragioneSociale, url: url, ); final agente = await authService.login(codAgente, password); state = AuthState(agente: agente, isInitialized: true); } catch (e) { state = AuthState(error: e.toString(), isInitialized: true); } } void logout() { state = const AuthState(isInitialized: true); } void resetToInit() { state = const AuthState(isInitialized: false); } } final authProvider = NotifierProvider( AuthNotifier.new, );