Files
cargaMasiva_front/src/hooks/use-session.tsx
T
2025-07-02 15:46:51 -06:00

53 lines
1.2 KiB
TypeScript

// hooks/use-session.ts
import { useEffect, useState } from "react";
import { jwtDecode } from "jwt-decode";
interface JwtPayload {
sub: string;
email: string;
tipo: string;
exp: number; // <-- Asegúrate de incluir esto
}
export const useSession = () => {
const [data, setData] = useState<JwtPayload | null>(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
const token = localStorage.getItem("token");
if (!token) {
setLoading(false);
return;
}
try {
const decoded = jwtDecode<JwtPayload>(token);
const now = Date.now() / 1000;
if (decoded.exp < now) {
// Token expirado
localStorage.removeItem("token");
setData(null);
} else {
setData(decoded);
// Programar logout automático al momento exacto de expiración
const timeout = setTimeout(() => {
localStorage.removeItem("token");
setData(null);
window.location.reload();
}, (decoded.exp - now) * 1000);
return () => clearTimeout(timeout);
}
} catch (e) {
console.error("Token inválido", e);
localStorage.removeItem("token");
} finally {
setLoading(false);
}
}, []);
return { loading, data };
};