import React, { useCallback, useState } from 'react'; import { useSelector } from 'react-redux'; import PropTypes from 'prop-types'; import { useI18nContext } from '../../../../hooks/useI18nContext'; import Box from '../../../../components/ui/box'; import SiteOrigin from '../../../../components/ui/site-origin'; import { IconSize, Text, ValidTag, } from '../../../../components/component-library'; import { FlexDirection, TextVariant, JustifyContent, AlignItems, TextAlign, Display, FontWeight, BlockSize, } from '../../../../helpers/constants/design-system'; import { PageContainerFooter } from '../../../../components/ui/page-container'; import SnapConnectCell from '../../../../components/app/snaps/snap-connect-cell/snap-connect-cell'; import { getDedupedSnaps, getSnapName } from '../../../../helpers/utils/util'; import PulseLoader from '../../../../components/ui/pulse-loader/pulse-loader'; import SnapPrivacyWarning from '../../../../components/app/snaps/snap-privacy-warning/snap-privacy-warning'; import { getPermissions, getTargetSubjectMetadata, } from '../../../../selectors'; import SnapAvatar from '../../../../components/app/snaps/snap-avatar/snap-avatar'; import { useOriginMetadata } from '../../../../hooks/useOriginMetadata'; export default function SnapsConnect({ request, approveConnection, rejectConnection, targetSubjectMetadata, snapsInstallPrivacyWarningShown, setSnapsInstallPrivacyWarningShownStatus, }) { const t = useI18nContext(); const { origin, iconUrl, name } = targetSubjectMetadata; const [isLoading, setIsLoading] = useState(false); const [isShowingSnapsPrivacyWarning, setIsShowingSnapsPrivacyWarning] = useState(!snapsInstallPrivacyWarningShown); const currentPermissions = useSelector((state) => getPermissions(state, request?.metadata?.origin), ); const onCancel = useCallback(() => { rejectConnection(request.metadata.id); }, [request, rejectConnection]); const onConnect = useCallback(() => { try { setIsLoading(true); approveConnection(request); } finally { setIsLoading(false); } }, [request, approveConnection]); const snaps = getDedupedSnaps(request, currentPermissions); const singularConnectSnapMetadata = useSelector((state) => getTargetSubjectMetadata(state, snaps?.[0]), ); const SnapsConnectContent = () => { const { hostname: trimmedOrigin } = useOriginMetadata(origin) || {}; if (isLoading) { return ( ); } if (snaps?.length > 1) { return ( {t('connectionRequest')} {t('multipleSnapConnectionWarning', [ {trimmedOrigin} , {snaps?.length} , ])} {snaps.map((snap) => ( // TODO(hbmalik88): add in the iconUrl prop when we have access to a snap's icons pre-installation ))} ); } else if (snaps?.length === 1) { const snapId = snaps[0]; const snapName = getSnapName(snapId, singularConnectSnapMetadata); return ( {t('connectionRequest')} {t('snapConnectionWarning', [ {trimmedOrigin} , {snapName} , ])} ); } return null; }; return ( {isShowingSnapsPrivacyWarning && ( { setIsShowingSnapsPrivacyWarning(false); setSnapsInstallPrivacyWarningShownStatus(true); }} onCanceled={onCancel} /> )} ); } SnapsConnect.propTypes = { request: PropTypes.object.isRequired, approveConnection: PropTypes.func.isRequired, rejectConnection: PropTypes.func.isRequired, targetSubjectMetadata: PropTypes.shape({ extensionId: PropTypes.string, iconUrl: PropTypes.string, name: PropTypes.string, origin: PropTypes.string, subjectType: PropTypes.string, }), snapsInstallPrivacyWarningShown: PropTypes.bool.isRequired, setSnapsInstallPrivacyWarningShownStatus: PropTypes.func, };