@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.
104 lines • 5.31 kB
JavaScript
;
'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 () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.useQueries = useQueries;
const React = __importStar(require("react"));
const useSyncExternalStore_ts_1 = require("./useSyncExternalStore.js");
const query_core_1 = require("@tanstack/query-core");
const QueryClientProvider_tsx_1 = require("./QueryClientProvider.js");
const isRestoring_tsx_1 = require("./isRestoring.js");
const QueryErrorResetBoundary_tsx_1 = require("./QueryErrorResetBoundary.js");
const errorBoundaryUtils_ts_1 = require("./errorBoundaryUtils.js");
const suspense_ts_1 = require("./suspense.js");
function useQueries({ queries, context, }) {
const queryClient = (0, QueryClientProvider_tsx_1.useQueryClient)({ context });
const isRestoring = (0, isRestoring_tsx_1.useIsRestoring)();
const errorResetBoundary = (0, QueryErrorResetBoundary_tsx_1.useQueryErrorResetBoundary)();
const defaultedQueries = React.useMemo(() => queries.map((options) => {
const defaultedOptions = queryClient.defaultQueryOptions(options);
// Make sure the results are already in fetching state before subscribing or updating options
defaultedOptions._optimisticResults = isRestoring
? 'isRestoring'
: 'optimistic';
return defaultedOptions;
}), [queries, queryClient, isRestoring]);
defaultedQueries.forEach((query) => {
(0, suspense_ts_1.ensureStaleTime)(query);
(0, errorBoundaryUtils_ts_1.ensurePreventErrorBoundaryRetry)(query, errorResetBoundary);
});
(0, errorBoundaryUtils_ts_1.useClearResetErrorBoundary)(errorResetBoundary);
const [observer] = React.useState(() => new query_core_1.QueriesObserver(queryClient, defaultedQueries));
const optimisticResult = observer.getOptimisticResult(defaultedQueries);
(0, useSyncExternalStore_ts_1.useSyncExternalStore)(React.useCallback((onStoreChange) => isRestoring
? () => undefined
: observer.subscribe(query_core_1.notifyManager.batchCalls(onStoreChange)), [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.setQueries(defaultedQueries, { listeners: false });
}, [defaultedQueries, observer]);
const shouldAtLeastOneSuspend = optimisticResult.some((result, index) => (0, suspense_ts_1.shouldSuspend)(defaultedQueries[index], result, isRestoring));
const suspensePromises = shouldAtLeastOneSuspend
? optimisticResult.flatMap((result, index) => {
const options = defaultedQueries[index];
const queryObserver = observer.getObservers()[index];
if (options && queryObserver) {
if ((0, suspense_ts_1.shouldSuspend)(options, result, isRestoring)) {
return (0, suspense_ts_1.fetchOptimistic)(options, queryObserver, errorResetBoundary);
}
else if ((0, suspense_ts_1.willFetch)(result, isRestoring)) {
void (0, suspense_ts_1.fetchOptimistic)(options, queryObserver, errorResetBoundary);
}
}
return [];
})
: [];
if (suspensePromises.length > 0) {
throw Promise.all(suspensePromises);
}
const observerQueries = observer.getQueries();
const firstSingleResultWhichShouldThrow = optimisticResult.find((result, index) => (0, errorBoundaryUtils_ts_1.getHasError)({
result,
errorResetBoundary,
useErrorBoundary: defaultedQueries[index]?.useErrorBoundary ?? false,
query: observerQueries[index],
}));
if (firstSingleResultWhichShouldThrow?.error) {
throw firstSingleResultWhichShouldThrow.error;
}
return optimisticResult;
}
//# sourceMappingURL=useQueries.js.map