ajustes
This commit is contained in:
@@ -1,16 +1,45 @@
|
||||
// Wrapper sobre $fetch que injeta o Authorization header automaticamente.
|
||||
// Em caso de 401, tenta renovar o token via refresh e repete a requisição.
|
||||
export function useApi() {
|
||||
const { public: { apiBase } } = useRuntimeConfig()
|
||||
const token = useCookie<string | null>('auth_token')
|
||||
const refreshToken = useCookie<string | null>('refresh_token')
|
||||
|
||||
function apiFetch<T>(path: string, options: Parameters<typeof $fetch>[1] = {}): Promise<T> {
|
||||
return $fetch<T>(`${apiBase}${path}`, {
|
||||
async function tryRefresh(): Promise<boolean> {
|
||||
if (!refreshToken.value) return false
|
||||
try {
|
||||
const res = await $fetch<{ access_token: string; refresh_token: string }>(
|
||||
`${apiBase}/auth/refresh`,
|
||||
{ method: 'POST', body: { refresh_token: refreshToken.value } }
|
||||
)
|
||||
token.value = res.access_token
|
||||
refreshToken.value = res.refresh_token
|
||||
return true
|
||||
} catch {
|
||||
token.value = null
|
||||
refreshToken.value = null
|
||||
navigateTo('/login')
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
async function apiFetch<T>(path: string, options: Parameters<typeof $fetch>[1] = {}): Promise<T> {
|
||||
const doFetch = () => $fetch<T>(`${apiBase}${path}`, {
|
||||
...options,
|
||||
headers: {
|
||||
...(options.headers as Record<string, string> || {}),
|
||||
...(token.value ? { Authorization: `Bearer ${token.value}` } : {}),
|
||||
},
|
||||
})
|
||||
|
||||
try {
|
||||
return await doFetch()
|
||||
} catch (err: any) {
|
||||
if (err?.status === 401 && await tryRefresh()) {
|
||||
return await doFetch()
|
||||
}
|
||||
throw err
|
||||
}
|
||||
}
|
||||
|
||||
return { apiFetch }
|
||||
|
||||
Reference in New Issue
Block a user