Source: muze-firebolt/src/actions/physical/longtouch.js

/* global setTimeout */
import { getEvent } from 'muze-utils';
import { generatePayloadFromEvent } from './helpers';

/**
 * Adds mouse interactions to target element.
 * @param {VisualUnit} instance instance of visual unit.
 * @param {SVGElement} targetEl Element on which the event listeners will be attached.
 * @param {Array} behaviours Array of behaviours
 */
export const longtouch = firebolt => (targetEl, behaviours) => {
    let event;
    let touchEnd;
    const dispatchBehaviour = function (args) {
        const payload = generatePayloadFromEvent(args, event, firebolt);
        behaviours.forEach(beh => firebolt.dispatchBehaviour(beh, payload));
        event.stopPropagation();
    };

    touchEnd = false;
    event = getEvent();
    targetEl.on('touchstart', (args) => {
        event = getEvent();
        touchEnd = false;
        setTimeout(() => {
            if (!touchEnd) {
                dispatchBehaviour(args);
            } else {
                behaviours.forEach(beh => firebolt.dispatchBehaviour(beh, {
                    criteria: null
                }));
            }
        }, 100);
    }).on('touchend', () => {
        touchEnd = true;
    });
};