1
1
import { useMemo , useState } from 'react'
2
- import { collate , createHookFromObservableFactory , DocumentStore , useDocumentStore } from 'sanity'
2
+ import { useObservable } from 'react-rx'
3
+ import { collate , DocumentStore , useDocumentStore } from 'sanity'
3
4
4
5
import { SANITY_API_VERSION } from '../hooks/useClient'
5
6
import { createSearchFilter } from '../util/createSearchFilter'
@@ -14,44 +15,49 @@ export const ASSET_SORT_OPTIONS = {
14
15
15
16
export type SortOption = keyof typeof ASSET_SORT_OPTIONS
16
17
17
- const useAssetDocuments = createHookFromObservableFactory <
18
- VideoAssetDocument [ ] ,
19
- {
20
- documentStore : DocumentStore
21
- sort : SortOption
22
- searchQuery : string
23
- }
24
- > ( ( { documentStore, sort, searchQuery} ) => {
25
- const search = createSearchFilter ( searchQuery )
26
- const filter = [ `_type == "mux.videoAsset"` , ...search . filter ] . filter ( Boolean ) . join ( ' && ' )
18
+ const useAssetDocuments = ( {
19
+ documentStore,
20
+ sort,
21
+ searchQuery,
22
+ } : {
23
+ documentStore : DocumentStore
24
+ sort : SortOption
25
+ searchQuery : string
26
+ } ) : VideoAssetDocument [ ] | undefined => {
27
+ const memoizedObservable = useMemo ( ( ) => {
28
+ const search = createSearchFilter ( searchQuery )
29
+ const filter = [ `_type == "mux.videoAsset"` , ...search . filter ] . filter ( Boolean ) . join ( ' && ' )
30
+ const sortFragment = ASSET_SORT_OPTIONS [ sort ] . groq
31
+ return documentStore . listenQuery (
32
+ /* groq */ `*[${ filter } ] | order(${ sortFragment } )` ,
33
+ search . params ,
34
+ {
35
+ apiVersion : SANITY_API_VERSION ,
36
+ }
37
+ )
38
+ } , [ documentStore , sort , searchQuery ] )
27
39
28
- const sortFragment = ASSET_SORT_OPTIONS [ sort ] . groq
29
- return documentStore . listenQuery (
30
- /* groq */ `*[${ filter } ] | order(${ sortFragment } )` ,
31
- search . params ,
32
- {
33
- apiVersion : SANITY_API_VERSION ,
34
- }
35
- )
36
- } )
40
+ return useObservable ( memoizedObservable , undefined )
41
+ }
37
42
38
43
export default function useAssets ( ) {
39
44
const documentStore = useDocumentStore ( )
40
45
const [ sort , setSort ] = useState < SortOption > ( 'createdDesc' )
41
46
const [ searchQuery , setSearchQuery ] = useState ( '' )
42
47
43
- const [ assetDocuments = [ ] , isLoading ] = useAssetDocuments ( { documentStore, sort, searchQuery} )
48
+ const assetDocumentsObservable = useAssetDocuments ( { documentStore, sort, searchQuery} )
49
+ const isLoading = assetDocumentsObservable === undefined
44
50
const assets = useMemo (
45
51
( ) =>
46
52
// Avoid displaying both drafts & published assets by collating them together and giving preference to drafts
47
- collate < VideoAssetDocument > ( assetDocuments ) . map (
53
+ collate < VideoAssetDocument > ( assetDocumentsObservable ?? [ ] ) . map (
48
54
( collated ) =>
49
55
( {
50
56
...( collated . draft || collated . published || { } ) ,
51
57
_id : collated . id ,
52
58
} ) as VideoAssetDocument
53
59
) ,
54
- [ assetDocuments ]
60
+ [ assetDocumentsObservable ]
55
61
)
56
62
57
63
return {
0 commit comments