function useAuthenticator()

in web/src/hooks/authenticator.ts [23:85]


function useAuthenticator(): Authenticator {
  const [user, setUser] = useRecoilState(loggedInUserState);
  const { showErrorNotification } = useNotifications();

  useEffect(() => {
    Hub.listen('auth', ({ payload: { event, data } }) => {
      switch (event) {
        case 'signIn':
        case 'cognitoHostedUI':
          getUser().then(userData => {
            const u = userData ? userData.userEmail as UserType : undefined;
            const lu : LoggedInUserState = { user: u };
            setUser(lu);
          });
          break;
        case 'signOut':
          setUser(undefined);
          break;
        case 'signIn_failure':
        case 'cognitoHostedUI_failure':
          showErrorNotification({
            header: i18n.signInFailureTitle,
            content: `${i18n.signInFailureText} ${data}`
          });
          break;
      }
    });

    getUser().then(userData => {
      const u = userData ? userData.userEmail as UserType : undefined;
      const lu : LoggedInUserState = { user: u };
      setUser(lu);
    });
  }, []);

  return {
    user,
    initiateAuth: () => inititateAuth(),
    initiateSignOut: () => initiateSignOut(),
  };

  function getUser() {
    return Auth.currentSession()
      .then(data => {
        const idToken = data.getIdToken();
        return {
          userEmail: idToken.payload.email
        };
      })
      .catch((err: Error) => showErrorNotification({
        header: i18n.signInFailureTitle,
        content: `${i18n.signInFailureText} ${err?.message}`
      }));
  }

  function inititateAuth() {
    return Auth.federatedSignIn();
  }

  function initiateSignOut() {
    return Auth.signOut();
  }
}