102 lines
2.6 KiB
TypeScript
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)}`;
|
|
}
|
|
};
|