Files
t8y2--dbx/docs/components/StaticSearchDialog.tsx
T
2026-07-13 13:09:14 +08:00

52 lines
1.7 KiB
TypeScript

"use client";
import { create } from "@orama/orama";
import { useDocsSearch } from "fumadocs-core/search/client";
import { SearchDialog, SearchDialogClose, SearchDialogContent, SearchDialogFooter, SearchDialogHeader, SearchDialogIcon, SearchDialogInput, SearchDialogList, SearchDialogOverlay } from "fumadocs-ui/components/dialog/search";
import type { SharedProps } from "fumadocs-ui/contexts/search";
import { useI18n } from "fumadocs-ui/contexts/i18n";
import { useMemo, useState } from "react";
import { createCjkSearchTokenizer } from "@/lib/cjkSearchTokenizer";
export function StaticSearchDialog(props: SharedProps) {
const { locale } = useI18n();
const [tag] = useState<string | undefined>();
const api = `/${locale ?? "en"}/api/search`;
const { search, setSearch, query } = useDocsSearch({
type: "static",
from: api,
locale,
tag,
delayMs: 100,
initOrama: (dbLocale) => {
if (dbLocale === "cn") {
return create({
schema: { _: "string" },
components: { tokenizer: createCjkSearchTokenizer() },
});
}
return create({
schema: { _: "string" },
language: "english",
});
},
});
const defaultItems = useMemo(() => null, []);
return (
<SearchDialog search={search} onSearchChange={setSearch} isLoading={query.isLoading} {...props}>
<SearchDialogOverlay />
<SearchDialogContent>
<SearchDialogHeader>
<SearchDialogIcon />
<SearchDialogInput />
<SearchDialogClose />
</SearchDialogHeader>
<SearchDialogList items={query.data !== "empty" ? query.data : defaultItems} />
</SearchDialogContent>
<SearchDialogFooter />
</SearchDialog>
);
}