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