Skip to content

Commit 49e32e6

Browse files
committed
feat(UISrefActive): support for nested UISrefActive
1 parent 83b0d8e commit 49e32e6

File tree

2 files changed

+58
-1
lines changed

2 files changed

+58
-1
lines changed

src/components/UISrefActive.tsx

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ let classNames = _classNames;
1717

1818
export interface UISrefActiveProps {
1919
parentUIView: UIViewAddress;
20+
addStateInfoToParentActive: Function;
2021
router: UIRouterReact;
2122
class?: string;
2223
exact?: Boolean;
@@ -46,6 +47,7 @@ class SrefActive extends Component<UISrefActiveProps, any> {
4647

4748
static propTypes = {
4849
parentUIView: PropTypes.object,
50+
addStateInfoToParentActive: PropTypes.func,
4951
router: PropTypes.object.isRequired,
5052
class: PropTypes.string.isRequired,
5153
children: PropTypes.element.isRequired,
@@ -71,7 +73,17 @@ class SrefActive extends Component<UISrefActiveProps, any> {
7173
addStateInfo = (stateName, stateParams) => {
7274
const activeClass = this.props.class;
7375
let deregister = this.addState(stateName, stateParams, activeClass);
76+
const addStateInfo = this.props.addStateInfoToParentActive;
7477
this.updateActiveClasses();
78+
79+
if (typeof addStateInfo === 'function') {
80+
const parentDeregister = addStateInfo(stateName, stateParams);
81+
return () => {
82+
deregister();
83+
parentDeregister();
84+
};
85+
}
86+
7587
return deregister;
7688
};
7789

@@ -142,7 +154,18 @@ export const UISrefActive = props => (
142154
<UIRouterConsumer>
143155
{router => (
144156
<UIViewConsumer>
145-
{parentUIView => <SrefActive {...props} router={router} parentUIView={parentUIView} />}
157+
{parentUIView => (
158+
<UISrefActiveConsumer>
159+
{addStateInfo => (
160+
<SrefActive
161+
{...props}
162+
router={router}
163+
parentUIView={parentUIView}
164+
addStateInfoToParentActive={addStateInfo}
165+
/>
166+
)}
167+
</UISrefActiveConsumer>
168+
)}
146169
</UIViewConsumer>
147170
)}
148171
</UIRouterConsumer>

src/components/__tests__/UISrefActive.test.tsx

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,40 @@ describe('<UISrefActive>', () => {
235235
expect(instance.states.length).toBe(3);
236236
});
237237

238+
it('works with nested <UISrefActive>', () => {
239+
const wrapper = mount(
240+
<UIRouter router={router}>
241+
<UISrefActive class="active">
242+
<div>
243+
<UISrefActive class="active">
244+
<UISref to="parent.child1">
245+
<a>child1</a>
246+
</UISref>
247+
</UISrefActive>
248+
<UISrefActive class="active">
249+
<UISref to="parent.child2">
250+
<a>child2</a>
251+
</UISref>
252+
</UISrefActive>
253+
<UISrefActive class="active">
254+
<UISref to="parent.child3">
255+
<a>child3</a>
256+
</UISref>
257+
</UISrefActive>
258+
</div>
259+
</UISrefActive>
260+
</UIRouter>
261+
);
262+
const instance = wrapper
263+
.find(UISrefActive)
264+
.at(0)
265+
.find('SrefActive')
266+
.at(0)
267+
.instance();
268+
expect(instance.context.parentUIViewAddress).toBeUndefined();
269+
expect(instance.states.length).toBe(3);
270+
});
271+
238272
it("removes active state of UISref when it's unmounted", () => {
239273
const Comp = props => (
240274
<UIRouter router={router}>

0 commit comments

Comments
 (0)