Fix session expiration handling
This commit is contained in:
@@ -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');
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user