@@ -70,8 +70,10 @@ export type ChannelSearchParams<
70
70
) => Promise < void > | void ;
71
71
/** The number of milliseconds to debounce the search query. The default interval is 200ms. */
72
72
searchDebounceIntervalMs ?: number ;
73
- /** Boolean to search for channels as well as users in the server query, default is false and just searches for users */
73
+ /** Boolean to search for channels in the server query, default is false and just searches for users */
74
74
searchForChannels ?: boolean ;
75
+ /** Boolean to search for users in the server query, default is true and just searches for users */
76
+ searchForUsers ?: boolean ;
75
77
/** Custom search function to override the default implementation */
76
78
searchFunction ?: (
77
79
params : ChannelSearchFunctionParams < StreamChatGenerics > ,
@@ -99,6 +101,7 @@ export const useChannelSearch = <
99
101
onSelectResult,
100
102
searchDebounceIntervalMs = 300 ,
101
103
searchForChannels = false ,
104
+ searchForUsers = true ,
102
105
searchFunction,
103
106
searchQueryParams,
104
107
setChannels,
@@ -110,10 +113,7 @@ export const useChannelSearch = <
110
113
const [ results , setResults ] = useState < Array < ChannelOrUserResponse < StreamChatGenerics > > > ( [ ] ) ;
111
114
const [ searching , setSearching ] = useState ( false ) ;
112
115
113
- const searchQueryPromiseInProgress = useRef <
114
- | Promise < UsersAPIResponse < StreamChatGenerics > >
115
- | Promise < [ Channel < StreamChatGenerics > [ ] , UsersAPIResponse < StreamChatGenerics > ] >
116
- > ( undefined ) ;
116
+ const searchQueryPromiseInProgress = useRef < boolean > ( false ) ;
117
117
const shouldIgnoreQueryResults = useRef ( false ) ;
118
118
119
119
const inputRef = useRef < HTMLInputElement | null > ( null ) ;
@@ -124,9 +124,7 @@ export const useChannelSearch = <
124
124
setResults ( [ ] ) ;
125
125
setSearching ( false ) ;
126
126
127
- if ( searchQueryPromiseInProgress . current ) {
128
- shouldIgnoreQueryResults . current = true ;
129
- }
127
+ shouldIgnoreQueryResults . current = searchQueryPromiseInProgress . current ;
130
128
} , [ ] ) ;
131
129
132
130
const activateSearch = useCallback ( ( ) => {
@@ -210,41 +208,59 @@ export const useChannelSearch = <
210
208
211
209
const getChannels = useCallback (
212
210
async ( text : string ) => {
211
+ if ( ! searchForChannels && ! searchForUsers ) return ;
213
212
let results : ChannelOrUserResponse < StreamChatGenerics > [ ] = [ ] ;
213
+ const promises : Array <
214
+ Promise < Channel < StreamChatGenerics > [ ] > | Promise < UsersAPIResponse < StreamChatGenerics > >
215
+ > = [ ] ;
214
216
try {
215
- const userQueryPromise = client . queryUsers (
216
- // @ts -expect-error
217
- {
218
- $or : [ { id : { $autocomplete : text } } , { name : { $autocomplete : text } } ] ,
219
- ...searchQueryParams ?. userFilters ?. filters ,
220
- } ,
221
- { id : 1 , ...searchQueryParams ?. userFilters ?. sort } ,
222
- { limit : 8 , ...searchQueryParams ?. userFilters ?. options } ,
223
- ) ;
224
-
225
- if ( ! searchForChannels ) {
226
- searchQueryPromiseInProgress . current = userQueryPromise ;
227
- const { users } = await searchQueryPromiseInProgress . current ;
228
- results = users . filter ( ( u ) => u . id !== client . user ?. id ) ;
229
- } else {
230
- const channelQueryPromise = client . queryChannels (
231
- // @ts -expect-error
232
- {
233
- name : { $autocomplete : text } ,
234
- ...searchQueryParams ?. channelFilters ?. filters ,
235
- } ,
236
- searchQueryParams ?. channelFilters ?. sort || { } ,
237
- { limit : 5 , ...searchQueryParams ?. channelFilters ?. options } ,
217
+ if ( searchForChannels ) {
218
+ promises . push (
219
+ client . queryChannels (
220
+ // @ts -expect-error
221
+ {
222
+ members : { $in : [ client . userID ] } ,
223
+ name : { $autocomplete : text } ,
224
+ ...searchQueryParams ?. channelFilters ?. filters ,
225
+ } ,
226
+ searchQueryParams ?. channelFilters ?. sort || { } ,
227
+ { limit : 5 , ...searchQueryParams ?. channelFilters ?. options } ,
228
+ ) ,
238
229
) ;
230
+ }
239
231
240
- searchQueryPromiseInProgress . current = Promise . all ( [
241
- channelQueryPromise ,
242
- userQueryPromise ,
243
- ] ) ;
244
-
245
- const [ channels , { users } ] = await searchQueryPromiseInProgress . current ;
232
+ if ( searchForUsers ) {
233
+ promises . push (
234
+ client . queryUsers (
235
+ // @ts -expect-error
236
+ {
237
+ $or : [ { id : { $autocomplete : text } } , { name : { $autocomplete : text } } ] ,
238
+ ...searchQueryParams ?. userFilters ?. filters ,
239
+ } ,
240
+ { id : 1 , ...searchQueryParams ?. userFilters ?. sort } ,
241
+ { limit : 8 , ...searchQueryParams ?. userFilters ?. options } ,
242
+ ) ,
243
+ ) ;
244
+ }
246
245
247
- results = [ ...channels , ...users . filter ( ( u ) => u . id !== client . user ?. id ) ] ;
246
+ if ( promises . length ) {
247
+ searchQueryPromiseInProgress . current = true ;
248
+
249
+ const resolved = await Promise . all ( promises ) ;
250
+
251
+ if ( searchForChannels && searchForUsers ) {
252
+ const [ channels , { users } ] = resolved as [
253
+ Channel < StreamChatGenerics > [ ] ,
254
+ UsersAPIResponse < StreamChatGenerics > ,
255
+ ] ;
256
+ results = [ ...channels , ...users . filter ( ( u ) => u . id !== client . user ?. id ) ] ;
257
+ } else if ( searchForChannels ) {
258
+ const [ channels ] = resolved as [ Channel < StreamChatGenerics > [ ] ] ;
259
+ results = [ ...channels ] ;
260
+ } else if ( searchForUsers ) {
261
+ const [ { users } ] = resolved as [ UsersAPIResponse < StreamChatGenerics > ] ;
262
+ results = [ ...users . filter ( ( u ) => u . id !== client . user ?. id ) ] ;
263
+ }
248
264
}
249
265
} catch ( error ) {
250
266
console . error ( error ) ;
@@ -257,9 +273,9 @@ export const useChannelSearch = <
257
273
shouldIgnoreQueryResults . current = false ;
258
274
}
259
275
260
- searchQueryPromiseInProgress . current = undefined ;
276
+ searchQueryPromiseInProgress . current = false ;
261
277
} ,
262
- [ client , searchForChannels , searchQueryParams ] ,
278
+ [ client , searchForChannels , searchForUsers , searchQueryParams ] ,
263
279
) ;
264
280
265
281
// eslint-disable-next-line react-hooks/exhaustive-deps
@@ -282,6 +298,8 @@ export const useChannelSearch = <
282
298
} ,
283
299
event ,
284
300
) ;
301
+ } else if ( ! searchForChannels && ! searchForUsers ) {
302
+ return ;
285
303
} else if ( event . target . value ) {
286
304
setSearching ( true ) ;
287
305
setQuery ( event . target . value ) ;
@@ -292,7 +310,15 @@ export const useChannelSearch = <
292
310
}
293
311
onSearchCallback ?.( event ) ;
294
312
} ,
295
- [ clearState , disabled , scheduleGetChannels , onSearchCallback , searchFunction ] ,
313
+ [
314
+ clearState ,
315
+ disabled ,
316
+ scheduleGetChannels ,
317
+ onSearchCallback ,
318
+ searchForChannels ,
319
+ searchForUsers ,
320
+ searchFunction ,
321
+ ] ,
296
322
) ;
297
323
298
324
return {
0 commit comments