From 6bc38ec748203072807bf1bf82bf86361f1ab53a Mon Sep 17 00:00:00 2001 From: Mattrixwv Date: Sun, 16 Mar 2025 11:14:42 -0400 Subject: [PATCH] Fix login issues --- src/pages/protected/LogoutPage.tsx | 5 ++- src/pages/public/LoginPage.tsx | 4 +-- src/providers/AuthProvider.tsx | 54 +++++++++++++++++++++--------- 3 files changed, 43 insertions(+), 20 deletions(-) diff --git a/src/pages/protected/LogoutPage.tsx b/src/pages/protected/LogoutPage.tsx index 31cbc7c..06a3480 100644 --- a/src/pages/protected/LogoutPage.tsx +++ b/src/pages/protected/LogoutPage.tsx @@ -5,15 +5,14 @@ import { useNavigate } from "react-router"; export default function LogoutPage(){ - const { setJwt, setExpiration } = useAuth(); + const { reset } = useAuth(); const navigate = useNavigate(); const logout = async () => { const response = await api.get("/auth/logout"); if(response.status === 200){ - setJwt(null); - setExpiration(null); + reset(); navigate("/"); } else{ diff --git a/src/pages/public/LoginPage.tsx b/src/pages/public/LoginPage.tsx index 03a5753..f6b2550 100644 --- a/src/pages/public/LoginPage.tsx +++ b/src/pages/public/LoginPage.tsx @@ -7,7 +7,7 @@ import { Link, Navigate, useNavigate } from "react-router"; export default function LoginPage(){ - const { jwt, setJwt } = useAuth(); + const { jwt, setTokenData } = useAuth(); const navigate = useNavigate(); const { addSuccessMessage, addErrorMessage } = useTimedModal(); @@ -28,7 +28,7 @@ export default function LoginPage(){ if(response.status === 200){ addSuccessMessage("Logged in successfully"); const json = await response.json(); - setJwt(json.token); + setTokenData(json); navigate("/raidGroup"); } else{ diff --git a/src/providers/AuthProvider.tsx b/src/providers/AuthProvider.tsx index 4d5bfac..3dc401d 100644 --- a/src/providers/AuthProvider.tsx +++ b/src/providers/AuthProvider.tsx @@ -27,6 +27,10 @@ type AuthProviderState = { raidGroupRequests: RaidGroupRequest[]; tutorialsStatus: AccountTutorialStatus; setTutorialsStatus: (tutorialsStatus: AccountTutorialStatus) => void; + reset: () => void; + /* eslint-disable @typescript-eslint/no-explicit-any */ + setTokenData: (data: any) => void; + /* eslint-enable @typescript-eslint/no-explicit-any */ } const initialState: AuthProviderState = { @@ -40,7 +44,9 @@ const initialState: AuthProviderState = { gamePermissions: [], raidGroupRequests: [], tutorialsStatus: {} as AccountTutorialStatus, - setTutorialsStatus: () => null + setTutorialsStatus: () => null, + reset: () => null, + setTokenData: () => null } const AuthContext = createContext(initialState); @@ -64,23 +70,29 @@ export function AuthProvider({ const { mutate: tutorialsStatusMutation } = useUpdateTutorialsStatus(); + /* eslint-disable @typescript-eslint/no-explicit-any */ + const setTokenData = useCallback((data: any) => { + setJwt(data.token); + const decodedToken = JSON.parse(atob(data.token.split(".")[1])); + //console.log("decodedToken = "); + //console.log(decodedToken); + setExpiration(new Date(decodedToken.exp * 1000)); + setFirstFetch(false); + setAccountId(decodedToken.accountId); + setAccountPermissions(JSON.parse(decodedToken.accountPermissions)); + setRaidGroupPermissions(JSON.parse(decodedToken.raidGroupPermissions)); + setGamePermissions(JSON.parse(decodedToken.gamePermissions)); + setRaidGroupRequests(JSON.parse(decodedToken.raidGroupRequests)); + }, [ setJwt, setExpiration, setFirstFetch, setAccountId, setAccountPermissions, setRaidGroupPermissions, setGamePermissions, setRaidGroupRequests ]); + /* eslint-enable @typescript-eslint/no-explicit-any */ + const fetchToken = useCallback(async () => { //console.log("Fetching token"); try{ const response = await api.get("/auth/refresh"); //If the token is retrieved if((response.status === 200) && (!response.data.errors)){ - setJwt(response.data.token); - const decodedToken = JSON.parse(atob(response.data.token.split(".")[1])); - //console.log("decodedToken = "); - //console.log(decodedToken); - setExpiration(new Date(decodedToken.exp * 1000)); - setFirstFetch(false); - setAccountId(decodedToken.accountId); - setAccountPermissions(JSON.parse(decodedToken.accountPermissions)); - setRaidGroupPermissions(JSON.parse(decodedToken.raidGroupPermissions)); - setGamePermissions(JSON.parse(decodedToken.gamePermissions)); - setRaidGroupRequests(JSON.parse(decodedToken.raidGroupRequests)); + setTokenData(response.data); return response.data.token; } //If the token cannot be retrieved @@ -96,7 +108,7 @@ export function AuthProvider({ setExpiration(null); setFirstFetch(false); } - }, [ setJwt, setExpiration, setFirstFetch ]); + }, [ setJwt, setExpiration, setFirstFetch, setTokenData ]); //Add the token to all queries @@ -135,6 +147,17 @@ export function AuthProvider({ tutorialsStatusMutation(newTutorialsStatus); }, [ setTutorialsStatus, tutorialsStatusMutation ]); + const reset = useCallback(() => { + setJwt(null); + setExpiration(null); + setAccountId(null); + setAccountPermissions([]); + setRaidGroupPermissions([]); + setGamePermissions([]); + setRaidGroupRequests([]); + setTutorialsStatus({} as AccountTutorialStatus); + }, [ setJwt, setExpiration, setAccountId, setAccountPermissions, setRaidGroupPermissions, setGamePermissions, setRaidGroupRequests, setTutorialsStatus ]); + const currentTokens = useMemo(() => ({ jwt, setJwt, @@ -144,8 +167,9 @@ export function AuthProvider({ raidGroupPermissions, gamePermissions, raidGroupRequests, - tutorialsStatus, setTutorialsStatus: updateTutorialsStatus - }), [ jwt, expiration, accountId, accountPermissions, raidGroupPermissions, gamePermissions, raidGroupRequests, tutorialsStatus, updateTutorialsStatus ]); + tutorialsStatus, setTutorialsStatus: updateTutorialsStatus, + reset, setTokenData + }), [ jwt, expiration, accountId, accountPermissions, raidGroupPermissions, gamePermissions, raidGroupRequests, tutorialsStatus, updateTutorialsStatus, reset, setTokenData ]); //TODO: Return a spinner while the first token is being fetched