Skip to content

Instantly share code, notes, and snippets.

@kitze
Created April 14, 2021 14:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save kitze/3273be146208abfb77791b4e227f7b2a to your computer and use it in GitHub Desktop.
Save kitze/3273be146208abfb77791b4e227f7b2a to your computer and use it in GitHub Desktop.
magical mutation for blitz
import { useToast } from "@chakra-ui/react";
import { exists } from "app/core/utils/js-utils";
import { QueryFn, useMutation } from "blitz";
import { MutationOptions } from "react-query";
type ShowLoginOnFailFn = (s: any) => boolean;
type CustomOptions = {
errorMessage?: string;
showLoginOnFail?: boolean | ShowLoginOnFailFn;
showErrorToast?: boolean;
successToastMessage?: string;
onFail?: any;
onWin?: any;
};
export const useMagicalMutation = <
TResult extends QueryFn,
TVariables = undefined,
TError = Error,
TSnapshot = unknown
>(
c: TResult,
options: CustomOptions & MutationOptions<TResult, TVariables, TError, TSnapshot> = {
throwOnError: true,
}
) => {
// const { openAuthDialog } = useGlobalStore();
const {
errorMessage,
showLoginOnFail,
showErrorToast = true,
successToastMessage,
onFail,
onWin,
...restOfOptions
} = options;
const toast = useToast();
const showError = (title = "An error occurred") => {
toast({
title: title,
status: "error",
isClosable: true,
position: "top-right",
});
};
type Paramz = Parameters<typeof c>;
const fn = async (v: Paramz[0], a?: Paramz[1]) => {
try {
const data = await c(v, a);
if (exists(data)) {
onWin?.(data);
if (successToastMessage) {
toast({
title: successToastMessage,
status: "success",
duration: 1000,
isClosable: true,
});
}
return data;
}
} catch (err) {
const shouldShowLoginOnFail =
typeof showLoginOnFail === "boolean" ? showLoginOnFail : showLoginOnFail?.(err);
if (showErrorToast && !shouldShowLoginOnFail) {
showError(errorMessage || `Error: ${err?.message}`);
}
if (shouldShowLoginOnFail) {
// openAuthDialog(onWin);
}
onFail?.(err);
}
};
return useMutation(fn, restOfOptions);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment