Skip to content

Commit b096ace

Browse files
authored
feat: suport doc search (#7)
* feat: add doc search for algolia * build: remove file
1 parent df90c4b commit b096ace

File tree

8 files changed

+318
-59
lines changed

8 files changed

+318
-59
lines changed

.env.example

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# https://docsearch.algolia.com/apply/
2+
NEXT_PUBLIC_DOC_SEARCH_APP_ID=
3+
NEXT_PUBLIC_DOC_SEARCH_INDEX_NAME=
4+
NEXT_PUBLIC_DOC_SEARCH_API_KEY=

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ yarn-error.log*
3232

3333
# env files (can opt-in for committing if needed)
3434
.env*
35+
!.env.example
3536

3637
# vercel
3738
.vercel

components/layouts/page-header/command-menu.tsx

Lines changed: 0 additions & 57 deletions
This file was deleted.
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
'use client';
2+
import Link from 'next/link';
3+
import { useCallback, useRef, useState } from 'react';
4+
import { createPortal } from 'react-dom';
5+
import { DocSearchModal, useDocSearchKeyboardEvents } from '@docsearch/react';
6+
import siteConfig from '~/config/siteConfig';
7+
import { Button } from '~/components/ui/button';
8+
import '@docsearch/css';
9+
10+
export default function AlgoliaDocSearch() {
11+
const [isOpen, setIsOpen] = useState(false);
12+
const searchButtonRef = useRef<HTMLButtonElement>(null);
13+
14+
const onOpen = useCallback(() => {
15+
setIsOpen(true);
16+
}, [setIsOpen]);
17+
18+
const onClose = useCallback(() => {
19+
setIsOpen(false);
20+
}, [setIsOpen]);
21+
22+
useDocSearchKeyboardEvents({
23+
isOpen,
24+
onOpen,
25+
onClose,
26+
searchButtonRef,
27+
});
28+
29+
return (
30+
<>
31+
<Button
32+
onClick={() => setIsOpen(true)}
33+
variant="outline"
34+
className="relative h-8 w-full justify-start rounded-[0.5rem] bg-muted/50 text-sm font-normal text-muted-foreground shadow-none sm:pr-12 md:w-32 lg:w-48 xl:w-56"
35+
>
36+
<span className="inline-flex">Try Search</span>
37+
<kbd className="pointer-events-none absolute right-[0.3rem] top-[0.3rem] hidden h-5 select-none items-center gap-1 rounded border bg-muted px-1.5 font-mono text-[10px] font-medium opacity-100 sm:flex">
38+
<span className="text-xs"></span>K
39+
</kbd>
40+
</Button>
41+
{isOpen &&
42+
createPortal(
43+
<DocSearchModal
44+
initialScrollY={window.scrollY}
45+
appId={siteConfig.docSearch.appId}
46+
apiKey={siteConfig.docSearch.apiKey}
47+
indexName={siteConfig.docSearch.indexName}
48+
onClose={onClose}
49+
placeholder="搜索文章内容"
50+
hitComponent={({ hit, children }) => <Link href={hit.url}>{children}</Link>}
51+
/>,
52+
document.body,
53+
)}
54+
</>
55+
);
56+
}

components/layouts/page-header/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { Button } from '~/components/ui/button';
2-
import CommandMenu from './command-menu';
32
import MobileNav from './mobile-nav';
43
import PCNav from './pc-nav';
54
import Link from 'next/link';
65
import siteConfig from '~/config/siteConfig';
76
import ThemeSwitcher from './theme-switcher';
7+
import AlgoliaDocSearch from './doc-search';
88

99
export default function PageHeader() {
1010
return (
@@ -15,7 +15,7 @@ export default function PageHeader() {
1515
<MobileNav />
1616
<div className="flex flex-1 items-center justify-between gap-2 md:justify-end">
1717
<div className="w-full flex-1 md:w-auto md:flex-none">
18-
<CommandMenu />
18+
<AlgoliaDocSearch />
1919
</div>
2020
<nav className="flex items-center gap-0.5">
2121
{siteConfig.externalLink.map((item) => (

config/siteConfig.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ const siteConfig = {
2727
// icon: Gitee,
2828
// },
2929
],
30+
docSearch: {
31+
appId: process.env.NEXT_PUBLIC_DOC_SEARCH_APP_ID || '',
32+
indexName: process.env.NEXT_PUBLIC_DOC_SEARCH_INDEX_NAME || '',
33+
apiKey: process.env.NEXT_PUBLIC_DOC_SEARCH_API_KEY || '',
34+
},
3035
};
3136

3237
export default siteConfig;

package.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
"name": "jsonq",
33
"version": "0.1.0",
44
"private": true,
5+
"packageManager": "[email protected]",
6+
"engines": {
7+
"node": ">=18.18"
8+
},
59
"scripts": {
610
"dev": "run-p watch generate dev:turbo ",
711
"dev:turbo": "next dev --turbopack",
@@ -14,6 +18,8 @@
1418
"prepare": "husky"
1519
},
1620
"dependencies": {
21+
"@docsearch/css": "^3.9.0",
22+
"@docsearch/react": "^3.9.0",
1723
"@radix-ui/react-dialog": "^1.1.6",
1824
"@radix-ui/react-dropdown-menu": "^2.1.6",
1925
"@radix-ui/react-slot": "^1.1.2",

0 commit comments

Comments
 (0)