You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
24 lines
799 B
24 lines
799 B
import { request, unwrapApiBody, type ApiResponse } from '~/utils/http/factory'
|
|
import { getApiErrorMessage } from '~/utils/http/error-message'
|
|
|
|
type RequestOptions = NonNullable<Parameters<typeof request>[1]>
|
|
export type ClientFetchOptions = RequestOptions & { notify?: boolean }
|
|
|
|
export function useClientApi() {
|
|
const toast = useToast()
|
|
|
|
async function fetchData<T>(url: string, options?: ClientFetchOptions): Promise<T> {
|
|
const { notify = true, ...rest } = options ?? {}
|
|
try {
|
|
const res = await request<ApiResponse<T>>(url, rest)
|
|
return unwrapApiBody(res)
|
|
} catch (e: unknown) {
|
|
if (import.meta.client && notify) {
|
|
toast.add({ title: getApiErrorMessage(e), color: 'error' })
|
|
}
|
|
throw e
|
|
}
|
|
}
|
|
|
|
return { fetchData, getApiErrorMessage }
|
|
}
|
|
|