-
Notifications
You must be signed in to change notification settings - Fork 58
/
redirectTo.ts
37 lines (32 loc) · 1.43 KB
/
redirectTo.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/** @module hooks */ /** */
import { isString, isFunction } from '../common/predicates';
import { Transition } from '../transition/transition';
import { services } from '../common/coreservices';
import { TargetState } from '../state/targetState';
import { TransitionService } from '../transition/transitionService';
import { TransitionHookFn } from '../transition/interface';
/**
* A [[TransitionHookFn]] that redirects to a different state or params
*
* Registered using `transitionService.onStart({ to: (state) => !!state.redirectTo }, redirectHook);`
*
* See [[StateDeclaration.redirectTo]]
*/
const redirectToHook: TransitionHookFn = (trans: Transition) => {
const redirect = trans.to().redirectTo;
if (!redirect) return;
const $state = trans.router.stateService;
function handleResult(result: any) {
if (!result) return;
if (result instanceof TargetState) return result;
if (isString(result)) return $state.target(<any> result, trans.params(), trans.options());
if (result['state'] || result['params'])
return $state.target(result['state'] || trans.to(), result['params'] || trans.params(), trans.options());
}
if (isFunction(redirect)) {
return services.$q.when(redirect(trans)).then(handleResult);
}
return handleResult(redirect);
};
export const registerRedirectToHook = (transitionService: TransitionService) =>
transitionService.onStart({ to: (state) => !!state.redirectTo }, redirectToHook);