From 2e27d960fcadbe9b36e2401610ee9459906e6284 Mon Sep 17 00:00:00 2001 From: Amin Limbada Date: Tue, 30 Sep 2025 15:04:46 +0400 Subject: [PATCH 1/3] fix: YOEXT-1742 The top bar balance is not updated on portfolio page --- packages/yoroi-extension/app/Routes.js | 2 +- .../common/components/PortfolioHeader.tsx | 22 +++++++++++++------ .../module/PortfolioContextProvider.tsx | 15 +++++++++++-- .../app/UI/features/portfolio/module/state.ts | 4 ++++ packages/yoroi-extension/package-lock.json | 20 ++++++++--------- 5 files changed, 43 insertions(+), 20 deletions(-) diff --git a/packages/yoroi-extension/app/Routes.js b/packages/yoroi-extension/app/Routes.js index ae9222dcaca..eab5d3a4096 100644 --- a/packages/yoroi-extension/app/Routes.js +++ b/packages/yoroi-extension/app/Routes.js @@ -1,7 +1,7 @@ // @flow import type { Node } from 'react'; -import React, { Suspense } from 'react'; +import React, { Suspense, useMemo } from 'react'; import { Navigate, Route, Routes, Outlet } from 'react-router'; import ConnectedWebsitesPage, { ConnectedWebsitesPagePromise } from './containers/dapp-connector/ConnectedWebsitesContainer'; import Transfer, { WalletTransferPagePromise } from './containers/transfer/Transfer'; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx index 6a705fd6fee..4519ef5c165 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx @@ -49,7 +49,14 @@ const PortfolioHeader = observer(({ walletBalance, setKeyword, isLoading, toolti const [loading, setLoading] = React.useState(false); const strings = useStrings(); const theme: any = useTheme(); - const { unitOfAccount, changeUnitOfAccountPair, accountPair, primaryTokenInfo } = usePortfolio(); + const { + unitOfAccount, + changeUnitOfAccountPair, + accountPair, + primaryTokenInfo, + selectedWallet: contextSelectedWallet, + networkId: contextNetworkId, + } = usePortfolio(); const { tokenActivity } = usePortfolioTokenActivity(); const localStorageApi = new LocalStorageApi(); const { @@ -57,15 +64,16 @@ const PortfolioHeader = observer(({ walletBalance, setKeyword, isLoading, toolti config, } = useCurrencyPairing(); - // TODO refactor and remove this caluclation from here in the future - this should come from the main selected wallet context - const { wallets, delegation } = stores; - const selectedWallet /*: WalletState */ = wallets.selectedOrFail; - const networkId = selectedWallet.networkId; + // ✅ Use context data instead of store data for automatic re-rendering + const { delegation } = stores; + const selectedWallet = contextSelectedWallet; + const networkId = contextNetworkId; const rewards = delegation.getRewardBalanceOrZero(selectedWallet); - const balance = selectedWallet.balance; + + const balance = selectedWallet?.balance; const totalBalanceAmount = getTotalAmount(balance, rewards); const defaultEntry = totalBalanceAmount?.getDefaultEntry(); - const primaryBalance = defaultEntry.amount.shiftedBy(-primaryTokenInfo.decimals); + const primaryBalance = defaultEntry?.amount.shiftedBy(-primaryTokenInfo?.decimals || 0); // End of total Ada balance calculation const { changeValue, changePercent, variantPnl } = priceChange(open, ptPrice); diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx index 0665f5dc5cd..a7a68c93273 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx @@ -60,7 +60,16 @@ export const PortfolioContextProvider = ({ openDialogWrapper, shouldHideBalance, }: PortfolioProviderProps) => { - const { walletBalance, ftAssetList, selectedWallet, networkId, primaryTokenInfo, backendServiceZero, explorer } = currentWallet; + const { + walletBalance, + ftAssetList, + selectedWallet, + networkId, + primaryTokenInfo, + backendServiceZero, + explorer, + stakingRewards, + } = currentWallet; if (selectedWallet === undefined) { return <>; @@ -98,6 +107,8 @@ export const PortfolioContextProvider = ({ ftAssetList: ftAssetList || [], networkId, primaryTokenInfo, + stakingRewards, + selectedWallet, isHiddenAmount: shouldHideBalance, openBuyDialog: () => { if (selectedWallet.isTestnet) { @@ -111,7 +122,7 @@ export const PortfolioContextProvider = ({ explorer, isTestnet: selectedWallet.isTestnet, }), - [state, actions, ftAssetList, networkId, selectedWallet, settingFiatPairUnit] + [state, actions, ftAssetList, networkId, selectedWallet, settingFiatPairUnit, stakingRewards] ); return {children}; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/state.ts b/packages/yoroi-extension/app/UI/features/portfolio/module/state.ts index 59fdd4ba8ba..ca8b5f4f842 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/state.ts +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/state.ts @@ -41,6 +41,8 @@ export type PortfolioState = { ftAssetList: any[]; showWelcomeBanner: boolean; primaryTokenInfo: any; + stakingRewards: any; + selectedWallet: any; isHiddenAmount: boolean; openBuyDialog: () => void; backendServiceZero: string; @@ -60,6 +62,8 @@ export const defaultPortfolioState: PortfolioState = { networkId: null, ftAssetList: [], primaryTokenInfo: null, + stakingRewards: null, + selectedWallet: null, isHiddenAmount: false, showWelcomeBanner: false, openBuyDialog: () => {}, diff --git a/packages/yoroi-extension/package-lock.json b/packages/yoroi-extension/package-lock.json index 34dacce04bf..d6545232602 100644 --- a/packages/yoroi-extension/package-lock.json +++ b/packages/yoroi-extension/package-lock.json @@ -39,7 +39,7 @@ "@yoroi/resolver": "2.0.2", "@yoroi/staking": "^1.6.0", "@yoroi/swap": "6.0.2", - "@yoroi/types": "2.0.0", + "@yoroi/types": "6.0.0", "assert": "2.1.0", "async-await-queue": "2.1.4", "bech32": "2.0.0", @@ -9875,18 +9875,18 @@ } }, "node_modules/@yoroi/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@yoroi/types/-/types-2.0.0.tgz", - "integrity": "sha512-eLkd58t8nx45HulloWSnkwnnaApBEviW6Jp1401AJPU9+fG0+fvYqXoGmPTUhuEJ2qYIBx3JaSAslq6SQYJ6WA==", - "license": "Apache-2.0", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@yoroi/types/-/types-6.0.0.tgz", + "integrity": "sha512-LqAbhw9/cWR0Yq122UMgpmXwaSZPsUZQ2HRfKDU/pfAbb7tOIRwI4Fc4OwXnw8v4QgRceaMSROg4PpqX+4yIEw==", "engines": { - "node": ">= 16.19.0" + "node": ">= 22.12.0" }, "peerDependencies": { - "@emurgo/yoroi-lib": "^2.0.0", - "axios": "^1.5.0", - "bignumber.js": "^9.0.1", - "rxjs": "^7.8.1" + "@emurgo/yoroi-lib": "3.0.0-beta.1", + "axios": "^1.10.0", + "bignumber.js": "9.3.0", + "immer": "10.1.1", + "rxjs": "7.8.2" } }, "node_modules/abab": { From 1d3b4a895fbe37b40f19dd6cfa3852da943bee8f Mon Sep 17 00:00:00 2001 From: Sorin Chis Date: Fri, 3 Oct 2025 14:01:29 +0200 Subject: [PATCH 2/3] move ada balance calc in component --- .../useCases/TokensTable/TableColumnsChip.tsx | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/TableColumnsChip.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/TableColumnsChip.tsx index 40391bca78d..188bbe039ee 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/TableColumnsChip.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/TableColumnsChip.tsx @@ -11,6 +11,8 @@ import { DEFAULT_FIAT_PAIR, TOKEN_CHART_INTERVAL } from '../../common/helpers/co import { formatPriceChange, priceChange } from '../../common/helpers/priceChange'; import { useGetPortfolioTokenChart } from '../../common/hooks/usePortfolioTokenChart'; import { usePortfolio } from '../../module/PortfolioContextProvider'; +import { useMemo } from 'react'; +import { getTotalAmount } from '../../../../utils/createCurrentWalletInfo'; export const TokenDisplay = ({ token, pathId }: { token: TokenInfoType; pathId: string }) => { const theme = useTheme(); @@ -136,11 +138,19 @@ export const TokenPriceChangeChip = ({ export const TokenPriceTotal = observer(({ token, secondaryToken24Activity, stores, pathId }) => { const theme = useTheme(); - const { accountPair, primaryTokenInfo, walletBalance, showWelcomeBanner } = usePortfolio(); + const { accountPair, primaryTokenInfo, showWelcomeBanner, selectedWallet: contextSelectedWallet } = usePortfolio(); const mainFiatFullPathId = `${pathId}-totalMain-text`; const secondFiatFullPathId = `${pathId}-totalSecond-text`; const mainCurrencyValueFullPathId = `${pathId}-totalMainCurrencyValue-text`; const mainCurrencyFiatFullPathId = `${pathId}-totalMainCurrencyFiat-text`; + const selectedWallet = contextSelectedWallet; + + const { delegation } = stores; + const rewards = delegation.getRewardBalanceOrZero(selectedWallet); + const balance = selectedWallet?.balance; + const totalBalanceAmount = getTotalAmount(balance, rewards); + const defaultEntry = totalBalanceAmount?.getDefaultEntry(); + const primaryBalance = defaultEntry?.amount.shiftedBy(-primaryTokenInfo?.decimals || 0); // TODO refactor this properly if (showWelcomeBanner) { @@ -182,12 +192,15 @@ export const TokenPriceTotal = observer(({ token, secondaryToken24Activity, stor if (ptPrice === null) return `... ${currency}`; - const totalPrice = - ptPrice && - atomicBreakdown(tokenQuantityAsBigInt, decimals) - .bn.times(tokenPrice ?? 1) - .times(showingAda ? 1 : new BigNumber(ptPrice.toString())) - .toFormat(decimals); + const totalPrice = useMemo(() => { + return ( + ptPrice && + atomicBreakdown(tokenQuantityAsBigInt, decimals) + .bn.times(tokenPrice ?? 1) + .times(showingAda ? 1 : new BigNumber(ptPrice.toString())) + .toFormat(decimals) + ); + }, [primaryBalance, selectedWallet?.balance]); const primaryAda = isPrimary && showingAda; @@ -200,7 +213,7 @@ export const TokenPriceTotal = observer(({ token, secondaryToken24Activity, stor - {isPrimary ? walletBalance?.ada : token.formatedAmount} + {isPrimary ? Number(primaryBalance) : token.formatedAmount} {token.info.name} From 3c9927e864d1680360fe791c8340545c898abf09 Mon Sep 17 00:00:00 2001 From: Amin Limbada Date: Mon, 6 Oct 2025 17:21:58 +0400 Subject: [PATCH 3/3] chore: remove comment --- .../UI/features/portfolio/common/components/PortfolioHeader.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx index 4519ef5c165..9c5a619643f 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/common/components/PortfolioHeader.tsx @@ -64,7 +64,6 @@ const PortfolioHeader = observer(({ walletBalance, setKeyword, isLoading, toolti config, } = useCurrencyPairing(); - // ✅ Use context data instead of store data for automatic re-rendering const { delegation } = stores; const selectedWallet = contextSelectedWallet; const networkId = contextNetworkId;