getAuthTokenStatus function

Future<AuthTokenStatus> getAuthTokenStatus({
  1. required BuildContext context,
})

getAuthTokenStatus is used to check if the Auth Token has expired or if it needs refreshing

The reason the http and graphQL client are not passed in is because by the time this function is being called they will have already been initialized

Implementation

Future<AuthTokenStatus> getAuthTokenStatus({
  required BuildContext context,
}) async {
  final CoreState? state = StoreProvider.state<CoreState>(context);
  final UserState userStateFromState = state!.userState!;

  /// Checks if user is signed in
  final bool isSignedIn = state.userState!.isSignedIn!;

  if (isSignedIn) {
    /// Token Expiry time
    final String tokenExpiryFromState = userStateFromState.tokenExpiryTime!;

    if (tokenExpiryFromState != UNKNOWN) {
      /// subtract the current time from the time the user signed in
      /// first check if token has expired
      final Duration difference =
          DateTime.parse(tokenExpiryFromState).difference(DateTime.now());

      final int differenceInMinutes = difference.inMinutes;
      final int differenceInHours = difference.inHours;

      /// If the difference is more than 10 do nothing everything is ok
      if (differenceInMinutes >= 10) {
        return AuthTokenStatus.okay;
      }

      /// Refresh the token because it is about to expire or it has expired.
      /// No PIN verification is required
      else if (differenceInMinutes > 0 && differenceInMinutes <= 9) {
        StoreProvider.dispatch<CoreState>(
            context, RefreshTokenAction(context: context));
        return AuthTokenStatus.okay;
      }

      /// Refresh the token and require PIN verification
      else if (differenceInHours > -12) {
        StoreProvider.dispatch<CoreState>(
            context, RefreshTokenAction(context: context));

        return AuthTokenStatus.requiresPin;
      }
      return AuthTokenStatus.requiresLogin;
    } else {
      return AuthTokenStatus.requiresLogin;
    }
  } else {
    return AuthTokenStatus.requiresLogin;
  }
}