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();
  await _serviceStateSubscription?.cancel();

  ref.onDispose(() {
    _authStateChangesSubscription?.cancel();
    _serviceStateSubscription?.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);
    }
  });

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

  return resultCompleter.future;
}