94 lines
2.5 KiB
TypeScript

import { ref, computed } from 'vue';
export interface User {
id: number;
name: string;
email: string;
avatar?: string;
role: string;
}
export interface LoginCredentials {
email: string;
password: string;
}
// Estado global de autenticación
const user = ref<User | null>(null);
const token = ref<string | null>(null);
const isLoading = ref(false);
// Inicializar desde localStorage
const initAuth = () => {
const storedToken = localStorage.getItem('auth_token');
const storedUser = localStorage.getItem('auth_user');
if (storedToken && storedUser) {
token.value = storedToken;
user.value = JSON.parse(storedUser);
}
};
// Computeds
const isAuthenticated = computed(() => !!user.value && !!token.value);
// Función de login (simulada)
const login = async (credentials: LoginCredentials): Promise<{ success: boolean; error?: string }> => {
isLoading.value = true;
try {
// Simular llamada a API
await new Promise(resolve => setTimeout(resolve, 1000));
// Validación simple (en producción esto vendría del backend)
if (credentials.email === 'admin@gols.com' && credentials.password === 'admin123') {
const mockUser: User = {
id: 1,
name: 'John Doe',
email: credentials.email,
avatar: '',
role: 'admin'
};
const mockToken = 'mock-jwt-token-' + Date.now();
// Guardar en estado
user.value = mockUser;
token.value = mockToken;
// Persistir en localStorage
localStorage.setItem('auth_token', mockToken);
localStorage.setItem('auth_user', JSON.stringify(mockUser));
return { success: true };
} else {
return { success: false, error: 'Credenciales inválidas' };
}
} catch (error) {
return { success: false, error: 'Error al iniciar sesión' };
} finally {
isLoading.value = false;
}
};
// Función de logout
const logout = () => {
user.value = null;
token.value = null;
localStorage.removeItem('auth_token');
localStorage.removeItem('auth_user');
};
// Composable para usar en componentes
export const useAuth = () => {
return {
user,
token,
isLoading,
isAuthenticated,
login,
logout,
initAuth
};
};