diff options
| author | Oskar Nyberg <oskar@mullvad.net> | 2022-11-25 17:34:39 +0100 |
|---|---|---|
| committer | Oskar Nyberg <oskar@mullvad.net> | 2022-11-28 17:15:17 +0100 |
| commit | a33c4337ebe200739e737b465f55fd35068b59ae (patch) | |
| tree | 0c8e104bee3202302e65c3080bf13997c3af4c31 /gui/src/renderer | |
| parent | f81ac3a4a0662050b4dd195ea6784cc99a13e687 (diff) | |
| download | mullvadvpn-a33c4337ebe200739e737b465f55fd35068b59ae.tar.xz mullvadvpn-a33c4337ebe200739e737b465f55fd35068b59ae.zip | |
Call transition finished callback once only
Diffstat (limited to 'gui/src/renderer')
| -rw-r--r-- | gui/src/renderer/components/TransitionContainer.tsx | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/gui/src/renderer/components/TransitionContainer.tsx b/gui/src/renderer/components/TransitionContainer.tsx index 5fbfe61a55..1587cce024 100644 --- a/gui/src/renderer/components/TransitionContainer.tsx +++ b/gui/src/renderer/components/TransitionContainer.tsx @@ -91,6 +91,8 @@ export default class TransitionContainer extends React.Component<IProps, IState> private currentContentRef = React.createRef<HTMLDivElement>(); private nextContentRef = React.createRef<HTMLDivElement>(); + // The item that should trigger the cycle to finish in onTransitionEnd + private transitioningItemRef?: React.RefObject<HTMLDivElement>; public static getDerivedStateFromProps(props: IProps, state: IState) { const candidate = props.children; @@ -187,12 +189,11 @@ export default class TransitionContainer extends React.Component<IProps, IState> } private onTransitionEnd = (event: React.TransitionEvent<HTMLDivElement>) => { - if ( - this.isCycling && - (event.target === this.currentContentRef.current || - event.target === this.nextContentRef.current) - ) { - this.continueCycling(); + if (this.isCycling && event.target === this.transitioningItemRef?.current) { + this.transitioningItemRef = undefined; + this.makeNextItemCurrent(() => { + this.onFinishCycle(); + }); } }; @@ -203,15 +204,11 @@ export default class TransitionContainer extends React.Component<IProps, IState> } } - private finishCycling() { - this.isCycling = false; + private onFinishCycle() { this.props.onTransitionEnd(); + this.cycleUnguarded(); } - private continueCycling = () => { - this.makeNextItemCurrent(this.cycleUnguarded); - }; - private cycleUnguarded = () => { const itemQueue = this.state.itemQueue; @@ -237,11 +234,11 @@ export default class TransitionContainer extends React.Component<IProps, IState> break; default: - this.replace(this.cycleUnguarded); + this.replace(() => this.onFinishCycle); break; } } else { - this.finishCycling(); + this.isCycling = false; } }; @@ -270,6 +267,7 @@ export default class TransitionContainer extends React.Component<IProps, IState> } private slideUp(duration: number) { + this.transitioningItemRef = this.nextContentRef; this.setState((state) => ({ nextItem: state.itemQueue[0], itemQueue: state.itemQueue.slice(1), @@ -281,6 +279,7 @@ export default class TransitionContainer extends React.Component<IProps, IState> } private slideDown(duration: number) { + this.transitioningItemRef = this.currentContentRef; this.setState((state) => ({ nextItem: state.itemQueue[0], itemQueue: state.itemQueue.slice(1), @@ -292,6 +291,7 @@ export default class TransitionContainer extends React.Component<IProps, IState> } private push(duration: number) { + this.transitioningItemRef = this.nextContentRef; this.setState((state) => ({ nextItem: state.itemQueue[0], itemQueue: state.itemQueue.slice(1), @@ -303,6 +303,7 @@ export default class TransitionContainer extends React.Component<IProps, IState> } private pop(duration: number) { + this.transitioningItemRef = this.currentContentRef; this.setState((state) => ({ nextItem: state.itemQueue[0], itemQueue: state.itemQueue.slice(1), |
