94 lines
2.5 KiB
TypeScript
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
|
|
};
|
|
};
|