INTO-CPS-Association/DTaaS

View on GitHub
client/src/util/auth/Authentication.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { User } from 'oidc-client-ts';
import { useDispatch } from 'react-redux';
import { setUserName } from 'store/auth.slice';
import { AuthContextProps } from 'react-oidc-context';
import { getLogoutRedirectURI, useAppURL, cleanURL } from 'util/envUtil';

export interface CustomAuthContext {
  signoutRedirect: () => Promise<void>;
  removeUser: () => Promise<void>;
  signoutSilent: () => Promise<void>;
  revokeTokens: () => Promise<void>;
  user?: User | null | undefined;
}

export function getAndSetUsername(auth: CustomAuthContext) {
  const dispatch = useDispatch();
  if (auth.user !== null && auth.user !== undefined) {
    const profileUrl = auth.user.profile.profile ?? '';
    const username = profileUrl.split('/').filter(Boolean).pop() ?? '';
    sessionStorage.setItem('username', username ?? '');
    dispatch(setUserName(username));
  }
}

export async function signOut(auth: AuthContextProps) {
  if (!auth.user) {
    return;
  }
  const LOGOUT_URL = getLogoutRedirectURI() ?? '';
  const APP_URL = cleanURL(useAppURL());
  const idToken = auth.user.id_token;
  try {
    await auth.revokeTokens();
    await auth.removeUser();
    await auth.clearStaleState();
    sessionStorage.clear();
    document.cookie = '_xsrf=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
    await auth.signoutRedirect({
      post_logout_redirect_uri: LOGOUT_URL.toString(),
      id_token_hint: idToken,
    });
    await fetch(`${APP_URL}/_oauth/logout`, {
      signal: AbortSignal.timeout(30000),
    });
    setTimeout(() => {
      window.location.reload();
    }, 3000);
  } catch (e) {
    throw new Error(`Error occurred during logout: ${e}`);
  }
}

export function wait(milliseconds: number): Promise<void> {
  return new Promise<void>((resolve) => {
    const onTimeout = () => {
      resolve();
    };
    setTimeout(onTimeout, milliseconds);
  });
}