packages/@interactjs/pointer-events/PointerEvent.ts

import { BaseEvent } from '@interactjs/core/BaseEvent'
import type Interaction from '@interactjs/core/Interaction'
import type { PointerEventType, PointerType, Point } from '@interactjs/core/types'
import * as pointerUtils from '@interactjs/utils/pointerUtils'

export default class PointerEvent<T extends string = any> extends BaseEvent<never> {
  declare type: T
  declare originalEvent: PointerEventType
  declare pointerId: number
  declare pointerType: string
  declare double: boolean
  declare pageX: number
  declare pageY: number
  declare clientX: number
  declare clientY: number
  declare dt: number
  declare eventable: any;
  [key: string]: any

  /** */
  constructor (
    type: T,
    pointer: PointerType | PointerEvent<any>,
    event: PointerEventType,
    eventTarget: Node,
    interaction: Interaction<never>,
    timeStamp: number,
  ) {
    super(interaction)
    pointerUtils.pointerExtend(this, event)

    if (event !== pointer) {
      pointerUtils.pointerExtend(this, pointer)
    }

    this.timeStamp = timeStamp
    this.originalEvent = event
    this.type = type
    this.pointerId = pointerUtils.getPointerId(pointer)
    this.pointerType = pointerUtils.getPointerType(pointer)
    this.target = eventTarget
    this.currentTarget = null

    if (type === 'tap') {
      const pointerIndex = interaction.getPointerIndex(pointer)
      this.dt = this.timeStamp - interaction.pointers[pointerIndex].downTime

      const interval = this.timeStamp - interaction.tapTime

      this.double =
        !!interaction.prevTap &&
        interaction.prevTap.type !== 'doubletap' &&
        interaction.prevTap.target === this.target &&
        interval < 500
    } else if (type === 'doubletap') {
      this.dt = (pointer as PointerEvent<'tap'>).timeStamp - interaction.tapTime
      this.double = true
    }
  }

  _subtractOrigin ({ x: originX, y: originY }: Point) {
    this.pageX -= originX
    this.pageY -= originY
    this.clientX -= originX
    this.clientY -= originY

    return this
  }

  _addOrigin ({ x: originX, y: originY }: Point) {
    this.pageX += originX
    this.pageY += originY
    this.clientX += originX
    this.clientY += originY

    return this
  }

  /**
   * Prevent the default behaviour of the original Event
   */
  preventDefault () {
    this.originalEvent.preventDefault()
  }
}

export { PointerEvent }