diff --git a/src/app/search/page.tsx b/src/app/search/page.tsx index 47d4351d..e1993eb0 100644 --- a/src/app/search/page.tsx +++ b/src/app/search/page.tsx @@ -7,25 +7,28 @@ import { } from "@/components/ui/resizable"; import { Separator } from "@/components/ui/separator"; import { useNonEmptyQueryParam } from "@/hooks/useNonEmptyQueryParam"; -import { getCodeHostFilePreviewLink } from "@/lib/utils"; +import { SearchResultFile } from "@/lib/schemas"; +import { createPathWithQueryParams, getCodeHostFilePreviewLink } from "@/lib/utils"; import { SymbolIcon } from "@radix-ui/react-icons"; import { useQuery } from "@tanstack/react-query"; import Image from "next/image"; +import { useRouter } from "next/navigation"; import { useMemo, useState } from "react"; import logoDark from "../../../public/sb_logo_dark.png"; import logoLight from "../../../public/sb_logo_light.png"; +import { fetchFileSource, search } from "../api/(client)/client"; import { SearchBar } from "../searchBar"; import { SettingsDropdown } from "../settingsDropdown"; -import { CodePreviewPanel, CodePreviewFile } from "./codePreviewPanel"; +import { CodePreviewFile, CodePreviewPanel } from "./codePreviewPanel"; import { SearchResultsPanel } from "./searchResultsPanel"; -import { useRouter } from "next/navigation"; -import { fetchFileSource, search } from "../api/(client)/client"; -import { SearchResultFile } from "@/lib/schemas"; + +const DEFAULT_NUM_RESULTS = 100; export default function SearchPage() { const router = useRouter(); const searchQuery = useNonEmptyQueryParam("query") ?? ""; - const numResults = useNonEmptyQueryParam("numResults") ?? "100"; + const _numResults = parseInt(useNonEmptyQueryParam("numResults") ?? `${DEFAULT_NUM_RESULTS}`); + const numResults = isNaN(_numResults) ? DEFAULT_NUM_RESULTS : _numResults; const [selectedMatchIndex, setSelectedMatchIndex] = useState(0); const [selectedFile, setSelectedFile] = useState(undefined); @@ -34,7 +37,7 @@ export default function SearchPage() { queryKey: ["search", searchQuery, numResults], queryFn: () => search({ query: searchQuery, - numResults: parseInt(numResults), + numResults, }), enabled: searchQuery.length > 0, }); @@ -53,6 +56,9 @@ export default function SearchPage() { } }, [searchResponse]); + const isMoreResultsButtonVisible = useMemo(() => { + return searchResponse && searchResponse.Result.MatchCount > numResults; + }, [searchResponse, numResults]); return (
@@ -90,8 +96,22 @@ export default function SearchPage() { />
-
+

Results for: {fileMatches.length} files in {searchDurationMs} ms

+ {isMoreResultsButtonVisible && ( +
{ + const url = createPathWithQueryParams('/search', + ["query", searchQuery], + ["numResults", `${numResults*2}`], + ) + router.push(url); + }} + > + More results +
+ )}
diff --git a/src/lib/schemas.ts b/src/lib/schemas.ts index 319475c1..c96fed73 100644 --- a/src/lib/schemas.ts +++ b/src/lib/schemas.ts @@ -34,6 +34,7 @@ export const searchResponseSchema = z.object({ Result: z.object({ Duration: z.number(), FileCount: z.number(), + MatchCount: z.number(), Files: z.array(z.object({ FileName: z.string(), Repository: z.string(), diff --git a/src/lib/types.ts b/src/lib/types.ts index f137e381..4d0d1045 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -1,4 +1 @@ -export const pathQueryParamName = "path"; -export const repoQueryParamName = "repo"; - export type KeymapType = "default" | "vim"; \ No newline at end of file