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,
};