RocketChat/Rocket.Chat

View on GitHub
apps/meteor/app/discussion/client/createDiscussionMessageAction.ts

Summary

Maintainability
A
30 mins
Test Coverage
import { Meteor } from 'meteor/meteor';
import { Tracker } from 'meteor/tracker';

import CreateDiscussion from '../../../client/components/CreateDiscussion/CreateDiscussion';
import { imperativeModal } from '../../../client/lib/imperativeModal';
import { roomCoordinator } from '../../../client/lib/rooms/roomCoordinator';
import { messageArgs } from '../../../client/lib/utils/messageArgs';
import { hasPermission } from '../../authorization/client';
import { settings } from '../../settings/client';
import { MessageAction } from '../../ui-utils/client';

Meteor.startup(() => {
    Tracker.autorun(() => {
        if (!settings.get('Discussion_enabled')) {
            return MessageAction.removeButton('start-discussion');
        }

        MessageAction.addButton({
            id: 'start-discussion',
            icon: 'discussion',
            label: 'Discussion_start',
            type: 'communication',
            context: ['message', 'message-mobile', 'videoconf'],
            async action(_, props) {
                const { message = messageArgs(this).msg, room } = props;

                imperativeModal.open({
                    component: CreateDiscussion,
                    props: {
                        defaultParentRoom: room?.prid || room?._id,
                        onClose: imperativeModal.close,
                        parentMessageId: message._id,
                        nameSuggestion: message?.msg?.substr(0, 140),
                    },
                });
            },
            condition({
                message: {
                    u: { _id: uid },
                    drid,
                    dcount,
                },
                room,
                subscription,
                user,
            }) {
                if (drid || !Number.isNaN(Number(dcount))) {
                    return false;
                }
                if (!subscription) {
                    return false;
                }
                const isLivechatRoom = roomCoordinator.isLivechatRoom(room.t);
                if (isLivechatRoom) {
                    return false;
                }

                if (!user) {
                    return false;
                }

                return uid !== user._id ? hasPermission('start-discussion-other-user', room._id) : hasPermission('start-discussion', room._id);
            },
            order: 1,
            group: 'menu',
        });
    });
});