11import { isEqual } from 'lodash'
22import { useCallback , useMemo , useState } from 'react'
3+ import { type PoolListItem } from '@/dex/features/pool-list/types'
4+ import { useNetworkFromUrl } from '@/dex/hooks/useChainId'
35import { type NetworkConfig } from '@/dex/types/main.types'
6+ import { notFalsy } from '@curvefi/prices-api/objects.util'
47import { ColumnFiltersState , ExpandedState , getPaginationRowModel , useReactTable } from '@tanstack/react-table'
58import { CurveApi } from '@ui-kit/features/connect-wallet'
69import { useUserProfileStore } from '@ui-kit/features/user-profile'
7- import { SMALL_POOL_TVL } from '@ui-kit/features/user-profile/store'
10+ import { MIN_POOLS_DISPLAYED , SMALL_POOL_TVL } from '@ui-kit/features/user-profile/store'
811import { useIsTablet } from '@ui-kit/hooks/useBreakpoints'
912import { usePageFromQueryString } from '@ui-kit/hooks/usePageFromQueryString'
1013import { useSortFromQueryString } from '@ui-kit/hooks/useSortFromQueryString'
@@ -16,6 +19,7 @@ import { EmptyStateRow } from '@ui-kit/shared/ui/DataTable/EmptyStateRow'
1619import { useColumnFilters } from '@ui-kit/shared/ui/DataTable/hooks/useColumnFilters'
1720import { TableFilters } from '@ui-kit/shared/ui/DataTable/TableFilters'
1821import { TableFiltersTitles } from '@ui-kit/shared/ui/DataTable/TableFiltersTitles'
22+ import { takeTopWithMin } from '@ui-kit/utils'
1923import { PoolListChips } from './chips/PoolListChips'
2024import { POOL_LIST_COLUMNS , PoolColumnId } from './columns'
2125import { PoolListEmptyState } from './components/PoolListEmptyState'
@@ -27,16 +31,23 @@ const LOCAL_STORAGE_KEY = 'dex-pool-list'
2731
2832const migration : MigrationOptions < ColumnFiltersState > = { version : 1 }
2933
30- const useDefaultPoolsFilter = ( minLiquidity : number ) =>
31- useMemo (
32- ( ) => [
33- {
34- id : PoolColumnId . Tvl ,
35- value : [ minLiquidity , null ] ,
36- } ,
37- ] ,
38- [ minLiquidity ] ,
34+ const useStaticPoolsFilter = ( data : PoolListItem [ ] ) => {
35+ const hideSmallPools = useUserProfileStore ( ( s ) => s . hideSmallPools )
36+ const { hideSmallPoolsTvl : tvl = SMALL_POOL_TVL } = useNetworkFromUrl ( ) ?? { }
37+ return useMemo (
38+ ( ) =>
39+ notFalsy (
40+ hideSmallPools && {
41+ id : PoolColumnId . Tvl ,
42+ value : [
43+ takeTopWithMin ( data , ( pool ) => + ( pool . tvl ?. value ?? 0 ) , tvl , MIN_POOLS_DISPLAYED ) ,
44+ null , // no upper limit
45+ ] ,
46+ } ,
47+ ) ,
48+ [ data , tvl , hideSmallPools ] ,
3949 )
50+ }
4051
4152const useSearch = ( columnFiltersById : Record < string , unknown > , setColumnFilter : ( id : string , value : unknown ) => void ) =>
4253 [
@@ -45,22 +56,21 @@ const useSearch = (columnFiltersById: Record<string, unknown>, setColumnFilter:
4556 ] as const
4657
4758const PER_PAGE = 50
59+ const EMPTY : never [ ] = [ ]
4860
4961export const PoolListTable = ( { network, curve } : { network : NetworkConfig ; curve : CurveApi | null } ) => {
50- // todo: this needs to be more complicated, we need to show at least the top 10 per chain
51- const minLiquidity = useUserProfileStore ( ( s ) => s . hideSmallPools ) ? SMALL_POOL_TVL : 0
5262 const { isLite, poolFilters } = network
5363 const { signerAddress } = curve ?? { }
5464
5565 // todo: use isReady to show a loading spinner close to the data
5666 const { data, isLoading, isReady, userHasPositions } = usePoolListData ( network )
5767
58- const defaultFilters = useDefaultPoolsFilter ( minLiquidity )
59- const [ columnFilters , columnFiltersById , setColumnFilter , resetFilters ] = useColumnFilters (
60- LOCAL_STORAGE_KEY ,
68+ const staticFilters = useStaticPoolsFilter ( data )
69+ const { columnFilters, columnFiltersById, setColumnFilter, resetFilters } = useColumnFilters ( {
70+ title : LOCAL_STORAGE_KEY ,
6171 migration,
62- defaultFilters ,
63- )
72+ staticFilters ,
73+ } )
6474 const [ sorting , onSortingChange ] = useSortFromQueryString ( DEFAULT_SORT )
6575 const [ pagination , onPaginationChange ] = usePageFromQueryString ( PER_PAGE )
6676 const { columnSettings, columnVisibility, sortField } = usePoolListVisibilitySettings ( LOCAL_STORAGE_KEY , {
@@ -71,7 +81,7 @@ export const PoolListTable = ({ network, curve }: { network: NetworkConfig; curv
7181 const [ searchText , onSearch ] = useSearch ( columnFiltersById , setColumnFilter )
7282 const table = useReactTable ( {
7383 columns : POOL_LIST_COLUMNS ,
74- data : useMemo ( ( ) => data ?? [ ] , [ data ] ) ,
84+ data : data ?? EMPTY ,
7585 state : { expanded, sorting, columnVisibility, columnFilters, pagination } ,
7686 onSortingChange,
7787 onExpandedChange,
@@ -109,7 +119,7 @@ export const PoolListTable = ({ network, curve }: { network: NetworkConfig; curv
109119 < PoolListChips
110120 poolFilters = { poolFilters }
111121 hiddenMarketCount = { data ? data . length - resultCount : 0 }
112- hasFilters = { columnFilters . length > 0 && ! isEqual ( columnFilters , defaultFilters ) }
122+ hasFilters = { columnFilters . length > 0 && ! isEqual ( columnFilters , staticFilters ) }
113123 resetFilters = { resetFilters }
114124 onSortingChange = { onSortingChange }
115125 sortField = { sortField }
0 commit comments