// Copyright 2020-2021 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import * as React from 'react'; import { noop } from 'lodash'; import { Avatar } from './Avatar'; import type { ActionSpec } from './ConfirmationDialog'; import { ConfirmationDialog } from './ConfirmationDialog'; import { InContactsIcon } from './InContactsIcon'; import { Modal } from './Modal'; import type { ConversationType } from '../state/ducks/conversations'; import type { PreferredBadgeSelectorType } from '../state/selectors/badges'; import type { LocalizerType, ThemeType } from '../types/Util'; import { isInSystemContacts } from '../util/isInSystemContacts'; export enum SafetyNumberChangeSource { Calling = 'Calling', MessageSend = 'MessageSend', Story = 'Story', } export type SafetyNumberProps = { contactID: string; onClose: () => void; }; export type Props = { readonly confirmText?: string; readonly contacts: Array; readonly getPreferredBadge: PreferredBadgeSelectorType; readonly i18n: LocalizerType; readonly onCancel: () => void; readonly onConfirm: () => void; readonly renderSafetyNumber: (props: SafetyNumberProps) => JSX.Element; readonly theme: ThemeType; }; export const SafetyNumberChangeDialog = ({ confirmText, contacts, getPreferredBadge, i18n, onCancel, onConfirm, renderSafetyNumber, theme, }: Props): JSX.Element => { const [isReviewing, setIsReviewing] = React.useState( contacts.length <= 5 ); const [selectedContact, setSelectedContact] = React.useState< ConversationType | undefined >(undefined); const cancelButtonRef = React.createRef(); React.useEffect(() => { if (cancelButtonRef && cancelButtonRef.current) { cancelButtonRef.current.focus(); } }, [cancelButtonRef, contacts]); const onClose = selectedContact ? () => { setSelectedContact(undefined); } : onCancel; if (selectedContact) { return ( {renderSafetyNumber({ contactID: selectedContact.id, onClose })} ); } const allVerified = contacts.every(contact => contact.isVerified); const actions: Array = [ { action: onConfirm, text: confirmText || (allVerified ? i18n('safetyNumberChangeDialog_send') : i18n('sendAnyway')), style: 'affirmative', }, ]; if (isReviewing) { return (
{i18n('safetyNumberChanges')}
{i18n('safetyNumberChangeDialog__message')}
    {contacts.map((contact: ConversationType) => { const shouldShowNumber = Boolean( contact.name || contact.profileName ); return ( ); })}
); } actions.unshift({ action: () => setIsReviewing(true), text: i18n('safetyNumberChangeDialog__review'), }); return (
{i18n('safetyNumberChanges')}
{i18n('icu:safetyNumberChangeDialog__many-contacts', { count: contacts.length, })}
); }; type ContactRowProps = Readonly<{ contact: ConversationType; getPreferredBadge: PreferredBadgeSelectorType; i18n: LocalizerType; setSelectedContact: (contact: ConversationType) => void; shouldShowNumber: boolean; theme: ThemeType; }>; function ContactRow({ contact, getPreferredBadge, i18n, setSelectedContact, shouldShowNumber, theme, }: ContactRowProps) { return (
  • {contact.title} {isInSystemContacts(contact) ? ( {' '} ) : null}
    {shouldShowNumber || contact.isVerified ? (
    {shouldShowNumber ? ( {contact.phoneNumber} ) : ( '' )} {shouldShowNumber && contact.isVerified ? (  ·  ) : ( '' )} {contact.isVerified ? ( {i18n('verified')} ) : ( '' )}
    ) : null}
  • ); }