saleor-dashboard/src/hooks/makeMutation.ts

85 lines
2.2 KiB
TypeScript
Raw Normal View History

import { isJwtError } from "@saleor/auth/errors";
import { commonMessages } from "@saleor/intl";
import { getMutationStatus, maybe } from "@saleor/misc";
import { MutationResultAdditionalProps } from "@saleor/types";
2019-11-13 16:46:08 +00:00
import { ApolloError } from "apollo-client";
import { DocumentNode } from "graphql";
import {
MutationFunction,
MutationResult,
useMutation as useBaseMutation
} from "react-apollo";
import { useIntl } from "react-intl";
import useNotifier from "./useNotifier";
2020-05-07 11:04:15 +00:00
import useUser from "./useUser";
2019-11-13 16:46:08 +00:00
2019-11-22 15:39:20 +00:00
export type UseMutation<TData, TVariables> = [
2019-11-13 16:46:08 +00:00
MutationFunction<TData, TVariables>,
2019-12-06 17:14:19 +00:00
MutationResult<TData> & MutationResultAdditionalProps
2019-11-13 16:46:08 +00:00
];
2019-11-22 15:39:20 +00:00
export type UseMutationCbs<TData> = Partial<{
2019-11-13 16:46:08 +00:00
onCompleted: (data: TData) => void;
onError: (error: ApolloError) => void;
}>;
2019-11-22 15:39:20 +00:00
export type UseMutationHook<TData, TVariables> = (
2019-11-13 16:46:08 +00:00
cbs: UseMutationCbs<TData>
) => UseMutation<TData, TVariables>;
function makeMutation<TData, TVariables>(
mutation: DocumentNode
): UseMutationHook<TData, TVariables> {
function useMutation<TData, TVariables>({
onCompleted,
onError
}: UseMutationCbs<TData>): UseMutation<TData, TVariables> {
const notify = useNotifier();
const intl = useIntl();
2020-05-07 11:04:15 +00:00
const user = useUser();
2019-11-13 16:46:08 +00:00
const [mutateFn, result] = useBaseMutation(mutation, {
onCompleted,
onError: (err: ApolloError) => {
if (
maybe(
() =>
err.graphQLErrors[0].extensions.exception.code ===
"ReadOnlyException"
)
) {
notify({
2020-07-01 09:39:36 +00:00
status: "error",
2019-11-13 16:46:08 +00:00
text: intl.formatMessage(commonMessages.readOnly)
});
} else if (err.graphQLErrors.some(isJwtError)) {
2020-05-07 11:04:15 +00:00
user.logout();
notify({
2020-07-01 09:39:36 +00:00
status: "error",
2020-05-07 11:04:15 +00:00
text: intl.formatMessage(commonMessages.sessionExpired)
});
2019-11-13 16:46:08 +00:00
} else {
notify({
2020-07-01 09:39:36 +00:00
status: "error",
2019-11-13 16:46:08 +00:00
text: intl.formatMessage(commonMessages.somethingWentWrong)
});
}
if (onError) {
onError(err);
}
}
});
2019-12-06 17:11:28 +00:00
return [
mutateFn,
{
...result,
2019-12-06 17:17:44 +00:00
status: getMutationStatus(result)
2019-12-06 17:11:28 +00:00
}
];
2019-11-13 16:46:08 +00:00
}
return useMutation;
}
export default makeMutation;