Skip to content

Commit 089ff90

Browse files
ci(release): publish latest release
1 parent e3a712f commit 089ff90

File tree

612 files changed

+85877
-23233
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

612 files changed

+85877
-23233
lines changed

.nvmrc

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
v18
1+
v18.16.0

.prettierignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
*.tsbuildinfo
12
__generated__
23
__mocks__
34
.detoxrc.js

RELEASE

+4-8
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
Here are the latest updates:
2-
3-
Native Asset Top Up: Easily access our fiat on ramp feature if you don’t have enough native asset on a network to complete a transaction.
4-
5-
Other changes:
6-
7-
- Various bug fixes and performance improvements
8-
- Improved gas estimation for Send transactions
1+
We are back with some new updates! Here’s the latest:
2+
3+
- Improved swap context menu linkouts
4+
- Various bug fixes and performance improvements

VERSION

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
mobile/1.32
1+
extension/1.3.0

apps/extension/package.json

+3-4
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,9 @@
1111
"@sentry/react": "7.80.0",
1212
"@sentry/webpack-plugin": "2.10.3",
1313
"@svgr/webpack": "8.0.1",
14-
"@tamagui/core": "1.95.1",
14+
"@tamagui/core": "1.108.2",
1515
"@types/uuid": "9.0.1",
16-
"@uniswap/analytics-events": "2.34.0",
17-
"@uniswap/sdk-core": "5.3.0",
16+
"@uniswap/analytics-events": "2.36.0",
1817
"@uniswap/universal-router-sdk": "2.2.0",
1918
"@uniswap/v3-sdk": "3.13.0",
2019
"dotenv-webpack": "8.0.1",
@@ -75,7 +74,7 @@
7574
"serve": "^14.2.0",
7675
"statsig-js": "4.41.0",
7776
"swc-loader": "^0.2.3",
78-
"tamagui-loader": "1.95.1",
77+
"tamagui-loader": "1.108.2",
7978
"typescript": "5.3.3",
8079
"webpack": "5.90.0",
8180
"webpack-cli": "^5.0.1",

apps/extension/src/app/PopupApp.tsx

+149
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
import '@tamagui/core/reset.css'
2+
import 'src/app/Global.css'
3+
4+
import { useEffect } from 'react'
5+
import { I18nextProvider, useTranslation } from 'react-i18next'
6+
import { useDispatch } from 'react-redux'
7+
import { RouterProvider } from 'react-router-dom'
8+
import { PersistGate } from 'redux-persist/integration/react'
9+
import { ExtensionStatsigProvider } from 'src/app/StatsigProvider'
10+
import { GraphqlProvider } from 'src/app/apollo'
11+
import { ErrorElement } from 'src/app/components/ErrorElement'
12+
import { TraceUserProperties } from 'src/app/components/Trace/TraceUserProperties'
13+
import { DappContextProvider } from 'src/app/features/dapp/DappContext'
14+
import { SentryAppNameTag, initializeSentry, sentryCreateHashRouter } from 'src/app/sentry'
15+
import { initExtensionAnalytics } from 'src/app/utils/analytics'
16+
import { getLocalUserId } from 'src/app/utils/storage'
17+
import { getReduxPersistor, getReduxStore } from 'src/store/store'
18+
import { Button, Flex, Image, Text } from 'ui/src'
19+
import { CHROME_LOGO, UNISWAP_LOGO } from 'ui/src/assets'
20+
import { iconSizes, spacing } from 'ui/src/theme'
21+
import Trace from 'uniswap/src/features/telemetry/Trace'
22+
import { ElementName } from 'uniswap/src/features/telemetry/constants'
23+
import { UnitagUpdaterContextProvider } from 'uniswap/src/features/unitags/context'
24+
import i18n from 'uniswap/src/i18n/i18n'
25+
import { ExtensionScreens } from 'uniswap/src/types/screens/extension'
26+
import { logger } from 'utilities/src/logger/logger'
27+
import { ErrorBoundary } from 'wallet/src/components/ErrorBoundary/ErrorBoundary'
28+
import { LocalizationContextProvider } from 'wallet/src/features/language/LocalizationContext'
29+
import { syncAppWithDeviceLanguage } from 'wallet/src/features/language/slice'
30+
import { SharedProvider } from 'wallet/src/provider'
31+
32+
getLocalUserId()
33+
.then((userId) => {
34+
initializeSentry(SentryAppNameTag.Popup, userId)
35+
})
36+
.catch((error) => {
37+
logger.error(error, {
38+
tags: { file: 'PopupApp.tsx', function: 'getLocalUserId' },
39+
})
40+
})
41+
42+
const router = sentryCreateHashRouter([
43+
{
44+
path: '',
45+
element: <PopupContent />,
46+
errorElement: <ErrorElement />,
47+
},
48+
])
49+
50+
function PopupContent(): JSX.Element {
51+
const { t } = useTranslation()
52+
const dispatch = useDispatch()
53+
54+
useEffect(() => {
55+
dispatch(syncAppWithDeviceLanguage())
56+
}, [dispatch])
57+
58+
const searchParams = new URLSearchParams(window.location.search)
59+
const tabId = searchParams.get('tabId')
60+
const windowId = searchParams.get('windowId')
61+
62+
const tabIdNumber = tabId ? Number(tabId) : undefined
63+
const windowIdNumber = windowId ? Number(windowId) : undefined
64+
65+
return (
66+
<Trace logImpression screen={ExtensionScreens.PopupOpenExtension}>
67+
<Flex fill gap="$spacing16" height="100%" px="$spacing24" py="$spacing24">
68+
<Flex row>
69+
<Flex position="relative">
70+
<Image height={iconSizes.icon40} source={UNISWAP_LOGO} width={iconSizes.icon40} />
71+
<Flex
72+
backgroundColor="$surface1"
73+
borderColor="$surface3"
74+
borderRadius={6}
75+
borderWidth={1}
76+
bottom={-spacing.spacing4}
77+
p="$spacing2"
78+
position="absolute"
79+
right={-spacing.spacing4}
80+
>
81+
<Image height={iconSizes.icon12} source={CHROME_LOGO} width={iconSizes.icon12} />
82+
</Flex>
83+
</Flex>
84+
</Flex>
85+
86+
<Flex gap="$spacing4">
87+
<Text color="$neutral1" variant="subheading1">
88+
{t('extension.popup.chrome.title')}
89+
</Text>
90+
<Text color="$neutral2" variant="body2">
91+
{t('extension.popup.chrome.description')}
92+
</Text>
93+
</Flex>
94+
95+
<Flex fill />
96+
97+
<Trace logPress element={ElementName.ExtensionPopupOpenButton}>
98+
<Button
99+
theme="primary"
100+
width="100%"
101+
onPress={async () => {
102+
if (windowIdNumber) {
103+
// eslint-disable-next-line security/detect-non-literal-fs-filename
104+
await chrome.sidePanel.open({ tabId: tabIdNumber, windowId: windowIdNumber })
105+
window.close()
106+
}
107+
}}
108+
>
109+
{t('extension.popup.chrome.button')}
110+
</Button>
111+
</Trace>
112+
</Flex>
113+
</Trace>
114+
)
115+
}
116+
117+
// TODO WALL-4313 - Backup for some broken chrome.sidePanel.open functionality
118+
// Consider removing this once the issue is resolved or leaving as fallback
119+
export default function PopupApp(): JSX.Element {
120+
// initialize analytics on load
121+
useEffect(() => {
122+
initExtensionAnalytics().catch(() => undefined)
123+
}, [])
124+
125+
return (
126+
<Trace>
127+
<PersistGate persistor={getReduxPersistor()}>
128+
<ExtensionStatsigProvider>
129+
<I18nextProvider i18n={i18n}>
130+
<SharedProvider reduxStore={getReduxStore()}>
131+
<ErrorBoundary>
132+
<GraphqlProvider>
133+
<LocalizationContextProvider>
134+
<UnitagUpdaterContextProvider>
135+
<TraceUserProperties />
136+
<DappContextProvider>
137+
<RouterProvider router={router} />
138+
</DappContextProvider>
139+
</UnitagUpdaterContextProvider>
140+
</LocalizationContextProvider>
141+
</GraphqlProvider>
142+
</ErrorBoundary>
143+
</SharedProvider>
144+
</I18nextProvider>
145+
</ExtensionStatsigProvider>
146+
</PersistGate>
147+
</Trace>
148+
)
149+
}

apps/extension/src/app/features/accounts/AccountItem.tsx

+4-7
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,12 @@ import { removeAllDappConnectionsForAccount } from 'src/app/features/dapp/action
77
import { ContextMenu, Flex, MenuContentItem, Text, TouchableArea } from 'ui/src'
88
import { CopySheets, Edit, TrashFilled, TripleDots } from 'ui/src/components/icons'
99
import { iconSizes } from 'ui/src/theme'
10-
import { usePortfolioTotalValue } from 'uniswap/src/features/dataApi/balances'
1110
import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants'
1211
import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send'
1312
import { setClipboard } from 'uniswap/src/utils/clipboard'
1413
import { NumberType } from 'utilities/src/format/types'
1514
import { AddressDisplay } from 'wallet/src/components/accounts/AddressDisplay'
1615
import { WarningModal } from 'wallet/src/components/modals/WarningModal/WarningModal'
17-
import { usePortfolioValueModifiers } from 'wallet/src/features/dataApi/balances'
1816
import { useLocalizationContext } from 'wallet/src/features/language/LocalizationContext'
1917
import { pushNotification } from 'wallet/src/features/notifications/slice'
2018
import { AppNotificationType, CopyNotificationType } from 'wallet/src/features/notifications/types'
@@ -26,16 +24,15 @@ import { DisplayNameType } from 'wallet/src/features/wallet/types'
2624
type AccountItemProps = {
2725
address: Address
2826
onAccountSelect?: () => void
27+
balanceUSD?: number
2928
}
3029

31-
export function AccountItem({ address, onAccountSelect }: AccountItemProps): JSX.Element {
30+
export function AccountItem({ address, onAccountSelect, balanceUSD }: AccountItemProps): JSX.Element {
3231
const { t } = useTranslation()
3332
const dispatch = useDispatch()
34-
const valueModifiers = usePortfolioValueModifiers() ?? []
35-
const { data, loading, error } = usePortfolioTotalValue({ address, valueModifiers })
36-
const { balanceUSD } = data || {}
3733

3834
const { convertFiatAmountFormatted } = useLocalizationContext()
35+
3936
const formattedBalance = convertFiatAmountFormatted(balanceUSD, NumberType.PortfolioBalance)
4037

4138
const [showEditLabelModal, setShowEditLabelModal] = useState(false)
@@ -173,7 +170,7 @@ export function AccountItem({ address, onAccountSelect }: AccountItemProps): JSX
173170
transform="translateY(-50%)"
174171
variant="body3"
175172
>
176-
{loading || error ? '' : formattedBalance}
173+
{formattedBalance}
177174
</Text>
178175
<ContextMenu closeOnClick itemId={address} menuOptions={menuOptions} onLeftClick>
179176
<Flex

apps/extension/src/app/features/accounts/AccountSwitcherScreen.tsx

+16-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { navigate } from 'src/app/navigation/state'
1616
import { Button, Flex, MenuContent, MenuContentItem, Popover, ScrollView, Text, useSporeColors } from 'ui/src'
1717
import { WalletFilled, X } from 'ui/src/components/icons'
1818
import { spacing } from 'ui/src/theme'
19+
import { AccountType } from 'uniswap/src/features/accounts/types'
1920
import Trace from 'uniswap/src/features/telemetry/Trace'
2021
import { ModalName, WalletEventName } from 'uniswap/src/features/telemetry/constants'
2122
import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send'
@@ -26,9 +27,10 @@ import { sleep } from 'utilities/src/time/timing'
2627
import { AddressDisplay } from 'wallet/src/components/accounts/AddressDisplay'
2728
import { PlusCircle } from 'wallet/src/components/icons/PlusCircle'
2829
import { WarningModal } from 'wallet/src/components/modals/WarningModal/WarningModal'
30+
import { useAccountList } from 'wallet/src/features/accounts/hooks'
2931
import { createOnboardingAccount } from 'wallet/src/features/onboarding/createOnboardingAccount'
3032
import { WarningSeverity } from 'wallet/src/features/transactions/WarningModal/types'
31-
import { AccountType, BackupType, SignerMnemonicAccount } from 'wallet/src/features/wallet/accounts/types'
33+
import { BackupType, SignerMnemonicAccount } from 'wallet/src/features/wallet/accounts/types'
3234
import { createAccountsActions } from 'wallet/src/features/wallet/create/createAccountsSaga'
3335
import { useActiveAccountWithThrow, useDisplayName, useSignerAccounts } from 'wallet/src/features/wallet/hooks'
3436
import { selectSortedSignerMnemonicAccounts } from 'wallet/src/features/wallet/selectors'
@@ -136,6 +138,17 @@ export function AccountSwitcherScreen(): JSX.Element {
136138
onPress: (): void => setShowRemoveWalletModal(true),
137139
},
138140
]
141+
const { data: accountBalanceData } = useAccountList({
142+
addresses: accountAddresses,
143+
notifyOnNetworkStatusChange: true,
144+
})
145+
146+
const sortedAddressesByBalance = accountAddresses
147+
.map((address) => {
148+
const wallet = accountBalanceData?.portfolios?.find((portfolio) => portfolio?.ownerAddress === address)
149+
return { address, balance: wallet?.tokensTotalDenominatedValue?.value }
150+
})
151+
.sort((a, b) => (b.balance ?? 0) - (a.balance ?? 0))
139152

140153
const contentShadowProps = {
141154
shadowColor: colors.shadowColor.val,
@@ -201,11 +214,12 @@ export function AccountSwitcherScreen(): JSX.Element {
201214
</Text>
202215
)}
203216
<Flex>
204-
{accountAddresses.map((address: string) => {
217+
{sortedAddressesByBalance.map(({ address, balance }) => {
205218
return (
206219
<AccountItem
207220
key={address}
208221
address={address}
222+
balanceUSD={balance}
209223
onAccountSelect={async (): Promise<void> => {
210224
dispatch(setAccountAsActive(address))
211225
await updateDappConnectedAddressFromExtension(address)

0 commit comments

Comments
 (0)