Skip to content

Commit a44d655

Browse files
authored
feat: sync token category filter with URL search params (#426)
* feat: sync token category filter with URL search params Persist the selected token category in the URL as a ?category= search parameter so that shared links preserve the active filter. The default view (no param) shows all tokens. * fix: normalize invalid category query param on tokens page
1 parent a4e8ece commit a44d655

File tree

1 file changed

+43
-3
lines changed

1 file changed

+43
-3
lines changed

src/pages/network/assets/tokens/TokensPage.tsx

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import { memo, useCallback, useMemo, useState } from 'react'
1+
import { memo, useCallback, useEffect, useMemo } from 'react'
22
import { useTranslation } from 'react-i18next'
3+
import { useSearchParams } from 'react-router-dom'
34

45
import { withHelmet } from '@app/components/hocs'
56
import { Breadcrumbs } from '@app/components/ui'
@@ -24,11 +25,50 @@ const TokensLoadingRows = memo(() =>
2425
function TokensPage() {
2526
const { t } = useTranslation('network-page')
2627
const { isMobile } = useTailwindBreakpoint()
27-
const [selectedCategory, setSelectedCategory] = useState<CategoryFilter>(TOKEN_CATEGORY_STANDARD)
28+
const [searchParams, setSearchParams] = useSearchParams()
29+
const selectedCategory: CategoryFilter = searchParams.get('category') || TOKEN_CATEGORY_ALL
30+
31+
const handleCategoryChange = useCallback(
32+
(category: CategoryFilter) => {
33+
setSearchParams(
34+
(prev) => {
35+
if (category === TOKEN_CATEGORY_ALL) {
36+
prev.delete('category')
37+
} else {
38+
prev.set('category', category)
39+
}
40+
return prev
41+
},
42+
{ replace: true }
43+
)
44+
},
45+
[setSearchParams]
46+
)
2847

2948
const { data, isLoading, error } = useGetAssetsIssuancesQuery()
3049
const { data: categoriesData } = useGetTokenCategoriesQuery()
3150

51+
// Normalize invalid category param
52+
useEffect(() => {
53+
const categoryParam = searchParams.get('category')
54+
if (!categoryParam || !categoriesData) return
55+
56+
const validCategories = new Set([
57+
TOKEN_CATEGORY_STANDARD,
58+
...categoriesData.categories.map((cat) => cat.id)
59+
])
60+
61+
if (!validCategories.has(categoryParam)) {
62+
setSearchParams(
63+
(prev) => {
64+
prev.delete('category')
65+
return prev
66+
},
67+
{ replace: true }
68+
)
69+
}
70+
}, [searchParams, categoriesData, setSearchParams])
71+
3272
const allTokens = useMemo(
3373
() =>
3474
data?.assets
@@ -91,7 +131,7 @@ function TokensPage() {
91131
<CategoryChips
92132
categoriesData={categoriesData}
93133
selectedCategory={selectedCategory}
94-
onCategoryChange={setSelectedCategory}
134+
onCategoryChange={handleCategoryChange}
95135
showAll
96136
/>
97137
)}

0 commit comments

Comments
 (0)