1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-23 09:52:26 +01:00

[MMI] Fixed connect mmi button several issues (#20455)

* fixed connect mmi button several issues

* Fixed snapshot

* Improved multiple things

* running yarn dedupe

* Update LavaMoat policies

* For some reason, this.mmiConfigurationController.store.mmiConfiguration?.portfolio sometimes is undefined, added [] if null.
Moved the || {} outside the find method

* minor improvements

---------

Co-authored-by: MetaMask Bot <metamaskbot@users.noreply.github.com>
This commit is contained in:
Albert Olivé 2023-08-17 14:50:40 +02:00 committed by GitHub
parent 20e16d41be
commit 486ade85f3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 164 additions and 108 deletions

View File

@ -569,7 +569,7 @@ export default class MMIController extends EventEmitter {
const mmiDashboardData = await this.handleMmiDashboardData(); const mmiDashboardData = await this.handleMmiDashboardData();
const cookieSetUrls = const cookieSetUrls =
this.mmiConfigurationController.store.mmiConfiguration?.portfolio this.mmiConfigurationController.store.mmiConfiguration?.portfolio
?.cookieSetUrls; ?.cookieSetUrls || [];
setDashboardCookie(mmiDashboardData, cookieSetUrls); setDashboardCookie(mmiDashboardData, cookieSetUrls);
} catch (error) { } catch (error) {
console.error(error); console.error(error);

View File

@ -790,10 +790,26 @@
"@metamask-institutional/extension>@metamask-institutional/custody-controller": { "@metamask-institutional/extension>@metamask-institutional/custody-controller": {
"packages": { "packages": {
"@ethereumjs/tx>@ethereumjs/util": true, "@ethereumjs/tx>@ethereumjs/util": true,
"@metamask-institutional/custody-keyring": true, "@metamask-institutional/extension>@metamask-institutional/custody-keyring": true,
"@metamask/obs-store": true "@metamask/obs-store": true
} }
}, },
"@metamask-institutional/extension>@metamask-institutional/custody-keyring": {
"globals": {
"console.log": true,
"console.warn": true
},
"packages": {
"@ethereumjs/tx>@ethereumjs/util": true,
"@metamask-institutional/custody-keyring>@metamask-institutional/configuration-client": true,
"@metamask-institutional/sdk": true,
"@metamask-institutional/sdk>@metamask-institutional/types": true,
"@metamask/obs-store": true,
"browserify>crypto-browserify": true,
"browserify>events": true,
"gulp-sass>lodash.clonedeep": true
}
},
"@metamask-institutional/institutional-features": { "@metamask-institutional/institutional-features": {
"globals": { "globals": {
"chrome.runtime.id": true, "chrome.runtime.id": true,

View File

@ -222,7 +222,7 @@
"@material-ui/core": "^4.11.0", "@material-ui/core": "^4.11.0",
"@metamask-institutional/custody-controller": "0.2.6", "@metamask-institutional/custody-controller": "0.2.6",
"@metamask-institutional/custody-keyring": "^0.0.25", "@metamask-institutional/custody-keyring": "^0.0.25",
"@metamask-institutional/extension": "^0.2.1", "@metamask-institutional/extension": "0.3.2",
"@metamask-institutional/institutional-features": "^1.1.8", "@metamask-institutional/institutional-features": "^1.1.8",
"@metamask-institutional/portfolio-dashboard": "^1.1.3", "@metamask-institutional/portfolio-dashboard": "^1.1.3",
"@metamask-institutional/rpc-allowlist": "^1.0.0", "@metamask-institutional/rpc-allowlist": "^1.0.0",

View File

@ -48,9 +48,8 @@ const CustodyConfirmLink = ({ hideModal }) => {
const { custodians } = useSelector(getMMIConfiguration); const { custodians } = useSelector(getMMIConfiguration);
const { custodianName } = const { custodianName } =
custodyAccountDetails[toChecksumHexAddress(address)] || {}; custodyAccountDetails[toChecksumHexAddress(address)] || {};
const { displayName, iconUrl } = custodians.find( const { displayName, iconUrl } =
(item) => item.name === custodianName || {}, custodians.find((item) => item.name === custodianName) || {};
);
const { url, ethereum, text, action } = useSelector( const { url, ethereum, text, action } = useSelector(
(state) => state.appState.modal.modalState.props.link || {}, (state) => state.appState.modal.modalState.props.link || {},
); );

View File

@ -1,5 +1,6 @@
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { ThemeType } from '../../../../shared/constants/preferences';
const LOGO_WIDTH = 162; const LOGO_WIDTH = 162;
const LOGO_HEIGHT = 30; const LOGO_HEIGHT = 30;
@ -994,6 +995,6 @@ export default function MetaFoxHorizontalLogo({
} }
MetaFoxHorizontalLogo.propTypes = { MetaFoxHorizontalLogo.propTypes = {
theme: PropTypes.oneOf(['light', 'dark']), theme: PropTypes.oneOf([ThemeType.light, ThemeType.dark, ThemeType.os]),
className: PropTypes.string, className: PropTypes.string,
}; };

View File

@ -50,9 +50,9 @@ const InstitutionalHomeFooter = ({ activitySupportDisplayStyle }) => {
InstitutionalHomeFooter.propTypes = { InstitutionalHomeFooter.propTypes = {
activitySupportDisplayStyle: PropTypes.shape({ activitySupportDisplayStyle: PropTypes.shape({
justifyContent: PropTypes.string.isRequired, justifyContent: PropTypes.string.isRequired,
paddingLeft: PropTypes.string, paddingLeft: PropTypes.number,
marginBottom: PropTypes.string, marginBottom: PropTypes.number,
marginTop: PropTypes.string, marginTop: PropTypes.number,
}).isRequired, }).isRequired,
}; };

View File

@ -90,6 +90,7 @@ exports[`CustodyPage renders CustodyPage 2`] = `
</ul> </ul>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
`; `;

View File

@ -8,6 +8,7 @@ import React, {
import { useSelector, useDispatch } from 'react-redux'; import { useSelector, useDispatch } from 'react-redux';
import { useHistory } from 'react-router-dom'; import { useHistory } from 'react-router-dom';
import { v4 as uuidv4 } from 'uuid'; import { v4 as uuidv4 } from 'uuid';
import { isEqual } from 'lodash';
import { useI18nContext } from '../../../hooks/useI18nContext'; import { useI18nContext } from '../../../hooks/useI18nContext';
import { mmiActionsFactory } from '../../../store/institutional/institution-background'; import { mmiActionsFactory } from '../../../store/institutional/institution-background';
import { MetaMetricsContext } from '../../../contexts/metametrics'; import { MetaMetricsContext } from '../../../contexts/metametrics';
@ -42,6 +43,7 @@ import {
} from '../../../helpers/constants/routes'; } from '../../../helpers/constants/routes';
import { getCurrentChainId, getSelectedAddress } from '../../../selectors'; import { getCurrentChainId, getSelectedAddress } from '../../../selectors';
import { getMMIConfiguration } from '../../../selectors/institutional/selectors'; import { getMMIConfiguration } from '../../../selectors/institutional/selectors';
import { getInstitutionalConnectRequests } from '../../../ducks/institutional/institutional';
import CustodyAccountList from '../connect-custody/account-list'; import CustodyAccountList from '../connect-custody/account-list';
import JwtUrlForm from '../../../components/institutional/jwt-url-form'; import JwtUrlForm from '../../../components/institutional/jwt-url-form';
import { import {
@ -74,14 +76,15 @@ const CustodyPage = () => {
const [apiUrl, setApiUrl] = useState(''); const [apiUrl, setApiUrl] = useState('');
const [addNewTokenClicked, setAddNewTokenClicked] = useState(false); const [addNewTokenClicked, setAddNewTokenClicked] = useState(false);
const [chainId, setChainId] = useState(parseInt(currentChainId, 16)); const [chainId, setChainId] = useState(parseInt(currentChainId, 16));
const [connectRequest, setConnectRequest] = useState(undefined); const connectRequests = useSelector(getInstitutionalConnectRequests, isEqual);
const [accounts, setAccounts] = useState(); const [accounts, setAccounts] = useState();
const address = useSelector(getSelectedAddress); const address = useSelector(getSelectedAddress);
const connectRequest = connectRequests ? connectRequests[0] : undefined;
const custodianButtons = useMemo(() => { const custodianButtons = useMemo(() => {
const custodianItems = []; const custodianItems = [];
const sortedCustodians = custodians.sort(function (a, b) { const sortedCustodians = [...custodians].sort(function (a, b) {
const nameA = a.name.toLowerCase(); const nameA = a.name.toLowerCase();
const nameB = b.name.toLowerCase(); const nameB = b.name.toLowerCase();
@ -94,14 +97,34 @@ const CustodyPage = () => {
return 0; return 0;
}); });
function shouldShowInProduction(custodian) {
return (
custodian &&
'production' in custodian &&
!custodian.production &&
process.env.METAMASK_ENVIRONMENT === 'production'
);
}
function isHidden(custodian) {
return custodian && 'hidden' in custodian && custodian.hidden;
}
function isNotSelectedCustodian(custodian) {
return (
custodian &&
'name' in custodian &&
connectRequest &&
Object.keys(connectRequest).length &&
custodian.name !== selectedCustodianName
);
}
sortedCustodians.forEach((custodian) => { sortedCustodians.forEach((custodian) => {
if ( if (
(!custodian.production && shouldShowInProduction(custodian) ||
process.env.METAMASK_ENVIRONMENT === 'production') || isHidden(custodian) ||
custodian.hidden || isNotSelectedCustodian(custodian)
(connectRequest &&
Object.keys(connectRequest).length &&
custodian.name !== selectedCustodianName)
) { ) {
return; return;
} }
@ -134,23 +157,27 @@ const CustodyPage = () => {
size={BUTTON_SIZES.SM} size={BUTTON_SIZES.SM}
data-testid="custody-connect-button" data-testid="custody-connect-button"
onClick={async () => { onClick={async () => {
const jwtListValue = await dispatch( try {
mmiActions.getCustodianJWTList(custodian.name), const jwtListValue = await dispatch(
); mmiActions.getCustodianJWTList(custodian.name),
setSelectedCustodianName(custodian.name); );
setSelectedCustodianType(custodian.type); setSelectedCustodianName(custodian.name);
setSelectedCustodianImage(custodian.iconUrl); setSelectedCustodianType(custodian.type);
setSelectedCustodianDisplayName(custodian.displayName); setSelectedCustodianImage(custodian.iconUrl);
setApiUrl(custodian.apiUrl); setSelectedCustodianDisplayName(custodian.displayName);
setCurrentJwt(jwtListValue[0] || ''); setApiUrl(custodian.apiUrl);
setJwtList(jwtListValue); setCurrentJwt(jwtListValue[0] || '');
trackEvent({ setJwtList(jwtListValue);
category: MetaMetricsEventCategory.MMI, trackEvent({
event: MetaMetricsEventName.CustodianSelected, category: MetaMetricsEventCategory.MMI,
properties: { event: MetaMetricsEventName.CustodianSelected,
custodian: custodian.name, properties: {
}, custodian: custodian.name,
}); },
});
} catch (error) {
console.error('Error:', error);
}
}} }}
> >
{t('select')} {t('select')}
@ -208,58 +235,54 @@ const CustodyPage = () => {
useEffect(() => { useEffect(() => {
const fetchConnectRequest = async () => { const fetchConnectRequest = async () => {
const connectRequestValue = await dispatch( try {
mmiActions.getCustodianConnectRequest(), if (connectRequest && Object.keys(connectRequest).length) {
); const {
token,
environment: custodianName,
service: custodianType,
apiUrl: custodianApiUrl,
} = connectRequest;
if (Object.keys(connectRequestValue).length) { const custodianToken =
const { token || (await dispatch(mmiActions.getCustodianToken(address)));
token,
custodianName,
custodianType,
apiUrl: custodianApiUrl,
} = connectRequestValue;
const jwt = setCurrentJwt(custodianToken);
token || (await dispatch(mmiActions.getCustodianToken(address))); setSelectedCustodianType(custodianType);
const accountsValue = await dispatch( setSelectedCustodianName(custodianName);
mmiActions.getCustodianAccounts( setApiUrl(custodianApiUrl);
jwt, setConnectError('');
custodianApiUrl,
custodianType,
true,
),
);
setConnectRequest(connectRequestValue); const accountsValue = await dispatch(
setCurrentJwt(jwt); mmiActions.getCustodianAccounts(
setSelectedCustodianType(custodianType); custodianToken,
setSelectedCustodianName(custodianName); custodianApiUrl,
setApiUrl(custodianApiUrl); custodianType,
setConnectError(''); true,
setAccounts(accountsValue); ),
);
trackEvent({ setAccounts(accountsValue);
category: MetaMetricsEventCategory.MMI,
event: MetaMetricsEventName.CustodianConnected, trackEvent({
properties: { category: MetaMetricsEventCategory.MMI,
custodian: custodianName, event: MetaMetricsEventName.CustodianConnected,
apiUrl, properties: {
rpc: Boolean(connectRequest), custodian: custodianName,
}, apiUrl,
}); rpc: Boolean(connectRequest),
},
});
}
} catch (error) {
console.error(error);
handleConnectError(error);
} }
}; };
const handleFetchConnectRequest = async () => { const handleFetchConnectRequest = () => {
try { setLoading(true);
setLoading(true); fetchConnectRequest().finally(() => setLoading(false));
await fetchConnectRequest();
setLoading(false);
} catch (error) {
console.error(error);
setLoading(false);
}
}; };
handleFetchConnectRequest(); handleFetchConnectRequest();
@ -343,8 +366,7 @@ const CustodyPage = () => {
{selectError} {selectError}
</Text> </Text>
)} )}
{!accounts && !selectedCustodianType && (
{!accounts && !selectedCustodianType ? (
<Box <Box
padding={4} padding={4}
display={Display.Flex} display={Display.Flex}
@ -383,7 +405,7 @@ const CustodyPage = () => {
<ul width={BlockSize.Full}>{custodianButtons}</ul> <ul width={BlockSize.Full}>{custodianButtons}</ul>
</Box> </Box>
</Box> </Box>
) : null} )}
{!accounts && selectedCustodianType && ( {!accounts && selectedCustodianType && (
<> <>
<Box <Box

View File

@ -107,8 +107,9 @@ import { getPermissionSubjects } from './permissions';
export function isNetworkLoading(state) { export function isNetworkLoading(state) {
const selectedNetworkClientId = getSelectedNetworkClientId(state); const selectedNetworkClientId = getSelectedNetworkClientId(state);
return ( return (
selectedNetworkClientId &&
state.metamask.networksMetadata[selectedNetworkClientId].status !== state.metamask.networksMetadata[selectedNetworkClientId].status !==
NetworkStatus.Available NetworkStatus.Available
); );
} }

View File

@ -3648,16 +3648,16 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@metamask-institutional/custody-controller@npm:^0.2.8": "@metamask-institutional/custody-controller@npm:^0.2.9":
version: 0.2.8 version: 0.2.9
resolution: "@metamask-institutional/custody-controller@npm:0.2.8" resolution: "@metamask-institutional/custody-controller@npm:0.2.9"
dependencies: dependencies:
"@ethereumjs/util": "npm:^8.0.5" "@ethereumjs/util": "npm:^8.0.5"
"@metamask-institutional/custody-keyring": "npm:^0.0.25" "@metamask-institutional/custody-keyring": "npm:^0.0.26"
"@metamask-institutional/sdk": "npm:^0.1.18" "@metamask-institutional/sdk": "npm:^0.1.18"
"@metamask-institutional/types": "npm:^1.0.3" "@metamask-institutional/types": "npm:^1.0.3"
"@metamask/obs-store": "npm:^8.0.0" "@metamask/obs-store": "npm:^8.0.0"
checksum: b10fb2f4f5d23e6f28a3606ba5cdf73e140537e061b5532d61283f4fd85faf334cfa94663d101a6323b8149656b4294d027fc3be0e56c9654738ec6c68c7e461 checksum: b59a49b42d51c8b8eced77c06e4398afacb0e6c47b7757b3df7c0cacbb77656f12c0e681cf3e71760363ea95e7d8c167a9146b5573c0bed220a466572e739080
languageName: node languageName: node
linkType: hard linkType: hard
@ -3693,20 +3693,36 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@metamask-institutional/extension@npm:^0.2.1": "@metamask-institutional/custody-keyring@npm:^0.0.26":
version: 0.2.1 version: 0.0.26
resolution: "@metamask-institutional/extension@npm:0.2.1" resolution: "@metamask-institutional/custody-keyring@npm:0.0.26"
dependencies:
"@ethereumjs/tx": "npm:^4.1.1"
"@ethereumjs/util": "npm:^8.0.5"
"@metamask-institutional/configuration-client": "npm:^1.0.6"
"@metamask-institutional/sdk": "npm:^0.1.18"
"@metamask-institutional/types": "npm:^1.0.3"
"@metamask/obs-store": "npm:^8.0.0"
crypto: "npm:^1.0.1"
lodash.clonedeep: "npm:^4.5.0"
checksum: c2163fc6b83b3c0dd5c5a7c69c71f5a2563a28ffb2df069b4ed16c56692872fb52b40aed911e1af30a0fee733a61d0239677df04d5da945c7f4cf5e003eff8d9
languageName: node
linkType: hard
"@metamask-institutional/extension@npm:0.3.2":
version: 0.3.2
resolution: "@metamask-institutional/extension@npm:0.3.2"
dependencies: dependencies:
"@ethereumjs/util": "npm:^8.0.5" "@ethereumjs/util": "npm:^8.0.5"
"@metamask-institutional/custody-controller": "npm:^0.2.8" "@metamask-institutional/custody-controller": "npm:^0.2.9"
"@metamask-institutional/custody-keyring": "npm:^0.0.25" "@metamask-institutional/custody-keyring": "npm:^0.0.26"
"@metamask-institutional/portfolio-dashboard": "npm:^1.4.0" "@metamask-institutional/portfolio-dashboard": "npm:^1.4.0"
"@metamask-institutional/sdk": "npm:^0.1.18" "@metamask-institutional/sdk": "npm:^0.1.18"
"@metamask-institutional/transaction-update": "npm:^0.1.23" "@metamask-institutional/transaction-update": "npm:^0.1.24"
"@metamask-institutional/types": "npm:^1.0.3" "@metamask-institutional/types": "npm:^1.0.3"
jest-create-mock-instance: "npm:^2.0.0" jest-create-mock-instance: "npm:^2.0.0"
jest-fetch-mock: "npm:3.0.3" jest-fetch-mock: "npm:3.0.3"
checksum: 28c80a016d49d41b8ad74732637da00f9bbabc64af1ec7b8704a03bfe809f4683502b3552646c49c478613f27f16becd981c68abc37244186688e4c170c3f991 checksum: f3fe93a1f2872e2f27b56af3e03b0aba90bb290cb7b800bed086db16e56bd9251e99eb7f46fd142e1ccb588f13d24a9379a23dbd778e8a0e83e5dbf7c11692a7
languageName: node languageName: node
linkType: hard linkType: hard
@ -3756,17 +3772,17 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@metamask-institutional/transaction-update@npm:^0.1.21, @metamask-institutional/transaction-update@npm:^0.1.23": "@metamask-institutional/transaction-update@npm:^0.1.21, @metamask-institutional/transaction-update@npm:^0.1.24":
version: 0.1.23 version: 0.1.24
resolution: "@metamask-institutional/transaction-update@npm:0.1.23" resolution: "@metamask-institutional/transaction-update@npm:0.1.24"
dependencies: dependencies:
"@metamask-institutional/custody-keyring": "npm:^0.0.25" "@metamask-institutional/custody-keyring": "npm:^0.0.26"
"@metamask-institutional/sdk": "npm:^0.1.18" "@metamask-institutional/sdk": "npm:^0.1.18"
"@metamask-institutional/types": "npm:^1.0.3" "@metamask-institutional/types": "npm:^1.0.3"
"@metamask-institutional/websocket-client": "npm:^0.1.25" "@metamask-institutional/websocket-client": "npm:^0.1.26"
"@metamask/obs-store": "npm:^8.0.0" "@metamask/obs-store": "npm:^8.0.0"
ethereumjs-util: "npm:^7.1.5" ethereumjs-util: "npm:^7.1.5"
checksum: 621ff8277fecf73c59e3bde74364f1f4b68c7e086caf20bfb01029c43ff9145c51ca5acd89c10204c56e820837fb7736d2968d3bc1b30f3c215061a162d4d74c checksum: d767d61600101ca3c580e3eeb9133d1a9d0753fd6190a830f798142074ff0e69142c567094dfb46062a299ee53b69db47021014e015db8c0fa55038bcdca7ca1
languageName: node languageName: node
linkType: hard linkType: hard
@ -3777,15 +3793,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@metamask-institutional/websocket-client@npm:^0.1.25": "@metamask-institutional/websocket-client@npm:^0.1.26":
version: 0.1.25 version: 0.1.26
resolution: "@metamask-institutional/websocket-client@npm:0.1.25" resolution: "@metamask-institutional/websocket-client@npm:0.1.26"
dependencies: dependencies:
"@metamask-institutional/custody-keyring": "npm:^0.0.25" "@metamask-institutional/custody-keyring": "npm:^0.0.26"
"@metamask-institutional/sdk": "npm:^0.1.18" "@metamask-institutional/sdk": "npm:^0.1.18"
"@metamask-institutional/types": "npm:^1.0.3" "@metamask-institutional/types": "npm:^1.0.3"
mock-socket: "npm:^9.2.1" mock-socket: "npm:^9.2.1"
checksum: b0ab0b17974e83b3c13e7a7a687b9dc254606f7120685602a832271ae16c46ce257820f0af8e0f74c8fa2a82bdc20e00534c9f43beae139b6def9df7b7a8063d checksum: ae2b5146c4922a76100d8348a7b22dacc5d43cda3f2be92dda24251082061462dab327059793b7b61b4d7c4270e7b7fd40c0da8feac0bcf7805e18c5f2bc6db9
languageName: node languageName: node
linkType: hard linkType: hard
@ -24224,7 +24240,7 @@ __metadata:
"@material-ui/core": "npm:^4.11.0" "@material-ui/core": "npm:^4.11.0"
"@metamask-institutional/custody-controller": "npm:0.2.6" "@metamask-institutional/custody-controller": "npm:0.2.6"
"@metamask-institutional/custody-keyring": "npm:^0.0.25" "@metamask-institutional/custody-keyring": "npm:^0.0.25"
"@metamask-institutional/extension": "npm:^0.2.1" "@metamask-institutional/extension": "npm:0.3.2"
"@metamask-institutional/institutional-features": "npm:^1.1.8" "@metamask-institutional/institutional-features": "npm:^1.1.8"
"@metamask-institutional/portfolio-dashboard": "npm:^1.1.3" "@metamask-institutional/portfolio-dashboard": "npm:^1.1.3"
"@metamask-institutional/rpc-allowlist": "npm:^1.0.0" "@metamask-institutional/rpc-allowlist": "npm:^1.0.0"