Performed first authentication
This commit is contained in:
		
							
								
								
									
										85
									
								
								moneymgr_mobile/lib/providers/auth_state.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								moneymgr_mobile/lib/providers/auth_state.dart
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,85 @@
 | 
			
		||||
import 'package:moneymgr_mobile/services/api/api_client.dart';
 | 
			
		||||
import 'package:moneymgr_mobile/services/api/api_token.dart';
 | 
			
		||||
import 'package:moneymgr_mobile/services/api/auth_api.dart';
 | 
			
		||||
import 'package:moneymgr_mobile/services/router/routes_list.dart';
 | 
			
		||||
import 'package:moneymgr_mobile/services/storage/secure_storage.dart';
 | 
			
		||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
 | 
			
		||||
 | 
			
		||||
part 'auth_state.g.dart';
 | 
			
		||||
 | 
			
		||||
/// The current authentication state of the app.
 | 
			
		||||
///
 | 
			
		||||
/// This notifier is responsible for saving/removing the token and profile info
 | 
			
		||||
/// to the storage through the [setAuthToken] and [logout] methods.
 | 
			
		||||
@riverpod
 | 
			
		||||
class CurrentAuthState extends _$CurrentAuthState {
 | 
			
		||||
  @override
 | 
			
		||||
  AuthState build() {
 | 
			
		||||
    final secureStorage = ref.watch(secureStorageProvider).requireValue;
 | 
			
		||||
    final token = secureStorage.token();
 | 
			
		||||
    return token != null ? AuthState.authenticated : AuthState.unauthenticated;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /// Attempts to authenticate with [token] and saves the token and profile info to storage.
 | 
			
		||||
  /// Will invalidate the state if success and throw an exception in case of failure
 | 
			
		||||
  Future<void> setAuthToken(ApiToken token) async {
 | 
			
		||||
    // Attempt to use provided token
 | 
			
		||||
    await ApiClient(token: token).authInfo();
 | 
			
		||||
 | 
			
		||||
    final secureStorage = ref.read(secureStorageProvider).requireValue;
 | 
			
		||||
    secureStorage.setToken(token);
 | 
			
		||||
 | 
			
		||||
    ref
 | 
			
		||||
        // Invalidate the state so the auth state will be updated to authenticated.
 | 
			
		||||
        .invalidateSelf();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /// Logs out, deletes the saved token and profile info from storage, and invalidates
 | 
			
		||||
  /// the state.
 | 
			
		||||
  void logout() {
 | 
			
		||||
    // TODO : implement logic
 | 
			
		||||
    /*final secureStorage = ref.read(secureStorageProvider).requireValue;
 | 
			
		||||
 | 
			
		||||
    // Delete the current [token] and [profile] from secure storage.
 | 
			
		||||
    secureStorage.remove('token');
 | 
			
		||||
 | 
			
		||||
    ref
 | 
			
		||||
    // Invalidate the state so the auth state will be updated to unauthenticated.
 | 
			
		||||
      ..invalidateSelf()
 | 
			
		||||
    // Invalidate the token provider so the API service will no longer use the
 | 
			
		||||
    // previous token.
 | 
			
		||||
      ..invalidate(tokenProvider);*/
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// The possible authentication states of the app.
 | 
			
		||||
enum AuthState {
 | 
			
		||||
  unknown(redirectPath: homePage, allowedPaths: [homePage]),
 | 
			
		||||
  unauthenticated(
 | 
			
		||||
    redirectPath: authPage,
 | 
			
		||||
    allowedPaths: [authPage, manualAuthPage, settingsPage],
 | 
			
		||||
  ),
 | 
			
		||||
  authenticated(
 | 
			
		||||
    redirectPath: homePage,
 | 
			
		||||
    allowedPaths: null,
 | 
			
		||||
    forbiddenPaths: [authPage, manualAuthPage],
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  const AuthState({
 | 
			
		||||
    required this.redirectPath,
 | 
			
		||||
    required this.allowedPaths,
 | 
			
		||||
    this.forbiddenPaths,
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  /// The target path to redirect when the current route is not allowed in this
 | 
			
		||||
  /// auth state.
 | 
			
		||||
  final String redirectPath;
 | 
			
		||||
 | 
			
		||||
  /// List of paths allowed when the app is in this auth state. May be set to null if there is no
 | 
			
		||||
  /// restriction applicable
 | 
			
		||||
  final List<String>? allowedPaths;
 | 
			
		||||
 | 
			
		||||
  /// List of paths not allowed when the app is in this auth state. May be set to null if there is no
 | 
			
		||||
  /// restriction applicable
 | 
			
		||||
  final List<String>? forbiddenPaths;
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user