@gqty/react
Version:
The No-GraphQL Client for React
75 lines (72 loc) • 2.15 kB
JavaScript
import { GQtyError } from 'gqty';
import * as React from 'react';
const createUseMutation = ({ resolve, refetch }, {
defaults: { mutationSuspense: defaultSuspense, retry: defaultRetry }
}) => {
const useMutation = (mutationFn, {
onCompleted,
onComplete = onCompleted,
onError,
retry = defaultRetry,
refetchQueries = [],
awaitRefetchQueries,
suspense = defaultSuspense,
noCache = false,
extensions
} = {}) => {
const [state, setState] = React.useState({});
if (suspense) {
if (state.promise) throw state.promise;
if (state.error) throw state.error;
}
const mutate = React.useCallback(
async ({
fn = mutationFn,
args
} = {}) => {
if (!fn) {
throw new GQtyError(`Please specify a mutation function.`);
}
try {
const promise = resolve(
({ mutation }) => {
if (mutation === void 0) {
throw new GQtyError(`Mutation is not defined in the schema.`);
}
return fn(mutation, args);
},
{
cachePolicy: noCache ? "no-store" : "no-cache",
retryPolicy: retry,
extensions
}
).then((data2) => {
const refetches = refetchQueries.map((v) => refetch(v));
return awaitRefetchQueries ? Promise.all(refetches).then(() => data2) : data2;
});
setState({ promise });
const data = await promise;
await (onComplete == null ? void 0 : onComplete(data));
setState({ data });
return data;
} catch (e) {
const error = GQtyError.create(e);
onError == null ? void 0 : onError(error);
setState({ error });
throw error;
}
},
[mutationFn, noCache, retry, refetchQueries, awaitRefetchQueries]
);
return Object.freeze([
mutate,
Object.freeze({
data: state.data,
error: state.error,
isLoading: state.promise !== void 0
})
]);
};
return useMutation;
};
export { createUseMutation };