import { Button, ButtonProps } from "@mantine/core"; import { useCallback, useState } from "react"; import { UseMutationResult } from "react-query"; type MutateButtonProps = Omit< ButtonProps<"button">, "onClick" | "loading" | "color" > & { mutation: UseMutationResult; args: () => VAR | null; onSuccess?: (args: DATA) => void; onError?: () => void; noReset?: boolean; }; function MutateButton({ mutation, noReset, onSuccess, onError, args, ...props }: MutateButtonProps) { const { mutateAsync } = mutation; const [isLoading, setLoading] = useState(false); const onClick = useCallback(async () => { setLoading(true); try { const argument = args(); if (argument !== null) { const data = await mutateAsync(argument); onSuccess?.(data); } else { onError?.(); } } catch (error) { onError?.(); } setLoading(false); }, [args, mutateAsync, onError, onSuccess]); return ; } export default MutateButton;