diff --git a/test/data/mock-send-state.json b/test/data/mock-send-state.json index 300d4428520b..65eff4dc7317 100644 --- a/test/data/mock-send-state.json +++ b/test/data/mock-send-state.json @@ -12,6 +12,8 @@ "appState": { "networkDropdownOpen": false, "importNftsModal": { "open": false }, + "showEditAccountsModalOpen": false, + "showEditNetworksModalOpen": false, "gasIsLoading": false, "isLoading": false, "importTokensModalOpen": false, diff --git a/test/data/mock-state.json b/test/data/mock-state.json index d2a4ac0ee45b..85325393d8a5 100644 --- a/test/data/mock-state.json +++ b/test/data/mock-state.json @@ -14,6 +14,8 @@ "importNftsModal": { "open": false }, + "showEditAccountsModalOpen": false, + "showEditNetworksModalOpen": false, "gasIsLoading": false, "isLoading": false, "modal": { diff --git a/ui/components/multichain/pages/review-permissions-page/site-cell/site-cell-menu.tsx b/ui/components/multichain/pages/review-permissions-page/site-cell/site-cell-menu.tsx new file mode 100644 index 000000000000..8f0fa843c691 --- /dev/null +++ b/ui/components/multichain/pages/review-permissions-page/site-cell/site-cell-menu.tsx @@ -0,0 +1,116 @@ +import React, { useRef, useCallback, useEffect, useState } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { + PopoverRole, + PopoverPosition, + Popover, + IconName, + Text, + ModalFocus, + Box, +} from '../../../../component-library'; +import { MenuItem } from '../../../../ui/menu'; +import { + IconColor, + TextColor, + TextVariant, +} from '../../../../../helpers/constants/design-system'; +import { useI18nContext } from '../../../../../hooks/useI18nContext'; +import { getPermissionsForActiveTab } from '../../../../../selectors'; +import { PermissionDetailsModal } from '../../../permission-details-modal/permission-details-modal'; + +// TODO: Replace `any` with type +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const TsMenuItem = MenuItem as any; + +export const SiteCellMenu = ({ + isOpen, + account, + anchorElement, + disableAccountSwitcher = false, + onClose, + closeMenu, + onActionClick, + activeTabOrigin, +}: { + isOpen: boolean; + anchorElement: HTMLElement | null; + disableAccountSwitcher: boolean; + onClose: () => void; + closeMenu: () => void; + onActionClick: (message: string) => void; + activeTabOrigin: string; +}) => { + const dispatch = useDispatch(); + const t = useI18nContext(); + const popoverDialogRef = useRef(null); + const [showPermissionModal, setShowPermissionModal] = useState(false); + const permissions = useSelector(getPermissionsForActiveTab); + + const handleClickOutside = useCallback( + (event) => { + if ( + popoverDialogRef?.current && + !popoverDialogRef.current.contains(event.target) + ) { + onClose(); + } + }, + [onClose], + ); + + useEffect(() => { + document.addEventListener('mousedown', handleClickOutside); + + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, [handleClickOutside]); + + const handleKeyDown = useCallback( + (event) => { + if ( + event.key === 'Tab' && + popoverDialogRef?.current?.contains(event.target) && + onClose + ) { + onClose(); + } + }, + [onClose], + ); + + return ( + <> + + + + { + setShowPermissionModal(true); + onClose(); + }} + > + + {t('permissionDetails')} + + + + + + + ); +}; diff --git a/ui/components/multichain/pages/review-permissions-page/site-cell/site-cell.tsx b/ui/components/multichain/pages/review-permissions-page/site-cell/site-cell.tsx index 5fb08ccb6412..9ad0bb61132f 100644 --- a/ui/components/multichain/pages/review-permissions-page/site-cell/site-cell.tsx +++ b/ui/components/multichain/pages/review-permissions-page/site-cell/site-cell.tsx @@ -29,9 +29,15 @@ import { } from '../../../../component-library'; import { getURLHost } from '../../../../../helpers/utils/util'; import { ConnectionListTooltip } from '../../permissions-page/connection-list-tooltip/connection-list-tooltip'; +import { + showEditAccountsModal, + showEditNetworksModal, +} from '../../../../../store/actions'; +import { useDispatch } from 'react-redux'; export const SiteCell = ({}) => { const t = useI18nContext(); + const dispatch = useDispatch(); return ( <> @@ -94,6 +100,9 @@ export const SiteCell = ({}) => { alignItems={AlignItems.center} style={{ flex: '1', alignSelf: 'center' }} gap={2} + onClick={() => { + dispatch(showEditAccountsModal()); + }} > { className="multichain-connection-list-item" > { textAlign={TextAlign.Left} ellipsis > - {t('accountsPermissionsTitle')} + {t('permission_walletSwitchEthereumChain')} { alignItems={AlignItems.center} style={{ flex: '1', alignSelf: 'center' }} gap={2} + onClick={() => { + dispatch(showEditNetworksModal()); + }} > ) : null} - {process.env.CHAIN_PERMISSIONS ? + {process.env.CHAIN_PERMISSIONS ? ( console.log('Yo')} + onActionClick={() => this.props.history.push(REVIEW_PERMISSIONS)} onClose={() => console.log('lo')} - /> : null} + /> + ) : null} ); } @@ -848,6 +855,10 @@ export default class Routes extends Component { location, isImportNftsModalOpen, hideImportNftsModal, + isEditAccountsModalOpen, + hideEditAccountsModal, + isEditNetworksModalOpen, + hideEditNetworksModal, isIpfsModalOpen, isBasicConfigurationModalOpen, hideIpfsModal, @@ -953,6 +964,13 @@ export default class Routes extends Component { {isImportNftsModalOpen ? ( hideImportNftsModal()} /> ) : null} + {isEditAccountsModalOpen ? ( + hideEditAccountsModal()} /> + ) : null} + {isEditNetworksModalOpen ? ( + hideEditNetworksModal()} /> + ) : null} + {isIpfsModalOpen ? ( hideIpfsModal()} /> ) : null} diff --git a/ui/pages/routes/routes.container.js b/ui/pages/routes/routes.container.js index dd88ca780596..a62f1d9c7325 100644 --- a/ui/pages/routes/routes.container.js +++ b/ui/pages/routes/routes.container.js @@ -53,6 +53,8 @@ import { hideKeyringRemovalResultModal, ///: END:ONLY_INCLUDE_IF setEditedNetwork, + hideEditAccountsModal, + hideEditNetworksModal, } from '../../store/actions'; import { pageChanged } from '../../ducks/history/history'; import { prepareToLeaveSwaps } from '../../ducks/swaps/swaps'; @@ -130,6 +132,8 @@ function mapStateToProps(state) { accountDetailsAddress: state.appState.accountDetailsAddress, isImportNftsModalOpen: state.appState.importNftsModal.open, isIpfsModalOpen: state.appState.showIpfsModalOpen, + isEditNetworksModalOpen: state.appState.showEditNetworksModalOpen, + isEditAccountsModalOpen: state.appState.showEditAccountsModalOpen, switchedNetworkDetails, useNftDetection, showNftEnablementToast, @@ -162,6 +166,8 @@ function mapDispatchToProps(dispatch) { toggleNetworkMenu: () => dispatch(toggleNetworkMenu()), hideImportNftsModal: () => dispatch(hideImportNftsModal()), hideIpfsModal: () => dispatch(hideIpfsModal()), + hideEditAccountsModal: () => dispatch(hideEditAccountsModal()), + hideEditNetworksModal: () => dispatch(hideEditNetworksModal()), hideImportTokensModal: () => dispatch(hideImportTokensModal()), hideDeprecatedNetworkModal: () => dispatch(hideDeprecatedNetworkModal()), addPermittedAccount: (activeTabOrigin, address) => diff --git a/ui/store/actionConstants.ts b/ui/store/actionConstants.ts index a54a5a220be8..d9dbb2724fec 100644 --- a/ui/store/actionConstants.ts +++ b/ui/store/actionConstants.ts @@ -14,6 +14,10 @@ export const NETWORK_DROPDOWN_CLOSE = 'UI_NETWORK_DROPDOWN_CLOSE'; export const IMPORT_NFTS_MODAL_OPEN = 'UI_IMPORT_NFTS_MODAL_OPEN'; export const IMPORT_NFTS_MODAL_CLOSE = 'UI_IMPORT_NFTS_MODAL_CLOSE'; export const SHOW_IPFS_MODAL_OPEN = 'UI_IPFS_MODAL_OPEN'; +export const SHOW_EDIT_ACCOUNTS_MODAL_OPEN = 'UI_EDIT_ACCOUNTS_MODAL_OPEN'; +export const SHOW_EDIT_ACCOUNTS_MODAL_CLOSE = 'UI_EDIT_ACCOUNTS_MODAL_CLOSE'; +export const SHOW_EDIT_NETWORKS_MODAL_OPEN = 'UI_EDIT_NETWORKS_MODAL_OPEN'; +export const SHOW_EDIT_NETWORKS_MODAL_CLOSE = 'UI_EDIT_NETWORKS_MODAL_CLOSE'; export const SHOW_IPFS_MODAL_CLOSE = 'UI_IPFS_MODAL_CLOSE'; export const IMPORT_TOKENS_POPOVER_OPEN = 'UI_IMPORT_TOKENS_POPOVER_OPEN'; export const IMPORT_TOKENS_POPOVER_CLOSE = 'UI_IMPORT_TOKENS_POPOVER_CLOSE'; diff --git a/ui/store/actions.ts b/ui/store/actions.ts index 58e8cca70de8..0fa9752414a5 100644 --- a/ui/store/actions.ts +++ b/ui/store/actions.ts @@ -2613,6 +2613,30 @@ export function hideImportNftsModal(): Action { }; } +export function showEditAccountsModal(): Action { + return { + type: actionConstants.SHOW_EDIT_ACCOUNTS_MODAL_OPEN, + }; +} + +export function hideEditAccountsModal(): Action { + return { + type: actionConstants.SHOW_EDIT_ACCOUNTS_MODAL_CLOSE, + }; +} + +export function hideEditNetworksModal(): Action { + return { + type: actionConstants.SHOW_EDIT_NETWORKS_MODAL_CLOSE, + }; +} + +export function showEditNetworksModal(): Action { + return { + type: actionConstants.SHOW_EDIT_NETWORKS_MODAL_OPEN, + }; +} + // TODO: Replace `any` with type // eslint-disable-next-line @typescript-eslint/no-explicit-any export function setConfirmationExchangeRates(value: Record) {