mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-08-19 03:32:21 +08:00
fix(refresher): refresher completes even after switching to a new tab (#21236)
This commit is contained in:
@ -149,7 +149,7 @@ export class Refresher implements ComponentInterface {
|
|||||||
if (getIonMode(this) === 'ios') {
|
if (getIonMode(this) === 'ios') {
|
||||||
await translateElement(el, undefined);
|
await translateElement(el, undefined);
|
||||||
} else {
|
} else {
|
||||||
await transitionEndAsync(this.el.querySelector('.refresher-refreshing-icon'));
|
await transitionEndAsync(this.el.querySelector('.refresher-refreshing-icon'), 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.didRefresh = false;
|
this.didRefresh = false;
|
||||||
|
@ -148,7 +148,7 @@ export const handleScrollWhileRefreshing = (
|
|||||||
export const translateElement = (el?: HTMLElement, value?: string) => {
|
export const translateElement = (el?: HTMLElement, value?: string) => {
|
||||||
if (!el) { return Promise.resolve(); }
|
if (!el) { return Promise.resolve(); }
|
||||||
|
|
||||||
const trans = transitionEndAsync(el);
|
const trans = transitionEndAsync(el, 200);
|
||||||
|
|
||||||
writeTask(() => {
|
writeTask(() => {
|
||||||
el.style.setProperty('transition', '0.2s all ease-out');
|
el.style.setProperty('transition', '0.2s all ease-out');
|
||||||
@ -181,15 +181,17 @@ export const shouldUseNativeRefresher = (referenceEl: HTMLIonRefresherElement, m
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const transitionEndAsync = (el: HTMLElement | null) => {
|
export const transitionEndAsync = (el: HTMLElement | null, expectedDuration = 0) => {
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
transitionEnd(el, resolve);
|
transitionEnd(el, expectedDuration, resolve);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const transitionEnd = (el: HTMLElement | null, callback: (ev?: TransitionEvent) => void) => {
|
const transitionEnd = (el: HTMLElement | null, expectedDuration = 0, callback: (ev?: TransitionEvent) => void) => {
|
||||||
let unRegTrans: (() => void) | undefined;
|
let unRegTrans: (() => void) | undefined;
|
||||||
|
let animationTimeout: any;
|
||||||
const opts: any = { passive: true };
|
const opts: any = { passive: true };
|
||||||
|
const ANIMATION_FALLBACK_TIMEOUT = 500;
|
||||||
|
|
||||||
const unregister = () => {
|
const unregister = () => {
|
||||||
if (unRegTrans) {
|
if (unRegTrans) {
|
||||||
@ -197,8 +199,8 @@ const transitionEnd = (el: HTMLElement | null, callback: (ev?: TransitionEvent)
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const onTransitionEnd = (ev: Event) => {
|
const onTransitionEnd = (ev?: Event) => {
|
||||||
if (el === ev.target) {
|
if (ev === undefined || el === ev.target) {
|
||||||
unregister();
|
unregister();
|
||||||
callback(ev as TransitionEvent);
|
callback(ev as TransitionEvent);
|
||||||
}
|
}
|
||||||
@ -207,8 +209,13 @@ const transitionEnd = (el: HTMLElement | null, callback: (ev?: TransitionEvent)
|
|||||||
if (el) {
|
if (el) {
|
||||||
el.addEventListener('webkitTransitionEnd', onTransitionEnd, opts);
|
el.addEventListener('webkitTransitionEnd', onTransitionEnd, opts);
|
||||||
el.addEventListener('transitionend', onTransitionEnd, opts);
|
el.addEventListener('transitionend', onTransitionEnd, opts);
|
||||||
|
animationTimeout = setTimeout(onTransitionEnd, expectedDuration + ANIMATION_FALLBACK_TIMEOUT);
|
||||||
|
|
||||||
unRegTrans = () => {
|
unRegTrans = () => {
|
||||||
|
if (animationTimeout) {
|
||||||
|
clearTimeout(animationTimeout);
|
||||||
|
animationTimeout = undefined;
|
||||||
|
}
|
||||||
el.removeEventListener('webkitTransitionEnd', onTransitionEnd, opts);
|
el.removeEventListener('webkitTransitionEnd', onTransitionEnd, opts);
|
||||||
el.removeEventListener('transitionend', onTransitionEnd, opts);
|
el.removeEventListener('transitionend', onTransitionEnd, opts);
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user