89 lines
2.5 KiB
TypeScript
89 lines
2.5 KiB
TypeScript
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' });
|
|
},
|
|
};
|
|
};
|