Spaces:
Runtime error
Runtime error
export type RequestModel = { | |
params?: object; | |
headers?: object; | |
signal?: AbortSignal; | |
}; | |
export type RequestWithBodyModel = RequestModel & { | |
body?: object | FormData; | |
}; | |
export const useFetch = () => { | |
const handleFetch = async ( | |
url: string, | |
request: any, | |
signal?: AbortSignal, | |
) => { | |
const requestUrl = request?.params ? `${url}${request.params}` : url; | |
const requestBody = request?.body | |
? request.body instanceof FormData | |
? { ...request, body: request.body } | |
: { ...request, body: JSON.stringify(request.body) } | |
: request; | |
const headers = { | |
...(request?.headers | |
? request.headers | |
: request?.body && request.body instanceof FormData | |
? {} | |
: { 'Content-type': 'application/json' }), | |
}; | |
return fetch(requestUrl, { ...requestBody, headers, signal }) | |
.then((response) => { | |
if (!response.ok) throw response; | |
const contentType = response.headers.get('content-type'); | |
const contentDisposition = response.headers.get('content-disposition'); | |
const headers = response.headers; | |
const result = | |
contentType && | |
(contentType?.indexOf('application/json') !== -1 || | |
contentType?.indexOf('text/plain') !== -1) | |
? response.json() | |
: contentDisposition?.indexOf('attachment') !== -1 | |
? response.blob() | |
: response; | |
return result; | |
}) | |
.catch(async (err) => { | |
const contentType = err.headers.get('content-type'); | |
const errResult = | |
contentType && contentType?.indexOf('application/problem+json') !== -1 | |
? await err.json() | |
: err; | |
throw errResult; | |
}); | |
}; | |
return { | |
get: async <T>(url: string, request?: RequestModel): Promise<T> => { | |
return handleFetch(url, { ...request, method: 'get' }); | |
}, | |
post: async <T>( | |
url: string, | |
request?: RequestWithBodyModel, | |
): Promise<T> => { | |
return handleFetch(url, { ...request, method: 'post' }); | |
}, | |
put: async <T>(url: string, request?: RequestWithBodyModel): Promise<T> => { | |
return handleFetch(url, { ...request, method: 'put' }); | |
}, | |
patch: async <T>( | |
url: string, | |
request?: RequestWithBodyModel, | |
): Promise<T> => { | |
return handleFetch(url, { ...request, method: 'patch' }); | |
}, | |
delete: async <T>(url: string, request?: RequestModel): Promise<T> => { | |
return handleFetch(url, { ...request, method: 'delete' }); | |
}, | |
}; | |
}; | |