feat: rewrite auth (#364)

* feat: wip rewrite auth

* feat: restructure folders and fix stories and tests

* feat: remove auth provider and fix tests
This commit is contained in:
Jérémy M
2023-06-23 17:49:50 +02:00
committed by GitHub
parent 1c7980b270
commit c6708b2c1f
54 changed files with 1268 additions and 584 deletions

View File

@ -0,0 +1,82 @@
import { useCallback } from 'react';
import { useRecoilState } from 'recoil';
import { useChallengeMutation, useVerifyMutation } from '~/generated/graphql';
import { tokenService } from '../services/TokenService';
import { currentUserState } from '../states/currentUserState';
import { isAuthenticatingState } from '../states/isAuthenticatingState';
export function useAuth() {
const [, setCurrentUser] = useRecoilState(currentUserState);
const [, setIsAuthenticating] = useRecoilState(isAuthenticatingState);
const [challenge] = useChallengeMutation();
const [verify] = useVerifyMutation();
const handleChallenge = useCallback(
async (email: string, password: string) => {
const challengeResult = await challenge({
variables: {
email,
password,
},
});
if (challengeResult.errors) {
throw challengeResult.errors;
}
if (!challengeResult.data?.challenge) {
throw new Error('No login token');
}
return challengeResult.data.challenge;
},
[challenge],
);
const handleVerify = useCallback(
async (loginToken: string) => {
const verifyResult = await verify({
variables: { loginToken },
});
if (verifyResult.errors) {
throw verifyResult.errors;
}
if (!verifyResult.data?.verify) {
throw new Error('No verify result');
}
tokenService.setTokenPair(verifyResult.data?.verify.tokens);
setIsAuthenticating(false);
setCurrentUser(verifyResult.data?.verify.user);
return verifyResult.data?.verify;
},
[setCurrentUser, setIsAuthenticating, verify],
);
const handleLogin = useCallback(
async (email: string, password: string) => {
const { loginToken } = await handleChallenge(email, password);
await handleVerify(loginToken.token);
},
[handleChallenge, handleVerify],
);
const handleLogout = useCallback(() => {
tokenService.removeTokenPair();
}, []);
return {
challenge: handleChallenge,
verify: handleVerify,
login: handleLogin,
logout: handleLogout,
};
}

View File

@ -0,0 +1,21 @@
import { useEffect, useState } from 'react';
import { cookieStorage } from '@/utils/cookie-storage';
export function useIsLogged(): boolean {
const [value, setValue] = useState<string | undefined>(
cookieStorage.getItem('accessToken'),
);
useEffect(() => {
const updateValue = (newValue: string | undefined) => setValue(newValue);
cookieStorage.addEventListener('accessToken', updateValue);
return () => {
cookieStorage.removeEventListener('accessToken', updateValue);
};
}, []);
return !!value;
}