TTMT.ManageWebGUI/src/hooks/useMutationData.ts

54 lines
1.2 KiB
TypeScript
Raw Normal View History

2025-09-24 16:13:57 +07:00
import { useMutation, useQueryClient } from "@tanstack/react-query";
import axios, { type Method } from "axios";
2025-08-11 23:21:36 +07:00
type MutationDataOptions<TInput, TOutput> = {
2025-09-24 16:13:57 +07:00
url: string;
method?: Method;
onSuccess?: (data: TOutput) => void;
onError?: (error: any) => void;
invalidate?: string[][];
};
2025-08-11 23:21:36 +07:00
export function useMutationData<TInput = any, TOutput = any>({
url,
method = "POST",
onSuccess,
onError,
invalidate = [],
}: MutationDataOptions<TInput, TOutput>) {
2025-09-24 16:13:57 +07:00
const queryClient = useQueryClient();
2025-09-26 17:56:55 +07:00
return useMutation<
TOutput,
any,
{ data: TInput; url?: string; config?: any; method?: Method }
>({
mutationFn: async ({
data,
config,
url: customUrl,
method: customMethod,
}) => {
const isFormData = data instanceof FormData;
2025-08-11 23:21:36 +07:00
const response = await axios.request({
2025-09-26 17:56:55 +07:00
url: customUrl ?? url,
method: customMethod ?? method,
2025-08-11 23:21:36 +07:00
data,
2025-09-24 16:13:57 +07:00
headers: {
2025-09-26 17:56:55 +07:00
...(isFormData ? {} : { "Content-Type": "application/json" }),
2025-09-24 16:13:57 +07:00
},
...config,
});
return response.data;
2025-08-11 23:21:36 +07:00
},
onSuccess: (data) => {
invalidate.forEach((key) =>
queryClient.invalidateQueries({ queryKey: key })
2025-09-24 16:13:57 +07:00
);
onSuccess?.(data);
2025-08-11 23:21:36 +07:00
},
onError,
2025-09-24 16:13:57 +07:00
});
2025-08-11 23:21:36 +07:00
}