import type { ChangePasswordRequest, CurrentUserResponse, EmailRequest, NotificationListResponse, OkResponse, OtpRequestResponse, PasswordLoginRequest, RegisterCitizenRequest, RegisterCitizenResponse, RewardsResponse, TokenResponse, VerifyOtpRequest } from "~/types/api"; export const useAuth = () => { const token = useCookie('auth_token', { maxAge: 60 * 60 * 12, sameSite: 'lax', watch: true }) const tokenState = useState('auth_token_state', () => token.value ?? null) type UserContext = CurrentUserResponse['user'] const user = useState('auth_user', () => null) const isSyncingUser = useState('auth_syncing', () => false) const isAuthenticated = computed(() => !!(tokenState.value || token.value)) watch(() => token.value, (newVal) => { tokenState.value = newVal || null }) const syncUser = async () => { const tokenVal = tokenState.value || token.value if (!tokenVal || isSyncingUser.value) return isSyncingUser.value = true try { const res = await fetchCurrentUser() if (res.ok) { console.log('[Auth] User synced successfully') user.value = res.user } } catch (error) { console.error('[Auth] Sync failed, logging out:', error) logout() } finally { isSyncingUser.value = false } } const handleLoginSuccess = async (jwtToken: string) => { token.value = jwtToken tokenState.value = jwtToken await syncUser() } const logout = () => { token.value = null tokenState.value = null user.value = null navigateTo('/auth/login') } const register = (body: RegisterCitizenRequest) => useApiFetch('/api/v1/auth/register', { method: 'POST', body }) const requestOtp = (body: EmailRequest) => useApiFetch('/api/v1/auth/otp/request', { method: 'POST', body }) const verifyOtp = (body: VerifyOtpRequest) => useApiFetch('/api/v1/auth/otp/verify', { method: 'POST', body }) const loginWithPassword = (body: PasswordLoginRequest) => useApiFetch('/api/v1/auth/login/password', { method: 'POST', body }) const changePassword = (body: ChangePasswordRequest) => useApiFetch('/api/v1/auth/change-password', { method: 'POST', body }) const fetchCurrentUser = () => useApiFetch('/api/v1/me', { method: 'GET' }) const fetchRewards = (query?: { page?: number; per_page?: number }) => useApiFetch('/api/v1/me/rewards', { method: 'GET', query }) const fetchNotifications = (query?: { page?: number; per_page?: number }) => useApiFetch('/api/v1/notifications', { method: 'GET', query }) const markNotificationRead = (id: number) => useApiFetch(`/api/v1/notifications/${id}/read`, { method: 'PATCH' }) return { user, token, tokenState, isSyncingUser, isAuthenticated, handleLoginSuccess, syncUser, logout, register, requestOtp, verifyOtp, loginWithPassword, changePassword, fetchCurrentUser, fetchRewards, fetchNotifications, markNotificationRead, } }