53 lines
1.2 KiB
TypeScript
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 };
|
|
};
|