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