import axios from 'axios' import { parse } from 'cookie-es' import type { AxiosInstance, InternalAxiosRequestConfig } from 'axios' /** * Single axios instance for the real Laravel API (VITE_API_URL). * Auth: Bearer token from cookie 'accessToken' (set by login). * Use this for all Crewli API calls; useApi (composables/useApi) stays for Vuexy demo/mock endpoints. */ const apiClient: AxiosInstance = axios.create({ baseURL: import.meta.env.VITE_API_URL, headers: { 'Content-Type': 'application/json', Accept: 'application/json', }, timeout: 30000, }) function getAccessToken(): string | null { if (typeof document === 'undefined') return null const cookies = parse(document.cookie) const token = cookies.accessToken return token ?? null } apiClient.interceptors.request.use( (config: InternalAxiosRequestConfig) => { const token = getAccessToken() if (token) { config.headers.Authorization = `Bearer ${token}` } if (import.meta.env.DEV) { console.log(`🚀 ${config.method?.toUpperCase()} ${config.url}`, config.data) } return config }, error => Promise.reject(error), ) apiClient.interceptors.response.use( response => { if (import.meta.env.DEV) { console.log(`✅ ${response.status} ${response.config.url}`, response.data) } return response }, error => { if (import.meta.env.DEV) { console.error( `❌ ${error.response?.status} ${error.config?.url}`, error.response?.data, ) } if (error.response?.status === 401) { // Clear auth cookies (align with utils/api.ts / login flow) document.cookie = 'accessToken=; path=/; max-age=0' document.cookie = 'userData=; path=/; max-age=0' document.cookie = 'userAbilityRules=; path=/; max-age=0' if (window.location.pathname !== '/login') { window.location.href = '/login' } } return Promise.reject(error) }, ) export { apiClient }