Skip to content

Commit 016e0d6

Browse files
fix(header,footer): guard fade and condense setup against concurrent teardown
1 parent 62dd0f5 commit 016e0d6

2 files changed

Lines changed: 34 additions & 3 deletions

File tree

core/src/components/footer/footer.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export class Footer implements ComponentInterface {
3434
private scrollHideCtrlPromise: Promise<ScrollHideController> | null = null;
3535
private hasWarnedCollapse = false;
3636
private activeEffect?: string;
37+
private fadeSetupToken: object | null = null;
3738

3839
@State() private keyboardVisible = false;
3940

@@ -187,7 +188,16 @@ export class Footer implements ComponentInterface {
187188
};
188189

189190
private setupFadeFooter = async (contentEl: HTMLElement) => {
190-
const scrollEl = (this.scrollEl = await getScrollElement(contentEl));
191+
const token = {};
192+
this.fadeSetupToken = token;
193+
194+
const scrollEl = await getScrollElement(contentEl);
195+
196+
if (this.fadeSetupToken !== token) {
197+
return;
198+
}
199+
200+
this.scrollEl = scrollEl;
191201

192202
/**
193203
* Handle fading of toolbars on scroll
@@ -202,6 +212,7 @@ export class Footer implements ComponentInterface {
202212

203213
private destroyCollapsibleFooter() {
204214
this.activeEffect = undefined;
215+
this.fadeSetupToken = null;
205216
this.scrollHideCtrlPromise = null;
206217

207218
if (this.scrollHideCtrl) {

core/src/components/header/header.tsx

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export class Header implements ComponentInterface {
4545
private scrollHideCtrlPromise: Promise<ScrollHideController> | null = null;
4646
private hasWarnedCollapse = false;
4747
private activeEffect?: string;
48+
private fadeCondenseSetupToken: object | null = null;
4849

4950
@Element() el!: HTMLElement;
5051

@@ -186,7 +187,16 @@ export class Header implements ComponentInterface {
186187
};
187188

188189
private setupFadeHeader = async (contentEl: HTMLElement, condenseHeader: HTMLElement | null) => {
189-
const scrollEl = (this.scrollEl = await getScrollElement(contentEl));
190+
const token = {};
191+
this.fadeCondenseSetupToken = token;
192+
193+
const scrollEl = await getScrollElement(contentEl);
194+
195+
if (this.fadeCondenseSetupToken !== token) {
196+
return;
197+
}
198+
199+
this.scrollEl = scrollEl;
190200

191201
/**
192202
* Handle fading of toolbars on scroll
@@ -201,6 +211,7 @@ export class Header implements ComponentInterface {
201211

202212
private destroyCollapsibleHeader() {
203213
this.activeEffect = undefined;
214+
this.fadeCondenseSetupToken = null;
204215
this.scrollHideCtrlPromise = null;
205216

206217
if (this.scrollHideCtrl) {
@@ -233,7 +244,16 @@ export class Header implements ComponentInterface {
233244
return false;
234245
}
235246

236-
this.scrollEl = await getScrollElement(contentEl);
247+
const token = {};
248+
this.fadeCondenseSetupToken = token;
249+
250+
const scrollEl = await getScrollElement(contentEl);
251+
252+
if (this.fadeCondenseSetupToken !== token) {
253+
return false;
254+
}
255+
256+
this.scrollEl = scrollEl;
237257

238258
/**
239259
* The condense effect requires an ion-title with size="large"

0 commit comments

Comments
 (0)