auth_provider.dart 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import 'package:flutter_riverpod/flutter_riverpod.dart';
  2. import '../../core/constants.dart';
  3. import '../../database/database.dart';
  4. import 'database_provider.dart';
  5. import '../../services/auth_service.dart';
  6. import 'sync_provider.dart';
  7. const _kRememberedUsername = 'REMEMBERED_USERNAME';
  8. const _kRememberedPassword = 'REMEMBERED_PASSWORD';
  9. class AuthState {
  10. final Agente? agente;
  11. final bool isLoading;
  12. final bool isInitialized;
  13. final String? error;
  14. const AuthState({
  15. this.agente,
  16. this.isLoading = false,
  17. this.isInitialized = false,
  18. this.error,
  19. });
  20. bool get isLoggedIn => agente != null;
  21. }
  22. final authServiceProvider = Provider<AuthService>((ref) {
  23. return AuthService(
  24. ref.read(agentiDaoProvider),
  25. ref.read(apiServiceProvider),
  26. ref.read(parametriDaoProvider),
  27. );
  28. });
  29. class AuthNotifier extends Notifier<AuthState> {
  30. @override
  31. AuthState build() {
  32. _checkInitialized();
  33. return const AuthState();
  34. }
  35. Future<void> _checkInitialized() async {
  36. final authService = ref.read(authServiceProvider);
  37. final initialized = await authService.isInitialized();
  38. state = AuthState(isInitialized: initialized);
  39. }
  40. Future<void> login(
  41. String code,
  42. String password,
  43. String url, {
  44. bool rememberMe = false,
  45. }) async {
  46. state = const AuthState(isLoading: true);
  47. try {
  48. final dao = ref.read(parametriDaoProvider);
  49. await dao.set(AppConstants.kUrlParam, url);
  50. final authService = ref.read(authServiceProvider);
  51. //print("Attempting login with code: $code, password: $password, url: $url");
  52. final agente = await authService.login(code, password);
  53. print(agente);
  54. if (agente != null) {
  55. state = AuthState(agente: agente, isInitialized: true);
  56. if (rememberMe) {
  57. await dao.set(_kRememberedUsername, code);
  58. await dao.set(_kRememberedPassword, password);
  59. } else {
  60. await dao.set(_kRememberedUsername, '');
  61. await dao.set(_kRememberedPassword, '');
  62. }
  63. } else {
  64. state = const AuthState(
  65. error: 'Codice agente o password errati',
  66. isInitialized: true,
  67. );
  68. }
  69. } catch (e) {
  70. state = AuthState(error: e.toString(), isInitialized: true);
  71. }
  72. }
  73. Future<void> initialize({
  74. required int idAgente,
  75. required String codAgente,
  76. required String password,
  77. String? ragioneSociale,
  78. required String url,
  79. }) async {
  80. state = const AuthState(isLoading: true);
  81. try {
  82. final authService = ref.read(authServiceProvider);
  83. await authService.initializeAgent(
  84. idAgente: idAgente,
  85. codAgente: codAgente,
  86. pwd: password,
  87. ragioneSociale: ragioneSociale,
  88. url: url,
  89. );
  90. final agente = await authService.login(codAgente, password);
  91. state = AuthState(agente: agente, isInitialized: true);
  92. } catch (e) {
  93. state = AuthState(error: e.toString(), isInitialized: true);
  94. }
  95. }
  96. void logout() {
  97. state = const AuthState(isInitialized: true);
  98. }
  99. void resetToInit() {
  100. state = const AuthState(isInitialized: false);
  101. }
  102. }
  103. final authProvider = NotifierProvider<AuthNotifier, AuthState>(
  104. AuthNotifier.new,
  105. );