From 6cf5d4c8fc42311040de95cc1757c0c518e737ed Mon Sep 17 00:00:00 2001 From: Petr Knetl Date: Mon, 26 Feb 2024 11:15:41 +0100 Subject: [PATCH] fixup! feat(suite-native): token definitions redux logic --- packages/suite-desktop/tsconfig.json | 4 +-- .../suite/src/middlewares/wallet/index.ts | 4 +-- .../tokenDefinitionsMiddleware.ts | 27 ++++++++++--------- .../tokenDefinitionsSelectors.ts | 13 ++++++++- suite-native/state/package.json | 2 +- suite-native/state/src/store.ts | 4 +-- suite-native/token-definitions/package.json | 4 +-- .../src/tokenDefinitionsMiddleware.ts | 27 ++++++++++--------- yarn.lock | 1 + 9 files changed, 51 insertions(+), 35 deletions(-) diff --git a/packages/suite-desktop/tsconfig.json b/packages/suite-desktop/tsconfig.json index e164b4a36264..646ed9c41d33 100644 --- a/packages/suite-desktop/tsconfig.json +++ b/packages/suite-desktop/tsconfig.json @@ -1,8 +1,6 @@ { "extends": "../../tsconfig.base.json", - "compilerOptions": { - "outDir": "./libDev" - }, + "compilerOptions": { "outDir": "./libDev" }, "include": ["./src", "./e2e", "**/*.json"], "references": [] } diff --git a/packages/suite/src/middlewares/wallet/index.ts b/packages/suite/src/middlewares/wallet/index.ts index 515e852fd218..52d5d6f28761 100644 --- a/packages/suite/src/middlewares/wallet/index.ts +++ b/packages/suite/src/middlewares/wallet/index.ts @@ -1,7 +1,7 @@ import { prepareFiatRatesMiddleware, prepareBlockchainMiddleware, - prepareTokenDefinitionsMiddleware, + tokenDefinitionsMiddleware, } from '@suite-common/wallet-core'; import { prepareDiscoveryMiddleware } from './discoveryMiddleware'; @@ -19,7 +19,7 @@ export default [ walletMiddleware, prepareDiscoveryMiddleware(extraDependencies), prepareFiatRatesMiddleware(extraDependencies), - prepareTokenDefinitionsMiddleware(extraDependencies), + tokenDefinitionsMiddleware, storageMiddleware, graphMiddleware, coinmarketMiddleware, diff --git a/suite-common/wallet-core/src/token-definitions/tokenDefinitionsMiddleware.ts b/suite-common/wallet-core/src/token-definitions/tokenDefinitionsMiddleware.ts index 5a17812d52c7..ff94351e1930 100644 --- a/suite-common/wallet-core/src/token-definitions/tokenDefinitionsMiddleware.ts +++ b/suite-common/wallet-core/src/token-definitions/tokenDefinitionsMiddleware.ts @@ -1,18 +1,24 @@ -import { createMiddlewareWithExtraDeps } from '@suite-common/redux-utils'; +import { isAnyOf } from '@reduxjs/toolkit'; + +import { createMiddleware } from '@suite-common/redux-utils'; import { getNetworkFeatures, isEthereumBasedNetwork, networks } from '@suite-common/wallet-config'; import { accountsActions } from '../accounts/accountsActions'; import { getTokenDefinitionThunk } from './tokenDefinitionsThunks'; -import { selectSpecificTokenDefinition } from './tokenDefinitionsSelectors'; +import { selectShouldFetchTokenDefinition } from './tokenDefinitionsSelectors'; + +const isAccountChangingAction = isAnyOf( + accountsActions.createAccount, + accountsActions.updateAccount, +); -export const prepareTokenDefinitionsMiddleware = createMiddlewareWithExtraDeps( +export const tokenDefinitionsMiddleware = createMiddleware( (action, { dispatch, next, getState }) => { + // The action changes has to be stored before evaluated in this middleware, + // because it needs to check the latest state to decide if we should fetch token definitions. next(action); - if ( - accountsActions.createAccount.match(action) || - accountsActions.updateAccount.match(action) - ) { + if (isAccountChangingAction(action)) { const { symbol } = action.payload; const networkFeatures = getNetworkFeatures(symbol); @@ -21,17 +27,14 @@ export const prepareTokenDefinitionsMiddleware = createMiddlewareWithExtraDeps( action.payload.tokens?.forEach(token => { const contractAddress = token.contract; - const tokenDefinition = selectSpecificTokenDefinition( + const shouldFetchTokenDefinition = selectShouldFetchTokenDefinition( getState(), symbol, contractAddress, ); const network = networks[symbol]; - if ( - isEthereumBasedNetwork(network) && - (!tokenDefinition || tokenDefinition.error) - ) { + if (isEthereumBasedNetwork(network) && shouldFetchTokenDefinition) { dispatch( getTokenDefinitionThunk({ networkSymbol: symbol, diff --git a/suite-common/wallet-core/src/token-definitions/tokenDefinitionsSelectors.ts b/suite-common/wallet-core/src/token-definitions/tokenDefinitionsSelectors.ts index 79e9bb3ee89a..91cd5faefb89 100644 --- a/suite-common/wallet-core/src/token-definitions/tokenDefinitionsSelectors.ts +++ b/suite-common/wallet-core/src/token-definitions/tokenDefinitionsSelectors.ts @@ -1,6 +1,6 @@ import { D, pipe } from '@mobily/ts-belt'; -import { NetworkSymbol } from '@suite-common/wallet-config'; +import { NetworkSymbol, isEthereumBasedNetwork, networks } from '@suite-common/wallet-config'; import { TokenDefinitionsRootState } from './tokenDefinitionsTypes'; @@ -15,6 +15,17 @@ export const selectSpecificTokenDefinition = ( contractAddress: string, ) => state.wallet.tokenDefinitions?.[networkSymbol]?.[contractAddress]; +export const selectShouldFetchTokenDefinition = ( + state: TokenDefinitionsRootState, + networkSymbol: NetworkSymbol, + contractAddress: string, +) => { + const tokenDefinition = selectSpecificTokenDefinition(state, networkSymbol, contractAddress); + const network = networks[networkSymbol]; + + return isEthereumBasedNetwork(network) && (!tokenDefinition || tokenDefinition.error); +}; + export const selectKnownNetworkTokens = ( state: TokenDefinitionsRootState, networkSymbol: NetworkSymbol, diff --git a/suite-native/state/package.json b/suite-native/state/package.json index 1ef0c5f23e54..c6a092a77678 100644 --- a/suite-native/state/package.json +++ b/suite-native/state/package.json @@ -41,4 +41,4 @@ "redux-flipper": "^2.0.2", "redux-persist": "6.0.0" } -} \ No newline at end of file +} diff --git a/suite-native/state/src/store.ts b/suite-native/state/src/store.ts index 04a4083a7cce..9a20bb412aa5 100644 --- a/suite-native/state/src/store.ts +++ b/suite-native/state/src/store.ts @@ -6,7 +6,7 @@ import { prepareButtonRequestMiddleware, prepareDeviceMiddleware } from '@suite- import { prepareDiscoveryMiddleware } from '@suite-native/discovery'; import { prepareTransactionCacheMiddleware } from '@suite-native/accounts'; import { blockchainMiddleware } from '@suite-native/blockchain'; -import { prepareTokenDefinitionsMiddleware } from '@suite-native/token-definitions'; +import { tokenDefinitionsMiddleware } from '@suite-native/token-definitions'; import { extraDependencies } from './extraDependencies'; import { prepareRootReducers } from './reducers'; @@ -19,7 +19,7 @@ const middlewares: Middleware[] = [ prepareButtonRequestMiddleware(extraDependencies), prepareDiscoveryMiddleware(extraDependencies), prepareTransactionCacheMiddleware(extraDependencies), - prepareTokenDefinitionsMiddleware(extraDependencies), + tokenDefinitionsMiddleware, ]; if (__DEV__) { diff --git a/suite-native/token-definitions/package.json b/suite-native/token-definitions/package.json index 7d7425d76187..758f042c6acf 100644 --- a/suite-native/token-definitions/package.json +++ b/suite-native/token-definitions/package.json @@ -7,12 +7,12 @@ "main": "src/index", "scripts": { "lint:js": "yarn g:eslint '**/*.{ts,tsx,js}'", - "test:unit": "jest -c ../../jest.config.base.js", "type-check": "yarn g:tsc --build" }, "dependencies": { + "@reduxjs/toolkit": "1.9.5", "@suite-common/redux-utils": "workspace:*", "@suite-common/wallet-config": "workspace:*", "@suite-common/wallet-core": "workspace:*" } -} \ No newline at end of file +} diff --git a/suite-native/token-definitions/src/tokenDefinitionsMiddleware.ts b/suite-native/token-definitions/src/tokenDefinitionsMiddleware.ts index 80120a0fa5ef..1155dd238d03 100644 --- a/suite-native/token-definitions/src/tokenDefinitionsMiddleware.ts +++ b/suite-native/token-definitions/src/tokenDefinitionsMiddleware.ts @@ -1,19 +1,25 @@ -import { createMiddlewareWithExtraDeps } from '@suite-common/redux-utils'; +import { isAnyOf } from '@reduxjs/toolkit'; + +import { createMiddleware } from '@suite-common/redux-utils'; import { getNetworkFeatures, isEthereumBasedNetwork, networks } from '@suite-common/wallet-config'; import { accountsActions, getTokenDefinitionThunk, - selectSpecificTokenDefinition, + selectShouldFetchTokenDefinition, } from '@suite-common/wallet-core'; -export const prepareTokenDefinitionsMiddleware = createMiddlewareWithExtraDeps( +const isAccountChangingAction = isAnyOf( + accountsActions.createAccount, + accountsActions.updateAccount, +); + +export const tokenDefinitionsMiddleware = createMiddleware( (action, { dispatch, next, getState }) => { + // The action changes has to be stored before evaluated in this middleware, + // because it needs to check the latest state to decide if we should fetch token definitions. next(action); - if ( - accountsActions.createAccount.match(action) || - accountsActions.updateAccount.match(action) - ) { + if (isAccountChangingAction(action)) { const { symbol } = action.payload; const networkFeatures = getNetworkFeatures(symbol); @@ -22,17 +28,14 @@ export const prepareTokenDefinitionsMiddleware = createMiddlewareWithExtraDeps( action.payload.tokens?.forEach(token => { const contractAddress = token.contract; - const tokenDefinition = selectSpecificTokenDefinition( + const shouldFetchTokenDefinition = selectShouldFetchTokenDefinition( getState(), symbol, contractAddress, ); const network = networks[symbol]; - if ( - isEthereumBasedNetwork(network) && - (!tokenDefinition || tokenDefinition.error) - ) { + if (shouldFetchTokenDefinition && isEthereumBasedNetwork(network)) { dispatch( getTokenDefinitionThunk({ networkSymbol: symbol, diff --git a/yarn.lock b/yarn.lock index 1bfdce258502..74c82d156d77 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8846,6 +8846,7 @@ __metadata: version: 0.0.0-use.local resolution: "@suite-native/token-definitions@workspace:suite-native/token-definitions" dependencies: + "@reduxjs/toolkit": "npm:1.9.5" "@suite-common/redux-utils": "workspace:*" "@suite-common/wallet-config": "workspace:*" "@suite-common/wallet-core": "workspace:*"