RocketChat/Rocket.Chat

View on GitHub
apps/meteor/client/views/root/hooks/useMessageLinkClicks.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { useAbsoluteUrl, useLayout } from '@rocket.chat/ui-contexts';
import { useEffect } from 'react';

import { fireGlobalEvent } from '../../../lib/utils/fireGlobalEvent';

export const useMessageLinkClicks = () => {
    const absoluteUrl = useAbsoluteUrl();
    const { isEmbedded: embeddedLayout } = useLayout();

    useEffect(() => {
        if (!embeddedLayout) {
            return;
        }

        const handleMessageLinkClick = (event: Event) => {
            const element = event.currentTarget as Element | null;

            if (!element || !(element instanceof HTMLElement)) {
                return;
            }

            if (!(element instanceof HTMLAnchorElement)) {
                return;
            }

            if (element.origin !== absoluteUrl('').replace(/\/+$/, '') || !/msg=([a-zA-Z0-9]+)/.test(element.search)) {
                return;
            }

            fireGlobalEvent('click-message-link', { link: element.pathname + element.search });
        };

        document.body.addEventListener('click', handleMessageLinkClick);

        return () => {
            document.body.removeEventListener('click', handleMessageLinkClick);
        };
    }, [absoluteUrl, embeddedLayout]);
};