import React from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; import { getSnapPrefix } from '@metamask/snaps-utils'; import { useDispatch, useSelector } from 'react-redux'; import Box from '../../../ui/box'; import { BackgroundColor, TextColor, FLEX_DIRECTION, TextVariant, BorderColor, AlignItems, DISPLAY, BLOCK_SIZES, JustifyContent, BorderStyle, Color, BorderRadius, } from '../../../../helpers/constants/design-system'; import { formatDate, getSnapName, removeSnapIdPrefix, } from '../../../../helpers/utils/util'; import { Text, ButtonLink } from '../../../component-library'; import { getTargetSubjectMetadata } from '../../../../selectors'; import SnapAvatar from '../snap-avatar'; import { useI18nContext } from '../../../../hooks/useI18nContext'; import Tooltip from '../../../ui/tooltip/tooltip'; import ToggleButton from '../../../ui/toggle-button'; import { disableSnap, enableSnap } from '../../../../store/actions'; import { useOriginMetadata } from '../../../../hooks/useOriginMetadata'; import SnapVersion from '../snap-version/snap-version'; const SnapAuthorship = ({ snapId, className, expanded = false, snap }) => { const t = useI18nContext(); const dispatch = useDispatch(); // We're using optional chaining with snapId, because with the current implementation // of snap update in the snap controller, we do not have reference to snapId when an // update request is rejected because the reference comes from the request itself and not subject metadata // like it is done with snap install const snapPrefix = snapId && getSnapPrefix(snapId); const packageName = snapId && removeSnapIdPrefix(snapId); const isNPM = snapPrefix === 'npm:'; const url = isNPM ? `https://www.npmjs.com/package/${packageName}` : packageName; const subjectMetadata = useSelector((state) => getTargetSubjectMetadata(state, snapId), ); const friendlyName = snapId && getSnapName(snapId, subjectMetadata); // Expanded data const versionHistory = snap?.versionHistory ?? []; const installInfo = versionHistory.length ? versionHistory[versionHistory.length - 1] : undefined; const installOrigin = useOriginMetadata(installInfo?.origin); const onToggle = () => { if (snap?.enabled) { dispatch(disableSnap(snap?.id)); } else { dispatch(enableSnap(snap?.id)); } }; return ( {friendlyName} {packageName} {!expanded && ( )} {expanded && ( {t('enableSnap')} {installOrigin && installInfo && ( {t('installOrigin')} {installOrigin.host} {t('installedOn', [ formatDate(installInfo.date, 'dd MMM yyyy'), ])} )} {t('version')} )} ); }; SnapAuthorship.propTypes = { /** * The id of the snap */ snapId: PropTypes.string, /** * The className of the SnapAuthorship */ className: PropTypes.string, /** * If the authorship component should be expanded */ expanded: PropTypes.bool, /** * The snap object. Can be undefined if the component is not expanded */ snap: PropTypes.object, }; export default SnapAuthorship;