@@ -52,7 +52,8 @@ void HostPlatformViewEventEmitter::onKeyUp(const KeyEvent& keyEvent) const {
52
52
53
53
#pragma mark - Mouse Events
54
54
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) {
56
57
auto payload = jsi::Object (runtime);
57
58
payload.setProperty (runtime, " clientX" , event.clientX );
58
59
payload.setProperty (runtime, " clientY" , event.clientY );
@@ -77,4 +78,74 @@ void HostPlatformViewEventEmitter::onMouseLeave(const MouseEvent& mouseEvent) co
77
78
});
78
79
}
79
80
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
+
80
151
} // namespace facebook::react
0 commit comments