RocketChat/Rocket.Chat

View on GitHub
apps/meteor/client/lib/chats/flows/requestMessageDeletion.ts

Summary

Maintainability
A
2 hrs
Test Coverage
import type { IMessage } from '@rocket.chat/core-typings';

import { t } from '../../../../app/utils/lib/i18n';
import GenericModal from '../../../components/GenericModal';
import { imperativeModal } from '../../imperativeModal';
import { dispatchToastMessage } from '../../toast';
import type { ChatAPI } from '../ChatAPI';

export const requestMessageDeletion = async (chat: ChatAPI, message: IMessage): Promise<void> => {
    if (!(await chat.data.canDeleteMessage(message))) {
        dispatchToastMessage({ type: 'error', message: t('Message_deleting_blocked') });
        return;
    }

    const room = message.drid ? await chat.data.getDiscussionByID(message.drid) : undefined;

    await new Promise<void>((resolve, reject) => {
        const onConfirm = async (): Promise<void> => {
            try {
                if (!(await chat.data.canDeleteMessage(message))) {
                    dispatchToastMessage({ type: 'error', message: t('Message_deleting_blocked') });
                    return;
                }
                await chat.data.deleteMessage(message._id);

                imperativeModal.close();

                if (chat.currentEditing?.mid === message._id) {
                    chat.currentEditing.stop();
                }
                chat.composer?.focus();

                dispatchToastMessage({ type: 'success', message: t('Your_entry_has_been_deleted') });
                resolve();
            } catch (error) {
                dispatchToastMessage({ type: 'error', message: error });
                reject(error);
            }
        };

        const onCloseModal = async (): Promise<void> => {
            imperativeModal.close();

            if (chat.currentEditing?.mid === message._id) {
                chat.currentEditing.stop();
            }
            chat.composer?.focus();

            resolve();
        };

        imperativeModal.open({
            component: GenericModal,
            props: {
                title: t('Are_you_sure'),
                children: room ? t('The_message_is_a_discussion_you_will_not_be_able_to_recover') : t('You_will_not_be_able_to_recover'),
                variant: 'danger',
                confirmText: t('Yes_delete_it'),
                onConfirm,
                onClose: onCloseModal,
                onCancel: onCloseModal,
            },
        });
    });
};