Skip to content

Commit 68fc7dd

Browse files
committed
fixes search
1 parent c892543 commit 68fc7dd

File tree

6 files changed

+1001
-51
lines changed

6 files changed

+1001
-51
lines changed

docusaurus.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ const config = {
5151
projectName: 'docusaurus', // Usually your repo name.
5252
plugins: [
5353
'docusaurus-plugin-sass',
54-
// "@orama/plugin-docusaurus",
54+
'@orama/plugin-docusaurus-v3',
5555
// '@docusaurus/plugin-content-docs',
5656
[
5757
'docusaurus-plugin-openapi-docs',

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
"@lyrasearch/plugin-docusaurus": "^0.1.0",
2828
"@mdx-js/react": "^3.0.1",
2929
"@monaco-editor/react": "^4.6.0",
30-
"@orama/orama": "^2.1.0",
31-
"@orama/plugin-docusaurus": "^2.1.0",
30+
"@orama/plugin-docusaurus-v3": "^2.0.19",
31+
"@orama/searchbox": "1.0.0-rc33",
3232
"@radix-ui/react-accordion": "^1.1.2",
3333
"@radix-ui/react-alert-dialog": "^1.1.1",
3434
"@radix-ui/react-aspect-ratio": "^1.0.3",

src/theme/SearchBar/index.css

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
.DocSearch-Button {
2+
-webkit-user-select: none;
3+
user-select: none
4+
}
5+
6+
.DocSearch-Button kbd {
7+
border: 0;
8+
box-shadow: none;
9+
font-size: .8rem !important;
10+
padding: 0 !important;
11+
}

src/theme/SearchBar/index.tsx

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// @ts-nocheck
2+
import React from 'react'
3+
import { useLocation } from '@docusaurus/router'
4+
import { useActiveVersion, useVersions } from '@docusaurus/plugin-content-docs/client'
5+
import { useDocsPreferredVersion } from '@docusaurus/theme-common'
6+
import { usePluginData } from '@docusaurus/useGlobalData'
7+
import { SearchBox, SearchButton } from '@orama/searchbox'
8+
import { useOrama } from './useOrama'
9+
10+
interface PluginData {
11+
searchData: {
12+
current: { data: ArrayBuffer } | null
13+
}
14+
endpoint: { url: string; key: string } | null
15+
analytics: { apiKey: string; indexId: string; enabled: boolean } | null
16+
docsInstances: string[]
17+
}
18+
19+
export function OramaSearchNoDocs() {
20+
const { searchBoxConfig, colorMode } = useOrama()
21+
22+
return (
23+
<div>
24+
<SearchButton colorScheme={colorMode} className="DocSearch-Button" />
25+
{searchBoxConfig && (
26+
<SearchBox
27+
{...searchBoxConfig}
28+
colorScheme={colorMode}
29+
searchParams={{
30+
where: {
31+
version: { eq: 'current' }
32+
}
33+
}}
34+
facetProperty="category"
35+
/>
36+
)}
37+
</div>
38+
)
39+
}
40+
41+
export function OramaSearchWithDocs({ pluginId }: { pluginId: string }) {
42+
const versions = useVersions(pluginId)
43+
const activeVersion = useActiveVersion(pluginId)
44+
const { preferredVersion } = useDocsPreferredVersion(pluginId)
45+
const currentVersion = activeVersion || preferredVersion || versions[0]
46+
const { searchBoxConfig, colorMode } = useOrama()
47+
const searchParams = {
48+
...(currentVersion && {
49+
where: {
50+
version: { eq: currentVersion.name }
51+
}
52+
})
53+
}
54+
55+
return (
56+
<div>
57+
<SearchButton colorScheme={colorMode} className="DocSearch-Button" />
58+
{searchBoxConfig && (
59+
<SearchBox {...searchBoxConfig} colorScheme={colorMode} searchParams={searchParams} facetProperty="category" />
60+
)}
61+
</div>
62+
)
63+
}
64+
65+
export default function OramaSearchWrapper() {
66+
const { pathname } = useLocation()
67+
const { docsInstances }: PluginData = usePluginData('@orama/plugin-docusaurus-v3') as PluginData
68+
const pluginId = docsInstances.filter((id: string) => pathname.includes(id))[0] || docsInstances[0]
69+
if (!pluginId) {
70+
return <OramaSearchNoDocs />
71+
}
72+
return <OramaSearchWithDocs pluginId={pluginId} />
73+
}

src/theme/SearchBar/useOrama.ts

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// @ts-nocheck
2+
import { useEffect, useState } from 'react'
3+
import useBaseUrl from '@docusaurus/useBaseUrl'
4+
import useIsBrowser from '@docusaurus/useIsBrowser'
5+
import { useColorMode } from '@docusaurus/theme-common'
6+
import { usePluginData } from '@docusaurus/useGlobalData'
7+
import { ungzip } from 'pako'
8+
import { presets } from '@orama/searchbox'
9+
import { OramaClient } from '@oramacloud/client'
10+
import { create, insertMultiple } from '@orama/orama'
11+
import { pluginAnalytics } from '@orama/plugin-analytics'
12+
import '@orama/searchbox/dist/index.css'
13+
14+
export const useOrama = () => {
15+
const [searchBoxConfig, setSearchBoxConfig] = useState(null)
16+
const { colorMode } = useColorMode()
17+
const { searchData, endpoint, analytics }: PluginData = usePluginData('@orama/plugin-docusaurus-v3') as PluginData
18+
19+
const baseURL = useBaseUrl('orama-search-index-current.json.gz')
20+
const isBrowser = useIsBrowser()
21+
useEffect(() => {
22+
async function loadOrama() {
23+
if (endpoint?.url) {
24+
setSearchBoxConfig({
25+
oramaInstance: new OramaClient({
26+
endpoint: endpoint.url,
27+
api_key: endpoint.key
28+
})
29+
})
30+
} else {
31+
let buffer
32+
33+
if (searchData?.current) {
34+
buffer = searchData.current.data
35+
} else {
36+
const searchResponse = await fetch(baseURL)
37+
38+
if (searchResponse.status === 0) {
39+
throw new Error(`Network error: ${await searchResponse.text()}`)
40+
} else if (searchResponse.status !== 200) {
41+
throw new Error(`HTTP error ${searchResponse.status}: ${await searchResponse.text()}`)
42+
}
43+
44+
buffer = await searchResponse.arrayBuffer()
45+
}
46+
47+
const deflated = ungzip(buffer, { to: 'string' })
48+
const parsedDeflated = JSON.parse(deflated)
49+
50+
const db = await create({
51+
schema: { ...presets.docs.schema, version: 'enum' },
52+
plugins: [
53+
...(analytics
54+
? [
55+
pluginAnalytics({
56+
apiKey: analytics.apiKey,
57+
indexId: analytics.indexId,
58+
enabled: analytics.enabled
59+
})
60+
]
61+
: [])
62+
]
63+
})
64+
65+
await insertMultiple(db, Object.values(parsedDeflated.docs.docs))
66+
67+
setSearchBoxConfig({
68+
oramaInstance: db
69+
})
70+
}
71+
}
72+
73+
if (!isBrowser) {
74+
return
75+
}
76+
77+
loadOrama().catch((error) => {
78+
console.error('Cannot load search index.', error)
79+
})
80+
}, [isBrowser])
81+
82+
return { searchBoxConfig, colorMode }
83+
}

0 commit comments

Comments
 (0)