diff --git a/packages/vanilla/src/index.ts b/packages/vanilla/src/index.ts index 0b7cb16..42f33c8 100644 --- a/packages/vanilla/src/index.ts +++ b/packages/vanilla/src/index.ts @@ -8,7 +8,7 @@ import {intersects} from './utils/intersects'; import {isSafariBrowser, isTouchDevice} from './utils/browser'; import {on, off, simplifyEvent} from './utils/events'; import {selectAll, SelectAllSelectors} from './utils/selectAll'; -import {shouldTrigger} from './utils/shouldTrigger'; +import {matchesTrigger} from './utils/matchesTrigger'; // Re-export types export * from './types'; @@ -168,7 +168,7 @@ export default class SelectionArea extends EventTarget { const {document, startAreas, boundaries, features, behaviour} = this._options; const targetBoundingClientRect = target.getBoundingClientRect(); - if (evt instanceof MouseEvent && !shouldTrigger(evt, behaviour.triggers)) { + if (evt instanceof MouseEvent && !matchesTrigger(evt, behaviour.triggers)) { return; } diff --git a/packages/vanilla/src/types.ts b/packages/vanilla/src/types.ts index d14397c..5ba40e6 100644 --- a/packages/vanilla/src/types.ts +++ b/packages/vanilla/src/types.ts @@ -1,5 +1,6 @@ import type SelectionArea from './index'; import type {Intersection} from './utils/intersects'; +import type {Trigger} from './utils/matchesTrigger'; export type DeepPartial = T extends unknown[] ? T : @@ -54,24 +55,6 @@ export interface Coordinates { export type TapMode = 'touch' | 'native'; export type OverlapMode = 'keep' | 'drop' | 'invert'; -// https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button#value -export type MouseButton = 0 // Main - | 1 // Auxiliary - | 2 // Secondary - | 3 // Fourth - | 4; // Fifth - -export type Modifier = 'ctrl' - | 'alt' - | 'shift'; - -export type Trigger = MouseButton | MouseButtonWithModifiers; - -export type MouseButtonWithModifiers = { - button: MouseButton, - modifiers: Modifier[] -}; - export interface Scrolling { speedDivider: number; manualSpeed: number; diff --git a/packages/vanilla/src/utils/shouldTrigger.ts b/packages/vanilla/src/utils/matchesTrigger.ts similarity index 60% rename from packages/vanilla/src/utils/shouldTrigger.ts rename to packages/vanilla/src/utils/matchesTrigger.ts index b9383f9..822bf2d 100644 --- a/packages/vanilla/src/utils/shouldTrigger.ts +++ b/packages/vanilla/src/utils/matchesTrigger.ts @@ -1,4 +1,21 @@ -import {Trigger} from '../types'; + +// https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button#value +export type MouseButton = 0 // Main + | 1 // Auxiliary + | 2 // Secondary + | 3 // Fourth + | 4; // Fifth + +export type Modifier = 'ctrl' + | 'alt' + | 'shift'; + +export type Trigger = MouseButton | MouseButtonWithModifiers; + +export type MouseButtonWithModifiers = { + button: MouseButton, + modifiers: Modifier[] +}; /** * Determines whether a MouseEvent should execute until completion depending on @@ -8,8 +25,9 @@ import {Trigger} from '../types'; * @param triggers A list of Triggers that signify that the event should execute until completion * @returns Whether the MouseEvent should execute until completion */ -export const shouldTrigger = (event: MouseEvent, triggers: Trigger[]): boolean => { - for (const trigger of triggers) { +export const matchesTrigger = (event: MouseEvent, triggers: Trigger[]): boolean => + triggers.some((trigger) => { + // The trigger requires only a specific button to be pressed if (typeof trigger === 'number') { return event.button === trigger; @@ -17,9 +35,11 @@ export const shouldTrigger = (event: MouseEvent, triggers: Trigger[]): boolean = // The trigger requires a specific button to be pressed AND some modifiers if (typeof trigger === 'object') { - const reqButtonIsPressed = trigger.button === event.button; + if (trigger.button !== event.button) { + return false; + } - const allReqModifiersArePressed = trigger.modifiers.every((modifier) => { + return trigger.modifiers.every((modifier) => { switch (modifier) { case 'alt': return event.altKey; @@ -29,11 +49,7 @@ export const shouldTrigger = (event: MouseEvent, triggers: Trigger[]): boolean = return event.shiftKey; } }); - - return reqButtonIsPressed && allReqModifiersArePressed; } - } - // By default, we do not process the event - return false; -}; \ No newline at end of file + return false; + });