Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 31 additions & 15 deletions apps/explorer/src/routes/_layout/address/$address.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1284,12 +1284,11 @@ function SectionsWrapper(props: {
// Holdings uses local pagination state (decoupled from URL `page` param)
const [holdingsPage, setHoldingsPage] = React.useState(1)
const [showAllHoldings, setShowAllHoldings] = React.useState(false)
const prevAddressRef = React.useRef(address)
if (prevAddressRef.current !== address) {
prevAddressRef.current = address
setHoldingsPage(1)
setShowAllHoldings(false)
}
// Render a new address with default holdings controls immediately, then
// sync the backing state after commit.
const settledHoldingsAddressRef = React.useRef(address)
const isHoldingsAddressTransition =
settledHoldingsAddressRef.current !== address

const { isTokenListed: isHoldingTokenListed } = useTokenListMembership()
const { listedAssets, unlistedAssets } = React.useMemo(() => {
Expand All @@ -1305,17 +1304,34 @@ function SectionsWrapper(props: {
return { listedAssets: listed, unlistedAssets: unlisted }
}, [assetsData, isHoldingTokenListed])

const visibleAssets = showAllHoldings ? assetsData : listedAssets
const currentShowAllHoldings = isHoldingsAddressTransition
? false
: showAllHoldings
const visibleAssets = currentShowAllHoldings ? assetsData : listedAssets
const hasUnlisted = unlistedAssets.length > 0

// Clamp page when asset count shrinks (e.g. after a refetch or filter toggle)
const maxHoldingsPage = Math.max(
1,
Math.ceil(visibleAssets.length / ASSETS_PER_PAGE),
)
if (holdingsPage > maxHoldingsPage) {
const currentHoldingsPage = isHoldingsAddressTransition
? 1
: Math.min(holdingsPage, maxHoldingsPage)

React.useEffect(() => {
if (!isHoldingsAddressTransition) return

settledHoldingsAddressRef.current = address
setHoldingsPage(1)
setShowAllHoldings(false)
}, [address, isHoldingsAddressTransition])

React.useEffect(() => {
if (isHoldingsAddressTransition || holdingsPage <= maxHoldingsPage) return

setHoldingsPage(maxHoldingsPage)
}
}, [holdingsPage, isHoldingsAddressTransition, maxHoldingsPage])

// Build sections based on visible tabs
const sections = visibleTabs.map((tabName) => {
Expand Down Expand Up @@ -1401,7 +1417,7 @@ function SectionsWrapper(props: {
),
}
case 'holdings': {
const holdingsPages = Math.ceil(visibleAssets.length / ASSETS_PER_PAGE)
const holdingsPages = maxHoldingsPage
return {
title: 'Holdings',
totalItems: visibleAssets.length,
Expand All @@ -1425,8 +1441,8 @@ function SectionsWrapper(props: {
items={(mode) =>
visibleAssets
.slice(
(holdingsPage - 1) * ASSETS_PER_PAGE,
holdingsPage * ASSETS_PER_PAGE,
(currentHoldingsPage - 1) * ASSETS_PER_PAGE,
currentHoldingsPage * ASSETS_PER_PAGE,
)
.map((asset) => ({
className: 'text-[13px]',
Expand All @@ -1453,17 +1469,17 @@ function SectionsWrapper(props: {
}
totalItems={visibleAssets.length}
displayCount={visibleAssets.length}
page={holdingsPage}
page={currentHoldingsPage}
itemsLabel="assets"
itemsPerPage={ASSETS_PER_PAGE}
pagination={
<HoldingsFooter
page={holdingsPage}
page={currentHoldingsPage}
pages={holdingsPages}
totalItems={visibleAssets.length}
onPageChange={setHoldingsPage}
hasUnlisted={hasUnlisted}
showAll={showAllHoldings}
showAll={currentShowAllHoldings}
unlistedCount={unlistedAssets.length}
onToggleShowAll={() => {
setShowAllHoldings((prev) => !prev)
Expand Down