Fix session expiration handling

This commit is contained in:
2026-04-23 01:10:15 -05:00
parent da4b06094e
commit 820e335d9a
22 changed files with 308 additions and 51 deletions
+51
View File
@@ -0,0 +1,51 @@
export const ACCESS_TOKEN_KEY = 'accessToken';
export const SESSION_EXPIRED_MESSAGE = 'Tu sesión expiró. Vuelve a iniciar sesión.';
export const SESSION_EXPIRED_EVENT = 'linkedsign:session-expired';
export const getAccessToken = () => localStorage.getItem(ACCESS_TOKEN_KEY);
export const setAccessToken = (token) => {
localStorage.setItem(ACCESS_TOKEN_KEY, token);
};
export const clearAccessToken = () => {
localStorage.removeItem(ACCESS_TOKEN_KEY);
};
export const getAccessTokenExpiryDelay = (token) => {
try {
const [, payload] = token.split('.');
const normalizedPayload = payload.replace(/-/g, '+').replace(/_/g, '/');
const paddedPayload = normalizedPayload.padEnd(
normalizedPayload.length + ((4 - (normalizedPayload.length % 4)) % 4),
'='
);
const decoded = JSON.parse(window.atob(paddedPayload));
if (!decoded.exp) return null;
return Math.max(decoded.exp * 1000 - Date.now(), 0);
} catch {
return null;
}
};
export const translateApiError = (error, fallback = 'Ocurrió un error. Intenta nuevamente.') => {
const code = error?.response?.data?.code;
const message = error?.response?.data?.error;
if (code === 'SESSION_EXPIRED' || /token|session|sesión/i.test(message || '')) {
return SESSION_EXPIRED_MESSAGE;
}
return message || fallback;
};
export const expireSession = ({ redirect = true } = {}) => {
clearAccessToken();
window.dispatchEvent(new CustomEvent(SESSION_EXPIRED_EVENT, {
detail: { message: SESSION_EXPIRED_MESSAGE },
}));
if (redirect && window.location.pathname !== '/login') {
window.location.replace('/login?sessionExpired=1');
}
};