39 lines
1.3 KiB
TypeScript
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);
|
|
},
|
|
});
|
|
};
|