1
1
'use client' ;
2
2
3
3
import * as React from 'react' ;
4
- import { Input , Stack } from '@ttoss/ui' ;
5
4
import {
6
5
type PreloadedQuery ,
7
6
graphql ,
8
7
usePreloadedQuery ,
9
8
useQueryLoader ,
10
9
} from 'react-relay' ;
10
+ import { Search } from '@ttoss/components' ;
11
11
import {
12
12
SerializablePreloadedQuery ,
13
13
useSerializablePreloadedQuery ,
14
14
} from 'src/relay/useSerializablePreloadedQuery' ;
15
+ import { Stack } from '@ttoss/ui' ;
15
16
import { ZettelHomeSearchQuery } from './__generated__/ZettelHomeSearchQuery.graphql' ;
16
17
import Link from 'next/link' ;
17
18
import ZettelHomeQueryNode , {
18
19
ZettelHomeQuery ,
19
20
} from './__generated__/ZettelHomeQuery.graphql' ;
20
21
22
+ type SearchResult = {
23
+ id : string ;
24
+ title ?: string | null ;
25
+ } ;
26
+
21
27
const zettelHomeSearchQuery = graphql `
22
28
query ZettelHomeSearchQuery($searchText: String!) {
23
29
zettel {
@@ -29,7 +35,22 @@ const zettelHomeSearchQuery = graphql`
29
35
}
30
36
` ;
31
37
32
- const SearchResults = ( {
38
+ const SearchResults = ( { results = [ ] } : { results ?: SearchResult [ ] } ) => {
39
+ return (
40
+ < >
41
+ { results ?. map ( ( result ) => {
42
+ const href = `/my/zettel/${ result ?. id } ` ;
43
+ return (
44
+ < Link key = { result ?. id } href = { href } >
45
+ { result ?. title || '(No title)' }
46
+ </ Link >
47
+ ) ;
48
+ } ) }
49
+ </ >
50
+ ) ;
51
+ } ;
52
+
53
+ const HandleSearch = ( {
33
54
searchQueryRef,
34
55
} : {
35
56
searchQueryRef : PreloadedQuery < ZettelHomeSearchQuery > ;
@@ -39,7 +60,9 @@ const SearchResults = ({
39
60
searchQueryRef
40
61
) ;
41
62
42
- return < pre > { JSON . stringify ( data . zettel ?. search , null , 2 ) } </ pre > ;
63
+ const results = [ ...( data . zettel ?. search || [ ] ) ] ;
64
+
65
+ return < SearchResults results = { results } /> ;
43
66
} ;
44
67
45
68
export const ZettelHome = ( {
@@ -73,40 +96,45 @@ export const ZettelHome = ({
73
96
queryRef
74
97
) ;
75
98
76
- const notes = data . zettel ?. notes ?. edges ?. map ( ( edge ) => {
77
- return { ...edge ?. node , title : edge ?. node ?. title || '(No title)' } ;
78
- } ) ;
99
+ const defaultResults =
100
+ data . zettel ?. notes ?. edges . map ( ( edge ) => {
101
+ return edge ?. node ;
102
+ } ) || [ ] ;
79
103
80
- const [ searchText , setSearchText ] = React . useState < string > ( '' ) ;
104
+ const [ searchText , setSearchText ] = React . useState < string | undefined > ( '' ) ;
81
105
82
106
const [ searchQueryRef , search , disposeSearchQuery ] =
83
107
useQueryLoader < ZettelHomeSearchQuery > ( zettelHomeSearchQuery ) ;
84
108
109
+ const [ isPending , startTransition ] = React . useTransition ( ) ;
110
+
85
111
React . useEffect ( ( ) => {
86
112
if ( searchText ) {
87
- search ( { searchText } ) ;
113
+ startTransition ( ( ) => {
114
+ search ( { searchText } ) ;
115
+ } ) ;
88
116
}
89
117
90
118
return disposeSearchQuery ;
91
119
} , [ disposeSearchQuery , search , searchText ] ) ;
92
120
93
121
return (
94
122
< Stack >
95
- < Input
123
+ < Search
124
+ sx = { {
125
+ marginBottom : 'lg' ,
126
+ } }
96
127
value = { searchText }
97
- onChange = { ( e ) => {
98
- setSearchText ( e . target . value ) ;
128
+ onChange = { ( newSearchText ) => {
129
+ setSearchText ( newSearchText as string ) ;
99
130
} }
131
+ loading = { isPending }
100
132
/>
101
- { searchQueryRef && < SearchResults searchQueryRef = { searchQueryRef } /> }
102
- { notes ?. map ( ( note ) => {
103
- const href = `/my/zettel/${ note ?. id } ` ;
104
- return (
105
- < Link key = { note ?. id } href = { href } >
106
- { note ?. title }
107
- </ Link >
108
- ) ;
109
- } ) }
133
+ { searchQueryRef ? (
134
+ < HandleSearch searchQueryRef = { searchQueryRef } />
135
+ ) : (
136
+ < SearchResults results = { defaultResults } />
137
+ ) }
110
138
</ Stack >
111
139
) ;
112
140
} ;
0 commit comments