Puente persistente entre un componente React VR y el código del módulo nativo
Estoy intentando que mi navegador envíe algunos eventos DOM a los componentes React VR.
Lo más parecido que tengo es este código usando "módulos nativos".
(client.js)
const windowEventsModule = new WindowEventsModule();
function init(bundle, parent, options) {
const vr = new VRInstance(bundle, 'WelcomeToVR', parent, {
...options,
nativeModules: [windowEventsModule]
});
windowEventsModule.init(vr.rootView.context);
vr.start();
return vr;
}
window.ReactVR = {init};
(WindowEventsModule.js)
export default class WindowEventsModule extends Module {
constructor() {
super('WindowEventsModule');
this.listeners = {};
window.onmousewheel = event => {
this._emit('onmousewheel', event);
};
}
init(rnctx) {
this._rnctx = rnctx;
}
_emit(name, ob) {
if (!this._rnctx) {
return;
}
Object.keys(this.listeners).forEach(key => {
this._rnctx.invokeCallback(this.listeners[key], [ob]);
});
}
onMouseWheel(listener) {
const key = String(Math.random());
this.listeners[key] = listener;
return () => {
delete this.listeners[key];
};
}
}
Entonces mis componentes ahora pueden llamarWindowEvents.onMouseWheel(function() {})
y recibir una devolución de llamada del mundo DOM.
Desafortunadamente, esto solo funciona una vez. Aparentemente, RN invalidará mi devolución de llamada después de que se llame.
Yo tambien investiguethis._rnctx.callFunction()
, que puede llamar a una función arbitraria en algo llamado "módulo invocable". No veo cómo puedo llegar desde allí a mis componentes.
¿Hay algo que este olvidando? ¿Cuál es el patrón para alimentar mensajes arbitrarios del mundo nativo en el trabajador de fondo ReactVR?