diff --git a/src/Incorporator.ts b/src/Incorporator.ts index 71ceb44..7cd7301 100644 --- a/src/Incorporator.ts +++ b/src/Incorporator.ts @@ -32,7 +32,15 @@ export default class Incorporator extends PureComponent { const handlers = scope.getSelectorHandlers(this.selector); for (const evType of Object.keys(handlers)) { const onFoo = `on${evType[0].toUpperCase()}${evType.slice(1)}`; - props[onFoo] = (ev: any) => handlers[evType]._n(ev); + const existingHandler = + typeof props[onFoo] === 'function' ? props[onFoo] : undefined; + const evHandler = (ev: any) => handlers[evType]._n(ev); + props[onFoo] = existingHandler + ? (ev: any) => { + evHandler(ev); + return existingHandler(ev); + } + : evHandler; } return props; } diff --git a/test/conversion.ts b/test/conversion.ts index d3831e9..dee2f99 100644 --- a/test/conversion.ts +++ b/test/conversion.ts @@ -87,6 +87,53 @@ describe('Conversion', function () { setTimeout(check, 150); }); + + it('respects handler set on react component', (done) => { + let onPressCalled = 0; + function main(sources: {react: ReactSource}) { + const inc = Symbol(); + const inc$ = sources.react.select(inc).events('press'); + const count$ = inc$.fold((acc: number, x: any) => acc + 1, 0); + const vdom$ = count$.map((i: number) => + h( + Touchable, + { + sel: inc, + onPress: () => { + onPressCalled++; + }, + }, + [h('div', [h('h1', {}, '' + i)])] + ) + ); + return {react: vdom$}; + } + + let turn = 0; + const RootComponent = makeCycleReactComponent(() => { + const source = new ReactSource(); + const sink = main({react: source}).react; + return {source, sink}; + }); + const r = renderer.create(createElement(RootComponent)); + const root = r.root; + const check = () => { + const to = root.findByType(Touchable); + const view = to.props.children; + const text = view.props.children; + assert.strictEqual(text.props.children, `${turn}`); + to.instance.press(); + turn++; + if (turn === 3) { + assert.strictEqual(onPressCalled, 3) + done(); + } + }; + setTimeout(check, 50); + setTimeout(check, 100); + setTimeout(check, 150); + }); + it('output React component routes props to sources.react.props()', (done) => { function main(sources: {react: ReactSource}) { sources.react.props().addListener({