| 123456789101112131415161718192021222324252627282930313233 | /* @flow */
/* eslint-disable flowtype/space-before-type-colon */
/**
 * Prevents further propagation of the events to be handler by a specific event
 * handler/listener in the capturing and bubbling phases.
 *
 * @param {Function} eventHandler - The event handler/listener which handles
 * events that need to be stopped from propagating.
 * @returns {Function} An event handler/listener to be used in place of the
 * specified eventHandler in order to stop the events from propagating.
 */
export function stopEventPropagation<T>(eventHandler: (ev: Event) => T)
        : (ev: Event) => T {
/* eslint-enable flowtype/space-before-type-colon */
    return (ev: Event): T => {
        const r = eventHandler(ev);
        // React Native does not propagate the press event so, for the sake of
        // cross-platform compatibility, stop the propagation on Web as well.
        // Additionally, use feature checking in order to deal with browser
        // differences.
        if (ev && ev.stopPropagation) {
            ev.stopPropagation();
            ev.preventDefault && ev.preventDefault();
        }
        return r;
    };
}
 |