// 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')}
);
}