import { useAuthStore } from '../stores/authStore'; import type { LoginResponse, RegisterData, User } from '../stores/authStore'; const API_BASE_URL = process.env.EXPO_PUBLIC_API_URL ?? 'http://localhost:8000'; export const authService = { async login(email: string, password: string): Promise { const res = await fetch(`${API_BASE_URL}/api/auth/login`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email, password }), }); if (!res.ok) { const body = await res.json().catch(() => ({})); throw new Error(body.message ?? body.error ?? `Login failed (${res.status})`); } const data: LoginResponse = await res.json(); // Sync with store useAuthStore.setState({ user: data.user, accessToken: data.accessToken, refreshToken: data.refreshToken, isAuthenticated: true, }); return data; }, async register(data: RegisterData): Promise { const res = await fetch(`${API_BASE_URL}/api/auth/register`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data), }); if (!res.ok) { const body = await res.json().catch(() => ({})); throw new Error(body.message ?? body.error ?? `Registration failed (${res.status})`); } const result: LoginResponse = await res.json(); useAuthStore.setState({ user: result.user, accessToken: result.accessToken, refreshToken: result.refreshToken, isAuthenticated: true, }); return result; }, async logout(): Promise { const { accessToken } = useAuthStore.getState(); if (accessToken) { try { await fetch(`${API_BASE_URL}/api/auth/logout`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${accessToken}`, }, }); } catch { /* ignore */ } } useAuthStore.setState({ user: null, accessToken: null, refreshToken: null, isAuthenticated: false, }); }, async refreshToken(): Promise { const { refreshToken } = useAuthStore.getState(); if (!refreshToken) return null; const res = await fetch(`${API_BASE_URL}/api/auth/refresh`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ refreshToken }), }); if (!res.ok) { useAuthStore.setState({ user: null, accessToken: null, refreshToken: null, isAuthenticated: false, error: 'Session expired', }); return null; } const data: LoginResponse = await res.json(); useAuthStore.setState({ user: data.user, accessToken: data.accessToken, refreshToken: data.refreshToken, isAuthenticated: true, }); return data; }, };