1
1
import React , { useEffect , useState } from 'react' ;
2
- import { initialSearchParams , SearchState , SearchStateContext } from './SearchStateContext' ;
3
- import { ContentSearchParams } from '../../../common/contentSearch' ;
2
+ import { emptySearchResult , initialSearchParams , SearchStateContext } from './SearchStateContext' ;
3
+ import { ContentSearchParams , ContentSearchResult } from '../../../common/contentSearch' ;
4
4
import { getInitialSearchParams , persistSearchParams } from './search-settings-cookies' ;
5
5
import { useAppState } from '../app-state/useAppState' ;
6
+ import { useApiFetch } from '../../fetch/useApiFetch' ;
6
7
7
- export const SearchStateProvider = ( { children } : { children : React . ReactNode } ) => {
8
+ type Props = {
9
+ children : React . ReactNode ;
10
+ } ;
11
+
12
+ export const SearchStateProvider = ( { children } : Props ) => {
8
13
const { appContext } = useAppState ( ) ;
9
14
const { basePath } = appContext ;
15
+ const { fetchSearch } = useApiFetch ( ) ;
10
16
11
- const [ searchResult , setSearchResult ] = useState < SearchState [ 'searchResult' ] > ( null ) ;
12
- const [ searchParams , setSearchParams ] = useState < SearchState [ 'searchParams' ] > (
17
+ const [ searchResult , setSearchResult ] = useState < ContentSearchResult > ( emptySearchResult ) ;
18
+ const [ searchParams , setSearchParams ] = useState < ContentSearchParams > (
13
19
getInitialSearchParams ( basePath )
14
20
) ;
15
21
const [ searchResultIsOpen , setSearchResultIsOpen ] = useState ( false ) ;
@@ -23,8 +29,20 @@ export const SearchStateProvider = ({ children }: { children: React.ReactNode })
23
29
const resetSearchSettings = ( ) =>
24
30
setSearchParams ( { ...initialSearchParams , query : searchParams . query } ) ;
25
31
32
+ const runSearch = ( params : ContentSearchParams ) =>
33
+ fetchSearch ( params ) . then ( ( result ) => {
34
+ setSearchResult (
35
+ result || {
36
+ total : 0 ,
37
+ hits : [ ] ,
38
+ status : 'error' ,
39
+ params : params ,
40
+ }
41
+ ) ;
42
+ } ) ;
43
+
26
44
useEffect ( ( ) => {
27
- setSearchResultIsOpen ( ! ! searchResult ) ;
45
+ setSearchResultIsOpen ( searchResult . status !== 'empty' ) ;
28
46
} , [ searchResult ] ) ;
29
47
30
48
return (
@@ -38,6 +56,7 @@ export const SearchStateProvider = ({ children }: { children: React.ReactNode })
38
56
setSearchResultIsOpen,
39
57
updateSearchParams,
40
58
resetSearchSettings,
59
+ runSearch,
41
60
} }
42
61
>
43
62
{ children }
0 commit comments