| 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' }); |
| }, |
| }; |
| }; |
|
|