usimple-saleor-sdk
Version:
This package contains all queries and mutations that are used in our sample storefront. It can be used for semi-custom or fully-custom (with ability to extend existing queries) storefront solutions.
74 lines • 2.9 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.mutationFactory = void 0;
const react_1 = __importDefault(require("react"));
const helpers_1 = require("./helpers");
// keep track of called mutation
const useMutationTracking = (() => {
let mostRecentMutation = 0;
const generateNewMutationId = () => {
mostRecentMutation += 1;
return mostRecentMutation;
};
const isMostRecentMutation = (mutationId) => {
return mostRecentMutation === mutationId;
};
return () => ({
generateNewMutationId,
isMostRecentMutation,
});
})();
const initialState = {
called: false,
data: null,
error: null,
loading: false,
};
const useMutation = (mutation, baseVariables = {}, baseOptions = {}) => {
const saleor = helpers_1.useSaleorClient();
const { generateNewMutationId, isMostRecentMutation, } = useMutationTracking();
const [result, setResult] = react_1.default.useState(initialState);
const handleMutationStart = () => {
if (!result.loading) {
setResult({
called: true,
data: null,
error: null,
loading: true,
});
}
};
const handleMutationError = (error, mutationId) => {
if (isMostRecentMutation(mutationId)) {
setResult(prevState => (Object.assign(Object.assign({}, prevState), { error, loading: false })));
}
};
const handleMutationComplete = (data, mutationId) => {
if (isMostRecentMutation(mutationId)) {
setResult(prevState => (Object.assign(Object.assign({}, prevState), { data, loading: false })));
}
};
const runMutation = react_1.default.useCallback((variables, options) => {
return new Promise(resolve => {
handleMutationStart();
const mutationId = generateNewMutationId();
const apolloVariables = Object.assign(Object.assign({}, baseVariables), variables);
const apolloOptions = Object.assign(Object.assign({}, baseOptions), options);
saleor.legacyAPIProxy[mutation](apolloVariables, apolloOptions)
.then(data => {
handleMutationComplete(data.data, mutationId);
resolve(data);
})
.catch(err => {
handleMutationError(err, mutationId);
resolve(null);
});
});
}, [mutation, baseOptions]);
return [runMutation, result];
};
exports.mutationFactory = (mutation) => (variables, options) => useMutation(mutation, variables, options);
//# sourceMappingURL=useMutation.js.map