From e3a712f2aeb80d6b7adb5c4826a5144f1f5e4893 Mon Sep 17 00:00:00 2001 From: Uniswap Labs Service Account Date: Thu, 8 Aug 2024 16:23:45 +0000 Subject: [PATCH] ci(release): publish latest release --- RELEASE | 9 +- VERSION | 2 +- apps/extension/src/app/PopupApp.tsx | 149 ------------------ apps/extension/src/app/navigation/utils.ts | 40 +---- apps/extension/src/app/sentry.ts | 1 - .../background/utils/chromeSidePanelUtils.ts | 5 - apps/extension/src/manifest.json | 2 +- apps/extension/src/popup.html | 68 -------- apps/extension/src/popup/popup.tsx | 45 ------ apps/extension/src/store/store.ts | 8 +- apps/extension/webpack.config.js | 1 - apps/mobile/src/app/App.tsx | 107 +++++++------ .../src/app/modals/AccountSwitcherModal.tsx | 4 +- .../AccountSwitcherModal.test.tsx.snap | 82 +++++----- .../src/components/accounts/AccountList.tsx | 78 ++++++--- .../__snapshots__/AccountList.test.tsx.snap | 78 +++++---- .../mobile/src/screens/TokenDetailsScreen.tsx | 2 +- packages/ui/src/assets/index.ts | 1 - .../ui/src/assets/logos/png/chrome-logo.png | Bin 1316 -> 0 bytes packages/ui/src/theme/fonts.ts | 7 +- .../modals/BottomSheetModal.native.tsx | 4 +- .../src/features/telemetry/constants/trace.ts | 1 - .../src/i18n/locales/source/en-US.json | 3 - .../src/i18n/locales/translations/es-ES.json | 3 - .../src/i18n/locales/translations/fr-FR.json | 3 - .../uniswap/src/types/screens/extension.ts | 1 - .../components/landing/LandingBackground.tsx | 4 +- packages/wallet/src/features/language/saga.ts | 5 +- 28 files changed, 223 insertions(+), 490 deletions(-) delete mode 100644 apps/extension/src/app/PopupApp.tsx delete mode 100644 apps/extension/src/popup.html delete mode 100644 apps/extension/src/popup/popup.tsx delete mode 100644 packages/ui/src/assets/logos/png/chrome-logo.png diff --git a/RELEASE b/RELEASE index 708484fbe0d..962f6bf660c 100644 --- a/RELEASE +++ b/RELEASE @@ -1,3 +1,8 @@ -- Onboarding improvements -- Adds fallback support method for opening the side panel on chrome failure +Here are the latest updates: + +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. + +Other changes: + - Various bug fixes and performance improvements +- Improved gas estimation for Send transactions diff --git a/VERSION b/VERSION index da438b7e9f7..e5142648116 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -extension/1.2.1 \ No newline at end of file +mobile/1.32 \ No newline at end of file diff --git a/apps/extension/src/app/PopupApp.tsx b/apps/extension/src/app/PopupApp.tsx deleted file mode 100644 index cbb527860bf..00000000000 --- a/apps/extension/src/app/PopupApp.tsx +++ /dev/null @@ -1,149 +0,0 @@ -import '@tamagui/core/reset.css' -import 'src/app/Global.css' - -import { useEffect } from 'react' -import { I18nextProvider, useTranslation } from 'react-i18next' -import { useDispatch } from 'react-redux' -import { RouterProvider } from 'react-router-dom' -import { PersistGate } from 'redux-persist/integration/react' -import { ExtensionStatsigProvider } from 'src/app/StatsigProvider' -import { GraphqlProvider } from 'src/app/apollo' -import { ErrorElement } from 'src/app/components/ErrorElement' -import { TraceUserProperties } from 'src/app/components/Trace/TraceUserProperties' -import { DappContextProvider } from 'src/app/features/dapp/DappContext' -import { SentryAppNameTag, initializeSentry, sentryCreateHashRouter } from 'src/app/sentry' -import { initExtensionAnalytics } from 'src/app/utils/analytics' -import { getLocalUserId } from 'src/app/utils/storage' -import { getReduxPersistor, getReduxStore } from 'src/store/store' -import { Button, Flex, Image, Text } from 'ui/src' -import { CHROME_LOGO, UNISWAP_LOGO } from 'ui/src/assets' -import { iconSizes, spacing } from 'ui/src/theme' -import Trace from 'uniswap/src/features/telemetry/Trace' -import { ElementName } from 'uniswap/src/features/telemetry/constants' -import { UnitagUpdaterContextProvider } from 'uniswap/src/features/unitags/context' -import i18n from 'uniswap/src/i18n/i18n' -import { ExtensionScreens } from 'uniswap/src/types/screens/extension' -import { logger } from 'utilities/src/logger/logger' -import { ErrorBoundary } from 'wallet/src/components/ErrorBoundary/ErrorBoundary' -import { LocalizationContextProvider } from 'wallet/src/features/language/LocalizationContext' -import { syncAppWithDeviceLanguage } from 'wallet/src/features/language/slice' -import { SharedProvider } from 'wallet/src/provider' - -getLocalUserId() - .then((userId) => { - initializeSentry(SentryAppNameTag.Popup, userId) - }) - .catch((error) => { - logger.error(error, { - tags: { file: 'PopupApp.tsx', function: 'getLocalUserId' }, - }) - }) - -const router = sentryCreateHashRouter([ - { - path: '', - element: , - errorElement: , - }, -]) - -function PopupContent(): JSX.Element { - const { t } = useTranslation() - const dispatch = useDispatch() - - useEffect(() => { - dispatch(syncAppWithDeviceLanguage()) - }, [dispatch]) - - const searchParams = new URLSearchParams(window.location.search) - const tabId = searchParams.get('tabId') - const windowId = searchParams.get('windowId') - - const tabIdNumber = tabId ? Number(tabId) : undefined - const windowIdNumber = windowId ? Number(windowId) : undefined - - return ( - - - - - - - - - - - - - - {t('extension.popup.chrome.title')} - - - {t('extension.popup.chrome.description')} - - - - - - - - - - - ) -} - -// TODO WALL-4313 - Backup for some broken chrome.sidePanel.open functionality -// Consider removing this once the issue is resolved or leaving as fallback -export default function PopupApp(): JSX.Element { - // initialize analytics on load - useEffect(() => { - initExtensionAnalytics().catch(() => undefined) - }, []) - - return ( - - - - - - - - - - - - - - - - - - - - - - - ) -} diff --git a/apps/extension/src/app/navigation/utils.ts b/apps/extension/src/app/navigation/utils.ts index f690045e889..1ba94376f68 100644 --- a/apps/extension/src/app/navigation/utils.ts +++ b/apps/extension/src/app/navigation/utils.ts @@ -36,7 +36,7 @@ export const useExtensionNavigation = (): { export async function focusOrCreateOnboardingTab(page?: string): Promise { const extension = await chrome.management.getSelf() - const tabs = await chrome.tabs.query({ url: `chrome-extension://${extension.id}/onboarding.html*` }) + const tabs = await chrome.tabs.query({ url: `chrome-extension://${extension.id}/*` }) const tab = tabs[0] const url = 'onboarding.html#/' + (page ? page : TopLevelRoutes.Onboarding) @@ -68,44 +68,6 @@ export async function focusOrCreateOnboardingTab(page?: string): Promise { }) } -export async function focusOrCreateDappRequestWindow(tabId: number | undefined, windowId: number): Promise { - const extension = await chrome.management.getSelf() - - const window = await chrome.windows.getCurrent() - - const tabs = await chrome.tabs.query({ url: `chrome-extension://${extension.id}/popup.html*` }) - const tab = tabs[0] - - // Centering within current window - const height = 410 - const width = 330 - const top = Math.round((window.top ?? 0) + ((window.height ?? height) - height) / 2) - const left = Math.round((window.left ?? 0) + ((window.width ?? width) - width) / 2) - let url = `popup.html?windowId=${windowId}` - if (tabId) { - url += `&tabId=${tabId}` - } - - if (!tab?.id) { - await chrome.windows.create({ - url, - type: 'popup', - top, - left, - width, - height, - }) - return - } - - await chrome.tabs.update(tab.id, { - url, - active: true, - highlighted: true, - }) - await chrome.windows.update(tab.windowId, { focused: true, top, left, width, height }) -} - /** * To avoid opening too many tabs while also ensuring that we don't take over the user's active tab, * we only update the URL of the active tab if it's already in a specific route of the Uniswap interface. diff --git a/apps/extension/src/app/sentry.ts b/apps/extension/src/app/sentry.ts index 513cb535205..33515d8a76c 100644 --- a/apps/extension/src/app/sentry.ts +++ b/apps/extension/src/app/sentry.ts @@ -19,7 +19,6 @@ export const enum SentryAppNameTag { Onboarding = 'onboarding', ContentScript = 'content-script', Background = 'background', - Popup = 'popup', } export function initializeSentry(appNameTag: SentryAppNameTag, sentryUserId: string): void { diff --git a/apps/extension/src/background/utils/chromeSidePanelUtils.ts b/apps/extension/src/background/utils/chromeSidePanelUtils.ts index 8696d81e4c0..c566362777e 100644 --- a/apps/extension/src/background/utils/chromeSidePanelUtils.ts +++ b/apps/extension/src/background/utils/chromeSidePanelUtils.ts @@ -1,4 +1,3 @@ -import { focusOrCreateDappRequestWindow } from 'src/app/navigation/utils' import { logger } from 'utilities/src/logger/logger' export async function openSidePanel(tabId: number | undefined, windowId: number): Promise { @@ -9,10 +8,6 @@ export async function openSidePanel(tabId: number | undefined, windowId: number) windowId, }) } catch (error) { - // TODO WALL-4313 - Backup for some broken chrome.sidePanel.open functionality - // Consider removing this once the issue is resolved or leaving as fallback - await focusOrCreateDappRequestWindow(tabId, windowId) - logger.error(error, { tags: { file: 'background/background.ts', diff --git a/apps/extension/src/manifest.json b/apps/extension/src/manifest.json index e107f435782..a7d174c4cf4 100644 --- a/apps/extension/src/manifest.json +++ b/apps/extension/src/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "Uniswap Extension", "description": "The Uniswap Extension is a self-custody crypto wallet that's built for swapping.", - "version": "1.2.1", + "version": "1.2.0", "minimum_chrome_version": "116", "icons": { "16": "assets/icon16.png", diff --git a/apps/extension/src/popup.html b/apps/extension/src/popup.html deleted file mode 100644 index 15cc3f3f894..00000000000 --- a/apps/extension/src/popup.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - Uniswap Extension - - - - - - - - diff --git a/apps/extension/src/popup/popup.tsx b/apps/extension/src/popup/popup.tsx deleted file mode 100644 index 8fff4d84eca..00000000000 --- a/apps/extension/src/popup/popup.tsx +++ /dev/null @@ -1,45 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/triple-slash-reference -/// - -import { createRoot } from 'react-dom/client' -import { OptionalStrictMode } from 'src/app/components/OptionalStrictMode' -import PopupApp from 'src/app/PopupApp' -import { initializeSentry, SentryAppNameTag } from 'src/app/sentry' -import { getLocalUserId } from 'src/app/utils/storage' -import { initializeReduxStore } from 'src/store/store' -import { logger } from 'utilities/src/logger/logger' -;(globalThis as any).regeneratorRuntime = undefined // eslint-disable-line @typescript-eslint/no-explicit-any -// The globalThis.regeneratorRuntime = undefined addresses a potentially unsafe-eval problem -// see https://github.com/facebook/regenerator/issues/378#issuecomment-802628326 - -getLocalUserId() - .then((userId) => { - initializeSentry(SentryAppNameTag.Popup, userId) - }) - .catch((error) => { - logger.error(error, { - tags: { file: 'popup.tsx', function: 'getLocalUserId' }, - }) - }) -async function initPopup(): Promise { - await initializeReduxStore({ readOnly: true }) - - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const container = document.getElementById('popup-root')! - const root = createRoot(container) - - root.render( - - - , - ) -} - -initPopup().catch((error) => { - logger.error(error, { - tags: { - file: 'popup.tsx', - function: 'initPopup', - }, - }) -}) diff --git a/apps/extension/src/store/store.ts b/apps/extension/src/store/store.ts index f351b0f3729..d7fcc4cfe1b 100644 --- a/apps/extension/src/store/store.ts +++ b/apps/extension/src/store/store.ts @@ -58,7 +58,7 @@ const setupStore = (preloadedState?: PreloadedState): ReturnType let store: ReturnType | undefined let persistor: ReturnType | undefined -export async function initializeReduxStore(args?: { readOnly?: boolean }): Promise<{ +export async function initializeReduxStore(): Promise<{ store: ReturnType persistor: ReturnType }> { @@ -69,12 +69,6 @@ export async function initializeReduxStore(args?: { readOnly?: boolean }): Promi store = setupStore(oldStore) persistor = persistStore(store) - if (args?.readOnly) { - // This means the store will be initialized with the persisted state from disk, but it won't persist any changes. - // Only useful for use cases where we don't want to modify the state (for example, a popup window instead of the sidebar). - persistor.pause() - } - // We wait a few seconds to make sure the store is fully initialized and persisted before deleting the old storage. // This is needed because otherwise the background script might think the user is not onboarded if it reads the storage while it's being migrated. if (oldStore) { diff --git a/apps/extension/webpack.config.js b/apps/extension/webpack.config.js index c94eea912e1..096cb64fd24 100644 --- a/apps/extension/webpack.config.js +++ b/apps/extension/webpack.config.js @@ -172,7 +172,6 @@ module.exports = (env) => { sidebar: './src/sidebar/sidebar.tsx', injected: './src/contentScript/injected.ts', ethereum: './src/contentScript/ethereum.ts', - popup: './src/popup/popup.tsx', }, output: { filename: '[name].js', diff --git a/apps/mobile/src/app/App.tsx b/apps/mobile/src/app/App.tsx index 46640688bb3..7c9829a023f 100644 --- a/apps/mobile/src/app/App.tsx +++ b/apps/mobile/src/app/App.tsx @@ -93,8 +93,7 @@ if (!__DEV__ && !isDetoxBuild) { environment: getSentryEnvironment(), dsn: config.sentryDsn, attachViewHierarchy: true, - // DataDog would do this for us now - enableCaptureFailedRequests: false, + enableCaptureFailedRequests: true, tracesSampleRate: getSentryTracesSamplingRate(), integrations: [ new Sentry.ReactNativeTracing({ @@ -175,26 +174,24 @@ function App(): JSX.Element | null { return ( - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + ) } @@ -248,38 +245,40 @@ function AppOuter(): JSX.Element | null { - - - - - - - - - { - routingInstrumentation.registerNavigationContainer(navigationRef) - }} - > - - - - - - - - - - - - - - - - - - - + + + + + + + + + + { + routingInstrumentation.registerNavigationContainer(navigationRef) + }} + > + + + + + + + + + + + + + + + + + + + + diff --git a/apps/mobile/src/app/modals/AccountSwitcherModal.tsx b/apps/mobile/src/app/modals/AccountSwitcherModal.tsx index 563f1e1edb0..e020f3a8f65 100644 --- a/apps/mobile/src/app/modals/AccountSwitcherModal.tsx +++ b/apps/mobile/src/app/modals/AccountSwitcherModal.tsx @@ -269,7 +269,9 @@ export function AccountSwitcher({ onClose }: { onClose: () => void }): JSX.Eleme - + + + diff --git a/apps/mobile/src/app/modals/__snapshots__/AccountSwitcherModal.test.tsx.snap b/apps/mobile/src/app/modals/__snapshots__/AccountSwitcherModal.test.tsx.snap index 076e03a3860..24db7b7aa3c 100644 --- a/apps/mobile/src/app/modals/__snapshots__/AccountSwitcherModal.test.tsx.snap +++ b/apps/mobile/src/app/modals/__snapshots__/AccountSwitcherModal.test.tsx.snap @@ -363,51 +363,57 @@ exports[`AccountSwitcher renders correctly 1`] = ` style={ { "flexDirection": "column", - "flexShrink": 1, + "maxHeight": NaN, } } > - ExpoLinearGradient - } - bounces={false} - collapsable={false} - data={[]} - getItem={[Function]} - getItemCount={[Function]} - jestAnimatedStyle={ + - - - - - ExpoLinearGradient + ExpoLinearGradient + + + + ExpoLinearGradient + , 'onPress'> & { accounts: Account[] isVisible?: boolean @@ -26,7 +23,7 @@ type AccountWithPortfolioValue = { portfolioValue: number | undefined } -const ViewOnlyHeader = (): JSX.Element => { +const ViewOnlyHeaderContent = (): JSX.Element => { const { t } = useTranslation() return ( @@ -37,6 +34,19 @@ const ViewOnlyHeader = (): JSX.Element => { ) } +enum AccountListItemType { + SignerHeader, + SignerAccount, + ViewOnlyHeader, + ViewOnlyAccount, +} + +type AccountListItem = + | { type: AccountListItemType.SignerHeader } + | { type: AccountListItemType.SignerAccount; account: AccountWithPortfolioValue } + | { type: AccountListItemType.ViewOnlyHeader } + | { type: AccountListItemType.ViewOnlyAccount; account: AccountWithPortfolioValue } + const SignerHeader = (): JSX.Element => { const { t } = useTranslation() return ( @@ -107,6 +117,45 @@ export function AccountList({ accounts, onPress, isVisible }: AccountListProps): [onPress], ) + const accountsToRender = useMemo(() => { + const items: AccountListItem[] = [] + + if (hasSignerAccounts) { + items.push({ type: AccountListItemType.SignerHeader }) + items.push(...signerAccounts.map((account) => ({ type: AccountListItemType.SignerAccount, account }))) + } + + if (hasViewOnlyAccounts) { + items.push({ type: AccountListItemType.ViewOnlyHeader }) + items.push(...viewOnlyAccounts.map((account) => ({ type: AccountListItemType.ViewOnlyAccount, account }))) + } + + return items + }, [hasSignerAccounts, hasViewOnlyAccounts, signerAccounts, viewOnlyAccounts]) + + const renderItem = useCallback( + ({ item }: { item: AccountListItem }) => { + switch (item.type) { + case AccountListItemType.SignerHeader: + return + case AccountListItemType.ViewOnlyHeader: + return + case AccountListItemType.SignerAccount: + case AccountListItemType.ViewOnlyAccount: + return renderAccountCardItem(item.account) + } + }, + [renderAccountCardItem], + ) + + const keyExtractor = useCallback( + (item: AccountListItem, index: number) => + item.type === AccountListItemType.SignerAccount || item.type === AccountListItemType.ViewOnlyAccount + ? item.account.account.address + : item.type.toString() + index, + [], + ) + return ( {/* TODO(MOB-646): attempt to switch gradients to react-native-svg#LinearGradient and avoid new clear color */} @@ -116,24 +165,7 @@ export function AccountList({ accounts, onPress, isVisible }: AccountListProps): start={{ x: 0, y: 1 }} style={ListSheet.topGradient} /> - = MIN_ACCOUNTS_TO_ENABLE_SCROLL} - showsVerticalScrollIndicator={false} - > - {hasSignerAccounts && ( - <> - - {signerAccounts.map(renderAccountCardItem)} - - )} - {hasViewOnlyAccounts && ( - <> - - {viewOnlyAccounts.map(renderAccountCardItem)} - - )} - + ExpoLinearGradient - - - - - - } - bounces={false} collapsable={false} - data={[]} + data={ + [ + { + "type": 0, + }, + { + "account": { + "account": { + "address": "0x82D56A352367453f74FC0dC7B071b311da373Fa6", + "backups": [ + "cloud", + ], + "derivationIndex": 0, + "mnemonicId": "0x82D56A352367453f74FC0dC7B071b311da373Fa6", + "name": "Test Account", + "timeImportedMs": 10, + "type": "signerMnemonic", + }, + "isPortfolioValueLoading": false, + "portfolioValue": 55, + }, + "type": 1, + }, + ] + } getItem={[Function]} getItemCount={[Function]} - jestAnimatedStyle={ - { - "value": {}, - } - } + handlerTag={1} + handlerType="NativeViewGestureHandler" keyExtractor={[Function]} - keyboardShouldPersistTaps="always" onContentSizeChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} onLayout={[Function]} onMomentumScrollBegin={[Function]} onMomentumScrollEnd={[Function]} @@ -47,18 +53,26 @@ exports[`AccountList renders without error 1`] = ` onScrollEndDrag={[Function]} removeClippedSubviews={false} renderItem={[Function]} - scrollEnabled={false} - scrollEventThrottle={16} - sentry-label="VirtualizedList" - showsHorizontalScrollIndicator={false} - showsVerticalScrollIndicator={false} + renderScrollComponent={[Function]} + scrollEventThrottle={0.0001} stickyHeaderIndices={[]} viewabilityConfigCallbackPairs={[]} + waitFor={ + [ + { + "current": null, + }, + { + "current": null, + }, + ] + } > + + { - setShowWarningModal(false) + setShowBuyNativeTokenModal(false) }} /> )} diff --git a/packages/ui/src/assets/index.ts b/packages/ui/src/assets/index.ts index d2c90774a49..19513d3d9d6 100644 --- a/packages/ui/src/assets/index.ts +++ b/packages/ui/src/assets/index.ts @@ -21,7 +21,6 @@ export const AVATARS_LIGHT = require('./misc/avatars-light.png') export const AVATARS_DARK = require('./misc/avatars-dark.png') export const APP_SCREENSHOT_LIGHT = require('./misc/app-screenshot-light.png') export const APP_SCREENSHOT_DARK = require('./misc/app-screenshot-dark.png') -export const CHROME_LOGO = require('./logos/png/chrome-logo.png') export const DOT_GRID = require('./misc/dot-grid.png') export const UNITAGS_BANNER_VERTICAL_LIGHT = require('./graphics/unitags-banner-v-light.png') export const UNITAGS_BANNER_VERTICAL_DARK = require('./graphics/unitags-banner-v-dark.png') diff --git a/packages/ui/src/assets/logos/png/chrome-logo.png b/packages/ui/src/assets/logos/png/chrome-logo.png deleted file mode 100644 index e1ef3e9105ea9a4818c5a754d98f1f60238d1a92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1316 zcmV+<1>5?GP)K~#7Ft(IL( zTtyVe&zXB+`6?|7Wf$1hRa03k7~Nu1R0s_P3u@A0AtY9fPo&n;qY7^C6Pe*P(EDB3KS3&MRv>HInMpqW$yyAHJ#nLGk50B`OW{# z%()lg7Sc#bzEir%vSr41pcLmPqPaNE2kbxg&crevH+x{T$Xy^Q>={C=K?E0wi}n+x zIvTZm7!qX{li;TShs4O&IuRyuIv%ABjZ14fMixZuL+ngBT#l^C+bhR#r8hdsmzq)JWFV}w! zjKALlNqZgz*=Exl{1d=$d@9OO?N)aa>3vA*U%j`1g})1(P^b0p`Q(5rNI3S+2g8uL zxPsAcl((f(#;G?bsdz72T;|X}6$BE7+;$nP$qe{(3-Gbm0Rlc9rgj3E>VAg#nzEb3 zPKyS7e}6WdZXGwNiL==$tLXyHCfo5u^B-`zH(=_oElh-y6?Ne76oc~9V?=%*>XHnQ zQBUCToUvw9B%%TIJCb0)nPf7yt-b+oB--I%bsH%U5o-NJ4q*Lu*t1)*uE=GGm=tK3G+)_oBd{~V;}(PdV;kaj5DF<2$c*uWsm_1 zsr$@h#U%>^Imd}Z(?N(e_5BtEv}EHNR~q+>WM&CLLU}13p=Ecv=1Pgh%n~zKMKOwo zgq2ZnWjN$Qh*0-cekuq)bM-Fr3A&G37c-O++~8N!S!r zTbKaWBnC9o76m~Fts(0@e8nf0b&Wdpa&2}He(-hkSE{yvGfmnMr1qVxNDPZ zj38=2!perU6+u$k*HtI-iOw^~rCDe@lBUf*I+fpNfzOXx#W|UU;P_j#p8K?O2H2&A ztAdXnzgr=T{{X-lJtwIyy%{%?eX03P-K`A&O>Ohlz5v%_SeLRp%=b63&@`o!P#fp zp+IYP>Qfm3$V*m1=G`Yglx8G}mB&Bw>)A-#>jtCYBb{FcC8b!{|2XVAZdR4RI33Gb zhUiy`sJF2I?8Ktsj%d4^ex$nIE_F!~zN`?baCc~fG&llq-025H`ZzJ(CUb1Yhx__A avh^<&aDY@PU_7}10000 } diff --git a/packages/wallet/src/features/language/saga.ts b/packages/wallet/src/features/language/saga.ts index 88d4ff6eee9..2475e761a19 100644 --- a/packages/wallet/src/features/language/saga.ts +++ b/packages/wallet/src/features/language/saga.ts @@ -4,7 +4,6 @@ import { call, put, select, takeLatest } from 'typed-redux-saga' import i18n from 'uniswap/src/i18n/i18n' import { getDeviceLocales } from 'utilities/src/device/locales' import { logger } from 'utilities/src/logger/logger' -import { isMobile } from 'utilities/src/platform' import { Language, Locale, @@ -39,9 +38,7 @@ function* appLanguageSaga(action: ReturnType) { logger.warn('language/saga', 'appLanguageSaga', 'Sync of language setting state and i18n instance failed') } - if (isMobile) { - yield* call(restartAppIfRTL, localeToSet) - } + yield* call(restartAppIfRTL, localeToSet) } function getDeviceLanguage(): Language {