From 1ea747c59a4666c5637fe7a47a1f70d3c4fd3003 Mon Sep 17 00:00:00 2001 From: ruijialin Date: Tue, 3 Jun 2025 13:58:52 -0400 Subject: [PATCH 1/6] set default currency on login --- .../app/store/middleware/listener.ts | 3 ++ .../app/store/settings/currency/listeners.ts | 43 +++++++++++++++++++ .../core-mobile/app/store/viewOnce/types.ts | 3 +- packages/core-mobile/ios/Podfile.lock | 6 +++ packages/core-mobile/package.json | 1 + yarn.lock | 20 +++++++++ 6 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 packages/core-mobile/app/store/settings/currency/listeners.ts diff --git a/packages/core-mobile/app/store/middleware/listener.ts b/packages/core-mobile/app/store/middleware/listener.ts index a7c06e0ecc..3aba5a54a2 100644 --- a/packages/core-mobile/app/store/middleware/listener.ts +++ b/packages/core-mobile/app/store/middleware/listener.ts @@ -15,6 +15,7 @@ import { addWatchlistListeners } from 'store/watchlist/listeners' import { addAppearanceListeners } from 'store/settings/appearance/listeners' import { addUnifiedBridgeListeners } from 'store/unifiedBridge/listeners' import { AppAddListener, AppStartListening } from 'store/types' +import { addCurrencyListeners } from 'store/settings/currency/listeners' const listener = createListenerMiddleware({ onError: (error, errorInfo) => { @@ -53,6 +54,8 @@ addWatchlistListeners(startListening) addAppearanceListeners(startListening) +addCurrencyListeners(startListening) + export const addAppListener = addListener as AppAddListener export { listener } diff --git a/packages/core-mobile/app/store/settings/currency/listeners.ts b/packages/core-mobile/app/store/settings/currency/listeners.ts new file mode 100644 index 0000000000..3404e91834 --- /dev/null +++ b/packages/core-mobile/app/store/settings/currency/listeners.ts @@ -0,0 +1,43 @@ +import { AnyAction, isAnyOf } from '@reduxjs/toolkit' +import { onAppUnlocked } from 'store/app' +import { AppListenerEffectAPI, AppStartListening } from 'store/types' +import { getLocales } from 'expo-localization' +import { + selectHasBeenViewedOnce, + setViewOnce, + ViewOnceKey +} from 'store/viewOnce' +import { setSelectedCurrency } from './slice' +import { currencies, CurrencySymbol } from './types' + +const handleSetDefaultCurrency = ( + _: AnyAction, + listenerApi: AppListenerEffectAPI +): void => { + const locales = getLocales() + const defaultCurrency = locales[0]?.currencyCode + + const { getState, dispatch } = listenerApi + const state = getState() + + const hasSetDefaultCurrency = selectHasBeenViewedOnce( + ViewOnceKey.SET_DEFAULT_CURRENCY + )(state) + + if (hasSetDefaultCurrency === false) { + const supportedCurrency = + currencies.find(curr => curr.symbol === defaultCurrency)?.symbol ?? + CurrencySymbol.USD + dispatch(setSelectedCurrency(supportedCurrency)) + dispatch(setViewOnce(ViewOnceKey.SET_DEFAULT_CURRENCY)) + } +} + +export const addCurrencyListeners = ( + startListening: AppStartListening +): void => { + startListening({ + matcher: isAnyOf(onAppUnlocked), + effect: handleSetDefaultCurrency + }) +} diff --git a/packages/core-mobile/app/store/viewOnce/types.ts b/packages/core-mobile/app/store/viewOnce/types.ts index aac4225bb2..2d30f5d674 100644 --- a/packages/core-mobile/app/store/viewOnce/types.ts +++ b/packages/core-mobile/app/store/viewOnce/types.ts @@ -11,7 +11,8 @@ export enum ViewOnceKey { SWAP_ONBOARDING, SEND_ONBOARDING, MIGRATE_TOKEN_FAVORITE_IDS, - AUTO_ENABLE_L2_CHAINS + AUTO_ENABLE_L2_CHAINS, + SET_DEFAULT_CURRENCY } export type ViewOnceObjectType = { diff --git a/packages/core-mobile/ios/Podfile.lock b/packages/core-mobile/ios/Podfile.lock index b91d01d20a..5463067683 100644 --- a/packages/core-mobile/ios/Podfile.lock +++ b/packages/core-mobile/ios/Podfile.lock @@ -309,6 +309,8 @@ PODS: - ExpoModulesCore - ExpoLocalAuthentication (15.0.2): - ExpoModulesCore + - ExpoLocalization (16.1.5): + - ExpoModulesCore - ExpoModulesCore (2.2.3): - DoubleConversion - glog @@ -3030,6 +3032,7 @@ DEPENDENCIES: - ExpoLinearGradient (from `../node_modules/expo-linear-gradient/ios`) - ExpoLinking (from `../node_modules/expo-linking/ios`) - ExpoLocalAuthentication (from `../node_modules/expo-local-authentication/ios`) + - ExpoLocalization (from `../node_modules/expo-localization/ios`) - ExpoModulesCore (from `../node_modules/expo-modules-core`) - ExpoSMS (from `../node_modules/expo-sms/ios`) - ExpoVideo (from `../node_modules/expo-video/ios`) @@ -3252,6 +3255,8 @@ EXTERNAL SOURCES: :path: "../node_modules/expo-linking/ios" ExpoLocalAuthentication: :path: "../node_modules/expo-local-authentication/ios" + ExpoLocalization: + :path: "../node_modules/expo-localization/ios" ExpoModulesCore: :path: "../node_modules/expo-modules-core" ExpoSMS: @@ -3533,6 +3538,7 @@ SPEC CHECKSUMS: ExpoLinearGradient: ee9efc5acb988b911320e964fab9b4cbdeb198c4 ExpoLinking: 0381341519ca7180a3a057d20edb1cf6a908aaf4 ExpoLocalAuthentication: 64bf2cbee456f5639d69a853684c285afc0602d8 + ExpoLocalization: 7cd94f24bc3ff2f263cb4258fe1e86a97bc1ea64 ExpoModulesCore: dd965804a882f1dbb6036fceea4d912461aeaa0d ExpoSMS: 2f90c7c780ef65c9f52b800183aab554360b34a2 ExpoVideo: 6860956b8fc77af4e69165236af5fc037a060a02 diff --git a/packages/core-mobile/package.json b/packages/core-mobile/package.json index 0317a1084b..390238b690 100644 --- a/packages/core-mobile/package.json +++ b/packages/core-mobile/package.json @@ -118,6 +118,7 @@ "expo-linear-gradient": "14.0.2", "expo-linking": "7.0.5", "expo-local-authentication": "15.0.2", + "expo-localization": "16.1.5", "expo-router": "4.0.18", "expo-sms": "13.0.1", "expo-video": "2.0.5", diff --git a/yarn.lock b/yarn.lock index bcae9bd244..3490e8ca1a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -327,6 +327,7 @@ __metadata: expo-linear-gradient: 14.0.2 expo-linking: 7.0.5 expo-local-authentication: 15.0.2 + expo-localization: 16.1.5 expo-router: 4.0.18 expo-sms: 13.0.1 expo-video: 2.0.5 @@ -18990,6 +18991,18 @@ __metadata: languageName: node linkType: hard +"expo-localization@npm:16.1.5": + version: 16.1.5 + resolution: "expo-localization@npm:16.1.5" + dependencies: + rtl-detect: ^1.0.2 + peerDependencies: + expo: "*" + react: "*" + checksum: c301e594e2a93b7e7ca278bbd4856ef23b7da1b72affaa1d7a62e54de02d949bdd23a939b7113105c1fae29317d69527e74b617fd8e666143f8211d54131fe38 + languageName: node + linkType: hard + "expo-manifests@npm:~0.15.7": version: 0.15.7 resolution: "expo-manifests@npm:0.15.7" @@ -28583,6 +28596,13 @@ react-native-webview@ava-labs/react-native-webview: languageName: node linkType: hard +"rtl-detect@npm:^1.0.2": + version: 1.1.2 + resolution: "rtl-detect@npm:1.1.2" + checksum: 4a43a1e5df0617eb86d5485640b318787d12b86acf53d840a3b2ff701ee941e95479d4e9ae97e907569ec763d1c47218cb87639bc87bcdad60a85747e5270cf0 + languageName: node + linkType: hard + "run-async@npm:^2.4.0": version: 2.4.1 resolution: "run-async@npm:2.4.1" From b19585cd852c865606a1dc6ce6ca823878a141b4 Mon Sep 17 00:00:00 2001 From: ruijialin Date: Wed, 4 Jun 2025 14:11:36 -0400 Subject: [PATCH 2/6] listen to appstate --- .../core-mobile/app/store/app/listeners.ts | 2 + .../app/store/settings/currency/listeners.ts | 50 +++++++++++++++---- .../app/store/settings/currency/slice.ts | 6 ++- 3 files changed, 47 insertions(+), 11 deletions(-) diff --git a/packages/core-mobile/app/store/app/listeners.ts b/packages/core-mobile/app/store/app/listeners.ts index 1d63f24852..e1782fe77d 100644 --- a/packages/core-mobile/app/store/app/listeners.ts +++ b/packages/core-mobile/app/store/app/listeners.ts @@ -32,6 +32,7 @@ import { setSelectedAppearance, setSelectedColorScheme } from 'store/settings/appearance' +import { setCurrencyOnChangeLocale } from 'store/settings/currency' import { onAppLocked, onAppUnlocked, @@ -88,6 +89,7 @@ const listenToAppState = async ( Logger.info('app comes back to foreground') AnalyticsService.capture('ApplicationOpened') dispatch(onForeground()) + dispatch(setCurrencyOnChangeLocale()) } else if (nextAppState === 'background') { Logger.info('app goes to background') dispatch(onBackground()) diff --git a/packages/core-mobile/app/store/settings/currency/listeners.ts b/packages/core-mobile/app/store/settings/currency/listeners.ts index 3404e91834..485e77d053 100644 --- a/packages/core-mobile/app/store/settings/currency/listeners.ts +++ b/packages/core-mobile/app/store/settings/currency/listeners.ts @@ -1,4 +1,4 @@ -import { AnyAction, isAnyOf } from '@reduxjs/toolkit' +import { AnyAction } from '@reduxjs/toolkit' import { onAppUnlocked } from 'store/app' import { AppListenerEffectAPI, AppStartListening } from 'store/types' import { getLocales } from 'expo-localization' @@ -7,16 +7,44 @@ import { setViewOnce, ViewOnceKey } from 'store/viewOnce' -import { setSelectedCurrency } from './slice' +import { AppDispatch } from '../../types' +import { + selectSelectedCurrency, + setCurrencyOnChangeLocale, + setSelectedCurrency +} from './slice' import { currencies, CurrencySymbol } from './types' -const handleSetDefaultCurrency = ( +export const setCurrency = ( + dispatch: AppDispatch, + selectedCurrency: string +): void => { + const locales = getLocales() + const currencyCode = locales[0]?.currencyCode + + const supportedCurrency = + currencies.find(curr => curr.symbol === currencyCode)?.symbol ?? + CurrencySymbol.USD + + if (selectedCurrency === supportedCurrency) return + + dispatch(setSelectedCurrency(supportedCurrency)) +} + +const handleSetCurrencyOnChangeLocale = ( _: AnyAction, listenerApi: AppListenerEffectAPI ): void => { - const locales = getLocales() - const defaultCurrency = locales[0]?.currencyCode + const { getState, dispatch } = listenerApi + const state = getState() + const selectedCurrency = selectSelectedCurrency(state) + setCurrency(dispatch, selectedCurrency) +} +const handleSetDefaultCurrency = ( + _: AnyAction, + listenerApi: AppListenerEffectAPI +): void => { const { getState, dispatch } = listenerApi const state = getState() @@ -25,10 +53,7 @@ const handleSetDefaultCurrency = ( )(state) if (hasSetDefaultCurrency === false) { - const supportedCurrency = - currencies.find(curr => curr.symbol === defaultCurrency)?.symbol ?? - CurrencySymbol.USD - dispatch(setSelectedCurrency(supportedCurrency)) + setCurrency(_, listenerApi) dispatch(setViewOnce(ViewOnceKey.SET_DEFAULT_CURRENCY)) } } @@ -37,7 +62,12 @@ export const addCurrencyListeners = ( startListening: AppStartListening ): void => { startListening({ - matcher: isAnyOf(onAppUnlocked), + actionCreator: onAppUnlocked, effect: handleSetDefaultCurrency }) + + startListening({ + actionCreator: setCurrencyOnChangeLocale, + effect: handleSetCurrencyOnChangeLocale + }) } diff --git a/packages/core-mobile/app/store/settings/currency/slice.ts b/packages/core-mobile/app/store/settings/currency/slice.ts index 096ba6a1cf..5061d63202 100644 --- a/packages/core-mobile/app/store/settings/currency/slice.ts +++ b/packages/core-mobile/app/store/settings/currency/slice.ts @@ -1,4 +1,4 @@ -import { createSlice, PayloadAction } from '@reduxjs/toolkit' +import { createAction, createSlice, PayloadAction } from '@reduxjs/toolkit' import { RootState } from 'store/types' import { currencies, @@ -36,4 +36,8 @@ export const selectSelectedCurrency = (state: RootState): CurrencySymbol => { // actions export const { setSelectedCurrency } = currencySlice.actions +export const setCurrencyOnChangeLocale = createAction( + `${reducerName}/setCurrencyOnChangeLocale` +) + export const currencyReducer = currencySlice.reducer From a9f12dc15d6f14bec69355a2978d8c628e641815 Mon Sep 17 00:00:00 2001 From: ruijialin Date: Wed, 4 Jun 2025 14:44:35 -0400 Subject: [PATCH 3/6] update setCurrency --- packages/core-mobile/app/store/settings/currency/listeners.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/core-mobile/app/store/settings/currency/listeners.ts b/packages/core-mobile/app/store/settings/currency/listeners.ts index 485e77d053..21bf9ee8e1 100644 --- a/packages/core-mobile/app/store/settings/currency/listeners.ts +++ b/packages/core-mobile/app/store/settings/currency/listeners.ts @@ -47,13 +47,14 @@ const handleSetDefaultCurrency = ( ): void => { const { getState, dispatch } = listenerApi const state = getState() + const selectedCurrency = selectSelectedCurrency(state) const hasSetDefaultCurrency = selectHasBeenViewedOnce( ViewOnceKey.SET_DEFAULT_CURRENCY )(state) if (hasSetDefaultCurrency === false) { - setCurrency(_, listenerApi) + setCurrency(dispatch, selectedCurrency) dispatch(setViewOnce(ViewOnceKey.SET_DEFAULT_CURRENCY)) } } From 552858e4cad9adcb08a27f9a89471c898b8a8463 Mon Sep 17 00:00:00 2001 From: ruijialin Date: Wed, 4 Jun 2025 14:46:49 -0400 Subject: [PATCH 4/6] Revert "update setCurrency" This reverts commit a9f12dc15d6f14bec69355a2978d8c628e641815. --- packages/core-mobile/app/store/settings/currency/listeners.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/core-mobile/app/store/settings/currency/listeners.ts b/packages/core-mobile/app/store/settings/currency/listeners.ts index 21bf9ee8e1..485e77d053 100644 --- a/packages/core-mobile/app/store/settings/currency/listeners.ts +++ b/packages/core-mobile/app/store/settings/currency/listeners.ts @@ -47,14 +47,13 @@ const handleSetDefaultCurrency = ( ): void => { const { getState, dispatch } = listenerApi const state = getState() - const selectedCurrency = selectSelectedCurrency(state) const hasSetDefaultCurrency = selectHasBeenViewedOnce( ViewOnceKey.SET_DEFAULT_CURRENCY )(state) if (hasSetDefaultCurrency === false) { - setCurrency(dispatch, selectedCurrency) + setCurrency(_, listenerApi) dispatch(setViewOnce(ViewOnceKey.SET_DEFAULT_CURRENCY)) } } From 8f649f8995444b13581df514aa2e621e6180ac6e Mon Sep 17 00:00:00 2001 From: ruijialin Date: Wed, 4 Jun 2025 14:46:58 -0400 Subject: [PATCH 5/6] Revert "listen to appstate" This reverts commit b19585cd852c865606a1dc6ce6ca823878a141b4. --- .../core-mobile/app/store/app/listeners.ts | 2 - .../app/store/settings/currency/listeners.ts | 50 ++++--------------- .../app/store/settings/currency/slice.ts | 6 +-- 3 files changed, 11 insertions(+), 47 deletions(-) diff --git a/packages/core-mobile/app/store/app/listeners.ts b/packages/core-mobile/app/store/app/listeners.ts index e1782fe77d..1d63f24852 100644 --- a/packages/core-mobile/app/store/app/listeners.ts +++ b/packages/core-mobile/app/store/app/listeners.ts @@ -32,7 +32,6 @@ import { setSelectedAppearance, setSelectedColorScheme } from 'store/settings/appearance' -import { setCurrencyOnChangeLocale } from 'store/settings/currency' import { onAppLocked, onAppUnlocked, @@ -89,7 +88,6 @@ const listenToAppState = async ( Logger.info('app comes back to foreground') AnalyticsService.capture('ApplicationOpened') dispatch(onForeground()) - dispatch(setCurrencyOnChangeLocale()) } else if (nextAppState === 'background') { Logger.info('app goes to background') dispatch(onBackground()) diff --git a/packages/core-mobile/app/store/settings/currency/listeners.ts b/packages/core-mobile/app/store/settings/currency/listeners.ts index 485e77d053..3404e91834 100644 --- a/packages/core-mobile/app/store/settings/currency/listeners.ts +++ b/packages/core-mobile/app/store/settings/currency/listeners.ts @@ -1,4 +1,4 @@ -import { AnyAction } from '@reduxjs/toolkit' +import { AnyAction, isAnyOf } from '@reduxjs/toolkit' import { onAppUnlocked } from 'store/app' import { AppListenerEffectAPI, AppStartListening } from 'store/types' import { getLocales } from 'expo-localization' @@ -7,44 +7,16 @@ import { setViewOnce, ViewOnceKey } from 'store/viewOnce' -import { AppDispatch } from '../../types' -import { - selectSelectedCurrency, - setCurrencyOnChangeLocale, - setSelectedCurrency -} from './slice' +import { setSelectedCurrency } from './slice' import { currencies, CurrencySymbol } from './types' -export const setCurrency = ( - dispatch: AppDispatch, - selectedCurrency: string -): void => { - const locales = getLocales() - const currencyCode = locales[0]?.currencyCode - - const supportedCurrency = - currencies.find(curr => curr.symbol === currencyCode)?.symbol ?? - CurrencySymbol.USD - - if (selectedCurrency === supportedCurrency) return - - dispatch(setSelectedCurrency(supportedCurrency)) -} - -const handleSetCurrencyOnChangeLocale = ( - _: AnyAction, - listenerApi: AppListenerEffectAPI -): void => { - const { getState, dispatch } = listenerApi - const state = getState() - const selectedCurrency = selectSelectedCurrency(state) - setCurrency(dispatch, selectedCurrency) -} - const handleSetDefaultCurrency = ( _: AnyAction, listenerApi: AppListenerEffectAPI ): void => { + const locales = getLocales() + const defaultCurrency = locales[0]?.currencyCode + const { getState, dispatch } = listenerApi const state = getState() @@ -53,7 +25,10 @@ const handleSetDefaultCurrency = ( )(state) if (hasSetDefaultCurrency === false) { - setCurrency(_, listenerApi) + const supportedCurrency = + currencies.find(curr => curr.symbol === defaultCurrency)?.symbol ?? + CurrencySymbol.USD + dispatch(setSelectedCurrency(supportedCurrency)) dispatch(setViewOnce(ViewOnceKey.SET_DEFAULT_CURRENCY)) } } @@ -62,12 +37,7 @@ export const addCurrencyListeners = ( startListening: AppStartListening ): void => { startListening({ - actionCreator: onAppUnlocked, + matcher: isAnyOf(onAppUnlocked), effect: handleSetDefaultCurrency }) - - startListening({ - actionCreator: setCurrencyOnChangeLocale, - effect: handleSetCurrencyOnChangeLocale - }) } diff --git a/packages/core-mobile/app/store/settings/currency/slice.ts b/packages/core-mobile/app/store/settings/currency/slice.ts index 5061d63202..096ba6a1cf 100644 --- a/packages/core-mobile/app/store/settings/currency/slice.ts +++ b/packages/core-mobile/app/store/settings/currency/slice.ts @@ -1,4 +1,4 @@ -import { createAction, createSlice, PayloadAction } from '@reduxjs/toolkit' +import { createSlice, PayloadAction } from '@reduxjs/toolkit' import { RootState } from 'store/types' import { currencies, @@ -36,8 +36,4 @@ export const selectSelectedCurrency = (state: RootState): CurrencySymbol => { // actions export const { setSelectedCurrency } = currencySlice.actions -export const setCurrencyOnChangeLocale = createAction( - `${reducerName}/setCurrencyOnChangeLocale` -) - export const currencyReducer = currencySlice.reducer From 47d39a38f7c578a92b867139b2ca5d3823aad1a3 Mon Sep 17 00:00:00 2001 From: ruijialin Date: Fri, 6 Jun 2025 12:02:21 -0400 Subject: [PATCH 6/6] listen to onLogin --- .../app/store/settings/currency/listeners.ts | 29 +++++-------------- .../core-mobile/app/store/viewOnce/types.ts | 3 +- 2 files changed, 9 insertions(+), 23 deletions(-) diff --git a/packages/core-mobile/app/store/settings/currency/listeners.ts b/packages/core-mobile/app/store/settings/currency/listeners.ts index 3404e91834..b60566f1c3 100644 --- a/packages/core-mobile/app/store/settings/currency/listeners.ts +++ b/packages/core-mobile/app/store/settings/currency/listeners.ts @@ -1,12 +1,7 @@ -import { AnyAction, isAnyOf } from '@reduxjs/toolkit' -import { onAppUnlocked } from 'store/app' +import { AnyAction } from '@reduxjs/toolkit' +import { onLogIn } from 'store/app' import { AppListenerEffectAPI, AppStartListening } from 'store/types' import { getLocales } from 'expo-localization' -import { - selectHasBeenViewedOnce, - setViewOnce, - ViewOnceKey -} from 'store/viewOnce' import { setSelectedCurrency } from './slice' import { currencies, CurrencySymbol } from './types' @@ -17,27 +12,19 @@ const handleSetDefaultCurrency = ( const locales = getLocales() const defaultCurrency = locales[0]?.currencyCode - const { getState, dispatch } = listenerApi - const state = getState() + const { dispatch } = listenerApi - const hasSetDefaultCurrency = selectHasBeenViewedOnce( - ViewOnceKey.SET_DEFAULT_CURRENCY - )(state) - - if (hasSetDefaultCurrency === false) { - const supportedCurrency = - currencies.find(curr => curr.symbol === defaultCurrency)?.symbol ?? - CurrencySymbol.USD - dispatch(setSelectedCurrency(supportedCurrency)) - dispatch(setViewOnce(ViewOnceKey.SET_DEFAULT_CURRENCY)) - } + const supportedCurrency = + currencies.find(curr => curr.symbol === defaultCurrency)?.symbol ?? + CurrencySymbol.USD + dispatch(setSelectedCurrency(supportedCurrency)) } export const addCurrencyListeners = ( startListening: AppStartListening ): void => { startListening({ - matcher: isAnyOf(onAppUnlocked), + actionCreator: onLogIn, effect: handleSetDefaultCurrency }) } diff --git a/packages/core-mobile/app/store/viewOnce/types.ts b/packages/core-mobile/app/store/viewOnce/types.ts index 2d30f5d674..aac4225bb2 100644 --- a/packages/core-mobile/app/store/viewOnce/types.ts +++ b/packages/core-mobile/app/store/viewOnce/types.ts @@ -11,8 +11,7 @@ export enum ViewOnceKey { SWAP_ONBOARDING, SEND_ONBOARDING, MIGRATE_TOKEN_FAVORITE_IDS, - AUTO_ENABLE_L2_CHAINS, - SET_DEFAULT_CURRENCY + AUTO_ENABLE_L2_CHAINS } export type ViewOnceObjectType = {