import React, { useMemo } from 'react'; import PropTypes from 'prop-types'; import { RestrictedMethods, ///: BEGIN:ONLY_INCLUDE_IN(flask) EndowmentPermissions, PermissionNamespaces, ///: END:ONLY_INCLUDE_IN } from '../../../../shared/constants/permissions'; import { useI18nContext } from '../../../hooks/useI18nContext'; ///: BEGIN:ONLY_INCLUDE_IN(flask) import { coinTypeToProtocolName } from '../../../helpers/utils/util'; ///: END:ONLY_INCLUDE_IN const UNKNOWN_PERMISSION = Symbol('unknown'); /** * @typedef {Object} PermissionLabelObject * @property {string} label - The text label. * @property {string} leftIcon - The left icon. * @property {string} rightIcon - The right icon. */ /** * Gets the permission list label dictionary key for the specified permission * name. * * @param {string} permissionName - The name of the permission whose key to * retrieve. * @param {Record} permissionDictionary - The * dictionary object mapping permission keys to label objects. */ function getPermissionKey(permissionName, permissionDictionary) { if (Object.hasOwnProperty.call(permissionDictionary, permissionName)) { return permissionName; } ///: BEGIN:ONLY_INCLUDE_IN(flask) for (const namespace of Object.keys(PermissionNamespaces)) { if (permissionName.startsWith(namespace)) { return PermissionNamespaces[namespace]; } } ///: END:ONLY_INCLUDE_IN return UNKNOWN_PERMISSION; } export default function PermissionsConnectPermissionList({ permissions }) { const t = useI18nContext(); const PERMISSION_LIST_VALUES = useMemo(() => { return { [RestrictedMethods.eth_accounts]: { leftIcon: 'fas fa-eye', label: t('permission_ethereumAccounts'), rightIcon: null, }, ///: BEGIN:ONLY_INCLUDE_IN(flask) [RestrictedMethods.snap_confirm]: { leftIcon: 'fas fa-user-check', label: t('permission_customConfirmation'), rightIcon: null, }, [RestrictedMethods['snap_getBip44Entropy_*']]: (permissionName) => { const coinType = permissionName.split('_').slice(-1); return { leftIcon: 'fas fa-door-open', label: t('permission_manageBip44Keys', [ coinTypeToProtocolName(coinType) || `${coinType} (Unrecognized protocol)`, ]), rightIcon: null, }; }, [RestrictedMethods.snap_manageState]: { leftIcon: 'fas fa-download', label: t('permission_manageState'), rightIcon: null, }, [RestrictedMethods['wallet_snap_*']]: (permissionName) => { const snapId = permissionName.split('_').slice(-1); return { leftIcon: 'fas fa-bolt', label: t('permission_accessSnap', [snapId]), rightIcon: null, }; }, [EndowmentPermissions['endowment:network-access']]: { leftIcon: 'fas fa-wifi', label: t('permission_accessNetwork'), rightIcon: null, }, ///: END:ONLY_INCLUDE_IN [UNKNOWN_PERMISSION]: (permissionName) => { return { leftIcon: 'fas fa-times-circle', label: t('permission_unknown', [permissionName ?? 'undefined']), rightIcon: null, }; }, }; }, [t]); return (
{Object.keys(permissions).map((permission) => { const listValue = PERMISSION_LIST_VALUES[ getPermissionKey(permission, PERMISSION_LIST_VALUES) ]; const { label, leftIcon, rightIcon } = typeof listValue === 'function' ? listValue(permission) : listValue; return (
{label} {rightIcon && }
); })}
); } PermissionsConnectPermissionList.propTypes = { permissions: PropTypes.object.isRequired, };