import type { UserInfo, LoginForm, RegisterForm, AuthResponse } from '~/types/auth' export const useAuth = () => { const config = useRuntimeConfig() const apiBase = config.public.apiBase const user = useState('user', () => null) const isAuthenticated = computed(() => !!user.value) const loading = ref(false) const login = async (credentials: LoginForm) => { loading.value = true try { const response = await $fetch(`${apiBase}/auth/login`, { method: 'POST', body: credentials }) user.value = response.user localStorage.setItem('auth_token', response.token) return response } catch (error) { throw error } finally { loading.value = false } } const register = async (userData: RegisterForm) => { loading.value = true try { const { passwordConfirm, ...registerData } = userData const response = await $fetch(`${apiBase}/auth/register`, { method: 'POST', body: registerData }) user.value = response.user localStorage.setItem('auth_token', response.token) return response } catch (error) { throw error } finally { loading.value = false } } const logout = async () => { const token = localStorage.getItem('auth_token') try { await $fetch(`${apiBase}/auth/logout`, { method: 'POST', headers: { Authorization: `Bearer ${token}` } }) } catch (error) { console.error('Logout error:', error) } finally { user.value = null localStorage.removeItem('auth_token') await navigateTo('/auth/login') } } const checkAuth = async () => { const token = localStorage.getItem('auth_token') if (!token) return try { const response = await $fetch<{ user: UserInfo }>(`${apiBase}/auth/me`, { headers: { Authorization: `Bearer ${token}` } }) user.value = response.user } catch (error) { console.error('Auth check failed:', error) localStorage.removeItem('auth_token') } } return { user: readonly(user), isAuthenticated, loading: readonly(loading), login, register, logout, checkAuth } }