import type { User } from '~/utils/types'; export const useAuth = () => { const user = ref(null); const isAuthenticated = computed(() => !!user.value); const loading = ref(false); const error = ref(null); // Tier-based computed properties const userTier = computed(() => user.value?.tier || 'user'); const isUser = computed(() => user.value?.tier === 'user'); const isBoard = computed(() => user.value?.tier === 'board'); const isAdmin = computed(() => user.value?.tier === 'admin'); const firstName = computed(() => { if (user.value?.firstName) return user.value.firstName; if (user.value?.name) return user.value.name.split(' ')[0]; return 'User'; }); // Helper methods const hasTier = (requiredTier: 'user' | 'board' | 'admin') => { return user.value?.tier === requiredTier; }; const hasGroup = (groupName: string) => { return user.value?.groups?.includes(groupName) || false; }; // Legacy compatibility const hasRole = (role: string) => { return hasGroup(role); }; // Direct login method const login = async (credentials: { username: string; password: string; rememberMe?: boolean }) => { loading.value = true; error.value = null; try { console.log('🔄 Starting login request...'); const response = await $fetch<{ success: boolean; redirectTo?: string; user?: User; }>('/api/auth/direct-login', { method: 'POST', body: credentials }); console.log('✅ Login response received:', response); if (response.success && response.user) { user.value = response.user; console.log('👤 User set in composable:', user.value); // Redirect to dashboard or intended page console.log('🔄 Redirecting to:', response.redirectTo || '/dashboard'); await navigateTo(response.redirectTo || '/dashboard'); return { success: true }; } console.warn('❌ Login response indicates failure:', response); return { success: false, error: 'Login failed' }; } catch (err: any) { console.error('❌ Login error caught:', err); error.value = err.data?.message || err.message || 'Login failed'; return { success: false, error: error.value }; } finally { loading.value = false; } }; // OAuth login method (fallback) const loginOAuth = () => { return navigateTo('/api/auth/login'); }; // Password reset method const requestPasswordReset = async (email: string) => { loading.value = true; error.value = null; try { const response = await $fetch<{ success: boolean; message: string; }>('/api/auth/forgot-password', { method: 'POST', body: { email } }); return { success: true, message: response.message }; } catch (err: any) { error.value = err.data?.message || 'Password reset failed'; return { success: false, error: error.value }; } finally { loading.value = false; } }; // Check authentication status const checkAuth = async () => { try { const response = await $fetch<{ authenticated: boolean; user: User | null; }>('/api/auth/session'); if (response.authenticated && response.user) { user.value = response.user; return true; } else { user.value = null; return false; } } catch (err) { console.error('Auth check error:', err); user.value = null; return false; } }; // Logout method const logout = async () => { try { await $fetch('/api/auth/logout', { method: 'POST' }); user.value = null; await navigateTo('/login'); } catch (err) { console.error('Logout error:', err); user.value = null; await navigateTo('/login'); } }; return { // State user: readonly(user), isAuthenticated, loading: readonly(loading), error: readonly(error), // Tier-based properties userTier, isUser, isBoard, isAdmin, firstName, // Helper methods hasTier, hasGroup, hasRole, // Legacy compatibility // Actions login, loginOAuth, logout, requestPasswordReset, checkAuth, }; };