Source: interactions/interactionManager.js

class InteractionManager {
    constructor(params) {
        this.map = params.map;
        this.interactions = {};
        this.snappings = {};
        this.snapDefault = params.snap || true;
    }

    /**
     * Добавляет взаимодействие
     * @param interactionObject
     * @return {{interactionId: string, interaction, params: *}}
     */
    addInteraction(interactionObject) {
        let self = this;

        self.removeInteractions();

        let map = self.map;
        let id = interactionObject.id;
        let interactionType = interactionObject.type;
        let interaction = interactionObject.interaction;
        let key = id + "*" + interactionType;
        this.interactions[key] = interaction;
        map.addInteraction(interaction);
        interactionObject.on("change-interactor", function (data) {
            self.removeInteractions();
            self.addInteraction(data);
        });

        return {
            interactionId: key,
            interaction: interaction,
            params: interactionObject
        }
    }

    /**
     * Привязка к объектам слоя
     * Прим.: в отличие от остальных взимсодействий не приводят к удалению из объекта snappings
     * @param params
     * @return {{interactionId: string, interaction, params: *}}
     */
    addSnapInteraction(params) {
        let self = this;

        let map = self.map;
        let id = params.id;
        let interactionType = params.type;
        let interaction = params.interaction;
        let key = id + "*" + interactionType;
        this.snappings[key] = interaction;
        map.addInteraction(interaction);
        return {
            interactionId: key,
            interaction: interaction,
            params: params
        }
    }

    /**
     * Удаление привязки по layerId
     * @param {string} layerId - идентификатор слоя
     */
    removeSnapInteraction(layerId) {
        let self = this;
        let map = self.map;
        let key = layerId + "*" + "snap";
        let interaction = self.snappings[key];

        map.removeInteraction(interaction);
        delete self.interactions[key];
    }

    removeInteractions() {
        let self = this;
        let map = self.map;
        let interactions = self.interactions;
        for (let key in interactions) {
            map.removeInteraction(interactions[key]);
            delete self.interactions[key];
        }
    }

    //todo
    snapOnAll() {
        let self = this;
        let map = self.map;
    }

    //todo
    snapOffAll() {

    }

    //todo
    snapOn(layerId) {

    }

    //todo
    snapOff(layerId) {
        this.removeSnapInteraction(layerId)
    }

    setMap(map) {
        this.map = map;
    }
}

module.exports = InteractionManager;