Skip to content

Commit ad4a769

Browse files
committed
added provider for FiatWalletsMap to fix reloading bug
1 parent 332d8ad commit ad4a769

File tree

10 files changed

+153
-103
lines changed

10 files changed

+153
-103
lines changed

packages/wallet-widget/src/components/SelectWalletRow.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { formatAddress, ConnectedWallet } from '@0xsequence/connect'
22
import { Text } from '@0xsequence/design-system'
33

44
import { useSettings } from '../hooks'
5+
import { useFiatWalletsMap } from '../hooks/useFiatWalletsMap'
56
import { getConnectorLogo } from '../utils/wallets'
67

78
import { ListCardSelect } from './ListCard'
@@ -16,14 +17,15 @@ export const SelectWalletRow = ({
1617
setActiveWallet: (address: string) => void
1718
onClose: () => void
1819
}) => {
19-
const { fiatCurrency, walletsWithFiatValue } = useSettings()
20+
const { fiatCurrency } = useSettings()
21+
const { fiatWalletsMap } = useFiatWalletsMap()
2022

21-
const onSelectWallet = () => {
23+
function onSelectWallet() {
2224
setActiveWallet(wallet.address)
2325
onClose()
2426
}
2527

26-
const fiatValue = walletsWithFiatValue.find(w => w.accountAddress === wallet.address)?.fiatValue
28+
const fiatValue = fiatWalletsMap.find(w => w.accountAddress === wallet.address)?.fiatValue
2729

2830
return (
2931
<ListCardSelect
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import { compareAddress, ContractVerificationStatus, useWallets } from '@0xsequence/connect'
2+
import { useGetExchangeRate, useGetCoinPrices, useGetTokenBalancesDetails } from '@0xsequence/hooks'
3+
import { useState, ReactNode, useEffect } from 'react'
4+
import { zeroAddress, getAddress } from 'viem'
5+
6+
import { FiatWalletPair, FiatWalletsMapContextProvider } from '../../../contexts'
7+
import { useSettings } from '../../../hooks'
8+
import { computeBalanceFiat } from '../../../utils'
9+
10+
// Define the provider component
11+
export const FiatWalletsMapProvider = ({ children }: { children: ReactNode }) => {
12+
const { wallets } = useWallets()
13+
const { selectedNetworks, selectedWallets, hideUnlistedTokens, fiatCurrency } = useSettings()
14+
15+
const [fiatWalletsMap, setFiatWalletsMap] = useState<FiatWalletPair[]>([])
16+
17+
const { data: tokenBalancesData, isPending: isTokenBalancesPending } = useGetTokenBalancesDetails({
18+
chainIds: selectedNetworks,
19+
filter: {
20+
accountAddresses: selectedWallets.map(wallet => wallet.address),
21+
contractStatus: hideUnlistedTokens ? ContractVerificationStatus.VERIFIED : ContractVerificationStatus.ALL,
22+
omitNativeBalances: false
23+
}
24+
})
25+
26+
const coinBalancesUnordered =
27+
tokenBalancesData?.filter(b => b.contractType === 'ERC20' || compareAddress(b.contractAddress, zeroAddress)) || []
28+
29+
const { data: coinPrices = [], isPending: isCoinPricesPending } = useGetCoinPrices(
30+
coinBalancesUnordered.map(token => ({
31+
chainId: token.chainId,
32+
contractAddress: token.contractAddress
33+
}))
34+
)
35+
36+
const { data: conversionRate, isPending: isConversionRatePending } = useGetExchangeRate(fiatCurrency.symbol)
37+
38+
useEffect(() => {
39+
if (
40+
!isTokenBalancesPending &&
41+
!isCoinPricesPending &&
42+
!isConversionRatePending &&
43+
coinBalancesUnordered.length > 0 &&
44+
coinPrices.length > 0 &&
45+
conversionRate
46+
) {
47+
const newFiatWalletsMap = wallets.map(wallet => {
48+
const walletBalances = coinBalancesUnordered.filter(b => getAddress(b.accountAddress) === getAddress(wallet.address))
49+
const walletFiatValue = walletBalances.reduce((acc, coin) => {
50+
return (
51+
acc +
52+
Number(
53+
computeBalanceFiat({
54+
balance: coin,
55+
prices: coinPrices,
56+
conversionRate,
57+
decimals: coin.contractInfo?.decimals || 18
58+
})
59+
)
60+
)
61+
}, 0)
62+
return {
63+
accountAddress: wallet.address,
64+
fiatValue: walletFiatValue.toFixed(2)
65+
} as FiatWalletPair
66+
})
67+
68+
if (JSON.stringify(newFiatWalletsMap) !== JSON.stringify(fiatWalletsMap)) {
69+
setFiatWalletsMap(newFiatWalletsMap)
70+
}
71+
}
72+
}, [coinBalancesUnordered, coinPrices, conversionRate, fiatCurrency, selectedNetworks, selectedWallets, hideUnlistedTokens])
73+
74+
return <FiatWalletsMapContextProvider value={{ fiatWalletsMap, setFiatWalletsMap }}>{children}</FiatWalletsMapContextProvider>
75+
}

packages/wallet-widget/src/components/SequenceWalletProvider/utils/WalletConnectSignClient.tsx renamed to packages/wallet-widget/src/components/SequenceWalletProvider/ProviderComponents/WalletConnectSignClientProvider.tsx

File renamed without changes.

packages/wallet-widget/src/components/SequenceWalletProvider/SequenceWalletProvider.tsx

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import React, { useState } from 'react'
99
import { HEADER_HEIGHT, HEADER_HEIGHT_WITH_LABEL } from '../../constants'
1010
import { History, Navigation, NavigationContextProvider, WalletModalContextProvider, WalletOptions } from '../../contexts'
1111

12+
import { FiatWalletsMapProvider } from './ProviderComponents/FiatWalletsMapProvider'
1213
import { getHeader, getContent } from './utils'
1314

1415
export const WALLET_WIDTH = 460
@@ -86,36 +87,38 @@ export const WalletContent = ({ children }: SequenceWalletProviderProps) => {
8687
return (
8788
<WalletModalContextProvider value={{ setOpenWalletModal, openWalletModalState: openWalletModal }}>
8889
<NavigationContextProvider value={{ setHistory, history, isBackButtonEnabled, setIsBackButtonEnabled }}>
89-
<ShadowRoot theme={theme}>
90-
<AnimatePresence>
91-
{openWalletModal && !isAddFundsModalOpen && !isConnectModalOpen && (
92-
<Modal
93-
contentProps={{
94-
style: {
95-
maxWidth: WALLET_WIDTH,
96-
height: 'fit-content',
97-
...getModalPositionCss(position),
98-
scrollbarColor: 'gray black',
99-
scrollbarWidth: 'thin'
100-
}
101-
}}
102-
scroll={false}
103-
onClose={() => setOpenWalletModal(false)}
104-
>
105-
<div id="sequence-kit-wallet-content">
106-
{getHeader(navigation)}
90+
<FiatWalletsMapProvider>
91+
<ShadowRoot theme={theme}>
92+
<AnimatePresence>
93+
{openWalletModal && !isAddFundsModalOpen && !isConnectModalOpen && (
94+
<Modal
95+
contentProps={{
96+
style: {
97+
maxWidth: WALLET_WIDTH,
98+
height: 'fit-content',
99+
...getModalPositionCss(position),
100+
scrollbarColor: 'gray black',
101+
scrollbarWidth: 'thin'
102+
}
103+
}}
104+
scroll={false}
105+
onClose={() => setOpenWalletModal(false)}
106+
>
107+
<div id="sequence-kit-wallet-content">
108+
{getHeader(navigation)}
107109

108-
{displayScrollbar ? (
109-
<Scroll style={{ paddingTop: paddingTop, height: 'min(800px, 90vh)' }}>{getContent(navigation)}</Scroll>
110-
) : (
111-
getContent(navigation)
112-
)}
113-
</div>
114-
</Modal>
115-
)}
116-
</AnimatePresence>
117-
</ShadowRoot>
118-
{children}
110+
{displayScrollbar ? (
111+
<Scroll style={{ paddingTop: paddingTop, height: 'min(800px, 90vh)' }}>{getContent(navigation)}</Scroll>
112+
) : (
113+
getContent(navigation)
114+
)}
115+
</div>
116+
</Modal>
117+
)}
118+
</AnimatePresence>
119+
</ShadowRoot>
120+
{children}
121+
</FiatWalletsMapProvider>
119122
</NavigationContextProvider>
120123
</WalletModalContextProvider>
121124
)
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { createGenericContext } from './genericContext'
2+
3+
export interface FiatWalletPair {
4+
accountAddress: string
5+
fiatValue: string
6+
}
7+
8+
export interface FiatWalletsMapContext {
9+
fiatWalletsMap: FiatWalletPair[]
10+
setFiatWalletsMap: (fiatWalletsMap: FiatWalletPair[]) => void
11+
}
12+
13+
const [useFiatWalletsMapContext, FiatWalletsMapContextProvider] = createGenericContext<FiatWalletsMapContext>()
14+
15+
export { useFiatWalletsMapContext, FiatWalletsMapContextProvider }
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export * from './WalletModal'
22
export * from './Navigation'
3+
export * from './FiatWalletsMap'
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { useFiatWalletsMapContext } from '../contexts/FiatWalletsMap'
2+
3+
export const useFiatWalletsMap = () => {
4+
const { fiatWalletsMap, setFiatWalletsMap } = useFiatWalletsMapContext()
5+
6+
return { fiatWalletsMap, setFiatWalletsMap }
7+
}

packages/wallet-widget/src/hooks/useSettings.ts

Lines changed: 4 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,6 @@ export interface SettingsCollection {
1616
}
1717
}
1818

19-
export interface WalletsWithFiatValue {
20-
accountAddress: string
21-
fiatValue: string
22-
}
23-
2419
interface Settings {
2520
hideCollectibles: boolean
2621
hideUnlistedTokens: boolean
@@ -29,21 +24,18 @@ interface Settings {
2924
allNetworks: number[]
3025
selectedWallets: ConnectedWallet[]
3126
selectedCollections: SettingsCollection[]
32-
walletsWithFiatValue: WalletsWithFiatValue[]
3327
hideCollectiblesObservable: Observable<boolean>
3428
hideUnlistedTokensObservable: Observable<boolean>
3529
fiatCurrencyObservable: Observable<FiatCurrency>
3630
selectedNetworksObservable: Observable<number[]>
3731
selectedWalletsObservable: Observable<ConnectedWallet[]>
3832
selectedCollectionsObservable: Observable<SettingsCollection[]>
39-
walletsWithFiatValueObservable: Observable<WalletsWithFiatValue[]>
4033
setFiatCurrency: (newFiatCurrency: FiatCurrency) => void
4134
setHideCollectibles: (newState: boolean) => void
4235
setHideUnlistedTokens: (newState: boolean) => void
4336
setSelectedWallets: (newWallets: ConnectedWallet[]) => void
4437
setSelectedNetworks: (newNetworks: number[]) => void
4538
setSelectedCollections: (newCollections: SettingsCollection[]) => void
46-
setWalletsWithFiatValue: (newWalletsWithFiatValue: WalletsWithFiatValue[]) => void
4739
}
4840

4941
type SettingsItems = {
@@ -53,7 +45,6 @@ type SettingsItems = {
5345
selectedWalletsObservable: MutableObservable<ConnectedWallet[]>
5446
selectedNetworksObservable: MutableObservable<number[]>
5547
selectedCollectionsObservable: MutableObservable<SettingsCollection[]>
56-
walletsWithFiatValueObservable: MutableObservable<WalletsWithFiatValue[]>
5748
}
5849

5950
let settingsObservables: SettingsItems | null = null
@@ -74,7 +65,6 @@ export const useSettings = (): Settings => {
7465
let selectedWallets: ConnectedWallet[] = allWallets
7566
let selectedNetworks: number[] = allNetworks
7667
let selectedCollections: SettingsCollection[] = []
77-
const walletsWithFiatValue: WalletsWithFiatValue[] = []
7868

7969
try {
8070
const settingsStorage = localStorage.getItem(LocalStorageKey.Settings)
@@ -133,8 +123,7 @@ export const useSettings = (): Settings => {
133123
fiatCurrencyObservable: observable(fiatCurrency),
134124
selectedWalletsObservable: observable(selectedWallets),
135125
selectedNetworksObservable: observable(selectedNetworks),
136-
selectedCollectionsObservable: observable(selectedCollections),
137-
walletsWithFiatValueObservable: observable(walletsWithFiatValue)
126+
selectedCollectionsObservable: observable(selectedCollections)
138127
}
139128
}
140129

@@ -167,8 +156,7 @@ export const useSettings = (): Settings => {
167156
fiatCurrencyObservable,
168157
selectedWalletsObservable,
169158
selectedNetworksObservable,
170-
selectedCollectionsObservable,
171-
walletsWithFiatValueObservable
159+
selectedCollectionsObservable
172160
} = settingsObservables
173161

174162
const setHideUnlistedTokens = (newState: boolean) => {
@@ -217,20 +205,14 @@ export const useSettings = (): Settings => {
217205
}
218206
}
219207

220-
const setWalletsWithFiatValue = (newWalletsWithFiatValue: WalletsWithFiatValue[]) => {
221-
walletsWithFiatValueObservable.set(newWalletsWithFiatValue)
222-
updateLocalStorage()
223-
}
224-
225208
const updateLocalStorage = () => {
226209
const newSettings = {
227210
hideUnlistedTokens: hideUnlistedTokensObservable.get(),
228211
hideCollectibles: hideCollectiblesObservable.get(),
229212
fiatCurrency: fiatCurrencyObservable.get(),
230213
selectedWallets: selectedWalletsObservable.get(),
231214
selectedNetworks: selectedNetworksObservable.get(),
232-
selectedCollections: selectedCollectionsObservable.get(),
233-
walletsWithFiatValue: walletsWithFiatValueObservable.get()
215+
selectedCollections: selectedCollectionsObservable.get()
234216
}
235217
console.log('settings updated', newSettings)
236218
localStorage.setItem(LocalStorageKey.Settings, JSON.stringify(newSettings))
@@ -244,20 +226,17 @@ export const useSettings = (): Settings => {
244226
selectedNetworks: selectedNetworksObservable.get(),
245227
allNetworks: allNetworks,
246228
selectedCollections: selectedCollectionsObservable.get(),
247-
walletsWithFiatValue: walletsWithFiatValueObservable.get(),
248229
hideUnlistedTokensObservable,
249230
hideCollectiblesObservable,
250231
fiatCurrencyObservable,
251232
selectedWalletsObservable,
252233
selectedNetworksObservable,
253234
selectedCollectionsObservable,
254-
walletsWithFiatValueObservable,
255235
setFiatCurrency,
256236
setHideCollectibles,
257237
setHideUnlistedTokens,
258238
setSelectedWallets,
259239
setSelectedNetworks,
260-
setSelectedCollections,
261-
setWalletsWithFiatValue
240+
setSelectedCollections
262241
}
263242
}

packages/wallet-widget/src/views/FilterMenu.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { ListCardSelect } from '../components/ListCard/ListCardSelect'
1212
import { SlideupDrawer } from '../components/SlideupDrawer'
1313
import { WalletAccountGradient } from '../components/WalletAccountGradient'
1414
import { useSettings } from '../hooks'
15+
import { useFiatWalletsMap } from '../hooks/useFiatWalletsMap'
1516
import { getConnectorLogo } from '../utils/wallets'
1617

1718
enum FilterType {
@@ -41,17 +42,17 @@ export const FilterMenu = ({
4142
selectedNetworksObservable,
4243
selectedCollectionsObservable,
4344
fiatCurrency,
44-
walletsWithFiatValue,
4545
setSelectedWallets,
4646
setSelectedNetworks,
4747
setSelectedCollections
4848
} = useSettings()
49+
const { fiatWalletsMap } = useFiatWalletsMap()
4950

5051
const selectedWallets = useObservable(selectedWalletsObservable)
5152
const selectedNetworks = useObservable(selectedNetworksObservable)
5253
const selectedCollections = useObservable(selectedCollectionsObservable)
5354

54-
const totalFiatValue = walletsWithFiatValue.reduce((acc, wallet) => acc + Number(wallet.fiatValue), 0)
55+
const totalFiatValue = fiatWalletsMap.reduce((acc, wallet) => acc + Number(wallet.fiatValue), 0)
5556

5657
const { data: tokens } = useGetTokenBalancesSummary({
5758
chainIds: selectedNetworks,
@@ -185,7 +186,7 @@ export const FilterMenu = ({
185186
rightChildren={
186187
<Text color="muted" fontWeight="medium" variant="normal">
187188
{fiatCurrency.sign}
188-
{walletsWithFiatValue.find(w => w.accountAddress === wallet.address)?.fiatValue}
189+
{fiatWalletsMap.find(w => w.accountAddress === wallet.address)?.fiatValue}
189190
</Text>
190191
}
191192
onClick={() => setSelectedWallets([wallet])}

0 commit comments

Comments
 (0)