Skip to content

Commit 5d57f50

Browse files
committed
redo event emitter
1 parent d9cd752 commit 5d57f50

File tree

1 file changed

+72
-1
lines changed

1 file changed

+72
-1
lines changed

packages/react-native/ReactCommon/react/renderer/components/view/platform/macos/react/renderer/components/view/HostPlatformViewEventEmitter.cpp

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ void HostPlatformViewEventEmitter::onKeyUp(const KeyEvent& keyEvent) const {
5252

5353
#pragma mark - Mouse Events
5454

55-
static jsi::Value mouseEventPayload(jsi::Runtime& runtime, const MouseEvent& event) {
55+
// Returns an Object instead of value as we read and modify it in dragEventPayload.
56+
static jsi::Object mouseEventPayload(jsi::Runtime& runtime, const MouseEvent& event) {
5657
auto payload = jsi::Object(runtime);
5758
payload.setProperty(runtime, "clientX", event.clientX);
5859
payload.setProperty(runtime, "clientY", event.clientY);
@@ -77,4 +78,74 @@ void HostPlatformViewEventEmitter::onMouseLeave(const MouseEvent& mouseEvent) co
7778
});
7879
}
7980

81+
#pragma mark - Drag and Drop Events
82+
83+
static jsi::Value dataTransferPayload(
84+
jsi::Runtime& runtime,
85+
const std::vector<DataTransferItem>& dataTransferItems) {
86+
auto filesArray = jsi::Array(runtime, dataTransferItems.size());
87+
auto itemsArray = jsi::Array(runtime, dataTransferItems.size());
88+
auto typesArray = jsi::Array(runtime, dataTransferItems.size());
89+
int i = 0;
90+
for (const auto& transferItem : dataTransferItems) {
91+
auto fileObject = jsi::Object(runtime);
92+
fileObject.setProperty(runtime, "name", transferItem.name);
93+
fileObject.setProperty(runtime, "type", transferItem.type);
94+
fileObject.setProperty(runtime, "uri", transferItem.uri);
95+
if (transferItem.size.has_value()) {
96+
fileObject.setProperty(runtime, "size", *transferItem.size);
97+
}
98+
if (transferItem.width.has_value()) {
99+
fileObject.setProperty(runtime, "width", *transferItem.width);
100+
}
101+
if (transferItem.height.has_value()) {
102+
fileObject.setProperty(runtime, "height", *transferItem.height);
103+
}
104+
filesArray.setValueAtIndex(runtime, i, fileObject);
105+
106+
auto itemObject = jsi::Object(runtime);
107+
itemObject.setProperty(runtime, "kind", transferItem.kind);
108+
itemObject.setProperty(runtime, "type", transferItem.type);
109+
itemsArray.setValueAtIndex(runtime, i, itemObject);
110+
111+
typesArray.setValueAtIndex(runtime, i, transferItem.type);
112+
i++;
113+
}
114+
115+
auto dataTransferObject = jsi::Object(runtime);
116+
dataTransferObject.setProperty(runtime, "files", filesArray);
117+
dataTransferObject.setProperty(runtime, "items", itemsArray);
118+
dataTransferObject.setProperty(runtime, "types", typesArray);
119+
120+
return dataTransferObject;
121+
}
122+
123+
static jsi::Value dragEventPayload(
124+
jsi::Runtime& runtime,
125+
const DragEvent& event) {
126+
auto payload = mouseEventPayload(runtime, event);
127+
auto dataTransferObject =
128+
dataTransferPayload(runtime, event.dataTransferItems);
129+
payload.setProperty(runtime, "dataTransfer", dataTransferObject);
130+
return payload;
131+
}
132+
133+
void HostPlatformViewEventEmitter::onDragEnter(DragEvent const& dragEvent) const {
134+
dispatchEvent("dragEnter", [dragEvent](jsi::Runtime &runtime) {
135+
return dragEventPayload(runtime, dragEvent);
136+
});
137+
}
138+
139+
void HostPlatformViewEventEmitter::onDragLeave(DragEvent const& dragEvent) const {
140+
dispatchEvent("dragLeave", [dragEvent](jsi::Runtime &runtime) {
141+
return dragEventPayload(runtime, dragEvent);
142+
});
143+
}
144+
145+
void HostPlatformViewEventEmitter::onDrop(DragEvent const& dragEvent) const {
146+
dispatchEvent("drop", [dragEvent](jsi::Runtime &runtime) {
147+
return dragEventPayload(runtime, dragEvent);
148+
});
149+
}
150+
80151
} // namespace facebook::react

0 commit comments

Comments
 (0)