102 lines
2.6 KiB
TypeScript

import type { AuthTokens, User } from '@avanzacast/shared-types';
const TOKEN_KEY = 'avanzacast_tokens';
const USER_KEY = 'avanzacast_user';
/**
* Guarda los tokens de autenticación en localStorage
*/
export const saveTokens = (tokens: AuthTokens): void => {
if (typeof window === 'undefined') return;
localStorage.setItem(TOKEN_KEY, JSON.stringify(tokens));
};
/**
* Obtiene los tokens de autenticación desde localStorage
*/
export const getTokens = (): AuthTokens | null => {
if (typeof window === 'undefined') return null;
const tokens = localStorage.getItem(TOKEN_KEY);
return tokens ? JSON.parse(tokens) : null;
};
/**
* Elimina los tokens de autenticación
*/
export const removeTokens = (): void => {
if (typeof window === 'undefined') return;
localStorage.removeItem(TOKEN_KEY);
};
/**
* Guarda los datos del usuario en localStorage
*/
export const saveUser = (user: User): void => {
if (typeof window === 'undefined') return;
localStorage.setItem(USER_KEY, JSON.stringify(user));
};
/**
* Obtiene los datos del usuario desde localStorage
*/
export const getUser = (): User | null => {
if (typeof window === 'undefined') return null;
const user = localStorage.getItem(USER_KEY);
return user ? JSON.parse(user) : null;
};
/**
* Elimina los datos del usuario
*/
export const removeUser = (): void => {
if (typeof window === 'undefined') return;
localStorage.removeItem(USER_KEY);
};
/**
* Limpia toda la información de autenticación
*/
export const clearAuth = (): void => {
removeTokens();
removeUser();
};
/**
* Verifica si el token de acceso ha expirado
*/
export const isTokenExpired = (tokens: AuthTokens | null): boolean => {
if (!tokens) return true;
const expirationTime = Date.now() + tokens.expiresIn * 1000;
return Date.now() >= expirationTime;
};
/**
* Obtiene el header de autorización para peticiones HTTP
*/
export const getAuthHeader = (): Record<string, string> => {
const tokens = getTokens();
if (!tokens) return {};
return {
Authorization: `Bearer ${tokens.accessToken}`,
};
};
/**
* Verifica si el usuario está autenticado
*/
export const isAuthenticated = (): boolean => {
const tokens = getTokens();
const user = getUser();
return !!(tokens && user && !isTokenExpired(tokens));
};
/**
* Redirige al login si no está autenticado
*/
export const requireAuth = (redirectUrl: string = '/auth/login'): void => {
if (!isAuthenticated() && typeof window !== 'undefined') {
const currentPath = window.location.pathname;
window.location.href = `${redirectUrl}?redirect=${encodeURIComponent(currentPath)}`;
}
};