import type { ProjectSearchEntriesResult } from "@t3tools/contracts";import { queryOptions } from "@tanstack/react-query";import { ensureNativeApi } from "~/nativeApi"; export const projectQueryKeys = { all: ["projects"] as const, searchEntries: (cwd: string | null, query: string, limit: number) => ["projects", "search-entries", cwd, query, limit] as const,}; const DEFAULT_SEARCH_ENTRIES_LIMIT = 80;const DEFAULT_SEARCH_ENTRIES_STALE_TIME = 15_000;const EMPTY_SEARCH_ENTRIES_RESULT: ProjectSearchEntriesResult = { entries: [], truncated: false,}; export function projectSearchEntriesQueryOptions(input: { cwd: string | null; query: string; enabled?: boolean; limit?: number; staleTime?: number;}) { const limit = input.limit ?? DEFAULT_SEARCH_ENTRIES_LIMIT; return queryOptions({ queryKey: projectQueryKeys.searchEntries(input.cwd, input.query, limit), queryFn: async () => { const api = ensureNativeApi(); if (!input.cwd) { throw new Error("Workspace entry search is unavailable."); } return api.projects.searchEntries({ cwd: input.cwd, query: input.query, limit, }); }, enabled: (input.enabled ?? true) && input.cwd !== null && input.query.length > 0, staleTime: input.staleTime ?? DEFAULT_SEARCH_ENTRIES_STALE_TIME, placeholderData: (previous) => previous ?? EMPTY_SEARCH_ENTRIES_RESULT, });}
import type { ProjectSearchEntriesResult } from "@t3tools/contracts";
import { queryOptions } from "@tanstack/react-query";
import { ensureNativeApi } from "~/nativeApi";
export const projectQueryKeys = {
all: ["projects"] as const,
searchEntries: (cwd: string | null, query: string, limit: number) =>
["projects", "search-entries", cwd, query, limit] as const,
};
const DEFAULT_SEARCH_ENTRIES_LIMIT = 80;
const DEFAULT_SEARCH_ENTRIES_STALE_TIME = 15_000;
const EMPTY_SEARCH_ENTRIES_RESULT: ProjectSearchEntriesResult = {
entries: [],
truncated: false,
};
export function projectSearchEntriesQueryOptions(input: {
cwd: string | null;
query: string;
enabled?: boolean;
limit?: number;
staleTime?: number;
}) {
const limit = input.limit ?? DEFAULT_SEARCH_ENTRIES_LIMIT;
return queryOptions({
queryKey: projectQueryKeys.searchEntries(input.cwd, input.query, limit),
queryFn: async () => {
const api = ensureNativeApi();
if (!input.cwd) {
throw new Error("Workspace entry search is unavailable.");
}
return api.projects.searchEntries({
cwd: input.cwd,
query: input.query,
limit,
});
},
enabled: (input.enabled ?? true) && input.cwd !== null && input.query.length > 0,
staleTime: input.staleTime ?? DEFAULT_SEARCH_ENTRIES_STALE_TIME,
placeholderData: (previous) => previous ?? EMPTY_SEARCH_ENTRIES_RESULT,
});
}