// Copyright 2023 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import type { MouseEvent } from 'react'; import React, { useCallback, useState } from 'react'; import type { LocalizerType } from '../types/Util.std.js'; import type { ShowToastAction } from '../state/ducks/toast.preload.js'; import { ToastType } from '../types/Toast.dom.js'; import { AxoAlertDialog } from '../axo/AxoAlertDialog.dom.js'; export type DeleteMessagesModalProps = Readonly<{ isMe: boolean; canDeleteForEveryone: boolean; needsAdminDelete: boolean; isDeletingOwnMessages: boolean; hasSeenAdminDeleteEducationDialog: boolean; i18n: LocalizerType; messageCount: number; onClose: () => void; onDeleteForMe: () => void; onDeleteForEveryone: () => void; onSeenAdminDeleteEducationDialog: () => void; showToast: ShowToastAction; }>; const MAX_DELETE_FOR_EVERYONE = 30; enum Step { SELECT_DELETE_TYPE, CONFIRM_ADMIN_DELETE, } export default function DeleteMessagesModal({ isMe, canDeleteForEveryone, needsAdminDelete, isDeletingOwnMessages, hasSeenAdminDeleteEducationDialog, i18n, messageCount, onClose, onDeleteForMe, onDeleteForEveryone, onSeenAdminDeleteEducationDialog, showToast, }: DeleteMessagesModalProps): React.JSX.Element { const [step, setStep] = useState(Step.SELECT_DELETE_TYPE); const tooManyMessages = messageCount > MAX_DELETE_FOR_EVERYONE; const handleBackToSelectDeleteType = useCallback(() => { setStep(Step.SELECT_DELETE_TYPE); }, []); const handleSelectDeleteForMe = useCallback(() => { onDeleteForMe(); onClose(); }, [onDeleteForMe, onClose]); const handleConfirmDeleteForEveryone = useCallback(() => { onDeleteForEveryone(); onClose(); }, [onDeleteForEveryone, onClose]); const handleSelectDeleteForEveryone = useCallback(() => { if (tooManyMessages) { showToast({ toastType: ToastType.TooManyMessagesToDeleteForEveryone, parameters: { count: MAX_DELETE_FOR_EVERYONE }, }); return; } if ( needsAdminDelete && !isDeletingOwnMessages && !hasSeenAdminDeleteEducationDialog ) { setStep(Step.CONFIRM_ADMIN_DELETE); return; } handleConfirmDeleteForEveryone(); }, [ tooManyMessages, needsAdminDelete, isDeletingOwnMessages, hasSeenAdminDeleteEducationDialog, showToast, handleConfirmDeleteForEveryone, ]); return ( <> ); } function DeleteMessagesSelectDeleteTypeDialog(props: { isMe: boolean; canDeleteForEveryone: boolean; i18n: LocalizerType; messageCount: number; tooManyMessages: boolean; open: boolean; onClose: () => void; onSelectDeleteForMe: () => void; onSelectDeleteForEveryone: () => void; }) { const { i18n, onClose, onSelectDeleteForEveryone } = props; const handleOpenChange = useCallback( (value: boolean) => { if (!value) { onClose(); } }, [onClose] ); const handleSelectDeleteForEveryone = useCallback( (event: MouseEvent) => { event.preventDefault(); onSelectDeleteForEveryone(); }, [onSelectDeleteForEveryone] ); return ( {i18n('icu:DeleteMessagesModal--title-2', { count: props.messageCount, })} {props.isMe ? i18n( 'icu:DeleteMessagesModal--description--noteToSelf--deleteSync', { count: props.messageCount } ) : i18n('icu:DeleteMessagesModal--description', { count: props.messageCount, })} {i18n('icu:cancel')} {props.isMe ? i18n('icu:DeleteMessagesModal--noteToSelf--deleteSync') : i18n('icu:DeleteMessagesModal--deleteForMe')} {props.canDeleteForEveryone && !props.isMe && ( {i18n('icu:DeleteMessagesModal--deleteForEveryone')} )} ); } function DeleteMessagesConfirmAdminDeleteDialog(props: { i18n: LocalizerType; messageCount: number; open: boolean; onOpenChange: () => void; onCancel: () => void; onConfirm: () => void; onClose: () => void; onSeenAdminDeleteEducationDialog: () => void; }) { const { i18n, messageCount, onCancel, onConfirm, onClose, onSeenAdminDeleteEducationDialog, } = props; const handleCancel = useCallback(() => { onCancel(); }, [onCancel]); const handleConfirm = useCallback(() => { onSeenAdminDeleteEducationDialog(); onConfirm(); onClose(); }, [onConfirm, onClose, onSeenAdminDeleteEducationDialog]); return ( {i18n('icu:DeleteMessagesModal--adminDeleteConfirmation--title')} {i18n( 'icu:DeleteMessagesModal--adminDeleteConfirmation--description', { count: messageCount } )} {i18n('icu:cancel')} {i18n('icu:DeleteMessagesModal--deleteForEveryone')} ); }