Skip to content

Commit d55ce49

Browse files
author
Tanner Reits
committed
fix(segment-view): disable scrolling when triggered by button click
1 parent 9cfff41 commit d55ce49

File tree

7 files changed

+34
-19
lines changed

7 files changed

+34
-19
lines changed

core/src/components.d.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import { NavigationHookCallback } from "./components/route/route-interface";
3434
import { SearchbarChangeEventDetail, SearchbarInputEventDetail } from "./components/searchbar/searchbar-interface";
3535
import { SegmentChangeEventDetail, SegmentValue } from "./components/segment/segment-interface";
3636
import { SegmentButtonLayout } from "./components/segment-button/segment-button-interface";
37+
import { SegmentViewScrollEvent } from "./components/segment-view/segment-view-interface";
3738
import { SelectChangeEventDetail, SelectCompareFn, SelectInterface } from "./components/select/select-interface";
3839
import { SelectPopoverOption } from "./components/select-popover/select-popover-interface";
3940
import { TabBarChangedEventDetail, TabButtonClickEventDetail, TabButtonLayout } from "./components/tab-bar/tab-bar-interface";
@@ -69,6 +70,7 @@ export { NavigationHookCallback } from "./components/route/route-interface";
6970
export { SearchbarChangeEventDetail, SearchbarInputEventDetail } from "./components/searchbar/searchbar-interface";
7071
export { SegmentChangeEventDetail, SegmentValue } from "./components/segment/segment-interface";
7172
export { SegmentButtonLayout } from "./components/segment-button/segment-button-interface";
73+
export { SegmentViewScrollEvent } from "./components/segment-view/segment-view-interface";
7274
export { SelectChangeEventDetail, SelectCompareFn, SelectInterface } from "./components/select/select-interface";
7375
export { SelectPopoverOption } from "./components/select-popover/select-popover-interface";
7476
export { TabBarChangedEventDetail, TabButtonClickEventDetail, TabButtonLayout } from "./components/tab-bar/tab-bar-interface";
@@ -4442,10 +4444,7 @@ declare global {
44424444
new (): HTMLIonSegmentContentElement;
44434445
};
44444446
interface HTMLIonSegmentViewElementEventMap {
4445-
"ionSegmentViewScroll": {
4446-
scrollRatio: number;
4447-
isManualScroll: boolean;
4448-
};
4447+
"ionSegmentViewScroll": SegmentViewScrollEvent;
44494448
"ionSegmentViewScrollEnd": void;
44504449
"ionSegmentViewScrollStart": void;
44514450
}
@@ -7542,10 +7541,7 @@ declare namespace LocalJSX {
75427541
/**
75437542
* Emitted when the segment view is scrolled.
75447543
*/
7545-
"onIonSegmentViewScroll"?: (event: IonSegmentViewCustomEvent<{
7546-
scrollRatio: number;
7547-
isManualScroll: boolean;
7548-
}>) => void;
7544+
"onIonSegmentViewScroll"?: (event: IonSegmentViewCustomEvent<SegmentViewScrollEvent>) => void;
75497545
/**
75507546
* Emitted when the segment view scroll has ended.
75517547
*/
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export interface SegmentViewScrollEvent {
2+
scrollRatio: number;
3+
isManualScroll: boolean;
4+
}

core/src/components/segment-view/segment-view.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,7 @@
2525
touch-action: none;
2626
overflow-x: hidden;
2727
}
28+
29+
:host(.segment-view-scroll-disabled) {
30+
pointer-events: none;
31+
}

core/src/components/segment-view/segment-view.tsx

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import type { ComponentInterface, EventEmitter } from '@stencil/core';
2-
import { Component, Element, Event, Host, Listen, Method, Prop, h } from '@stencil/core';
2+
import { Component, Element, Event, Host, Listen, Method, Prop, State, h } from '@stencil/core';
3+
4+
import type { SegmentViewScrollEvent } from './segment-view-interface';
35

46
@Component({
57
tag: 'ion-segment-view',
@@ -12,7 +14,6 @@ import { Component, Element, Event, Host, Listen, Method, Prop, h } from '@stenc
1214
export class SegmentView implements ComponentInterface {
1315
private scrollEndTimeout: ReturnType<typeof setTimeout> | null = null;
1416
private isTouching = false;
15-
private isManualScroll = true;
1617

1718
@Element() el!: HTMLElement;
1819

@@ -21,13 +22,17 @@ export class SegmentView implements ComponentInterface {
2122
*/
2223
@Prop() disabled = false;
2324

25+
/**
26+
* If `true`, the segment view is scrollable.
27+
* If `false`, pointer events will be disabled. This is to prevent issues with
28+
* quickly scrolling after interacting with a segment button.
29+
*/
30+
@State() isManualScroll = true;
31+
2432
/**
2533
* Emitted when the segment view is scrolled.
2634
*/
27-
@Event() ionSegmentViewScroll!: EventEmitter<{
28-
scrollRatio: number;
29-
isManualScroll: boolean;
30-
}>;
35+
@Event() ionSegmentViewScroll!: EventEmitter<SegmentViewScrollEvent>;
3136

3237
/**
3338
* Emitted when the segment view scroll has ended.
@@ -83,7 +88,7 @@ export class SegmentView implements ComponentInterface {
8388
}
8489
this.scrollEndTimeout = setTimeout(() => {
8590
this.checkForScrollEnd();
86-
}, 150);
91+
}, 50);
8792
}
8893

8994
/**
@@ -129,12 +134,13 @@ export class SegmentView implements ComponentInterface {
129134
}
130135

131136
render() {
132-
const { disabled } = this;
137+
const { disabled, isManualScroll } = this;
133138

134139
return (
135140
<Host
136141
class={{
137142
'segment-view-disabled': disabled,
143+
'segment-view-scroll-disabled': !isManualScroll,
138144
}}
139145
>
140146
<slot></slot>

core/src/components/segment/segment.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { createColorClasses, hostContext } from '@utils/theme';
77

88
import { getIonMode } from '../../global/ionic-global';
99
import type { Color, StyleEventDetail } from '../../interface';
10+
import type { SegmentViewScrollEvent } from '../segment-view/segment-view-interface';
1011

1112
import type { SegmentChangeEventDetail, SegmentValue } from './segment-interface';
1213

@@ -366,7 +367,7 @@ export class Segment implements ComponentInterface {
366367
}
367368

368369
@Listen('ionSegmentViewScroll', { target: 'body' })
369-
handleSegmentViewScroll(ev: CustomEvent) {
370+
handleSegmentViewScroll(ev: CustomEvent<SegmentViewScrollEvent>) {
370371
const { scrollRatio, isManualScroll } = ev.detail;
371372

372373
if (!isManualScroll) {

packages/angular/src/directives/proxies.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2047,11 +2047,13 @@ export class IonSegmentView {
20472047
}
20482048

20492049

2050+
import type { SegmentViewScrollEvent as IIonSegmentViewSegmentViewScrollEvent } from '@ionic/core';
2051+
20502052
export declare interface IonSegmentView extends Components.IonSegmentView {
20512053
/**
20522054
* Emitted when the segment view is scrolled.
20532055
*/
2054-
ionSegmentViewScroll: EventEmitter<CustomEvent<{ scrollRatio: number; isManualScroll: boolean; }>>;
2056+
ionSegmentViewScroll: EventEmitter<CustomEvent<IIonSegmentViewSegmentViewScrollEvent>>;
20552057
/**
20562058
* Emitted when the segment view scroll has ended.
20572059
*/

packages/angular/standalone/src/directives/proxies.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1886,11 +1886,13 @@ export class IonSegmentView {
18861886
}
18871887

18881888

1889+
import type { SegmentViewScrollEvent as IIonSegmentViewSegmentViewScrollEvent } from '@ionic/core/components';
1890+
18891891
export declare interface IonSegmentView extends Components.IonSegmentView {
18901892
/**
18911893
* Emitted when the segment view is scrolled.
18921894
*/
1893-
ionSegmentViewScroll: EventEmitter<CustomEvent<{ scrollRatio: number; isManualScroll: boolean; }>>;
1895+
ionSegmentViewScroll: EventEmitter<CustomEvent<IIonSegmentViewSegmentViewScrollEvent>>;
18941896
/**
18951897
* Emitted when the segment view scroll has ended.
18961898
*/

0 commit comments

Comments
 (0)