Files
circle-collect/src/hooks/core/useCreate.ts
T

39 lines
1.3 KiB
TypeScript

import { useMutation, UseMutationOptions, useQueryClient } from '@tanstack/react-query';
import apiClient from '../../api/client';
import {
normalizeApiError,
resolveMutationRequest,
} from './apiDebug';
export const useCreate = <T, R>(
resource: string,
options?: UseMutationOptions<R, Error, T>
) => {
const queryClient = useQueryClient();
return useMutation<R, Error, T>({
...options,
mutationFn: async (payload: T) => {
const { url, body } = resolveMutationRequest(resource, payload);
try {
const { data } = await apiClient.post<R>(url, body);
return data;
} catch (error) {
throw normalizeApiError(error);
}
},
onSuccess: (data, variables, onMutateResult, context) => {
const { url } = resolveMutationRequest(resource, variables);
queryClient.invalidateQueries({ queryKey: [url] });
if (resource && resource !== url) {
queryClient.invalidateQueries({ queryKey: [resource] });
}
options?.onSuccess?.(data, variables, onMutateResult, context);
},
onError: (error, variables, onMutateResult, context) => {
options?.onError?.(error, variables, onMutateResult, context);
},
});
};