Some checks failed
Deploy Development / deploy (push) Successful in 50s
Test Suite / pytest-backend (push) Failing after 1m45s
Test Suite / k6 /api/health Baseline (push) Has been skipped
Test Suite / playwright-smoke (push) Has been skipped
Test Suite / lint-backend (push) Successful in 8s
Test Suite / compose-smoke (push) Has been skipped
Vermeidet irreführendes Fail to fetch nach erfolgreichem POST und hält das Formular bei Fehlern offen.
56 lines
1.5 KiB
JavaScript
56 lines
1.5 KiB
JavaScript
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
|
|
}
|