From 15b92da3a9a0689c8a33f0ed89ae0d6d6e520e94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Vytick=20Vytrhl=C3=ADk?= Date: Wed, 19 Feb 2025 22:24:00 +0100 Subject: [PATCH] feat(suite-native): add trading slice to mobile --- suite-common/trading/src/index.ts | 1 + suite-native/module-trading/src/index.ts | 1 + .../module-trading/src/tradingSlice.ts | 60 +++++++++++++++++++ suite-native/state/src/reducers.ts | 3 + suite-native/state/src/store.ts | 2 + 5 files changed, 67 insertions(+) create mode 100644 suite-native/module-trading/src/tradingSlice.ts diff --git a/suite-common/trading/src/index.ts b/suite-common/trading/src/index.ts index ce2589a0f60..a60c88c53c5 100644 --- a/suite-common/trading/src/index.ts +++ b/suite-common/trading/src/index.ts @@ -4,6 +4,7 @@ export * from './regional'; export * from './utils'; export * from './constants'; export * from './reducers/tradingReducer'; +export type { TradingBuyState } from './reducers/buyReducer'; export * from './middlewares/tradingMiddleware'; export * from './actions/tradingActions'; export * from './actions/buyActions'; diff --git a/suite-native/module-trading/src/index.ts b/suite-native/module-trading/src/index.ts index 4000905f8f1..49bbb67ce9a 100644 --- a/suite-native/module-trading/src/index.ts +++ b/suite-native/module-trading/src/index.ts @@ -1 +1,2 @@ export * from './navigation/TradingStackNavigator'; +export * from './tradingSlice'; diff --git a/suite-native/module-trading/src/tradingSlice.ts b/suite-native/module-trading/src/tradingSlice.ts new file mode 100644 index 00000000000..82ea5380f0a --- /dev/null +++ b/suite-native/module-trading/src/tradingSlice.ts @@ -0,0 +1,60 @@ +import { PayloadAction } from '@reduxjs/toolkit'; + +import { createSliceWithExtraDeps, createWeakMapSelector } from '@suite-common/redux-utils'; +import { + TradingBuyState as CommonTradingBuyState, + TradingState as CommonTradingState, + initialState as commonInitialState, + prepareTradingReducer, +} from '@suite-common/trading'; + +import { ReceiveAccount } from './types'; + +export interface TradingBuyState extends CommonTradingBuyState { + selectedReceiveAccount: ReceiveAccount | undefined; +} + +interface TradingState extends CommonTradingState { + buy: TradingBuyState; +} + +export type TradeRootState = { + wallet: { + trading: TradingState; + }; +}; + +export const initialState: TradingState = { + ...commonInitialState, + buy: { ...commonInitialState.buy, selectedReceiveAccount: undefined }, +}; + +export const tradingSlice = createSliceWithExtraDeps({ + name: 'trading', + initialState, + reducers: { + setBuySelectedReceiveAccount: ( + state, + { payload }: PayloadAction<{ selectedReceiveAccount: ReceiveAccount }>, + ) => { + state.buy.selectedReceiveAccount = payload.selectedReceiveAccount; + }, + }, + extraReducers: (builder, extra) => { + const commonTradingFormReducer = prepareTradingReducer(extra); + builder + // In case that this reducer does not match the action, try to handle it by suite-common tradingReducer. + .addDefaultCase((state, action) => { + commonTradingFormReducer(state, action); + }); + }, +}); + +export const { setBuySelectedReceiveAccount } = tradingSlice.actions; + +export const createMemoizedSelector = createWeakMapSelector.withTypes(); + +export const selectTradingBuy = (state: TradeRootState) => state.wallet.trading.buy; + +export const selectBuySelectedReceiveAccount = (state: TradeRootState) => + selectTradingBuy(state).selectedReceiveAccount; diff --git a/suite-native/state/src/reducers.ts b/suite-native/state/src/reducers.ts index b0b7749c623..47f3bce8941 100644 --- a/suite-native/state/src/reducers.ts +++ b/suite-native/state/src/reducers.ts @@ -29,6 +29,7 @@ import { featureFlagsPersistedKeys, featureFlagsReducer } from '@suite-native/fe import { nativeFirmwareReducer } from '@suite-native/firmware'; import { graphPersistTransform, graphReducer } from '@suite-native/graph'; import { sendFormSlice } from '@suite-native/module-send'; +import { tradingSlice } from '@suite-native/module-trading'; import { appSettingsPersistWhitelist, appSettingsReducer } from '@suite-native/settings'; import { deriveAccountTypeFromPaymentType, @@ -59,6 +60,7 @@ const deviceReducer = prepareDeviceReducer(extraDependencies); const discoveryReducer = prepareDiscoveryReducer(extraDependencies); const tokenDefinitionsReducer = prepareTokenDefinitionsReducer(extraDependencies); const sendFormReducer = sendFormSlice.prepareReducer(extraDependencies); +const tradingReducer = tradingSlice.prepareReducer(extraDependencies); const stakeReducer = prepareStakeReducer(extraDependencies); const firmwareReducer = prepareFirmwareReducer(extraDependencies); @@ -82,6 +84,7 @@ export const prepareRootReducers = async () => { send: sendFormReducer, fees: feesReducer, stake: stakeReducer, + trading: tradingReducer }); const walletPersistedReducer = await preparePersistReducer({ diff --git a/suite-native/state/src/store.ts b/suite-native/state/src/store.ts index 1c59f9802d7..598157fcbf3 100644 --- a/suite-native/state/src/store.ts +++ b/suite-native/state/src/store.ts @@ -2,6 +2,7 @@ import { Middleware, StoreEnhancer, configureStore } from '@reduxjs/toolkit'; import devToolsEnhancer from 'redux-devtools-expo-dev-plugin'; import { logger } from 'redux-logger'; +import { tradingMiddleware } from '@suite-common/trading'; import { prepareFiatRatesMiddleware } from '@suite-common/wallet-core'; import { blockchainMiddleware } from '@suite-native/blockchain'; import { prepareButtonRequestMiddleware, prepareDeviceMiddleware } from '@suite-native/device'; @@ -25,6 +26,7 @@ const middlewares: Middleware[] = [ prepareButtonRequestMiddleware(extraDependencies), prepareDiscoveryMiddleware(extraDependencies), sendFormMiddleware, + tradingMiddleware, ]; const enhancers: Array> = [];