build method

Build (Init)

Implementation

@override
FutureOr<AuthRepositoryState> build() async {
  _log = ref.watch(appTalkerProvider);
  _log.logTyped(AuthRepositoryLog('build()'));

  _authService = ref.read(AuthService.provider);

  var resultCompleter = Completer<AuthRepositoryState>();

  /// Cancel all subscriptions
  await _authStateChangesSubscription?.cancel();

  /// Give it a bit of time to cancel
  // await Future.delayed(const Duration(seconds: 1));

  /// Check current user
  final currentUser = _authService.currentUser;
  if (currentUser is AuthUserVO) {
    try {
      resultCompleter.complete(AuthRepositoryState(authUser: currentUser));
    } catch (err) {
      _log.logTyped(AuthRepositoryLog(
          'build() _fetchUserData()', err, StackTrace.current));
      await _authService.logout();
      resultCompleter.complete(const AuthRepositoryState());
    }
  }

  /// Stream Changes
  _authStateChangesSubscription = _authService.authIdTokenChanges().listen(
    (user) async {
      _log.logTyped(AuthRepositoryLog('build authIdTokenChanges()', user));
      final tmpState = AuthRepositoryState(authUser: user);
      if (!resultCompleter.isCompleted) {
        resultCompleter.complete(tmpState);
      } else {
        state = AsyncValue.data(tmpState);
      }
    },
  );

  return resultCompleter.future;
}