@preact-signals/query
Version:
A reactive utility for React/Preact that simplifies the handling of data fetching and state management. Powered by Preact Signals, it provides hooks and functions to create reactive resources and manage their state seamlessly.
46 lines • 2.18 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.useMutation$ = void 0;
const hooks_1 = require("@preact-signals/utils/hooks");
const query_core_1 = require("@tanstack/query-core");
const react_1 = require("react");
const QueryClientProvider_1 = require("./react-query/QueryClientProvider");
const useObserver_1 = require("./useObserver");
const utils_1 = require("./utils");
const unified_signals_1 = require("@preact-signals/unified-signals");
const utils_2 = require("./react-query/utils");
function noop() { }
const useMutation$ = (options) => {
const $options = (0, utils_1.useRefBasedOptions)(options);
const $client = (0, QueryClientProvider_1.useQueryClient$)({
context: (0, hooks_1.useComputedOnce)(() => $options.value.context).value,
});
const observer = (0, hooks_1.useComputedOnce)(
// we will update current mutation observer with new options, so using `peek`
() => new query_core_1.MutationObserver($client.value, (0, utils_1.wrapFunctionsInUntracked)($options.peek())));
(0, unified_signals_1.useSignalEffect)(() => {
observer.value.setOptions((0, utils_1.wrapFunctionsInUntracked)($options.value));
});
const mutate = (0, react_1.useMemo)(() => (variables, mutateOptions) => void observer.peek().mutate(variables, mutateOptions).catch(noop), utils_1.EMPTY_ARRAY);
const observerResultToStore = (result) => ({
...result,
mutate,
mutateAsync: result.mutate,
});
const store = (0, useObserver_1.useObserverStore)(() => ({
getCurrent: () => observerResultToStore(observer.value.getCurrentResult()),
subscribe: (emit) => observer.value.subscribe((newValue) => {
emit(observerResultToStore(newValue));
}),
}));
const shouldThrow = (0, hooks_1.useComputedOnce)(() => store.error &&
(0, utils_2.shouldThrowError)(observer.value.options.useErrorBoundary, [store.error]));
if (shouldThrow.value) {
(0, unified_signals_1.untracked)(() => {
throw store.error;
});
}
return store;
};
exports.useMutation$ = useMutation$;
//# sourceMappingURL=useMutation$.js.map