Skip to content

Commit

Permalink
chore(esl-event-listener): code refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
fshovchko committed Jan 26, 2024
1 parent 908f4b4 commit 66ebfe0
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 20 deletions.
10 changes: 5 additions & 5 deletions src/modules/esl-event-listener/core/targets/swipe.target.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ export {ESLSwipeGestureEvent};
* Describes settings object that could be passed to {@link ESLSwipeGestureTarget.for} as optional parameter
*/
export interface ESLSwipeGestureSetting {
/** Flag to indicate if long event should be dispatched if scroll of content was detected (true by default) */
processOverflow?: boolean;
/** Flag to indicate if the swipe event should not be dispatched if a scroll of content was detected (true by default) */
skipOnScroll?: boolean;
/** The minimum distance to accept swipe (supports `px`, `vw` and `vh` units) */
threshold?: CSSSize;
/** The maximum duration between `ponterdown` and `pointerup` events */
Expand All @@ -32,7 +32,7 @@ export interface ESLSwipeGestureSetting {
*/
export class ESLSwipeGestureTarget extends SyntheticEventTarget {
protected static defaultConfig: Required<ESLSwipeGestureSetting> = {
processOverflow: true,
skipOnScroll: true,
threshold: '20px',
timeout: 500
};
Expand Down Expand Up @@ -76,7 +76,7 @@ export class ESLSwipeGestureTarget extends SyntheticEventTarget {
* @param startEvent - initial pointer event
*/
protected handleStart(startEvent: PointerEvent): void {
this.startEventOffset = this.config.processOverflow ? [] : getParentScrollOffsets(startEvent.target as Element, this.target);
this.startEventOffset = this.config.skipOnScroll ? getParentScrollOffsets(startEvent.target as Element, this.target) : [];
this.startEvent = startEvent;
ESLEventListener.subscribe(this, this.handleEnd, {
event: this.endEventName,
Expand Down Expand Up @@ -126,7 +126,7 @@ export class ESLSwipeGestureTarget extends SyntheticEventTarget {

// return if swipe took too long or distance is too short
if (!this.isGestureAcceptable(eventDetails)) return;
if (!this.config.processOverflow) {
if (this.config.skipOnScroll) {
const offsets = getParentScrollOffsets(endEvent.target as Element, this.target);
if (isOffsetChanged(this.startEventOffset.concat(offsets))) return;
}
Expand Down
8 changes: 4 additions & 4 deletions src/modules/esl-event-listener/core/targets/wheel.target.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ export {ESLWheelEvent};
* Describes settings object that could be passed to {@link ESLWheelTarget.for} as optional parameter
*/
export interface ESLWheelTargetSetting {
/** Flag to indicate if long event should be dispatched if scroll of content was detected (false by default) */
processOverflow?: boolean;
/** Flag to indicate if the `longwheel` event shouldn't be dispatched if scroll of content was detected (false by default) */
skipOnScroll?: boolean;
/** The minimum distance to accept as a long scroll */
distance?: number;
/** The maximum duration of the wheel events to consider it inertial */
Expand All @@ -31,7 +31,7 @@ export interface ESLWheelTargetSetting {
*/
export class ESLWheelTarget extends SyntheticEventTarget {
protected static defaultConfig: Required<ESLWheelTargetSetting> = {
processOverflow: true,
skipOnScroll: true,
distance: 400,
timeout: 100
};
Expand Down Expand Up @@ -70,7 +70,7 @@ export class ESLWheelTarget extends SyntheticEventTarget {
/** Handles wheel events */
@bind
protected _onWheel(event: WheelEvent): void {
if (!this.config.processOverflow) this.scrollData = this.scrollData.concat(getParentScrollOffsets(event.target as Element, this.target));
if (this.config.skipOnScroll) this.scrollData = this.scrollData.concat(getParentScrollOffsets(event.target as Element, this.target));
this.aggregateWheel(event);
}

Expand Down
22 changes: 11 additions & 11 deletions src/modules/esl-utils/dom/scroll/parent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,36 +3,36 @@ import {isElement, getNodeName, getParentNode} from '../api';
/**
* Get the list of all scroll parents, up the list of ancestors until we get to the top window object.
* @param element - element for which you want to get the list of all scroll parents
* @param topElement - element which element considered a final scrollable parent target (optional, defaults to element.ownerDocument?.body)
* @param root - element which element considered a final scrollable parent target (optional, defaults to element.ownerDocument?.body)
*/
export function getListScrollParents(element: Element, topElement?: Element): Element[] {
const targetParent = topElement || element.ownerDocument?.body;
const scrollParent = getScrollParent(element, targetParent);
export function getListScrollParents(element: Element, root?: Element): Element[] {
const limitNode = root || element.ownerDocument?.body;
const scrollParent = getScrollParent(element, limitNode);
if (!scrollParent) return [];
const isScrollableTarget = scrollParent === targetParent;
const isScrollableTarget = scrollParent === limitNode;
if (isScrollableTarget) return isScrollable(scrollParent) ? [scrollParent] : [];
return [scrollParent].concat(getListScrollParents(getParentNode(scrollParent) as Element, targetParent));
return [scrollParent].concat(getListScrollParents(getParentNode(scrollParent) as Element, limitNode));
}

/**
* Get the scroll parent of the specified element in the DOM tree.
* @param node - element for which to get the scroll parent
* @param topElement - element which element considered a final scrollable parent
* @param root - element which element considered a final scrollable parent
*/
export function getScrollParent(node: Element, topElement: Element): Element | undefined;
export function getScrollParent(node: Element, root: Element): Element | undefined;
/**
* Get the scroll parent of the specified element in the DOM tree.
* @param node - element for which to get the scroll parent
*/
export function getScrollParent(node: Element): Element;
export function getScrollParent(node: Element, topElement?: Element): Element | undefined {
export function getScrollParent(node: Element, root?: Element): Element | undefined {
if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {
return node.ownerDocument?.body as Element;
}

if (isElement(node) && isScrollable(node)) return node;
if (node === topElement) return;
return getScrollParent(getParentNode(node) as Element, topElement!);
if (node === root) return;
return getScrollParent(getParentNode(node) as Element, root!);
}

/**
Expand Down

0 comments on commit 66ebfe0

Please sign in to comment.