57 lines
2.3 KiB
TypeScript
57 lines
2.3 KiB
TypeScript
import createClient from 'openapi-fetch'
|
|
import type { paths } from './types'
|
|
|
|
// Vue CLI uses process.env.VUE_APP_*
|
|
const vueCliBase: string | undefined = typeof process !== 'undefined' ? (process.env?.VUE_APP_API_BASE ?? undefined) : undefined
|
|
const isTest = typeof process !== 'undefined' && (process.env?.VITEST === 'true' || process.env?.NODE_ENV === 'test')
|
|
// Prefer absolute http URL in tests to avoid TLS issues and ease MSW interception
|
|
// Use host-only base URL; always pass full "/api/v1/..." paths to the client methods
|
|
const defaultBase = ''
|
|
const baseUrl: string = isTest ? 'http://localhost' : (vueCliBase || defaultBase)
|
|
|
|
let householdSlugProvider: (() => string | null) | null = null
|
|
let authTokenProvider: (() => string | null) | null = null
|
|
|
|
export function setHouseholdSlugProvider(provider: (() => string | null) | null) {
|
|
householdSlugProvider = provider
|
|
}
|
|
|
|
// Expose current household slug for SDK convenience (temporary during migration)
|
|
export function getHouseholdSlug(): string | null {
|
|
return householdSlugProvider ? householdSlugProvider() : null
|
|
}
|
|
|
|
export function setAuthTokenProvider(provider: (() => string | null) | null) {
|
|
authTokenProvider = provider
|
|
}
|
|
|
|
export const api = createClient<paths>({
|
|
baseUrl,
|
|
fetch: (input: RequestInfo | URL, init?: RequestInit) => {
|
|
const headers = new Headers(init?.headers || {})
|
|
const slug = householdSlugProvider ? householdSlugProvider() : null
|
|
if (slug) headers.set('X-Household-Slug', slug)
|
|
const token = authTokenProvider ? authTokenProvider() : null
|
|
if (token) headers.set('Authorization', `Bearer ${token}`)
|
|
return globalThis.fetch(input, {
|
|
credentials: 'include',
|
|
...init,
|
|
headers,
|
|
})
|
|
},
|
|
})
|
|
|
|
// For endpoints not yet in OpenAPI, provide a raw fetch that preserves header injection and base URL behavior
|
|
export async function fetchApi(path: string, init?: RequestInit): Promise<Response> {
|
|
const headers = new Headers(init?.headers || {})
|
|
const slug = householdSlugProvider ? householdSlugProvider() : null
|
|
if (slug) headers.set('X-Household-Slug', slug)
|
|
const token = authTokenProvider ? authTokenProvider() : null
|
|
if (token) headers.set('Authorization', `Bearer ${token}`)
|
|
const url = baseUrl ? new URL(path, baseUrl).toString() : path
|
|
return globalThis.fetch(url, {
|
|
credentials: 'include',
|
|
...init,
|
|
headers,
|
|
})
|
|
}
|