Skip to content

Commit bc2eb66

Browse files
fix: small pools filter showing at least 10
1 parent 1a18fef commit bc2eb66

File tree

6 files changed

+65
-39
lines changed

6 files changed

+65
-39
lines changed

apps/main/src/dex/features/pool-list/PoolListTable.tsx

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import { isEqual } from 'lodash'
22
import { useCallback, useMemo, useState } from 'react'
3+
import { type PoolListItem } from '@/dex/features/pool-list/types'
4+
import { useNetworkFromUrl } from '@/dex/hooks/useChainId'
35
import { type NetworkConfig } from '@/dex/types/main.types'
6+
import { notFalsy } from '@curvefi/prices-api/objects.util'
47
import { ColumnFiltersState, ExpandedState, getPaginationRowModel, useReactTable } from '@tanstack/react-table'
58
import { CurveApi } from '@ui-kit/features/connect-wallet'
69
import { 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'
811
import { useIsTablet } from '@ui-kit/hooks/useBreakpoints'
912
import { usePageFromQueryString } from '@ui-kit/hooks/usePageFromQueryString'
1013
import { useSortFromQueryString } from '@ui-kit/hooks/useSortFromQueryString'
@@ -16,6 +19,7 @@ import { EmptyStateRow } from '@ui-kit/shared/ui/DataTable/EmptyStateRow'
1619
import { useColumnFilters } from '@ui-kit/shared/ui/DataTable/hooks/useColumnFilters'
1720
import { TableFilters } from '@ui-kit/shared/ui/DataTable/TableFilters'
1821
import { TableFiltersTitles } from '@ui-kit/shared/ui/DataTable/TableFiltersTitles'
22+
import { takeTopWithMin } from '@ui-kit/utils'
1923
import { PoolListChips } from './chips/PoolListChips'
2024
import { POOL_LIST_COLUMNS, PoolColumnId } from './columns'
2125
import { PoolListEmptyState } from './components/PoolListEmptyState'
@@ -27,16 +31,23 @@ const LOCAL_STORAGE_KEY = 'dex-pool-list'
2731

2832
const 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

4152
const 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

4758
const PER_PAGE = 50
59+
const EMPTY: never[] = []
4860

4961
export 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}

apps/main/src/dex/store/createPoolListSlice.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import type { Chain } from '@curvefi/prices-api'
2828
import { combineCampaigns } from '@ui-kit/entities/campaigns'
2929
import { getCampaignsExternal } from '@ui-kit/entities/campaigns/campaigns-external'
3030
import { getCampaignsMerkl } from '@ui-kit/entities/campaigns/campaigns-merkl'
31+
import { MIN_POOLS_DISPLAYED } from '@ui-kit/features/user-profile/store'
3132
import { groupSearchTerms, searchByText, takeTopWithMin } from '@ui-kit/utils'
3233
import { fetchNetworks, getNetworks } from '../entities/networks'
3334

@@ -153,10 +154,12 @@ const createPoolListSlice = (set: StoreApi<State>['setState'], get: StoreApi<Sta
153154
filterSmallTvl: (poolDatas, tvlMapper, chainId) => {
154155
const networks = getNetworks()
155156
const { hideSmallPoolsTvl } = networks[chainId]
156-
157-
const result = takeTopWithMin(poolDatas, (pd) => +(tvlMapper?.[pd.pool.id]?.value || '0'), hideSmallPoolsTvl, 10)
158-
159-
return result
157+
return takeTopWithMin(
158+
poolDatas,
159+
(pd) => +(tvlMapper?.[pd.pool.id]?.value || '0'),
160+
hideSmallPoolsTvl,
161+
MIN_POOLS_DISPLAYED,
162+
)
160163
},
161164
sortFn: (sortKey, order, poolDatas, rewardsApyMapper, tvlMapper, volumeMapper, isCrvRewardsEnabled, chainId) => {
162165
const networks = getNetworks()

apps/main/src/llamalend/features/market-list/LlamaMarketsTable.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,11 @@ export const LlamaMarketsTable = ({
5858

5959
const minLiquidity = useUserProfileStore((s) => s.hideSmallPools) ? SMALL_POOL_TVL : 0
6060
const defaultFilters = useDefaultLlamaFilter(minLiquidity)
61-
const [columnFilters, columnFiltersById, setColumnFilter, resetFilters] = useColumnFilters(
62-
LOCAL_STORAGE_KEY,
61+
const { columnFilters, columnFiltersById, setColumnFilter, resetFilters } = useColumnFilters({
62+
title: LOCAL_STORAGE_KEY,
6363
migration,
6464
defaultFilters,
65-
)
65+
})
6666
const [sorting, onSortingChange] = useSortFromQueryString(DEFAULT_SORT)
6767
const { columnSettings, columnVisibility, toggleVisibility, sortField } = useLlamaTableVisibility(
6868
LOCAL_STORAGE_KEY,

apps/main/src/llamalend/features/market-list/UserPositionsTable.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,11 @@ export const UserPositionsTable = ({ result, loading, tab }: UserPositionsTableP
4848
const { markets: data = [], userHasPositions } = result ?? {}
4949
const defaultFilters = useDefaultUserFilter(tab)
5050
const title = LOCAL_STORAGE_KEYS[tab]
51-
const [columnFilters, columnFiltersById, setColumnFilter, resetFilters] = useColumnFilters(
51+
const [columnFilters, columnFiltersById, setColumnFilter, resetFilters] = useColumnFilters({
5252
title,
5353
migration,
5454
defaultFilters,
55-
)
55+
})
5656
const [sorting, onSortingChange] = useSortFromQueryString(DEFAULT_SORT[tab], 'userSort')
5757
const { columnSettings, columnVisibility, sortField } = useLlamaTableVisibility(title, sorting, tab)
5858
const [expanded, onExpandedChange] = useState<ExpandedState>({})

packages/curve-ui-kit/src/features/user-profile/store.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { devtools, persist, type PersistOptions } from 'zustand/middleware'
55
import type { ThemeKey } from '@ui-kit/themes/basic-theme'
66

77
export const SMALL_POOL_TVL = 10000
8+
export const MIN_POOLS_DISPLAYED = 10
89

910
export type UserProfileState = {
1011
theme: ThemeKey

packages/curve-ui-kit/src/shared/ui/DataTable/hooks/useColumnFilters.tsx

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,27 @@ const DEFAULT: ColumnFiltersState = []
77

88
/**
99
* A hook to manage filters for a table. Currently saved in the state, but the URL could be a better place.
10+
* @param defaultFilters - The default filters to apply to the table.
11+
* @param staticFilters - Filters that cannot be changed by the user and are not stored in local storage.
12+
* @param title - The title of the table, used as a key for local storage.
13+
* @param migration - Migration options for the stored state.
14+
* @return An object containing the current filters, a mapping of filters by column ID, a function to set a filter, and a function to reset filters.
1015
*/
11-
export function useColumnFilters(
12-
tableTitle: string,
13-
migration: MigrationOptions<ColumnFiltersState>,
14-
defaultFilters: ColumnFiltersState = DEFAULT,
15-
) {
16-
const [columnFilters, setColumnFilters] = useTableFilters(tableTitle, defaultFilters, migration)
16+
export function useColumnFilters({
17+
title,
18+
migration,
19+
defaultFilters = DEFAULT,
20+
staticFilters = DEFAULT,
21+
}: {
22+
title: string
23+
migration: MigrationOptions<ColumnFiltersState>
24+
defaultFilters?: ColumnFiltersState
25+
staticFilters?: ColumnFiltersState
26+
}) {
27+
const [storedFilters, setStoredFilters] = useTableFilters(title, defaultFilters, migration)
1728
const setColumnFilter = useCallback(
1829
(id: string, value: unknown) =>
19-
setColumnFilters((filters) => [
30+
setStoredFilters((filters) => [
2031
...filters.filter((f) => f.id !== id),
2132
...(value == null
2233
? []
@@ -27,8 +38,10 @@ export function useColumnFilters(
2738
},
2839
]),
2940
]),
30-
[setColumnFilters],
41+
[setStoredFilters],
3142
)
43+
const columnFilters = useMemo(() => [...storedFilters, ...staticFilters], [storedFilters, staticFilters])
44+
3245
const columnFiltersById: Record<string, unknown> = useMemo(
3346
() =>
3447
columnFilters.reduce(
@@ -41,7 +54,6 @@ export function useColumnFilters(
4154
[columnFilters],
4255
)
4356

44-
const resetFilters = useCallback(() => setColumnFilters(defaultFilters), [defaultFilters, setColumnFilters])
45-
46-
return [columnFilters, columnFiltersById, setColumnFilter, resetFilters] as const
57+
const resetFilters = useCallback(() => setStoredFilters(defaultFilters), [defaultFilters, setStoredFilters])
58+
return { columnFilters, columnFiltersById, setColumnFilter, resetFilters }
4759
}

0 commit comments

Comments
 (0)