@talkjs/react-native
Version:
Official TalkJS SDK for React Native
78 lines (76 loc) • 2.23 kB
JavaScript
"use strict";
import { CONVERSATION_LIST, SELECT_CONVERSATION_EVENT } from './constants';
import { Subscription } from './EventSubscription';
export class TalkHandlers {
#subscriptions;
#handlers;
#onSelectConversationSubscription;
#injectJavaScript;
constructor(injectJavaScript) {
this.#handlers = {};
this.#subscriptions = {};
this.#injectJavaScript = injectJavaScript;
}
off(event) {
const subscription = this.#subscriptions[event];
if (subscription) {
subscription.unsubscribe();
}
}
add(event, object, handler) {
const subscription = new Subscription(this.#injectJavaScript);
this.#subscriptions[event] = subscription;
const variableName = subscription._variableName;
this.#handlers[variableName] = handler;
this.#injectJavaScript(`
${variableName} = ${object}.${event}(
(eventObj) =>
sendToReactNative("${event}", {id: "${variableName}", eventObj})
);
true;
`);
return subscription;
}
addOnSelectConversation(handler) {
this.#onSelectConversationSubscription?.unsubscribe();
this.#onSelectConversationSubscription = new Subscription(this.#injectJavaScript);
const variableName = this.#onSelectConversationSubscription._variableName;
this.#handlers[variableName] = handler;
this.#injectJavaScript(`
${variableName} = ${CONVERSATION_LIST}.onSelectConversation((eventObj) => {
eventObj.preventDefault();
// Deselect the selected conversation.
${CONVERSATION_LIST}.select(null);
sendToReactNative(
'${SELECT_CONVERSATION_EVENT}', {id: "${variableName}", eventObj}
);
});
true;
`);
}
process(data) {
const {
id,
eventObj
} = data;
this.#handlers[id](eventObj);
}
}
export class CustomHandlers {
#handlers;
constructor() {
this.#handlers = {};
}
process(event, data) {
const handlers = this.#handlers[event] ?? [];
handlers.forEach(handler => handler(data));
}
add(event, handler) {
if (event in this.#handlers) {
this.#handlers[event].push(handler);
} else {
this.#handlers[event] = [handler];
}
}
}
//# sourceMappingURL=Handlers.js.map