From 3979a07cdbbb1869bcc3161db8b7bf1a71053161 Mon Sep 17 00:00:00 2001 From: Gustaf Dalemar Date: Wed, 6 Dec 2017 12:56:34 +0100 Subject: [PATCH 1/3] fix: Make sure we don't show a components for a aborted path This would be a problem when loading slowly and clicking a new link while the other is still loading. --- src/RedialContext.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/RedialContext.js b/src/RedialContext.js index 196af12..eee35d5 100755 --- a/src/RedialContext.js +++ b/src/RedialContext.js @@ -185,7 +185,9 @@ export default class RedialContext extends Component { aborted, abort, loading: true, - prevRenderProps: this.state.aborted() ? this.state.prevRenderProps : this.props.renderProps, + prevRenderProps: this.state.loading || this.state.aborted() + ? this.state.prevRenderProps + : this.props.renderProps, }); if (this.props.parallel) { From df616ff9b1fbc0bb00909199ac566c8e8b8cba35 Mon Sep 17 00:00:00 2001 From: Gustaf Dalemar Date: Wed, 6 Dec 2017 13:20:26 +0100 Subject: [PATCH 2/3] fix: Trigger beforeTransition before afterTransition when in parallel --- src/RedialContext.js | 46 ++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/RedialContext.js b/src/RedialContext.js index eee35d5..8a7afa4 100755 --- a/src/RedialContext.js +++ b/src/RedialContext.js @@ -190,6 +190,29 @@ export default class RedialContext extends Component { : this.props.renderProps, }); + this.runBeforeTransition( + this.props.beforeTransition, + components, + renderProps, + force, + bail + ) + .catch((error) => { + let afterTransition = false; + if (error && error.afterTransition !== undefined) { + afterTransition = error.afterTransition; + error = error.error; // eslint-disable-line + } + + this.props.onError(error, { + reason: bail() || 'other', + // If not defined before it's a beforeTransition error + beforeTransition: !afterTransition, + router: this.props.renderProps.router, + abort: () => this.abort(true, abort), + }); + }); + if (this.props.parallel) { this.runAfterTransition( this.props.afterTransition, @@ -220,29 +243,6 @@ export default class RedialContext extends Component { } }); } - - this.runBeforeTransition( - this.props.beforeTransition, - components, - renderProps, - force, - bail - ) - .catch((error) => { - let afterTransition = false; - if (error && error.afterTransition !== undefined) { - afterTransition = error.afterTransition; - error = error.error; // eslint-disable-line - } - - this.props.onError(error, { - reason: bail() || 'other', - // If not defined before it's a beforeTransition error - beforeTransition: !afterTransition, - router: this.props.renderProps.router, - abort: () => this.abort(true, abort), - }); - }); } runAfterTransition(hooks, components, renderProps, force = false, bail) { From 0be97397d5905fa55275694ef92707a7ed55381e Mon Sep 17 00:00:00 2001 From: Gustaf Dalemar Date: Wed, 6 Dec 2017 15:35:31 +0100 Subject: [PATCH 3/3] fix: Solve a bug in onCompleted for afterTransition when using parallel It could call onCompleted for afterTransition twice without this fix. --- src/RedialContext.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/RedialContext.js b/src/RedialContext.js index 8a7afa4..ed08322 100755 --- a/src/RedialContext.js +++ b/src/RedialContext.js @@ -223,6 +223,7 @@ export default class RedialContext extends Component { ) .then(() => { if (this.completed.afterTransition) { + this.completed.afterTransition = false; this.props.onCompleted('afterTransition'); } })