diff --git a/app/components/UI/Tokens/index.tsx b/app/components/UI/Tokens/index.tsx index 2747fee3b1c..86536934b11 100644 --- a/app/components/UI/Tokens/index.tsx +++ b/app/components/UI/Tokens/index.tsx @@ -1,5 +1,5 @@ import React, { useRef, useState, LegacyRef, useMemo } from 'react'; -import { View } from 'react-native'; +import { ScrollView, View } from 'react-native'; import ActionSheet from '@metamask/react-native-actionsheet'; import { useSelector } from 'react-redux'; import useTokenBalancesController from '../../hooks/useTokenBalancesController/useTokenBalancesController'; @@ -21,7 +21,10 @@ import { TokenI, TokensI } from './types'; import { WalletViewSelectorsIDs } from '../../../../e2e/selectors/wallet/WalletView.selectors'; import { strings } from '../../../../locales/i18n'; import { IconName } from '../../../component-library/components/Icons/Icon'; -import { selectTokenSortConfig } from '../../../selectors/preferencesController'; +import { + selectTokenNetworkFilter, + selectTokenSortConfig, +} from '../../../selectors/preferencesController'; import { deriveBalanceFromAssetMarketDetails, sortAssets } from './util'; import { useNavigation } from '@react-navigation/native'; import { StackNavigationProp } from '@react-navigation/stack'; @@ -32,6 +35,7 @@ import { selectCurrentCurrency, } from '../../../selectors/currencyRateController'; import ButtonBase from '../../../component-library/components/Buttons/Button/foundation/ButtonBase'; +import { selectNetworkName } from '../../../selectors/networkInfos'; // this will be imported from TokenRatesController when it is exported from there // PR: https://github.com/MetaMask/core/pull/4622 @@ -73,6 +77,7 @@ const Tokens: React.FC = ({ tokens }) => { const { trackEvent, createEventBuilder } = useMetrics(); const { data: tokenBalances } = useTokenBalancesController(); const tokenSortConfig = useSelector(selectTokenSortConfig); + const tokenNetworkFilter = useSelector(selectTokenNetworkFilter); const chainId = useSelector(selectChainId); const networkClientId = useSelector(selectNetworkClientId); const hideZeroBalanceTokens = useSelector( @@ -82,9 +87,11 @@ const Tokens: React.FC = ({ tokens }) => { const tokenExchangeRates = useSelector(selectContractExchangeRates); const currentCurrency = useSelector(selectCurrentCurrency); const conversionRate = useSelector(selectConversionRate); + const networkName = useSelector(selectNetworkName); const actionSheet = useRef(); const sortControlsActionSheet = useRef(); + const filterControlsActionSheet = useRef(); const [tokenToRemove, setTokenToRemove] = useState(); const [refreshing, setRefreshing] = useState(false); const [isAddTokenEnabled, setIsAddTokenEnabled] = useState(true); @@ -142,6 +149,7 @@ const Tokens: React.FC = ({ tokens }) => { } }; + const showFilterControls = () => filterControlsActionSheet?.current?.show(); // TODO: BottomSheet const showSortControls = () => sortControlsActionSheet?.current?.show(); const onRefresh = async () => { @@ -236,25 +244,53 @@ const Tokens: React.FC = ({ tokens }) => { } }; + const onFilterControlsActionSheetPress = (index: number) => { + const { PreferencesController } = Engine.context; + switch (index) { + case 0: + PreferencesController.setTokenNetworkFilter({}); + break; + case 1: + PreferencesController.setTokenNetworkFilter({ + [chainId]: true, + }); + break; + default: + break; + } + }; + return ( - - + + + + + {tokensList && ( @@ -287,6 +323,13 @@ const Tokens: React.FC = ({ tokens }) => { cancelButtonIndex={2} onPress={onSortControlsActionSheetPress} /> + } + title={'Filter'} + options={['All Networks', 'Current Network', 'Cancel']} + cancelButtonIndex={2} + onPress={onFilterControlsActionSheetPress} + /> ); }; diff --git a/app/components/UI/Tokens/styles.ts b/app/components/UI/Tokens/styles.ts index 438ab229741..b85cafc41d6 100644 --- a/app/components/UI/Tokens/styles.ts +++ b/app/components/UI/Tokens/styles.ts @@ -152,6 +152,8 @@ const createStyles = (colors: Colors) => borderColor: colors.border.default, borderStyle: 'solid', borderWidth: 1, + marginLeft: 5, + marginRight: 5, }, }); diff --git a/app/components/Views/Wallet/__snapshots__/index.test.tsx.snap b/app/components/Views/Wallet/__snapshots__/index.test.tsx.snap index 34d76bf49f9..e8548f7174f 100644 --- a/app/components/Views/Wallet/__snapshots__/index.test.tsx.snap +++ b/app/components/Views/Wallet/__snapshots__/index.test.tsx.snap @@ -479,463 +479,408 @@ exports[`Wallet should render correctly 1`] = ` } } > - - - + - + - + - - + Your information can't be shown. Don’t worry, your wallet and funds are safe. + + + + - + + + - Basic functionality is off - + } + > - Turn on basic functionality + +  + + + Try again - + - - - + + + Please report this issue so we can fix it: + + - - - - - - - - - - - - + + Take a screenshot of this screen. + + +  + + + - Account 1 + Copy - - - - - - - + + the error message to clipboard. + - Address - : - - - +  + + + Submit a ticket + + - + + Please include the error message and the screenshot. + + + - 0xC495...D272 - - +  + + + Send us a bug report + + - - + } + > + here. + + + Please include details about what happened. + - - - + > + save your Secret Recovery Phrase + + + & re-install the app. Note: you can NOT restore your wallet without your Secret Recovery Phrase. + - - + + diff --git a/app/selectors/preferencesController.ts b/app/selectors/preferencesController.ts index 3f46e968dfa..927cc142c94 100644 --- a/app/selectors/preferencesController.ts +++ b/app/selectors/preferencesController.ts @@ -47,6 +47,12 @@ export const selectTokenSortConfig = createSelector( preferencesControllerState.tokenSortConfig, ); +export const selectTokenNetworkFilter = createSelector( + selectPreferencesControllerState, + (preferencesControllerState: PreferencesState) => + preferencesControllerState.tokenNetworkFilter, +); + // isMultiAccountBalancesEnabled is a patched property - ref patches/@metamask+preferences-controller+2.1.0.patch export const selectIsMultiAccountBalancesEnabled = createSelector( selectPreferencesControllerState, diff --git a/patches/@metamask+preferences-controller+11.0.0.patch b/patches/@metamask+preferences-controller+11.0.0.patch index 16c14a2b5e9..a99e425ff6a 100644 --- a/patches/@metamask+preferences-controller+11.0.0.patch +++ b/patches/@metamask+preferences-controller+11.0.0.patch @@ -1,8 +1,8 @@ diff --git a/node_modules/@metamask/preferences-controller/dist/chunk-FSWGV6H6.js b/node_modules/@metamask/preferences-controller/dist/chunk-FSWGV6H6.js -index 30e985c..ec9db71 100644 +index 30e985c..0619cd4 100644 --- a/node_modules/@metamask/preferences-controller/dist/chunk-FSWGV6H6.js +++ b/node_modules/@metamask/preferences-controller/dist/chunk-FSWGV6H6.js -@@ -17,13 +17,18 @@ var metadata = { +@@ -17,13 +17,19 @@ var metadata = { isIpfsGatewayEnabled: { persist: true, anonymous: true }, isMultiAccountBalancesEnabled: { persist: true, anonymous: true }, lostIdentities: { persist: true, anonymous: false }, @@ -19,11 +19,12 @@ index 30e985c..ec9db71 100644 + smartTransactionsOptInStatus: { persist: true, anonymous: true }, + useTransactionSimulations: { persist: true, anonymous: true }, + showMultiRpcModal: { persist: false, anonymous: false }, -+ tokenSortConfig: { persist: true, anonymous: false } ++ tokenSortConfig: { persist: true, anonymous: false }, ++ tokenNetworkFilter: { persist: true, anonymous: false }, }; var name = "PreferencesController"; function getDefaultPreferencesState() { -@@ -37,7 +42,7 @@ function getDefaultPreferencesState() { +@@ -37,7 +43,7 @@ function getDefaultPreferencesState() { isIpfsGatewayEnabled: true, isMultiAccountBalancesEnabled: true, lostIdentities: {}, @@ -32,7 +33,7 @@ index 30e985c..ec9db71 100644 securityAlertsEnabled: false, selectedAddress: "", showIncomingTransactions: { -@@ -64,7 +69,16 @@ function getDefaultPreferencesState() { +@@ -64,7 +70,17 @@ function getDefaultPreferencesState() { }, showTestNetworks: false, useNftDetection: false, @@ -46,11 +47,12 @@ index 30e985c..ec9db71 100644 + key: "tokenFiatBalance", + order: 'dsc', + sortCallback: 'stringNumeric', -+ } ++ }, ++ tokenNetworkFilter: {}, }; } var _syncIdentities, syncIdentities_fn; -@@ -213,9 +227,9 @@ var PreferencesController = class extends _basecontroller.BaseController { +@@ -213,9 +229,9 @@ var PreferencesController = class extends _basecontroller.BaseController { * @param useNftDetection - Boolean indicating user preference on NFT detection. */ setUseNftDetection(useNftDetection) { @@ -62,7 +64,7 @@ index 30e985c..ec9db71 100644 ); } this.update((state) => { -@@ -223,18 +237,33 @@ var PreferencesController = class extends _basecontroller.BaseController { +@@ -223,18 +239,33 @@ var PreferencesController = class extends _basecontroller.BaseController { }); } /** @@ -101,7 +103,7 @@ index 30e985c..ec9db71 100644 /** * Toggle the security alert enabled setting. * -@@ -245,6 +274,43 @@ var PreferencesController = class extends _basecontroller.BaseController { +@@ -245,6 +276,43 @@ var PreferencesController = class extends _basecontroller.BaseController { state.securityAlertsEnabled = securityAlertsEnabled; }); } @@ -145,7 +147,7 @@ index 30e985c..ec9db71 100644 /** * A setter for the user preferences to enable/disable rpc methods. * -@@ -307,6 +373,16 @@ var PreferencesController = class extends _basecontroller.BaseController { +@@ -307,6 +375,26 @@ var PreferencesController = class extends _basecontroller.BaseController { }); } } @@ -159,11 +161,21 @@ index 30e985c..ec9db71 100644 + state.tokenSortConfig = tokenSortConfig; + }); + } ++ /** ++ * Set the token network filter configuration setting. ++ * ++ * @param tokenNetworkFilter - Object describing token network filter configuration. ++ */ ++ setTokenNetworkFilter(tokenNetworkFilter) { ++ this.update((state) => { ++ state.tokenNetworkFilter = tokenNetworkFilter; ++ }); ++ } }; _syncIdentities = new WeakSet(); syncIdentities_fn = function(addresses) { diff --git a/node_modules/@metamask/preferences-controller/dist/types/PreferencesController.d.ts b/node_modules/@metamask/preferences-controller/dist/types/PreferencesController.d.ts -index 7e3ba15..552580d 100644 +index 7e3ba15..a4be46d 100644 --- a/node_modules/@metamask/preferences-controller/dist/types/PreferencesController.d.ts +++ b/node_modules/@metamask/preferences-controller/dist/types/PreferencesController.d.ts @@ -69,9 +69,10 @@ export type PreferencesState = { @@ -179,7 +191,7 @@ index 7e3ba15..552580d 100644 /** * Controls whether "security alerts" are enabled */ -@@ -98,6 +99,22 @@ export type PreferencesState = { +@@ -98,6 +99,26 @@ export type PreferencesState = { * Controls whether token detection is enabled */ useTokenDetection: boolean; @@ -199,10 +211,14 @@ index 7e3ba15..552580d 100644 + * Controls whether Multi rpc modal is displayed or not + */ + tokenSortConfig: Record; ++ /** ++ * Controls the token network filter ++ */ ++ tokenNetworkFilter: Record }; declare const name = "PreferencesController"; export type PreferencesControllerGetStateAction = ControllerGetStateAction; -@@ -121,7 +138,7 @@ export declare function getDefaultPreferencesState(): { +@@ -121,7 +142,7 @@ export declare function getDefaultPreferencesState(): { isIpfsGatewayEnabled: boolean; isMultiAccountBalancesEnabled: boolean; lostIdentities: {}; @@ -211,7 +227,7 @@ index 7e3ba15..552580d 100644 securityAlertsEnabled: boolean; selectedAddress: string; showIncomingTransactions: { -@@ -149,6 +166,10 @@ export declare function getDefaultPreferencesState(): { +@@ -149,6 +170,11 @@ export declare function getDefaultPreferencesState(): { showTestNetworks: boolean; useNftDetection: boolean; useTokenDetection: boolean; @@ -219,10 +235,11 @@ index 7e3ba15..552580d 100644 + useTransactionSimulations: boolean; + showMultiRpcModal: boolean; + tokenSortConfig: Record ++ tokenNetworkFilter: Record }; /** * Controller that stores shared settings and exposes convenience methods -@@ -217,11 +238,16 @@ export declare class PreferencesController extends BaseController): void ++ /** ++ * Set the token network filter ++ * ++ * @param tokenNetworkFilter - Object describing token network filter configuration. ++ */ ++ setTokenNetworkFilter(tokenNetworkFilter: Record): void } export default PreferencesController; //# sourceMappingURL=PreferencesController.d.ts.map