@@ -2,11 +2,15 @@ import React from 'react'
22import { useCombobox } from 'downshift'
33import { navigate , graphql , useStaticQuery } from 'gatsby'
44import { useIsMobile } from './use-breakpoint'
5+ import usePage from './use-page'
6+ import * as getNav from '../util/get-nav'
7+
8+ // This worker can live for the entire duraction of the site
9+ const WORKER = new Worker ( new URL ( '../util/search.worker.js' , import . meta. url ) )
10+ const CLI_ROOT = '/cli'
511
612const useSearchData = ( ) => {
7- // TODO: this static query runs for all pages changes in dev mode. When not
8- // testing search explicitly it should be replaced with some static data.
9- const rawData = useStaticQuery ( graphql `
13+ const data = useStaticQuery ( graphql `
1014 {
1115 allMdx {
1216 nodes {
@@ -27,15 +31,13 @@ const useSearchData = () => {
2731 ` )
2832
2933 return React . useMemo ( ( ) => {
30- const mdxNodes = rawData . allMdx . nodes . reduce ( ( map , obj ) => {
34+ const mdxNodes = data . allMdx . nodes . reduce ( ( map , obj ) => {
3135 map [ obj . id ] = obj
3236 return map
3337 } , { } )
3438
35- return rawData . allSitePage . nodes
36- . filter ( node => {
37- return node . pageContext && node . pageContext . mdxId && mdxNodes [ node . pageContext . mdxId ] != null
38- } )
39+ return data . allSitePage . nodes
40+ . filter ( node => mdxNodes [ node . pageContext ?. mdxId ] != null )
3941 . map ( node => {
4042 const mdxNode = mdxNodes [ node . pageContext . mdxId ]
4143 return {
@@ -44,53 +46,58 @@ const useSearchData = () => {
4446 body : mdxNode . body ,
4547 }
4648 } )
47- } , [ rawData ] )
49+ } , [ data ] )
4850}
4951
50- function useSearch ( ) {
51- const isMobile = useIsMobile ( )
52-
53- const queryRef = React . useRef ( )
54- const workerRef = React . useRef ( )
52+ const useCliVersion = ( ) => {
53+ return getNav . getCurrentOrDefaultVariant (
54+ getNav . getItem ( getNav . getVariantRoot ( `${ CLI_ROOT } /` , { stripTrailing : false } ) ) ,
55+ usePage ( ) . location . pathname ,
56+ )
57+ }
5558
59+ function useSearch ( ) {
5660 const [ query , setQuery ] = React . useState ( )
57- const [ items , setItems ] = React . useState ( null )
58-
59- const searchData = useSearchData ( )
61+ const [ results , setResults ] = React . useState ( null )
62+ const queryRef = React . useRef ( )
63+ const items = useSearchData ( )
64+ const isMobile = useIsMobile ( )
65+ const { url : cliUrl } = useCliVersion ( )
6066
6167 const handleSearchResults = React . useCallback ( ( { data} ) => {
68+ if ( data . debug ) {
69+ console . log ( data . debug )
70+ }
6271 if ( data . query && data . results && data . query === queryRef . current ) {
63- setItems ( data . results )
72+ setResults ( data . results )
6473 }
6574 } , [ ] )
6675
6776 React . useEffect ( ( ) => {
68- const worker = new Worker ( new URL ( '../util/search.worker.js ', import . meta . url ) )
69- workerRef . current = worker
77+ WORKER . addEventListener ( 'message ', handleSearchResults )
78+ } , [ handleSearchResults ] )
7079
71- worker . addEventListener ( 'message' , handleSearchResults )
72- worker . postMessage ( { data : searchData } )
80+ React . useEffect ( ( ) => {
81+ WORKER . postMessage ( { items} )
82+ } , [ items ] )
7383
74- return ( ) => worker . terminate ( )
75- } , [ searchData , handleSearchResults ] )
84+ React . useEffect ( ( ) => {
85+ WORKER . postMessage ( { cli : { root : CLI_ROOT , current : cliUrl } } )
86+ } , [ cliUrl ] )
7687
7788 React . useEffect ( ( ) => {
7889 queryRef . current = query
7990
8091 if ( query ) {
81- workerRef . current . postMessage ( { query} )
92+ WORKER . postMessage ( { query} )
8293 } else {
83- setItems ( null )
94+ setResults ( null )
8495 }
8596 } , [ query ] )
8697
8798 const combobox = useCombobox ( {
8899 id : 'search-box' ,
89- // We don't need Downshift to keep track of a selected item because as
90- // soon as an item is selected we navigate to a new page.
91- // Let's avoid any unexpected states related to the selected item
92- // by setting it to always be `null`.
93- items : items || [ ] ,
100+ items : results || [ ] ,
94101 onInputValueChange : ( { inputValue} ) => setQuery ( inputValue ) ,
95102 onSelectedItemChange : ( { selectedItem} ) => {
96103 if ( selectedItem ) {
@@ -126,8 +133,8 @@ function useSearch() {
126133
127134 return {
128135 ...combobox ,
129- results : items ,
130- isOpen : ! ! ( combobox . isOpen && items ) ,
136+ results,
137+ isOpen : ! ! ( combobox . isOpen && results ) ,
131138 }
132139}
133140
0 commit comments