initialize method

Future<void> initialize({
  1. bool initialCheck = true,
  2. bool listening = false,
})
inherited

Implementation

Future<void> initialize({
  bool initialCheck = true,
  bool listening = false,
}) async {
  if (_disposed || _initializing) return;
  _initializing = true;

  try {
    final cached = await _backup.cache;
    if (_disposed) return;

    final isCachedLoggedIn = cached != null && cached.isLoggedIn;
    if (initialCheck && isCachedLoggedIn) {
      _statusNotifier.value = AuthStatus.authenticated;
      _emitUser(cached);
    }

    final rawUid = await delegate.rawUid;
    if (_disposed) return;

    if (rawUid == null || rawUid.isEmpty) {
      if (isCachedLoggedIn) await _clearLocal();
      if (_disposed) return;
      _emitUser(null);
      _statusNotifier.value = AuthStatus.unauthenticated;
      return;
    }

    final remote = await _backup.onFetchUser(rawUid);
    if (_disposed) return;

    if (remote != null) {
      if (remote.isLoggedIn) {
        await _backup.setAsLocal(remote);
        if (_disposed) return;
        _statusNotifier.value = AuthStatus.authenticated;
        _emitUser(remote);
      } else {
        await _clearLocal();
        if (_disposed) return;
        _emitUser(null);
        _statusNotifier.value = AuthStatus.unauthenticated;
      }
    }

    if (listening) {
      await _subscription?.cancel();
      if (_disposed) return;
      _subscription = _backup.onListenUser(rawUid).listen(
        (remote) async {
          if (_disposed) return;
          if (remote != null && remote.isLoggedIn) {
            await _backup.setAsLocal(remote);
            if (_disposed) return;
            _statusNotifier.value = AuthStatus.authenticated;
            _emitUser(remote);
          } else {
            await _clearLocal();
            if (_disposed) return;
            _emitUser(null);
            _statusNotifier.value = AuthStatus.unauthenticated;
          }
        },
        onError: (e) {
          if (!_disposed) _errorNotifier.value = e.toString();
        },
      );
    }
  } finally {
    _initializing = false;
  }
}