Files
jp 0917366cdf Separate JSON API backend (vm_api.py) + React+TanStack frontend scaffold
- vm_api.py: pure FastAPI JSON API on :8098 with CORS
- vm-api.service: systemd unit for API (replaces inline HTML vm_web.py for frontend)
- vm_web.py: kept intact as fallback; Apache now proxies /api/ -> :8098
- frontend/: Vite + React + TanStack Query scaffold
- Apache vhost updated: DocumentRoot -> frontend/dist, /api/ proxy, SPA fallback
- All original HTML pages still functional via :8099 during transition
2026-08-13 17:42:33 +01:00

106 lines
4.1 KiB
JavaScript

"use client";
// src/useBaseQuery.ts
import * as React from "react";
import { environmentManager, noop, notifyManager } from "@tanstack/query-core";
import { useQueryClient } from "./QueryClientProvider.js";
import { useQueryErrorResetBoundary } from "./QueryErrorResetBoundary.js";
import {
ensurePreventErrorBoundaryRetry,
getHasError,
useClearResetErrorBoundary
} from "./errorBoundaryUtils.js";
import { useIsRestoring } from "./IsRestoringProvider.js";
import {
ensureSuspenseTimers,
fetchOptimistic,
shouldSuspend,
willFetch
} from "./suspense.js";
function useBaseQuery(options, Observer, queryClient) {
if (process.env.NODE_ENV !== "production") {
if (typeof options !== "object" || Array.isArray(options)) {
throw new Error(
'Bad argument type. Starting with v5, only the "Object" form is allowed when calling query related functions. Please use the error stack to find the culprit call. More info here: https://tanstack.com/query/latest/docs/react/guides/migrating-to-v5#supports-a-single-signature-one-object'
);
}
}
const isRestoring = useIsRestoring();
const errorResetBoundary = useQueryErrorResetBoundary();
const client = useQueryClient(queryClient);
const defaultedOptions = client.defaultQueryOptions(options);
client.getDefaultOptions().queries?._experimental_beforeQuery?.(
defaultedOptions
);
const query = client.getQueryCache().get(defaultedOptions.queryHash);
if (process.env.NODE_ENV !== "production") {
if (!defaultedOptions.queryFn) {
console.error(
`[${defaultedOptions.queryHash}]: No queryFn was passed as an option, and no default queryFn was found. The queryFn parameter is only optional when using a default queryFn. More info here: https://tanstack.com/query/latest/docs/framework/react/guides/default-query-function`
);
}
}
const subscribed = options.subscribed !== false;
defaultedOptions._optimisticResults = isRestoring ? "isRestoring" : subscribed ? "optimistic" : void 0;
ensureSuspenseTimers(defaultedOptions);
ensurePreventErrorBoundaryRetry(defaultedOptions, errorResetBoundary, query);
useClearResetErrorBoundary(errorResetBoundary);
const isNewCacheEntry = !client.getQueryCache().get(defaultedOptions.queryHash);
const [observer] = React.useState(
() => new Observer(
client,
defaultedOptions
)
);
const result = observer.getOptimisticResult(defaultedOptions);
const shouldSubscribe = !isRestoring && subscribed;
React.useSyncExternalStore(
React.useCallback(
(onStoreChange) => {
const unsubscribe = shouldSubscribe ? observer.subscribe(notifyManager.batchCalls(onStoreChange)) : noop;
observer.updateResult();
return unsubscribe;
},
[observer, shouldSubscribe]
),
() => observer.getCurrentResult(),
() => observer.getCurrentResult()
);
React.useEffect(() => {
observer.setOptions(defaultedOptions);
}, [defaultedOptions, observer]);
if (shouldSuspend(defaultedOptions, result)) {
throw fetchOptimistic(defaultedOptions, observer, errorResetBoundary);
}
if (getHasError({
result,
errorResetBoundary,
throwOnError: defaultedOptions.throwOnError,
query,
suspense: defaultedOptions.suspense
})) {
throw result.error;
}
;
client.getDefaultOptions().queries?._experimental_afterQuery?.(
defaultedOptions,
result
);
if (defaultedOptions.experimental_prefetchInRender && !environmentManager.isServer() && willFetch(result, isRestoring)) {
const promise = isNewCacheEntry ? (
// Fetch immediately on render in order to ensure `.promise` is resolved even if the component is unmounted
fetchOptimistic(defaultedOptions, observer, errorResetBoundary)
) : (
// subscribe to the "cache promise" so that we can finalize the currentThenable once data comes in
query?.promise
);
promise?.catch(noop).finally(() => {
observer.updateResult();
});
}
return !defaultedOptions.notifyOnChangeProps ? observer.trackResult(result) : result;
}
export {
useBaseQuery
};
//# sourceMappingURL=useBaseQuery.js.map