RocketChat/Rocket.Chat

View on GitHub
apps/meteor/client/sidebarv2/hooks/usePreventDefault.ts

Summary

Maintainability
C
1 day
Test Coverage
import type { RefObject } from 'react';
import { useEffect } from 'react';

export const usePreventDefault = (ref: RefObject<Element>): { ref: RefObject<Element> } => {
    // Flowrouter uses an addEventListener on the document to capture any clink link, since the react synthetic event use an addEventListener on the document too,
    // it is impossible/hard to determine which one will happen before and prevent/stop propagation, so feel free to remove this effect after remove flow router :)

    useEffect(() => {
        const { current } = ref;
        const stopPropagation: EventListener = (e) => {
            if ([(e.target as HTMLElement).nodeName, (e.target as HTMLElement).parentElement?.nodeName].includes('BUTTON')) {
                e.preventDefault();
            }
        };
        current?.addEventListener('click', stopPropagation);

        return (): void => current?.addEventListener('click', stopPropagation);
    }, [ref]);

    return { ref };
};