Kairo-Jinkendo/frontend/src/api/client.js

56 lines
1.5 KiB
JavaScript
Raw Normal View History

const TOKEN_KEY = 'kairo_auth_token'
export { TOKEN_KEY }
export function getToken() {
return localStorage.getItem(TOKEN_KEY) || ''
}
export function setToken(token) {
if (token) localStorage.setItem(TOKEN_KEY, token)
else localStorage.removeItem(TOKEN_KEY)
}
export function apiHeaders(token = getToken()) {
const headers = { 'Content-Type': 'application/json' }
if (token) headers['X-Auth-Token'] = token
return headers
}
export function parseError(body, fallback) {
if (!body) return fallback
if (typeof body.detail === 'string') return body.detail
if (Array.isArray(body.detail)) {
return body.detail.map((d) => d.msg || JSON.stringify(d)).join(', ')
}
return fallback
}
export async function apiFetch(path, options = {}) {
const token = options.token ?? getToken()
let res
try {
res = await fetch(path, {
...options,
headers: { ...apiHeaders(token), ...options.headers },
})
} catch (err) {
const message =
err instanceof TypeError
? 'Netzwerkfehler — Server nicht erreichbar. Bitte Verbindung prüfen oder Seite neu laden.'
: err.message || 'Netzwerkfehler bei der Anfrage'
const networkErr = new Error(message)
networkErr.cause = err
throw networkErr
}
const body = await res.json().catch(() => null)
if (!res.ok) {
const message = parseError(body, `Anfrage fehlgeschlagen (${res.status})`)
const err = new Error(message)
err.status = res.status
err.body = body
throw err
}
return body
}