Skip to content

Commit 0a6e34f

Browse files
luigiinredguyca
authored andcommitted
Add optional componentId param to bindComponent (#4299)
1 parent 708d594 commit 0a6e34f

File tree

3 files changed

+88
-11
lines changed

3 files changed

+88
-11
lines changed

lib/src/events/ComponentEventsObserver.test.tsx

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import { NativeEventsReceiver } from '../adapters/NativeEventsReceiver.mock';
55

66
describe('ComponentEventsObserver', () => {
77
const mockEventsReceiver = new NativeEventsReceiver();
8-
const uut = new ComponentEventsObserver(mockEventsReceiver);
98
const didAppearFn = jest.fn();
109
const didDisappearFn = jest.fn();
1110
const didMountFn = jest.fn();
@@ -16,13 +15,60 @@ describe('ComponentEventsObserver', () => {
1615
const previewCompletedFn = jest.fn();
1716
const modalDismissedFn = jest.fn();
1817
let subscription;
18+
let uut;
1919

2020
class SimpleScreen extends React.Component<any, any> {
2121
render() {
2222
return 'Hello';
2323
}
2424
}
2525

26+
class UnboundScreen extends React.Component<any, any> {
27+
constructor(props) {
28+
super(props);
29+
}
30+
31+
componentDidMount() {
32+
didMountFn();
33+
}
34+
35+
componentWillUnmount() {
36+
willUnmountFn();
37+
}
38+
39+
componentDidAppear() {
40+
didAppearFn();
41+
}
42+
43+
componentDidDisappear() {
44+
didDisappearFn();
45+
}
46+
47+
navigationButtonPressed(event) {
48+
navigationButtonPressedFn(event);
49+
}
50+
51+
modalDismissed(event) {
52+
modalDismissedFn(event);
53+
}
54+
55+
searchBarUpdated(event) {
56+
searchBarUpdatedFn(event);
57+
}
58+
59+
searchBarCancelPressed(event) {
60+
searchBarCancelPressedFn(event);
61+
}
62+
63+
previewCompleted(event) {
64+
previewCompletedFn(event);
65+
}
66+
67+
render() {
68+
return 'Hello';
69+
}
70+
}
71+
2672
class BoundScreen extends React.Component<any, any> {
2773
constructor(props) {
2874
super(props);
@@ -70,13 +116,43 @@ describe('ComponentEventsObserver', () => {
70116
}
71117
}
72118

119+
beforeEach(() => {
120+
jest.clearAllMocks();
121+
uut = new ComponentEventsObserver(mockEventsReceiver);
122+
});
123+
73124
it(`bindComponent expects a component with componentId`, () => {
74125
const tree = renderer.create(<SimpleScreen />);
75126
expect(() => uut.bindComponent(tree.getInstance() as any)).toThrow('');
76127
const tree2 = renderer.create(<SimpleScreen componentId={123} />);
77128
expect(() => uut.bindComponent(tree2.getInstance() as any)).toThrow('');
78129
});
79130

131+
it(`bindComponent accepts an optional componentId`, () => {
132+
const tree = renderer.create(<UnboundScreen />);
133+
uut.bindComponent(tree.getInstance() as any, 'myCompId')
134+
135+
expect(tree.toJSON()).toBeDefined();
136+
expect(didAppearFn).not.toHaveBeenCalled();
137+
138+
uut.notifyComponentDidAppear({ componentId: 'myCompId', componentName: 'doesnt matter' });
139+
expect(didAppearFn).toHaveBeenCalledTimes(1);
140+
});
141+
142+
it(`bindComponent should use optional componentId if component has a componentId in props`, () => {
143+
const tree = renderer.create(<UnboundScreen componentId={'doNotUseThisId'} />);
144+
uut.bindComponent(tree.getInstance() as any, 'myCompId')
145+
146+
expect(tree.toJSON()).toBeDefined();
147+
148+
uut.notifyComponentDidAppear({ componentId: 'dontUseThisId', componentName: 'doesnt matter' });
149+
expect(didAppearFn).not.toHaveBeenCalled();
150+
151+
152+
uut.notifyComponentDidAppear({ componentId: 'myCompId', componentName: 'doesnt matter' });
153+
expect(didAppearFn).toHaveBeenCalledTimes(1);
154+
});
155+
80156
it(`bindComponent notifies listeners by componentId on events`, () => {
81157
const tree = renderer.create(<BoundScreen componentId={'myCompId'} />);
82158
expect(tree.toJSON()).toBeDefined();

lib/src/events/ComponentEventsObserver.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,18 +38,19 @@ export class ComponentEventsObserver {
3838
this.nativeEventsReceiver.registerPreviewCompletedListener(this.notifyPreviewCompleted);
3939
}
4040

41-
public bindComponent(component: React.Component<any>): EventSubscription {
42-
const componentId = component.props.componentId;
43-
if (!_.isString(componentId)) {
44-
throw new Error(`bindComponent expects a component with a componentId in props`);
41+
public bindComponent(component: React.Component<any>, componentId?: string): EventSubscription {
42+
const computedComponentId = componentId || component.props.componentId;
43+
44+
if (!_.isString(computedComponentId)) {
45+
throw new Error(`bindComponent expects a component with a componentId in props or a componentId as the second argument`);
4546
}
46-
if (_.isNil(this.listeners[componentId])) {
47-
this.listeners[componentId] = {};
47+
if (_.isNil(this.listeners[computedComponentId])) {
48+
this.listeners[computedComponentId] = {};
4849
}
4950
const key = _.uniqueId();
50-
this.listeners[componentId][key] = component;
51+
this.listeners[computedComponentId][key] = component;
5152

52-
return { remove: () => _.unset(this.listeners[componentId], key) };
53+
return { remove: () => _.unset(this.listeners[computedComponentId], key) };
5354
}
5455

5556
public unmounted(componentId: string) {

lib/src/events/EventsRegistry.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ export class EventsRegistry {
6060
return this.commandsObserver.register(callback);
6161
}
6262

63-
public bindComponent(component: React.Component<any>): EventSubscription {
64-
return this.componentEventsObserver.bindComponent(component);
63+
public bindComponent(component: React.Component<any>, componentId?: string): EventSubscription {
64+
return this.componentEventsObserver.bindComponent(component, componentId);
6565
}
6666
}

0 commit comments

Comments
 (0)