setPersistence method

Future<bool> setPersistence(
  1. Persistence persistence
)

Sets the persistence type for authentication state.

persistence The persistence type to set.

Handles switching persistence, migrating tokens if needed.

Returns a Future that completes with a boolean indicating success.

Example:

bool success = await auth.setPersistence(Persistence.LOCAL);

Implementation

Future<bool> setPersistence(Persistence persistence) async {
  await _initFuture;
  IdTokenResult? accessToken;
  String? refreshToken;
  String? loginState;
  String? verifier;
  String? providerId;

  if (!kIsWeb) {
    throw FusabaseAuthException(
      message: AuthErrorMessageTemplates.PERSISTENCE_WEB_ONLY,
      code: 'invalid-persistence',
    );
  }
  try {
    accessToken = await __getIdTokenResult(
      app.options.appID + globals.accessTokenKey,
    );
    refreshToken = await __getToken(
      app.options.appID + globals.refreshTokenKey,
    );
  } catch (e) {
    //do nothing
  }

  for (var j = 0; j < 4; j++) {
    if (accessToken != null && refreshToken != null) {
      break;
    }

    switch (j) {
      case 0:
        _persistenceManager.setLocalPersistence();
        break;
      case 1:
        _persistenceManager.setIndexedDBPersistence();
        break;
      case 2:
        _persistenceManager.setSessionPersistence();
        break;
      case 3:
        _persistenceManager.setInMemoryPersistence();
        break;
    }

    accessToken = await __getIdTokenResult(
      app.options.appID + globals.accessTokenKey,
    );
    refreshToken = await __getToken(
      app.options.appID + globals.refreshTokenKey,
    );
  }

  await __removeCredTokens();

  if (accessToken == null || refreshToken == null) {
    await _signOutOnEvent();
    return _persistenceManager.setPersistence(persistence);
  } else {
    dynamic res = await _persistenceManager.setPersistence(persistence);
    if (!res) {
      await __setCredTokens({
        "accessToken": accessToken,
        "refreshToken": refreshToken,
      });
      return false;
    }
    await __setCredTokens({
      "accessToken": accessToken,
      "refreshToken": refreshToken,
    });
    _syncLoginPersistence(accessToken.token, refreshToken);
    dynamic userDetails;
    try {
      userDetails = await _authHelper.getUserDetails(
        accessToken: accessToken,
      );
    } catch (e) {
      __updateCurrentUser(null);
      return true;
    }

    final User user = User(
      user: userDetails,
      auth: this,
      accessToken: accessToken,
      refreshToken: refreshToken,
    );
    await user.getFUSABASEToken();
    __updateCurrentUser(user);
    return true;
  }
}