import { config, metrics } from 'config'; import { isLoggedInVar } from 'state-management/session'; // eslint-disable-next-line import/no-extraneous-dependencies import decode from 'jwt-decode'; import { getAsyncItem, removeAsyncItem, setAsyncItem } from './asyncStorage'; import { getEpochAddedMinutes, getCurrentEpoch } from './dateTime'; import { removeActiveRoomId } from './room'; const { STORAGE } = metrics; const { auth } = config; export const setAccessToken = async (accessToken: string) => { await setAsyncItem(STORAGE.ACCESS_TOKEN_KEY, accessToken); }; export const getAccessToken = async () => getAsyncItem(STORAGE.ACCESS_TOKEN_KEY); export const removeAccessToken = async () => removeAsyncItem(STORAGE.ACCESS_TOKEN_KEY); export const setPreRequestedRoute = async (route: string) => await setAsyncItem(STORAGE.PRE_REQUESTED_ROUTE, route); export const getPreRequestedRoute = async () => getAsyncItem(STORAGE.PRE_REQUESTED_ROUTE); export const removePreRequestedRoute = async () => removeAsyncItem(STORAGE.PRE_REQUESTED_ROUTE); export const setRefreshToken = async (refreshToken: string) => setAsyncItem(STORAGE.REFRESH_TOKEN_KEY, refreshToken); export const getRefreshToken = async () => getAsyncItem(STORAGE.REFRESH_TOKEN_KEY); export const removeRefreshToken = async () => removeAsyncItem(STORAGE.REFRESH_TOKEN_KEY); export const logout = async () => { await removeAccessToken(); await removePreRequestedRoute(); await removeActiveRoomId(); await removeRefreshToken(); isLoggedInVar(false); }; export const isAccessTokenValid = async () => { const token = await getAccessToken(); if (!token) return null; const jwt = decode(token as string) as any; const currentEpoch = getEpochAddedMinutes(getCurrentEpoch(), 2); return jwt.exp > currentEpoch ? token : null; }; export const getNewAccessToken = async (): Promise => { try { const tokenResponse = await fetch(`${auth.url}auth/refresh-token`, { method: 'GET', headers: { refresh_token: (await getRefreshToken()) as string, }, }); if (tokenResponse.status === 200) { const parsedResponse = await tokenResponse.json(); await setAccessToken(parsedResponse.token); return parsedResponse.token; } else { await logout(); return null; } } catch (error) { await logout(); return null; } };