imeeting/frontend/src/hooks/useAuth.ts

51 lines
1.6 KiB
TypeScript
Raw Normal View History

import { useEffect, useState, useMemo } from "react";
import { UserProfile } from "../types";
export function useAuth() {
const [accessToken, setAccessToken] = useState<string | null>(() => localStorage.getItem("accessToken"));
const parseJwtPayload = (token: string) => {
try {
const payloadPart = token.split(".")[1];
if (!payloadPart) return null;
const normalized = payloadPart.replace(/-/g, "+").replace(/_/g, "/");
const padded = normalized + "=".repeat((4 - (normalized.length % 4)) % 4);
return JSON.parse(atob(padded));
} catch (e) {
return null;
}
};
useEffect(() => {
const handler = () => setAccessToken(localStorage.getItem("accessToken"));
window.addEventListener("storage", handler);
return () => window.removeEventListener("storage", handler);
}, []);
const profile = useMemo<UserProfile | null>(() => {
const data = sessionStorage.getItem("userProfile");
if (data) {
return JSON.parse(data);
}
if (!accessToken) {
return null;
}
const payload = parseJwtPayload(accessToken);
if (payload && (payload.pwdResetRequired === 0 || payload.pwdResetRequired === 1)) {
return { pwdResetRequired: Number(payload.pwdResetRequired) } as UserProfile;
}
return null;
}, [accessToken]);
const isAuthed = !!accessToken;
const logout = () => {
localStorage.removeItem("accessToken");
localStorage.removeItem("refreshToken");
sessionStorage.removeItem("userProfile");
setAccessToken(null);
};
return { accessToken, isAuthed, profile, logout };
}