Skip to content

Commit b9d77e6

Browse files
authored
Respect react event handler (#13)
* Respect react event handler * add and make prettier formatting * Respect react event handler
1 parent 186ea3e commit b9d77e6

File tree

2 files changed

+56
-1
lines changed

2 files changed

+56
-1
lines changed

src/Incorporator.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,15 @@ export default class Incorporator extends PureComponent<Props, State> {
3232
const handlers = scope.getSelectorHandlers(this.selector);
3333
for (const evType of Object.keys(handlers)) {
3434
const onFoo = `on${evType[0].toUpperCase()}${evType.slice(1)}`;
35-
props[onFoo] = (ev: any) => handlers[evType]._n(ev);
35+
const existingHandler =
36+
typeof props[onFoo] === 'function' ? props[onFoo] : undefined;
37+
const evHandler = (ev: any) => handlers[evType]._n(ev);
38+
props[onFoo] = existingHandler
39+
? (ev: any) => {
40+
evHandler(ev);
41+
return existingHandler(ev);
42+
}
43+
: evHandler;
3644
}
3745
return props;
3846
}

test/conversion.ts

+47
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,53 @@ describe('Conversion', function () {
8787
setTimeout(check, 150);
8888
});
8989

90+
91+
it('respects handler set on react component', (done) => {
92+
let onPressCalled = 0;
93+
function main(sources: {react: ReactSource}) {
94+
const inc = Symbol();
95+
const inc$ = sources.react.select(inc).events('press');
96+
const count$ = inc$.fold((acc: number, x: any) => acc + 1, 0);
97+
const vdom$ = count$.map((i: number) =>
98+
h(
99+
Touchable,
100+
{
101+
sel: inc,
102+
onPress: () => {
103+
onPressCalled++;
104+
},
105+
},
106+
[h('div', [h('h1', {}, '' + i)])]
107+
)
108+
);
109+
return {react: vdom$};
110+
}
111+
112+
let turn = 0;
113+
const RootComponent = makeCycleReactComponent(() => {
114+
const source = new ReactSource();
115+
const sink = main({react: source}).react;
116+
return {source, sink};
117+
});
118+
const r = renderer.create(createElement(RootComponent));
119+
const root = r.root;
120+
const check = () => {
121+
const to = root.findByType(Touchable);
122+
const view = to.props.children;
123+
const text = view.props.children;
124+
assert.strictEqual(text.props.children, `${turn}`);
125+
to.instance.press();
126+
turn++;
127+
if (turn === 3) {
128+
assert.strictEqual(onPressCalled, 3)
129+
done();
130+
}
131+
};
132+
setTimeout(check, 50);
133+
setTimeout(check, 100);
134+
setTimeout(check, 150);
135+
});
136+
90137
it('output React component routes props to sources.react.props()', (done) => {
91138
function main(sources: {react: ReactSource}) {
92139
sources.react.props().addListener({

0 commit comments

Comments
 (0)