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 => { 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)}`; } };