UNPKG

@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.

93 lines 4.59 kB
"use strict"; "use client"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.useBaseQuery = void 0; const React = __importStar(require("react")); const useSyncExternalStore_1 = require("./useSyncExternalStore"); const query_core_1 = require("@tanstack/query-core"); const QueryClientProvider_1 = require("./QueryClientProvider"); const QueryErrorResetBoundary_1 = require("./QueryErrorResetBoundary"); const errorBoundaryUtils_1 = require("./errorBoundaryUtils"); const isRestoring_1 = require("./isRestoring"); const suspense_1 = require("./suspense"); function useBaseQuery(options, Observer) { const queryClient = (0, QueryClientProvider_1.useQueryClient)({ context: options.context }); const isRestoring = (0, isRestoring_1.useIsRestoring)(); const errorResetBoundary = (0, QueryErrorResetBoundary_1.useQueryErrorResetBoundary)(); const defaultedOptions = queryClient.defaultQueryOptions(options); // Make sure results are optimistically set in fetching state before subscribing or updating options defaultedOptions._optimisticResults = isRestoring ? "isRestoring" : "optimistic"; // Include callbacks in batch renders if (defaultedOptions.onError) { defaultedOptions.onError = query_core_1.notifyManager.batchCalls(defaultedOptions.onError); } if (defaultedOptions.onSuccess) { defaultedOptions.onSuccess = query_core_1.notifyManager.batchCalls(defaultedOptions.onSuccess); } if (defaultedOptions.onSettled) { defaultedOptions.onSettled = query_core_1.notifyManager.batchCalls(defaultedOptions.onSettled); } (0, suspense_1.ensureStaleTime)(defaultedOptions); (0, errorBoundaryUtils_1.ensurePreventErrorBoundaryRetry)(defaultedOptions, errorResetBoundary); (0, errorBoundaryUtils_1.useClearResetErrorBoundary)(errorResetBoundary); const [observer] = React.useState(() => new Observer(queryClient, defaultedOptions)); const result = observer.getOptimisticResult(defaultedOptions); (0, useSyncExternalStore_1.useSyncExternalStore)(React.useCallback((onStoreChange) => { const unsubscribe = isRestoring ? () => undefined : observer.subscribe(query_core_1.notifyManager.batchCalls(onStoreChange)); // Update result to make sure we did not miss any query updates // between creating the observer and subscribing to it. observer.updateResult(); return unsubscribe; }, [observer, isRestoring]), () => observer.getCurrentResult(), () => observer.getCurrentResult()); React.useEffect(() => { // Do not notify on updates because of changes in the options because // these changes should already be reflected in the optimistic result. observer.setOptions(defaultedOptions, { listeners: false }); }, [defaultedOptions, observer]); // Handle suspense if ((0, suspense_1.shouldSuspend)(defaultedOptions, result, isRestoring)) { throw (0, suspense_1.fetchOptimistic)(defaultedOptions, observer, errorResetBoundary); } // Handle error boundary if ((0, errorBoundaryUtils_1.getHasError)({ result, errorResetBoundary, useErrorBoundary: defaultedOptions.useErrorBoundary, query: observer.getCurrentQuery(), })) { throw result.error; } // Handle result property usage tracking return !defaultedOptions.notifyOnChangeProps ? observer.trackResult(result) : result; } exports.useBaseQuery = useBaseQuery; //# sourceMappingURL=useBaseQuery.js.map