Skip to content

Commit 40afdc0

Browse files
authored
Merge pull request #13139 from ethereum/performance/find-wallets-optimizations
Performance: find wallets first render optimizations
2 parents 51c478b + 1b6bde3 commit 40afdc0

File tree

4 files changed

+68
-59
lines changed

4 files changed

+68
-59
lines changed

src/components/FindWallet/MobileFiltersMenu.tsx

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ import {
1010
Flex,
1111
} from "@chakra-ui/react"
1212

13-
import type { Wallet } from "@/lib/types"
14-
1513
import { Button } from "@/components/Buttons"
1614

1715
import OldHeading from "../OldHeading"
@@ -23,17 +21,15 @@ import WalletFilterSidebar, {
2321
WalletFilterSidebarProps,
2422
} from "./WalletFilterSidebar"
2523

26-
import { useWalletTable } from "@/hooks/useWalletTable"
27-
2824
type MobileFiltersMenuProps = WalletFilterSidebarProps & {
29-
walletData: Wallet[]
3025
showMobileSidebar: boolean
3126
onOpen: () => void
3227
onClose: () => void
28+
totalWallets: number
3329
}
3430

3531
export const MobileFiltersMenu = ({
36-
walletData,
32+
totalWallets,
3733
filters,
3834
resetWalletFilter,
3935
resetFilters,
@@ -47,7 +43,6 @@ export const MobileFiltersMenu = ({
4743
onClose,
4844
}: MobileFiltersMenuProps) => {
4945
const { t } = useTranslation("page-wallets-find-wallet")
50-
const { filteredWallets } = useWalletTable({ filters, t, walletData })
5146

5247
return (
5348
<>
@@ -128,8 +123,7 @@ export const MobileFiltersMenu = ({
128123
</Box>
129124

130125
<Button w="100%" flex={1} onClick={onClose}>
131-
{t("page-find-wallet-see-wallets")}{" "}
132-
{`(${filteredWallets.length})`}
126+
{t("page-find-wallet-see-wallets")} {`(${totalWallets})`}
133127
</Button>
134128
</Flex>
135129
</DrawerBody>

src/components/FindWallet/WalletTable/index.tsx

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
Text,
1717
} from "@chakra-ui/react"
1818

19-
import type { ChildOnlyProp, Wallet, WalletFilter } from "@/lib/types"
19+
import type { ChildOnlyProp, WalletFilter } from "@/lib/types"
2020

2121
import { ButtonLink } from "@/components/Buttons"
2222
import { WalletMoreInfo } from "@/components/FindWallet/WalletTable/WalletMoreInfo"
@@ -196,28 +196,30 @@ const FlexInfoCenter = (props: { children: ReactNode; className?: string }) => (
196196
/>
197197
)
198198

199+
type UseWalletTable = ReturnType<typeof useWalletTable>
200+
199201
export type WalletTableProps = {
200202
filters: WalletFilter
201203
resetFilters: () => void
202204
resetWalletFilter: React.MutableRefObject<() => void>
203-
walletData: Wallet[]
205+
filteredWallets: UseWalletTable["filteredWallets"]
206+
totalWallets: number
207+
updateMoreInfo: (key: string) => void
208+
featureDropdownItems: UseWalletTable["featureDropdownItems"]
204209
onOpen: () => void
205210
}
206211

207212
const WalletTable = ({
208213
filters,
209214
resetFilters,
210215
resetWalletFilter,
211-
walletData,
216+
filteredWallets,
217+
totalWallets,
218+
updateMoreInfo,
219+
featureDropdownItems,
212220
onOpen,
213221
}: WalletTableProps) => {
214222
const { t } = useTranslation("page-wallets-find-wallet")
215-
const {
216-
featureDropdownItems,
217-
filteredWallets,
218-
updateMoreInfo,
219-
walletCardData,
220-
} = useWalletTable({ filters, t, walletData })
221223

222224
// Context API
223225
const { supportedLanguage } = useContext(WalletSupportedLanguageContext)
@@ -232,6 +234,17 @@ const WalletTable = ({
232234
})
233235
}
234236

237+
const showMoreInfo = (wallet) => {
238+
updateMoreInfo(wallet.key)
239+
// Log "more info" event only on expanding
240+
wallet.moreInfo &&
241+
trackCustomEvent({
242+
eventCategory: "WalletMoreInfo",
243+
eventAction: `More info wallet`,
244+
eventName: `More info ${wallet.name}`,
245+
})
246+
}
247+
235248
return (
236249
<Container>
237250
<WalletContentHeader>
@@ -254,16 +267,16 @@ const WalletTable = ({
254267
})`}
255268
</Text>
256269

257-
{filteredWallets.length === walletCardData.length ? (
270+
{filteredWallets.length === totalWallets ? (
258271
<Text ps={{ base: 2, md: 0 }} as="span">
259272
{t("page-find-wallet-showing-all-wallets")} (
260-
<strong>{walletCardData.length}</strong>)
273+
<strong>{totalWallets}</strong>)
261274
</Text>
262275
) : (
263276
<Text ps={{ base: 2, md: 0 }} as="span">
264277
{t("page-find-wallet-showing")}{" "}
265278
<strong>
266-
{filteredWallets.length} / {walletCardData.length}
279+
{filteredWallets.length} / {totalWallets}
267280
</strong>{" "}
268281
{t("page-find-wallet-wallets")}
269282
</Text>
@@ -296,17 +309,6 @@ const WalletTable = ({
296309
const hasDeviceLabels = deviceLabels.length > 0
297310
const hasAllLabels = hasPersonasLabels && hasDeviceLabels
298311

299-
const showMoreInfo = (wallet) => {
300-
updateMoreInfo(wallet.key)
301-
// Log "more info" event only on expanding
302-
wallet.moreInfo &&
303-
trackCustomEvent({
304-
eventCategory: "WalletMoreInfo",
305-
eventAction: `More info wallet`,
306-
eventName: `More info ${wallet.name}`,
307-
})
308-
}
309-
310312
return (
311313
<WalletContainer
312314
key={wallet.key}

src/hooks/useWalletTable.tsx

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useContext, useEffect, useState } from "react"
1+
import { useContext, useState } from "react"
22

33
import type { DropdownOption, Wallet, WalletFilter } from "@/lib/types"
44

@@ -120,20 +120,12 @@ export const useWalletTable = ({
120120
},
121121
]
122122

123-
const [walletCardData, setWalletData] = useState(
123+
const [walletCardData, setWalletData] = useState(() =>
124124
walletData.map((wallet) => {
125125
return { ...wallet, moreInfo: false, key: wallet.name }
126126
})
127127
)
128128

129-
useEffect(() => {
130-
setWalletData(
131-
walletData.map((wallet) => {
132-
return { ...wallet, moreInfo: false, key: wallet.name }
133-
})
134-
)
135-
}, [walletData])
136-
137129
// Context API for language filter
138130
const { supportedLanguage } = useContext(WalletSupportedLanguageContext)
139131

src/pages/wallets/find-wallet.tsx

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,15 @@ import { GetStaticProps, InferGetStaticPropsType } from "next"
33
import { useRouter } from "next/router"
44
import { useTranslation } from "next-i18next"
55
import { serverSideTranslations } from "next-i18next/serverSideTranslations"
6-
import { Box, calc, Center, Flex, Text, useDisclosure } from "@chakra-ui/react"
6+
import {
7+
Box,
8+
calc,
9+
Center,
10+
Flex,
11+
Show,
12+
Text,
13+
useDisclosure,
14+
} from "@chakra-ui/react"
715

816
import type { BasePageProps, ChildOnlyProp, Lang, Wallet } from "@/lib/types"
917

@@ -37,6 +45,7 @@ import {
3745
} from "@/lib/constants"
3846

3947
import { WalletSupportedLanguageContext } from "@/contexts/WalletSupportedLanguageContext"
48+
import { useWalletTable } from "@/hooks/useWalletTable"
4049
import HeroImage from "@/public/images/wallets/wallet-hero.png"
4150

4251
const Subtitle = ({ children }: ChildOnlyProp) => (
@@ -106,6 +115,13 @@ const FindWalletPage = ({
106115

107116
const { isOpen: showMobileSidebar, onOpen, onClose } = useDisclosure()
108117

118+
const {
119+
featureDropdownItems,
120+
filteredWallets,
121+
updateMoreInfo,
122+
walletCardData,
123+
} = useWalletTable({ filters, t, walletData: wallets })
124+
109125
const updateFilterOption = (key) => {
110126
const updatedFilters = { ...filters }
111127
updatedFilters[key] = !updatedFilters[key]
@@ -206,7 +222,7 @@ const FindWalletPage = ({
206222
{/* Mobile filters menu */}
207223
<Box hideFrom="lg">
208224
<MobileFiltersMenu
209-
walletData={wallets}
225+
totalWallets={filteredWallets.length}
210226
filters={filters}
211227
resetWalletFilter={resetWalletFilter}
212228
updateFilterOption={updateFilterOption}
@@ -224,28 +240,33 @@ const FindWalletPage = ({
224240
<Box px={{ md: 4, "2xl": 0 }}>
225241
<Flex pt={4} pb={6} gap={6}>
226242
{/* Filters sidebar */}
227-
<WalletFilterSidebar
228-
hideBelow="lg"
229-
top={calc(NAV_BAR_PX_HEIGHT).subtract("2px").toString()}
230-
{...{
231-
filters,
232-
resetWalletFilter,
233-
updateFilterOption,
234-
updateFilterOptions,
235-
resetFilters,
236-
selectedPersona,
237-
setFilters,
238-
setSelectedPersona,
239-
}}
240-
/>
243+
{/* Use `Show` instead of `hideBelow` prop to avoid rendering the sidebar on mobile */}
244+
<Show above="lg">
245+
<WalletFilterSidebar
246+
top={calc(NAV_BAR_PX_HEIGHT).subtract("2px").toString()}
247+
{...{
248+
filters,
249+
resetWalletFilter,
250+
updateFilterOption,
251+
updateFilterOptions,
252+
resetFilters,
253+
selectedPersona,
254+
setFilters,
255+
setSelectedPersona,
256+
}}
257+
/>
258+
</Show>
241259

242260
{/* Wallets table */}
243261
<Box mt={0.5} w="full">
244262
<WalletTable
245263
filters={filters}
246264
resetFilters={resetFilters}
247265
resetWalletFilter={resetWalletFilter}
248-
walletData={wallets}
266+
filteredWallets={filteredWallets}
267+
totalWallets={walletCardData.length}
268+
updateMoreInfo={updateMoreInfo}
269+
featureDropdownItems={featureDropdownItems}
249270
onOpen={onOpen}
250271
/>
251272
</Box>

0 commit comments

Comments
 (0)