1
1
2
2
import { IPromise } from "angular" ;
3
- import { IInjectable , extend , tail , isPromise , isArray , assertPredicate , unnestR } from "../common/common" ;
3
+ import { IInjectable , extend , tail , isPromise , isArray , assertPredicate , unnestR , flatten , identity } from "../common/common" ;
4
4
import { runtime } from "../common/angular1" ;
5
5
6
6
import { ITransitionOptions , ITransitionHookOptions , IHookRegistry , ITreeChanges , IEventHook , ITransitionService } from "./interface" ;
@@ -55,14 +55,25 @@ export default class HookBuilder {
55
55
// onBefore/onStart/onFinish/onSuccess/onError returns an array of hooks
56
56
// onExit/onRetain/onEnter returns an array of arrays of hooks
57
57
58
- getOnBeforeHooks = ( ) => this . _getTransitionHooks ( "onBefore" , this . treeChanges . from ) ;
59
- getOnStartHooks = ( ) => this . _getTransitionHooks ( "onStart" , this . treeChanges . to ) ;
60
- getOnExitHooks = ( ) => this . _getNodeHooks ( "onExit" , this . treeChanges . exiting . reverse ( ) , ( node ) => this . _toFrom ( { from : node . state } ) ) ;
61
- getOnRetainHooks = ( ) => this . _getNodeHooks ( "onRetain" , this . treeChanges . retained , ( node ) => this . _toFrom ( ) ) ;
62
- getOnEnterHooks = ( ) => this . _getNodeHooks ( "onEnter" , this . treeChanges . entering , ( node ) => this . _toFrom ( { to : node . state } ) ) ;
63
- getOnFinishHooks = ( ) => this . _getTransitionHooks ( "onFinish" , this . treeChanges . to , { $treeChanges$ : this . treeChanges } ) ;
64
- getOnSuccessHooks = ( ) => this . _getTransitionHooks ( "onSuccess" , this . treeChanges . to , { } , successErrorOptions ) ;
65
- getOnErrorHooks = ( ) => this . _getTransitionHooks ( "onError" , this . treeChanges . to , { } , successErrorOptions ) ;
58
+ getOnBeforeHooks = ( ) => this . _buildTransitionHooks ( "onBefore" ) ;
59
+ getOnStartHooks = ( ) => this . _buildTransitionHooks ( "onStart" ) ;
60
+ getOnExitHooks = ( ) => this . _buildNodeHooks ( "onExit" , this . treeChanges . exiting . reverse ( ) , ( node ) => this . _toFrom ( { from : node . state } ) ) ;
61
+ getOnRetainHooks = ( ) => this . _buildNodeHooks ( "onRetain" , this . treeChanges . retained , ( node ) => this . _toFrom ( ) ) ;
62
+ getOnEnterHooks = ( ) => this . _buildNodeHooks ( "onEnter" , this . treeChanges . entering , ( node ) => this . _toFrom ( { to : node . state } ) ) ;
63
+ getOnFinishHooks = ( ) => this . _buildTransitionHooks ( "onFinish" , { $treeChanges$ : this . treeChanges } ) ;
64
+ getOnSuccessHooks = ( ) => this . _buildTransitionHooks ( "onSuccess" , { } , { async : false , rejectIfSuperseded : false } ) ;
65
+ getOnErrorHooks = ( ) => this . _buildTransitionHooks ( "onError" , { } , { async : false , rejectIfSuperseded : false } ) ;
66
+
67
+
68
+ asyncHooks ( ) {
69
+ let onStartHooks = this . getOnStartHooks ( ) ;
70
+ let onExitHooks = this . getOnExitHooks ( ) ;
71
+ let onRetainHooks = this . getOnRetainHooks ( ) ;
72
+ let onEnterHooks = this . getOnEnterHooks ( ) ;
73
+ let onFinishHooks = this . getOnFinishHooks ( ) ;
74
+
75
+ return flatten ( [ onStartHooks , onExitHooks , onRetainHooks , onEnterHooks , onFinishHooks ] ) . filter ( identity ) ;
76
+ }
66
77
67
78
private _toFrom ( toFromOverride ?) : IToFrom {
68
79
return extend ( { to : this . toState , from : this . fromState } , toFromOverride ) ;
@@ -75,8 +86,8 @@ export default class HookBuilder {
75
86
* Finds all registered IEventHooks which matched the hookType and toFrom criteria.
76
87
* A TransitionHook is then built from each IEventHook with the context, locals, and options provided.
77
88
*/
78
- private _getTransitionHooks ( hookType : string , context : ( Node [ ] | State ) , locals = { } , options : ITransitionHookOptions = { } ) {
79
- let node = tail ( this . treeChanges . to ) ;
89
+ private _buildTransitionHooks ( hookType : string , locals = { } , options : ITransitionHookOptions = { } ) {
90
+ let context = this . treeChanges . to , node = tail ( context ) ;
80
91
options . traceData = { hookType, context } ;
81
92
82
93
const transitionHook = eventHook => this . buildHook ( node , eventHook . callback , locals , options ) ;
@@ -92,7 +103,7 @@ export default class HookBuilder {
92
103
* Finds all registered IEventHooks which matched the hookType and toFrom criteria.
93
104
* A TransitionHook is then built from each IEventHook with the context, locals, and options provided.
94
105
*/
95
- private _getNodeHooks ( hookType : string , path : Node [ ] , toFromFn : ( node : Node ) => IToFrom , locals : any = { } , options : ITransitionHookOptions = { } ) {
106
+ private _buildNodeHooks ( hookType : string , path : Node [ ] , toFromFn : ( node : Node ) => IToFrom , locals : any = { } , options : ITransitionHookOptions = { } ) {
96
107
const hooksForNode = ( node : Node ) => {
97
108
let toFrom = toFromFn ( node ) ;
98
109
options . traceData = { hookType, context : node } ;
@@ -108,7 +119,7 @@ export default class HookBuilder {
108
119
/** Given a node and a callback function, builds a TransitionHook */
109
120
buildHook ( node : Node , fn : IInjectable , locals ?, options : ITransitionHookOptions = { } ) : TransitionHook {
110
121
let _options = extend ( { } , this . baseHookOptions , options ) ;
111
- return new TransitionHook ( node . state , fn , extend ( { } , locals ) , node . resolveContext , _options ) ;
122
+ return new TransitionHook ( fn , extend ( { } , locals ) , node . resolveContext , _options ) ;
112
123
}
113
124
114
125
0 commit comments