Skip to content

Commit

Permalink
fix(all): gesture controller can block scrolling
Browse files Browse the repository at this point in the history
fixes #15725
  • Loading branch information
manucorporat committed Sep 25, 2018
1 parent 29d00da commit 633360f
Show file tree
Hide file tree
Showing 7 changed files with 35 additions and 26 deletions.
25 changes: 8 additions & 17 deletions core/src/components/backdrop/backdrop.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Component, ComponentInterface, Event, EventEmitter, Listen, Prop } from '@stencil/core';

import { GESTURE_CONTROLLER } from '../../utils/gesture/gesture-controller';
import { now } from '../../utils/helpers';

@Component({
Expand All @@ -13,6 +14,9 @@ import { now } from '../../utils/helpers';
export class Backdrop implements ComponentInterface {

private lastClick = -10000;
private blocker = GESTURE_CONTROLLER.createBlocker({
disableScroll: true
});

@Prop({ context: 'document' }) doc!: Document;

Expand All @@ -37,11 +41,13 @@ export class Backdrop implements ComponentInterface {
@Event() ionBackdropTap!: EventEmitter<void>;

componentDidLoad() {
registerBackdrop(this.doc, this);
if (this.stopPropagation) {
this.blocker.block();
}
}

componentDidUnload() {
unregisterBackdrop(this.doc, this);
this.blocker.destroy();
}

@Listen('touchstart', { passive: false, capture: true })
Expand Down Expand Up @@ -78,18 +84,3 @@ export class Backdrop implements ComponentInterface {
};
}
}

const BACKDROP_NO_SCROLL = 'backdrop-no-scroll';
const activeBackdrops = new Set();

function registerBackdrop(doc: Document, backdrop: any) {
activeBackdrops.add(backdrop);
doc.body.classList.add(BACKDROP_NO_SCROLL);
}

function unregisterBackdrop(doc: Document, backdrop: any) {
activeBackdrops.delete(backdrop);
if (activeBackdrops.size === 0) {
doc.body.classList.remove(BACKDROP_NO_SCROLL);
}
}
5 changes: 3 additions & 2 deletions core/src/components/content/content.scss
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
--keyboard-offset: 0px;
--offset-top: 0px;
--offset-bottom: 0px;
--overflow: auto;

display: block;
position: relative;
Expand Down Expand Up @@ -75,11 +76,11 @@
}

.scroll-y {
overflow-y: auto;
overflow-y: var(--overflow);
}

.scroll-x {
overflow-x: auto;
overflow-x: var(--overflow);
}

.overscroll::before,
Expand Down
7 changes: 7 additions & 0 deletions core/src/components/menu/menu.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Component, ComponentInterface, Element, Event, EventEmitter, EventListenerEnable, Listen, Method, Prop, QueueApi, State, Watch } from '@stencil/core';

import { Animation, Config, Gesture, GestureDetail, MenuChangeEventDetail, MenuControllerI, MenuI, Mode, Side } from '../../interface';
import { GESTURE_CONTROLLER } from '../../utils/gesture/gesture-controller';
import { assert, isEndSide as isEnd } from '../../utils/helpers';

@Component({
Expand All @@ -16,6 +17,7 @@ export class Menu implements ComponentInterface, MenuI {
private animation?: Animation;
private lastOnEnd = 0;
private gesture?: Gesture;
private blocker = GESTURE_CONTROLLER.createBlocker({ disableScroll: true });

mode!: Mode;

Expand Down Expand Up @@ -195,6 +197,7 @@ export class Menu implements ComponentInterface, MenuI {
}

componentDidUnload() {
this.blocker.destroy();
this.menuCtrl!._unregister(this);
if (this.animation) {
this.animation.destroy();
Expand Down Expand Up @@ -403,6 +406,7 @@ export class Menu implements ComponentInterface, MenuI {
if (this.backdropEl) {
this.backdropEl.classList.add(SHOW_BACKDROP);
}
this.blocker.block();
this.isAnimating = true;
}

Expand All @@ -415,6 +419,9 @@ export class Menu implements ComponentInterface, MenuI {
// emit opened/closed events
this._isOpen = isOpen;
this.isAnimating = false;
if (!this._isOpen) {
this.blocker.unblock();
}

// add/remove backdrop click listeners
this.enableListener(this, 'body:click', isOpen);
Expand Down
1 change: 0 additions & 1 deletion core/src/components/reorder-group/reorder-group.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ export class ReorderGroup implements ComponentInterface {
queue: this.queue,
gestureName: 'reorder',
gesturePriority: 90,
disableScroll: true,
threshold: 0,
direction: 'y',
passive: false,
Expand Down
4 changes: 4 additions & 0 deletions core/src/css/core.scss
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ body.backdrop-no-scroll {
overflow: hidden;
}

body.backdrop-no-scroll .ion-page > ion-content {
--overflow: hidden;
}


// Ionic Colors
// --------------------------------------------------
Expand Down
15 changes: 11 additions & 4 deletions core/src/utils/gesture/gesture-controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ export class GestureController {
*/
createBlocker(opts: BlockerConfig = {}): BlockerDelegate {
return new BlockerDelegate(
this.newID(),
this,
this.newID(),
opts.disable,
!!opts.disableScroll
);
Expand Down Expand Up @@ -95,10 +95,16 @@ export class GestureController {

disableScroll(id: number) {
this.disabledScroll.add(id);
if (this.disabledScroll.size === 1) {
this.doc.body.classList.add(BACKDROP_NO_SCROLL);
}
}

enableScroll(id: number) {
this.disabledScroll.delete(id);
if (this.disabledScroll.size === 0) {
this.doc.body.classList.remove(BACKDROP_NO_SCROLL);
}
}

canStart(gestureName: string): boolean {
Expand Down Expand Up @@ -140,7 +146,7 @@ export class GestureDelegate {
private ctrl?: GestureController;

constructor(
ctrl: any,
ctrl: GestureController,
private id: number,
private name: string,
private priority: number,
Expand Down Expand Up @@ -199,8 +205,8 @@ export class BlockerDelegate {
private ctrl?: GestureController;

constructor(
ctrl: GestureController,
private id: number,
ctrl: any,
private disable: string[] | undefined,
private disableScroll: boolean
) {
Expand Down Expand Up @@ -253,4 +259,5 @@ export interface BlockerConfig {
disableScroll?: boolean;
}

export const gestureController = new GestureController(document);
const BACKDROP_NO_SCROLL = 'backdrop-no-scroll';
export const GESTURE_CONTROLLER = new GestureController(document);
4 changes: 2 additions & 2 deletions core/src/utils/gesture/gesture.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { QueueApi } from '@stencil/core';

import { gestureController } from './gesture-controller';
import { GESTURE_CONTROLLER } from './gesture-controller';
import { createPointerEvents } from './pointer-events';
import { createPanRecognizer } from './recognizers';

Expand Down Expand Up @@ -52,7 +52,7 @@ export function createGesture(config: GestureConfig): Gesture {
);

const pan = createPanRecognizer(finalConfig.direction, finalConfig.threshold, finalConfig.maxAngle);
const gesture = gestureController.createGesture({
const gesture = GESTURE_CONTROLLER.createGesture({
name: config.gestureName,
priority: config.gesturePriority,
disableScroll: config.disableScroll
Expand Down

0 comments on commit 633360f

Please sign in to comment.