Skip to content

Commit bce6539

Browse files
christopherthielenmergify[bot]
authored andcommitted
feat(hooks): add useUIRouter and useCurrentState hooks
1 parent fa5495a commit bce6539

File tree

6 files changed

+38
-5
lines changed

6 files changed

+38
-5
lines changed

src/components/UIRouter.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ export const UIRouterInstanceUndefinedError = new Error(
6868
* const uiRouter = useUIRouter(config, states, plugins, router);
6969
* ```
7070
*/
71-
export function useUIRouter(
71+
export function useInitializeUIRouter(
7272
configFn: (router: UIRouterReact) => void,
7373
states: Array<ReactStateDeclaration>,
7474
plugins: Array<PluginFactory<UIRouterPlugin>>,
@@ -169,7 +169,7 @@ export function useUIRouter(
169169
* ```
170170
*/
171171
export function UIRouter({ config, states, plugins, router, children }: UIRouterProps) {
172-
const uiRouter = useUIRouter(config, states, plugins, router);
172+
const uiRouter = useInitializeUIRouter(config, states, plugins, router);
173173

174174
return <UIRouterContext.Provider value={uiRouter}>{children}</UIRouterContext.Provider>;
175175
}

src/components/UISref.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import * as _classNames from 'classnames';
1111
import { isFunction, TransitionOptions } from '@uirouter/core';
1212

1313
import { UIRouterReact, UIRouterContext, StateRegistry } from '../index';
14+
import { useUIRouter } from './hooks';
1415
import { UIViewAddress, UIViewContext } from './UIView';
1516
import { UISrefActiveContext, AddStateInfoFn } from './UISrefActive';
1617

@@ -41,7 +42,7 @@ export function getTransitionOptions(
4142
}
4243

4344
export function useUISref(to: string, params: { [key: string]: any } = {}, options: TransitionOptions = {}): LinkProps {
44-
const router = useContext(UIRouterContext);
45+
const router = useUIRouter();
4546
const parentUIViewAddress = useContext(UIViewContext);
4647
const parentUISrefActiveAddStateInfo = useContext(UISrefActiveContext);
4748

src/components/UISrefActive.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { useState, useCallback, useContext, useRef } from 'react';
77
import { cloneElement } from 'react';
88
import * as _classNames from 'classnames';
99

10-
import { useFirstRenderEffect } from './hooks';
10+
import { useFirstRenderEffect, useUIRouter } from './hooks';
1111
import { UIRouterReact, UIRouterContext } from '../index';
1212
import { UIViewAddress } from './UIView';
1313
import { UIRouterInstanceUndefinedError } from './UIRouter';
@@ -143,7 +143,7 @@ export interface UISrefActiveProps {
143143
* ```
144144
*/
145145
export function UISrefActive({ children, className, class: classToApply, exact }: UISrefActiveProps) {
146-
const router = useContext(UIRouterContext);
146+
const router = useUIRouter();
147147
const parentUIViewAddress = useContext(UIViewContext);
148148
const parentAddStateInfo = useContext(UISrefActiveContext);
149149

src/components/hooks/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1+
export * from './useCurrentState';
12
export * from './useFirstRenderEffect';
3+
export * from './useUIRouter';
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { StateParams } from '@uirouter/core';
2+
import { useEffect, useState } from 'react';
3+
import { useUIRouter } from './useUIRouter';
4+
5+
export function useCurrentRouterState() {
6+
const uiRouter = useUIRouter();
7+
const { globals } = uiRouter;
8+
const [stateData, setStateData] = useState({ state: globals.current, params: globals.params });
9+
10+
useEffect(() => {
11+
uiRouter.transitionService.onSuccess({}, transition => {
12+
const state = transition.to();
13+
const params = transition.params('to') as StateParams;
14+
setStateData({ state, params });
15+
});
16+
}, [uiRouter]);
17+
18+
return stateData;
19+
}

src/components/hooks/useUIRouter.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { useContext } from 'react';
2+
import { UIRouterContext } from '../UIRouter';
3+
4+
/** Returns the UIRouter object from React Context */
5+
export function useUIRouter() {
6+
const router = useContext(UIRouterContext);
7+
if (!router) {
8+
throw new Error(`UIRouter instance is undefined. Did you forget to include the <UIRouter> as root component?`);
9+
}
10+
return router;
11+
}

0 commit comments

Comments
 (0)