RocketChat/Rocket.Chat

View on GitHub
apps/meteor/client/views/room/Announcement/Announcement.tsx

Summary

Maintainability
A
1 hr
Test Coverage
import { Box } from '@rocket.chat/fuselage';
import { useMutableCallback } from '@rocket.chat/fuselage-hooks';
import { useSetModal, useTranslation } from '@rocket.chat/ui-contexts';
import type { MouseEvent } from 'react';
import React from 'react';

import GenericModal from '../../../components/GenericModal';
import MarkdownText from '../../../components/MarkdownText';
import AnnouncementComponent from './AnnouncementComponent';

type AnnouncementProps = {
    announcement: string;
    announcementDetails?: () => void;
};

const Announcement = ({ announcement, announcementDetails }: AnnouncementProps) => {
    const t = useTranslation();
    const setModal = useSetModal();
    const closeModal = useMutableCallback(() => setModal(null));
    const handleClick = (e: MouseEvent<HTMLAnchorElement>): void => {
        if ((e.target as HTMLAnchorElement).href) {
            return;
        }

        if (window?.getSelection()?.toString() !== '') {
            return;
        }

        announcementDetails
            ? announcementDetails()
            : setModal(
                    <GenericModal icon={null} title={t('Announcement')} confirmText={t('Close')} onConfirm={closeModal} onClose={closeModal}>
                        <Box overflow='hidden' wordBreak='break-word'>
                            <MarkdownText content={announcement} parseEmoji />
                        </Box>
                    </GenericModal>,
              );
    };

    return announcement ? (
        <AnnouncementComponent onClickOpen={(e: MouseEvent<HTMLAnchorElement>): void => handleClick(e)}>
            <MarkdownText variant='inlineWithoutBreaks' content={announcement} withTruncatedText parseEmoji />
        </AnnouncementComponent>
    ) : null;
};

export default Announcement;