getAuthTokenStatus function
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;
}
}