'use strict';

var VisualElementDragControls = require('./VisualElementDragControls.js');
var Feature = require('../../../../../../../motion-dom@12.38.0/node_modules/motion-dom/dist/es/render/Feature.js');
var noop = require('../../../../../../../motion-utils@12.36.0/node_modules/motion-utils/dist/es/noop.js');

class DragGesture extends Feature.Feature {
    constructor(node) {
        super(node);
        this.removeGroupControls = noop.noop;
        this.removeListeners = noop.noop;
        this.controls = new VisualElementDragControls.VisualElementDragControls(node);
    }
    mount() {
        // If we've been provided a DragControls for manual control over the drag gesture,
        // subscribe this component to it on mount.
        const { dragControls } = this.node.getProps();
        if (dragControls) {
            this.removeGroupControls = dragControls.subscribe(this.controls);
        }
        this.removeListeners = this.controls.addListeners() || noop.noop;
    }
    update() {
        const { dragControls } = this.node.getProps();
        const { dragControls: prevDragControls } = this.node.prevProps || {};
        if (dragControls !== prevDragControls) {
            this.removeGroupControls();
            if (dragControls) {
                this.removeGroupControls = dragControls.subscribe(this.controls);
            }
        }
    }
    unmount() {
        this.removeGroupControls();
        this.removeListeners();
        /**
         * In React 19, during list reorder reconciliation, components may
         * briefly unmount and remount while the drag is still active. If we're
         * actively dragging, we should NOT end the pan session - it will
         * continue tracking pointer events via its window-level listeners.
         *
         * The pan session will be properly cleaned up when:
         * 1. The drag ends naturally (pointerup/pointercancel)
         * 2. The component is truly removed from the DOM
         */
        if (!this.controls.isDragging) {
            this.controls.endPanSession();
        }
    }
}

exports.DragGesture = DragGesture;
