Skip to content

Commit 8a2403f

Browse files
committed
fix(trading): exchange - serialize store info data
1 parent d5b7b4d commit 8a2403f

File tree

10 files changed

+64
-42
lines changed

10 files changed

+64
-42
lines changed

packages/suite/src/actions/wallet/__tests__/tradingExchangeActions.test.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import { CryptoId, ExchangeTrade, ExchangeTradeQuoteRequest } from 'invity-api';
22

33
import { invityAPI } from '@suite-common/trading';
44

5-
import { tradingReducer } from 'src/reducers/wallet/tradingReducer';
5+
import { AppState } from 'src/reducers/store';
6+
import { selectTradingExchangeInfo, tradingReducer } from 'src/reducers/wallet/tradingReducer';
67
import { configureStore } from 'src/support/tests/configureStore';
78

89
import * as tradingExchangeActions from '../tradingExchangeActions';
@@ -108,7 +109,7 @@ describe('Trading Exchange Actions', () => {
108109

109110
return tradingExchangeActions.loadExchangeInfo().then(exchangeInfo => {
110111
store.dispatch(tradingExchangeActions.saveExchangeInfo(exchangeInfo));
111-
expect(store.getState().wallet.trading.exchange.exchangeInfo).toEqual({
112+
expect(selectTradingExchangeInfo(store.getState() as AppState)).toEqual({
112113
exchangeList,
113114
providerInfos: { changenow: exchangeList[0], changenowfr: exchangeList[1] },
114115
buySymbols: new Set<string>(['XMR', 'BTC', 'ETH', 'BCH']),

packages/suite/src/actions/wallet/tradingExchangeActions.ts

+18-15
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,14 @@ import { TRADING_COMMON, TRADING_EXCHANGE } from './constants';
1919
export interface ExchangeInfo {
2020
exchangeList?: ExchangeListResponse;
2121
providerInfos: { [name: string]: ExchangeProviderInfo };
22+
buySymbols: CryptoId[];
23+
sellSymbols: CryptoId[];
24+
}
25+
26+
export type TradingExchangeInfoSelector = Omit<ExchangeInfo, 'buySymbols' | 'sellSymbols'> & {
2227
buySymbols: Set<CryptoId>;
2328
sellSymbols: Set<CryptoId>;
24-
}
29+
};
2530

2631
export type TradingExchangeAction =
2732
| { type: typeof TRADING_EXCHANGE.SAVE_EXCHANGE_INFO; exchangeInfo: ExchangeInfo }
@@ -59,32 +64,30 @@ export const loadExchangeInfo = async (): Promise<ExchangeInfo> => {
5964
const exchangeList = await invityAPI.getExchangeList();
6065

6166
if (!exchangeList || exchangeList.length === 0) {
62-
return { providerInfos: {}, buySymbols: new Set(), sellSymbols: new Set() };
67+
return { providerInfos: {}, buySymbols: [], sellSymbols: [] };
6368
}
6469

6570
const providerInfos: { [name: string]: ExchangeProviderInfo } = {};
66-
exchangeList.forEach(e => (providerInfos[e.name] = e));
71+
exchangeList.forEach(exchange => (providerInfos[exchange.name] = exchange));
6772

6873
// merge symbols supported by at least one partner
69-
const buySymbolsArray: CryptoId[] = [];
70-
const sellSymbolsArray: CryptoId[] = [];
71-
exchangeList.forEach(p => {
72-
if (p.buyTickers) {
73-
buySymbolsArray.push(...p.buyTickers);
74+
const buySymbols: CryptoId[] = [];
75+
const sellSymbols: CryptoId[] = [];
76+
77+
exchangeList.forEach(provider => {
78+
if (provider.buyTickers) {
79+
buySymbols.push(...provider.buyTickers);
7480
}
75-
if (p.sellTickers) {
76-
sellSymbolsArray.push(...p.sellTickers);
81+
if (provider.sellTickers) {
82+
sellSymbols.push(...provider.sellTickers);
7783
}
7884
});
7985

80-
const buySymbols = new Set<CryptoId>(buySymbolsArray);
81-
const sellSymbols = new Set<CryptoId>(sellSymbolsArray);
82-
8386
return {
8487
exchangeList,
8588
providerInfos,
86-
buySymbols,
87-
sellSymbols,
89+
buySymbols: [...new Set(buySymbols)],
90+
sellSymbols: [...new Set(sellSymbols)],
8891
};
8992
};
9093

packages/suite/src/hooks/wallet/trading/form/useTradingExchangeForm.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ import { useBitcoinAmountUnit } from 'src/hooks/wallet/useBitcoinAmountUnit';
5050
import { useFormDraft } from 'src/hooks/wallet/useFormDraft';
5151
import { useTradingNavigation } from 'src/hooks/wallet/useTradingNavigation';
5252
import { useTradingRecomposeAndSign } from 'src/hooks/wallet/useTradingRecomposeAndSign';
53+
import { selectTradingExchangeInfo } from 'src/reducers/wallet/tradingReducer';
5354
import { UseTradingFormProps } from 'src/types/trading/trading';
5455
import {
5556
TradingExchangeFormContextProps,
@@ -74,7 +75,6 @@ export const useTradingExchangeForm = ({
7475
const type = 'exchange';
7576
const isNotFormPage = pageType !== 'form';
7677
const {
77-
exchangeInfo,
7878
quotesRequest,
7979
isFromRedirect,
8080
quotes,
@@ -83,6 +83,7 @@ export const useTradingExchangeForm = ({
8383
selectedQuote,
8484
addressVerified,
8585
} = useSelector(state => state.wallet.trading.exchange);
86+
const exchangeInfo = useSelector(selectTradingExchangeInfo);
8687
const { cryptoIdToCoinSymbol, buildDefaultCryptoOption } = useTradingInfo(type);
8788
const isPreviousRouteFromTradeSection = useTradingPreviousRoute(type);
8889
const [accountKey, setAccountKey] = useTradingAccountKey({

packages/suite/src/hooks/wallet/trading/useTradingDetail.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@ import { useDispatch, useSelector } from 'src/hooks/suite';
1313
import { useServerEnvironment } from 'src/hooks/wallet/trading/useServerEnviroment';
1414
import { useTradingLoadData } from 'src/hooks/wallet/trading/useTradingLoadData';
1515
import { useTradingWatchTrade } from 'src/hooks/wallet/trading/useTradingWatchTrade';
16-
import { selectTradingSellInfo } from 'src/reducers/wallet/tradingReducer';
16+
import {
17+
selectTradingExchangeInfo,
18+
selectTradingSellInfo,
19+
} from 'src/reducers/wallet/tradingReducer';
1720
import {
1821
TradingGetDetailDataProps,
1922
TradingGetTypedTradeProps,
@@ -99,7 +102,7 @@ export const useTradingDetail = <T extends TradingType>({
99102
const { account } = selectedAccount;
100103
const buyInfo = useSelector(selectTradingBuyInfo);
101104
const sellInfo = useSelector(selectTradingSellInfo);
102-
const { exchangeInfo } = trading.exchange;
105+
const exchangeInfo = useSelector(selectTradingExchangeInfo);
103106
const { info, transactionId, trade } = getTradingDetailData<T>({
104107
trading,
105108
tradingNew,

packages/suite/src/reducers/wallet/__tests__/tradingReducer.test.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,8 @@ describe('settings reducer', () => {
156156
it('TRADING_EXCHANGE.SAVE_EXCHANGE_INFO', () => {
157157
const exchangeInfo: ExchangeInfo = {
158158
providerInfos: {},
159-
buySymbols: new Set(['BTC', 'ETH']) as Set<CryptoId>,
160-
sellSymbols: new Set(['USDT@ETH']) as Set<CryptoId>,
159+
buySymbols: ['BTC', 'ETH'] as CryptoId[],
160+
sellSymbols: ['USDT@ETH'] as CryptoId[],
161161
};
162162
expect(
163163
tradingReducer(undefined, {

packages/suite/src/reducers/wallet/tradingReducer.ts

+22-9
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ import {
2626
TRADING_INFO,
2727
TRADING_SELL,
2828
} from 'src/actions/wallet/constants';
29-
import type { ExchangeInfo } from 'src/actions/wallet/tradingExchangeActions';
29+
import type {
30+
ExchangeInfo,
31+
TradingExchangeInfoSelector,
32+
} from 'src/actions/wallet/tradingExchangeActions';
3033
import type { SellInfo, TradingSellInfoSelector } from 'src/actions/wallet/tradingSellActions';
3134
import { AppState } from 'src/reducers/store';
3235
import { Action } from 'src/types/suite';
@@ -226,19 +229,29 @@ export const selectTradingSellInfo = createMemoizedSelector(
226229
},
227230
);
228231

232+
export const selectTradingExchangeInfo = createMemoizedSelector(
233+
[state => state.wallet.trading.exchange],
234+
(exchange): TradingExchangeInfoSelector | undefined => {
235+
const { exchangeInfo } = exchange;
236+
237+
if (!exchangeInfo) return;
238+
239+
return {
240+
...exchangeInfo,
241+
buySymbols: new Set(exchangeInfo.buySymbols),
242+
sellSymbols: new Set(exchangeInfo.sellSymbols),
243+
};
244+
},
245+
);
246+
229247
export const selectSupportedSymbols =
230248
(type: TradingType) =>
231249
(state: AppState): Set<CryptoId> | undefined => {
232-
const { trading } = state.wallet;
233-
234250
switch (type) {
235-
case 'buy': {
236-
const buyInfo = selectTradingBuyInfo(state);
237-
238-
return buyInfo?.supportedCryptoCurrencies;
239-
}
251+
case 'buy':
252+
return selectTradingBuyInfo(state)?.supportedCryptoCurrencies;
240253
case 'exchange':
241-
return trading.exchange.exchangeInfo?.sellSymbols;
254+
return selectTradingExchangeInfo(state)?.sellSymbols;
242255
case 'sell':
243256
return selectTradingSellInfo(state)?.supportedCryptoCurrencies;
244257
}

packages/suite/src/types/trading/trading.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import { StaticSessionId } from '@trezor/connect';
3232
import { AssetOptionBaseProps } from '@trezor/product-components';
3333
import { Timer } from '@trezor/react-utils';
3434

35-
import type { ExchangeInfo } from 'src/actions/wallet/tradingExchangeActions';
35+
import type { TradingExchangeInfoSelector } from 'src/actions/wallet/tradingExchangeActions';
3636
import type { TradingSellInfoSelector } from 'src/actions/wallet/tradingSellActions';
3737
import { GetDefaultAccountLabelParams } from 'src/hooks/suite/useDefaultAccountLabel';
3838
import { State } from 'src/reducers/wallet/tradingReducer';
@@ -77,7 +77,7 @@ export type TradingTradeDetailBuySellType = BuyTrade | SellFiatTrade;
7777
export type TradingTradeInfoMapProps = {
7878
buy: TradingBuyInfoSelector;
7979
sell: TradingSellInfoSelector;
80-
exchange: ExchangeInfo;
80+
exchange: TradingExchangeInfoSelector;
8181
};
8282

8383
export interface TradingGetTypedTradeProps {
@@ -93,7 +93,7 @@ export interface TradingGetDetailDataProps {
9393
infos: {
9494
buy: TradingBuyInfoSelector | undefined;
9595
sell: TradingSellInfoSelector | undefined;
96-
exchange: ExchangeInfo | undefined;
96+
exchange: TradingExchangeInfoSelector | undefined;
9797
};
9898
}
9999

packages/suite/src/types/trading/tradingForm.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import {
4040
import { FeeLevel } from '@trezor/connect';
4141
import { Timer } from '@trezor/react-utils';
4242

43-
import { ExchangeInfo } from 'src/actions/wallet/tradingExchangeActions';
43+
import { TradingExchangeInfoSelector } from 'src/actions/wallet/tradingExchangeActions';
4444
import { TradingSellInfoSelector } from 'src/actions/wallet/tradingSellActions';
4545
import type { TranslationKey } from 'src/components/suite/Translation';
4646
import {
@@ -241,7 +241,7 @@ export interface TradingExchangeFormContextProps
241241
exchangeStep: TradingExchangeStepType;
242242
feeInfo: FeeInfo;
243243

244-
exchangeInfo?: ExchangeInfo;
244+
exchangeInfo?: TradingExchangeInfoSelector;
245245
defaultCurrency: Option;
246246
amountLimits?: CryptoAmountLimitProps;
247247
composedLevels?: PrecomposedLevels | PrecomposedLevelsCardano;

packages/suite/src/utils/wallet/trading/__fixtures__/exchangeUtils.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -450,8 +450,8 @@ export const EXCHANGE_INFO: ExchangeInfo = {
450450
isRefundRequired: false,
451451
},
452452
},
453-
buySymbols: new Set(),
454-
sellSymbols: new Set(),
453+
buySymbols: [],
454+
sellSymbols: [],
455455
};
456456
export const MIN_MAX_QUOTES_OK: ExchangeTrade[] = [
457457
{

packages/suite/src/views/wallet/trading/common/TradingTransactions/TradingTransactionsList.tsx

+5-4
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ import { spacingsPx, typography } from '@trezor/theme';
99
import { Translation } from 'src/components/suite';
1010
import { useSelector } from 'src/hooks/suite';
1111
import { useTradingLoadData } from 'src/hooks/wallet/trading/useTradingLoadData';
12-
import { selectTradingSellInfo } from 'src/reducers/wallet/tradingReducer';
12+
import {
13+
selectTradingExchangeInfo,
14+
selectTradingSellInfo,
15+
} from 'src/reducers/wallet/tradingReducer';
1316
import { TradingTransactionExchange } from 'src/views/wallet/trading/common/TradingTransactions/TradingTransactionExchange';
1417
import { TradingTransactionBuy } from 'src/views/wallet/trading/common/TradingTransactions/TradingTransactionsBuy';
1518
import { TradingTransactionSell } from 'src/views/wallet/trading/common/TradingTransactions/TradingTransactionsSell';
@@ -38,9 +41,7 @@ export const TradingTransactionsList = () => {
3841
const activeSection = useSelector(state => state.wallet.trading.activeSection);
3942
const buyProviders = useSelector(selectTradingBuyProviders);
4043
const newTradingAllTransactions = useSelector(selectTradingTrades);
41-
const exchangeProviders = useSelector(
42-
state => state.wallet.trading.exchange.exchangeInfo?.providerInfos,
43-
);
44+
const exchangeProviders = useSelector(selectTradingExchangeInfo)?.providerInfos;
4445
const sellProviders = useSelector(selectTradingSellInfo)?.providerInfos;
4546
const isBuyAndSell = activeSection !== 'exchange';
4647
const newTradingBuyTransactions = newTradingAllTransactions.filter(

0 commit comments

Comments
 (0)