bd96fc032e
Co-authored-by: Copilot <copilot@github.com>
47 lines
1.4 KiB
JavaScript
47 lines
1.4 KiB
JavaScript
import axios from 'axios'
|
|
|
|
const RUNTIME = typeof window !== 'undefined' && window.__ENV__ ? window.__ENV__ : {}
|
|
|
|
const normalizeApiBaseUrl = (value, fallbackPath) => {
|
|
const rawValue = value || ''
|
|
if (!rawValue) return fallbackPath
|
|
if (/^https?:\/\//i.test(rawValue) || rawValue.startsWith('//') || rawValue.startsWith('/')) {
|
|
return rawValue
|
|
}
|
|
|
|
return `${window.location.protocol}//${rawValue}`
|
|
}
|
|
|
|
const AUTH_API = normalizeApiBaseUrl(RUNTIME.AUTH_API || import.meta.env.VITE_AUTH_API, 'http://localhost:5000')
|
|
const TRANSIT_API = normalizeApiBaseUrl(RUNTIME.TRANSIT_API || import.meta.env.VITE_TRANSIT_API, 'http://localhost:5001')
|
|
|
|
export const authClient = axios.create({ baseURL: AUTH_API })
|
|
|
|
export const transitClient = (token) => {
|
|
const client = axios.create({
|
|
baseURL: TRANSIT_API,
|
|
headers: { Authorization: `Bearer ${token}` }
|
|
})
|
|
|
|
// Auto-logout on unauthorized responses to avoid delayed failures
|
|
client.interceptors.response.use(
|
|
response => response,
|
|
error => {
|
|
try {
|
|
const status = error?.response?.status
|
|
if (status === 401 || status === 403) {
|
|
localStorage.removeItem('token')
|
|
localStorage.removeItem('user')
|
|
// reload to let App show the Login screen
|
|
if (typeof window !== 'undefined') window.location.reload()
|
|
}
|
|
} catch (e) {
|
|
// ignore
|
|
}
|
|
return Promise.reject(error)
|
|
}
|
|
)
|
|
|
|
return client
|
|
}
|