mirror of
https://github.com/getpaseo/paseo.git
synced 2026-10-30 05:02:58 +00:00
* perf(app): reduce avoidable work when opening large diffs Large snapshots were recursively reconstructed for reference stability, while native scroll worklets captured complete file models. Preserve identity at the data producers and prepare text for the visible window without rebuilding unchanged files. * test(app): await commit diff query completion without polling * chore(app): remove profiling artifacts from the source tree
123 lines
3.4 KiB
TypeScript
123 lines
3.4 KiB
TypeScript
import {
|
|
keepPreviousData,
|
|
skipToken,
|
|
useQueries,
|
|
useQuery,
|
|
type QueryKey,
|
|
type QueryClient,
|
|
type UseQueryOptions,
|
|
type UseQueryResult,
|
|
} from "@tanstack/react-query";
|
|
|
|
type QueryFnOption<TQueryFnData, TError, TData, TQueryKey extends QueryKey> = NonNullable<
|
|
UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>["queryFn"]
|
|
>;
|
|
|
|
type ReplicaQueryInput<TQueryFnData, TError, TData, TQueryKey extends QueryKey> = Omit<
|
|
UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
| "gcTime"
|
|
| "initialData"
|
|
| "refetchOnMount"
|
|
| "refetchOnReconnect"
|
|
| "refetchOnWindowFocus"
|
|
| "staleTime"
|
|
> & {
|
|
pushEvent: string;
|
|
};
|
|
|
|
type FetchQueryInput<TQueryFnData, TError, TData, TQueryKey extends QueryKey> = Omit<
|
|
UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
"initialData" | "placeholderData" | "queryFn" | "refetchOnMount" | "staleTime"
|
|
> & {
|
|
dataShape: "list" | "value";
|
|
queryFn: QueryFnOption<TQueryFnData, TError, TData, TQueryKey>;
|
|
} & (
|
|
| { staleTimeMs: number; immutableWhen?: never }
|
|
| { staleTimeMs?: never; immutableWhen: (data: TQueryFnData) => boolean }
|
|
);
|
|
|
|
export function useReplicaQuery<
|
|
TQueryFnData,
|
|
TError = Error,
|
|
TData = TQueryFnData,
|
|
TQueryKey extends QueryKey = QueryKey,
|
|
>(input: ReplicaQueryInput<TQueryFnData, TError, TData, TQueryKey>): UseQueryResult<TData, TError> {
|
|
return useQuery(replicaQueryOptions(input));
|
|
}
|
|
|
|
export function useFetchQuery<
|
|
TQueryFnData,
|
|
TError = Error,
|
|
TData = TQueryFnData,
|
|
TQueryKey extends QueryKey = QueryKey,
|
|
>(
|
|
input: FetchQueryInput<TQueryFnData, TError, TData, TQueryKey>,
|
|
queryClient?: QueryClient,
|
|
): UseQueryResult<TData, TError> {
|
|
return useQuery(fetchQueryOptions(input), queryClient);
|
|
}
|
|
|
|
export function useFetchQueries<TData>(
|
|
inputs: FetchQueryInput<TData, Error, TData, QueryKey>[],
|
|
): UseQueryResult<TData, Error>[] {
|
|
return useQueries({ queries: inputs.map((input) => fetchQueryOptions(input)) });
|
|
}
|
|
|
|
function replicaQueryOptions<
|
|
TQueryFnData,
|
|
TError = Error,
|
|
TData = TQueryFnData,
|
|
TQueryKey extends QueryKey = QueryKey,
|
|
>(
|
|
input: ReplicaQueryInput<TQueryFnData, TError, TData, TQueryKey>,
|
|
): UseQueryOptions<TQueryFnData, TError, TData, TQueryKey> {
|
|
const { pushEvent, meta, ...options } = input;
|
|
return {
|
|
...options,
|
|
gcTime: Infinity,
|
|
meta: {
|
|
...meta,
|
|
serverDataPolicy: {
|
|
class: "replica",
|
|
pushEvent,
|
|
},
|
|
},
|
|
queryFn: options.queryFn ?? skipToken,
|
|
refetchOnMount: false,
|
|
refetchOnReconnect: false,
|
|
refetchOnWindowFocus: false,
|
|
staleTime: Infinity,
|
|
};
|
|
}
|
|
|
|
export function fetchQueryOptions<
|
|
TQueryFnData,
|
|
TError = Error,
|
|
TData = TQueryFnData,
|
|
TQueryKey extends QueryKey = QueryKey,
|
|
>(
|
|
input: FetchQueryInput<TQueryFnData, TError, TData, TQueryKey>,
|
|
): UseQueryOptions<TQueryFnData, TError, TData, TQueryKey> {
|
|
if (!input.immutableWhen && !Number.isFinite(input.staleTimeMs)) {
|
|
throw new Error("Fetch queries must declare a finite staleTimeMs.");
|
|
}
|
|
|
|
const { dataShape, meta, staleTimeMs, immutableWhen, ...options } = input;
|
|
return {
|
|
...options,
|
|
...(dataShape === "list" ? { placeholderData: keepPreviousData } : {}),
|
|
meta: {
|
|
...meta,
|
|
serverDataPolicy: {
|
|
class: "fetch",
|
|
dataShape,
|
|
},
|
|
},
|
|
refetchOnMount: immutableWhen ? true : "always",
|
|
staleTime: immutableWhen
|
|
? (query) =>
|
|
query.state.data !== undefined && immutableWhen(query.state.data) ? Infinity : 0
|
|
: staleTimeMs,
|
|
};
|
|
}
|