GT2/Ejectable/node_modules/react-native-reanimated/Common/cpp/Registries/EventHandlerRegistry.cpp
2021-08-16 00:14:59 +00:00

61 lines
2.3 KiB
C++

#include "EventHandlerRegistry.h"
#include "WorkletEventHandler.h"
namespace reanimated {
void EventHandlerRegistry::registerEventHandler(std::shared_ptr<WorkletEventHandler> eventHandler) {
const std::lock_guard<std::mutex> lock(instanceMutex);
eventMappings[eventHandler->eventName][eventHandler->id] = eventHandler;
eventHandlers[eventHandler->id] = eventHandler;
}
void EventHandlerRegistry::unregisterEventHandler(unsigned long id) {
const std::lock_guard<std::mutex> lock(instanceMutex);
auto handlerIt = eventHandlers.find(id);
if (handlerIt != eventHandlers.end()) {
eventMappings[handlerIt->second->eventName].erase(id);
if (eventMappings[handlerIt->second->eventName].empty()) {
eventMappings.erase(handlerIt->second->eventName);
}
eventHandlers.erase(handlerIt);
}
}
void EventHandlerRegistry::processEvent(jsi::Runtime &rt, std::string eventName, std::string eventPayload) {
std::vector<std::shared_ptr<WorkletEventHandler>> handlersForEvent;
{
const std::lock_guard<std::mutex> lock(instanceMutex);
auto handlersIt = eventMappings.find(eventName);
if (handlersIt != eventMappings.end()) {
for (auto handler : handlersIt->second) {
handlersForEvent.push_back(handler.second);
}
}
}
// We receive here a JS Map with JSON as a value of NativeMap key
// { NativeMap: { "jsonProp": "json value" } }
// So we need to extract only JSON part
std::string delimimter = "NativeMap:";
auto positionToSplit = eventPayload.find(delimimter) + delimimter.size();
auto lastBracketCharactedPosition = eventPayload.size() - positionToSplit - 1;
auto eventJSON = eventPayload.substr(positionToSplit, lastBracketCharactedPosition);
if (eventJSON.compare(std::string("null")) == 0) {
return;
}
auto eventObject = jsi::Value::createFromJsonUtf8(rt, (uint8_t*)(&eventJSON[0]), eventJSON.size());
eventObject.asObject(rt).setProperty(rt, "eventName", jsi::String::createFromUtf8(rt, eventName));
for (auto handler : handlersForEvent) {
handler->process(rt, eventObject);
}
}
bool EventHandlerRegistry::isAnyHandlerWaitingForEvent(std::string eventName) {
const std::lock_guard<std::mutex> lock(instanceMutex);
auto it = eventMappings.find(eventName);
return (it != eventMappings.end()) and (!(it->second).empty());
}
}