diff --git a/packages/core/onLongPress/index.test.ts b/packages/core/onLongPress/index.test.ts index 13a5bda0469..0e6486e7ffc 100644 --- a/packages/core/onLongPress/index.test.ts +++ b/packages/core/onLongPress/index.test.ts @@ -24,9 +24,9 @@ describe('onLongPress', () => { expect(onLongPressCallback).toHaveBeenCalledTimes(1) } - async function triggerCallbackWithDelay(isRef: boolean) { + async function triggerCallbackWithDelay(isRef: boolean, delayFunc?: (ev: PointerEvent) => number) { const onLongPressCallback = vi.fn() - onLongPress(isRef ? element : element.value, onLongPressCallback, { delay: 1000 }) + onLongPress(isRef ? element : element.value, onLongPressCallback, { delay: delayFunc ?? 1000 }) // first pointer down element.value.dispatchEvent(pointerdownEvent) @@ -199,6 +199,7 @@ describe('onLongPress', () => { it('should remove event listeners after being stopped', () => stopEventListeners(isRef)) it('should trigger longpress if pointer is moved', () => triggerCallbackWithThreshold(isRef)) it('should trigger onMouseUp when pointer is released', () => triggerOnMouseUp(isRef)) + it('should trigger longpress after options.delay ms when options.delay is a function', () => triggerCallbackWithDelay(isRef, () => 1000)) }) } diff --git a/packages/core/onLongPress/index.ts b/packages/core/onLongPress/index.ts index d7e2c4c1b5f..4c8f319aa09 100644 --- a/packages/core/onLongPress/index.ts +++ b/packages/core/onLongPress/index.ts @@ -14,7 +14,7 @@ export interface OnLongPressOptions { * * @default 500 */ - delay?: number + delay?: number | ((ev: PointerEvent) => number) modifiers?: OnLongPressModifiers @@ -64,6 +64,14 @@ export function onLongPress( hasLongPressed = false } + function getDelay(ev: PointerEvent): number { + const delay = options?.delay + if (typeof delay === 'function') { + return delay(ev) + } + return delay ?? DEFAULT_DELAY + } + function onRelease(ev: PointerEvent) { const [_startTimestamp, _posStart, _hasLongPressed] = [startTimestamp, posStart, hasLongPressed] clear() @@ -108,7 +116,7 @@ export function onLongPress( hasLongPressed = true handler(ev) }, - options?.delay ?? DEFAULT_DELAY, + getDelay(ev), ) }