HEX
Server: nginx/1.24.0
System: Linux nowruzgan 6.8.0-57-generic #59-Ubuntu SMP PREEMPT_DYNAMIC Sat Mar 15 17:40:59 UTC 2025 x86_64
User: babak (1000)
PHP: 8.3.6
Disabled: NONE
Upload Files
File: /var/dev/nowruzgan/travelogue/src/app/directives/pan-gesture.ts
import { Directive, ElementRef, HostListener, Output, EventEmitter } from '@angular/core';

@Directive({
  selector: '[appPanGesture]'
})
export class PanGesture {

  private isPanning = false;
  private startX = 0;
  private startY = 0;

  @Output() panStart = new EventEmitter<{ x: number, y: number }>();
  @Output() panMove = new EventEmitter<{ deltaX: number, deltaY: number }>();
  @Output() panEnd = new EventEmitter<void>();

  constructor(private el: ElementRef) {}

  @HostListener('pointerdown', ['$event'])
  onPointerDown(event: PointerEvent) {
    event.preventDefault();
    this.isPanning = true;
    this.startX = event.clientX;
    this.startY = event.clientY;
    this.panStart.emit({ x: this.startX, y: this.startY });
    // this.el.nativeElement.setPointerCapture(event.pointerId);
  }

  @HostListener('pointermove', ['$event'])
  onPointerMove(event: PointerEvent) {
    if (!this.isPanning) return;
    event.preventDefault();
    const deltaX = event.clientX - this.startX;
    const deltaY = event.clientY - this.startY;
    this.panMove.emit({ deltaX, deltaY });
  }

  @HostListener('pointerup', ['$event'])
  onPointerUp(event: PointerEvent) {
    if (!this.isPanning) return;
    event.preventDefault();
    this.isPanning = false;
    this.panEnd.emit();
  }

  // Handle pointer cancellation (e.g., if touch is interrupted)
  @HostListener('pointercancel', ['$event'])
  onPointerCancel(event: PointerEvent) {
    this.isPanning = false;
    this.panEnd.emit();
  }
}