1
- /* eslint-disable no-console */
2
1
import { PostHogAction } from '@lace/common' ;
3
- import { StateStatus , useOutsideHandles } from 'features/outside-handles-provider' ;
2
+ import { useOutsideHandles } from 'features/outside-handles-provider' ;
4
3
import { StakePoolDetails , mapStakePoolToDisplayData , useDelegationPortfolioStore } from 'features/store' ;
5
- import debounce from 'lodash/debounce' ;
6
- import isEqual from 'lodash/isEqual' ;
7
- import { useCallback , useMemo , useRef } from 'react' ;
4
+ import { useCallback , useMemo , useState } from 'react' ;
8
5
import { ListRange } from 'react-virtuoso' ;
9
- import { SEARCH_DEBOUNCE_IN_MS } from '../constants' ;
10
6
import { StakePoolSortOptions } from '../types' ;
11
7
12
8
type QueryStatus = 'idle' | 'fetching' | 'paginating' ;
13
9
14
10
type UseQueryStakePoolsResult = {
15
11
status : QueryStatus ;
16
12
paginatePools : ( range : ListRange ) => Promise < void > ;
13
+ performQuery : ( ) => void ;
17
14
pools : ( StakePoolDetails | undefined ) [ ] ;
18
15
searchQuery : string ;
19
16
setSearchQuery : ( searchString : string ) => void ;
@@ -23,57 +20,25 @@ type UseQueryStakePoolsResult = {
23
20
} ;
24
21
25
22
export const useQueryStakePools = ( ) => {
26
- const portfolioMutators = useDelegationPortfolioStore ( ( s ) => s . mutators ) ;
23
+ const portfolioStore = useDelegationPortfolioStore ( ) ;
24
+ const { portfolioMutators, searchQuery, sort } = useMemo ( ( ) => {
25
+ const { mutators, searchQuery : searchQueryStore , sortField, sortOrder } = portfolioStore ;
26
+
27
+ return {
28
+ portfolioMutators : mutators ,
29
+ searchQuery : searchQueryStore || '' ,
30
+ sort : sortField && sortOrder && { field : sortField , order : sortOrder } ,
31
+ } ;
32
+ } , [ portfolioStore ] ) ;
33
+
27
34
const {
28
- walletStoreStakePoolSearchResults : { pageResults, totalResultCount : totalPoolsCount } ,
29
- walletStoreStakePoolSearchResultsStatus,
30
- walletStoreFetchStakePools : fetchStakePools ,
31
35
analytics,
36
+ walletStoreBlockchainProvider : { stakePoolProvider } ,
32
37
} = useOutsideHandles ( ) ;
33
38
34
- const { searchQuery, sortField, sortOrder } = useDelegationPortfolioStore ( ( store ) => ( {
35
- searchQuery : store . searchQuery || '' ,
36
- sortField : store . sortField ,
37
- sortOrder : store . sortOrder ,
38
- } ) ) ;
39
-
40
- const previousRequest = useRef < { searchQuery : string ; sortField ?: string ; sortOrder ?: string } | null > ( null ) ;
41
- const status = useMemo ( ( ) => {
42
- const nextRequest = { searchQuery, sortField, sortOrder } ;
43
- const requestChanged = ! isEqual ( previousRequest . current , nextRequest ) ;
44
- const statusIdle =
45
- walletStoreStakePoolSearchResultsStatus === StateStatus . LOADED ||
46
- walletStoreStakePoolSearchResultsStatus === StateStatus . IDLE ;
47
-
48
- return statusIdle ? 'idle' : requestChanged ? 'fetching' : 'paginating' ;
49
- } , [ searchQuery , sortField , sortOrder , walletStoreStakePoolSearchResultsStatus ] ) ;
50
-
51
- const debouncedSearch = useMemo (
52
- ( ) =>
53
- debounce ( async ( params : Parameters < typeof fetchStakePools > [ 0 ] ) => {
54
- await fetchStakePools ( params ) ;
55
- previousRequest . current = {
56
- searchQuery : params . searchString ,
57
- sortField : params . sort ?. field ,
58
- sortOrder : params . sort ?. order ,
59
- } ;
60
- } , SEARCH_DEBOUNCE_IN_MS ) ,
61
- [ fetchStakePools ]
62
- ) ;
63
-
64
- const paginatePools = useCallback (
65
- async ( { startIndex, endIndex } : { startIndex : number ; endIndex : number } ) => {
66
- if ( startIndex === endIndex ) return ;
67
-
68
- debouncedSearch ( {
69
- limit : endIndex ,
70
- searchString : searchQuery ?? '' ,
71
- skip : startIndex ,
72
- ...( sortField && sortOrder && { sort : { field : sortField , order : sortOrder } } ) ,
73
- } ) ;
74
- } ,
75
- [ debouncedSearch , searchQuery , sortField , sortOrder ]
76
- ) ;
39
+ const [ pools , setPools ] = useState < StakePoolDetails [ ] > ( Array . from ( { length : 100 } ) ) ;
40
+ const [ status , setStatus ] = useState < 'fetching' | 'idle' > ( 'fetching' ) ;
41
+ const [ totalPoolsCount , setTotalPoolsCount ] = useState < number > ( 0 ) ;
77
42
78
43
const setSearchQuery = useCallback (
79
44
( searchString : string ) => {
@@ -89,11 +54,6 @@ export const useQueryStakePools = () => {
89
54
[ analytics , portfolioMutators , searchQuery ]
90
55
) ;
91
56
92
- const pools = useMemo (
93
- ( ) => pageResults . map ( ( pool ) => ( pool ? mapStakePoolToDisplayData ( { stakePool : pool } ) : undefined ) ) ,
94
- [ pageResults ]
95
- ) ;
96
-
97
57
const setSort = useCallback (
98
58
( data : StakePoolSortOptions ) =>
99
59
portfolioMutators . executeCommand ( {
@@ -103,23 +63,34 @@ export const useQueryStakePools = () => {
103
63
[ portfolioMutators ]
104
64
) ;
105
65
66
+ const performQuery = useCallback ( ( ) => {
67
+ setStatus ( 'fetching' ) ;
68
+ stakePoolProvider
69
+ . queryStakePools ( {
70
+ filters : { pledgeMet : true , text : searchQuery } ,
71
+ pagination : { limit : 100_000_000 , startAt : 0 } ,
72
+ sort,
73
+ } )
74
+ . then ( ( { pageResults, totalResultCount } ) => {
75
+ setPools ( pageResults . map ( ( pool ) => mapStakePoolToDisplayData ( { stakePool : pool } ) ) ) ;
76
+ setTotalPoolsCount ( totalResultCount ) ;
77
+ setStatus ( 'idle' ) ;
78
+ } )
79
+ . catch ( ( error ) => console . error ( error ) ) ;
80
+ } , [ searchQuery , sort , stakePoolProvider ] ) ;
81
+
106
82
return useMemo < UseQueryStakePoolsResult > (
107
83
( ) => ( {
108
- paginatePools,
84
+ paginatePools : ( ) => Promise . resolve ( ) ,
85
+ performQuery,
109
86
pools,
110
87
searchQuery,
111
88
setSearchQuery,
112
89
setSort,
113
- ...( sortField &&
114
- sortOrder && {
115
- sort : {
116
- field : sortField ,
117
- order : sortOrder ,
118
- } ,
119
- } ) ,
90
+ sort,
120
91
status,
121
92
totalPoolsCount,
122
93
} ) ,
123
- [ paginatePools , pools , searchQuery , setSearchQuery , setSort , sortField , sortOrder , status , totalPoolsCount ]
94
+ [ pools , searchQuery , setSearchQuery , sort , setSort , status , totalPoolsCount , performQuery ]
124
95
) ;
125
96
} ;
0 commit comments