import axios from 'axios' import { parse } from 'cookie-es' import type { AxiosInstance, InternalAxiosRequestConfig } from 'axios' /** * Single axios instance for the Laravel API (`VITE_API_URL`, e.g. …/api/v1). * Auth: Bearer token from cookie `accessToken` (set by login). * Use composables built on this client for real API calls; Vuexy `useApi` remains for demos/mocks. */ 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) return cookies.accessToken ?? 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) { document.cookie = 'accessToken=; path=/; max-age=0' document.cookie = 'userData=; path=/; max-age=0' document.cookie = 'userAbilityRules=; path=/; max-age=0' if (typeof window !== 'undefined' && window.location.pathname !== '/login') { window.location.href = '/login' } } return Promise.reject(error) }, ) export { apiClient }