Skip to content

Commit b3e83b1

Browse files
Nick LefeverSaadnajmi
authored andcommitted
[fabric] Add file paste event emitter to TextInput component
Summary: This diff refactors the data transfer item payload conversion logic to share it with `TextInputEventEmitter` paste event, allowing to implement the onPaste event emitters building the same payload as generated by the drag and drop implementation. Test Plan: Tested later in this stack. Reviewers: shawndempsey, #rn-desktop Reviewed By: shawndempsey Differential Revision: https://phabricator.intern.facebook.com/D53694921
1 parent 64d756b commit b3e83b1

File tree

4 files changed

+166
-153
lines changed

4 files changed

+166
-153
lines changed

packages/react-native/ReactCommon/react/renderer/components/textinput/TextInputEventEmitter.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
* LICENSE file in the root directory of this source tree.
66
*/
77

8+
#include <react/renderer/components/view/HostPlatformViewEventEmitter.h>
9+
810
#include "TextInputEventEmitter.h"
911

1012
namespace facebook::react {
@@ -191,6 +193,13 @@ void TextInputEventEmitter::onGrammarCheckChange(
191193
const Metrics& textInputMetrics) const {
192194
dispatchTextInputEvent("grammarCheckChange", textInputMetrics);
193195
}
196+
197+
void TextInputEventEmitter::onPaste(
198+
const Metrics& textInputMetrics) const {
199+
dispatchEvent("paste", [textInputMetrics](jsi::Runtime& runtime) {
200+
return dataTransferPayload(runtime, textInputMetrics.dataTransferItems);
201+
});
202+
}
194203
#endif // macOS]
195204

196205
void TextInputEventEmitter::dispatchTextInputEvent(

packages/react-native/ReactCommon/react/renderer/components/textinput/TextInputEventEmitter.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ class TextInputEventEmitter : public ViewEventEmitter {
3232
bool autoCorrectEnabled;
3333
bool spellCheckEnabled;
3434
bool grammarCheckEnabled;
35-
#endif // macOS]
35+
std::vector<DataTransferItem> dataTransferItems;
36+
#endif // macOS]
3637
};
3738

3839
struct KeyPressMetrics {
@@ -53,6 +54,7 @@ class TextInputEventEmitter : public ViewEventEmitter {
5354
void onAutoCorrectChange(const Metrics& textInputMetrics) const;
5455
void onSpellCheckChange(const Metrics& textInputMetrics) const;
5556
void onGrammarCheckChange(const Metrics& textInputMetrics) const;
57+
void onPaste(const Metrics& textInputMetrics) const;
5658
#endif // macOS]
5759

5860
private:
@@ -65,4 +67,4 @@ class TextInputEventEmitter : public ViewEventEmitter {
6567
const Metrics& textInputMetrics) const;
6668
};
6769

68-
} // namespace facebook::react
70+
} // namespace facebook::react
Lines changed: 150 additions & 151 deletions
Original file line numberDiff line numberDiff line change
@@ -1,151 +1,150 @@
1-
/*
2-
* Copyright (c) Microsoft Corporation.
3-
*
4-
* This source code is licensed under the MIT license found in the
5-
* LICENSE file in the root directory of this source tree.
6-
*/
7-
8-
// [macOS]
9-
10-
#include <react/renderer/components/view/HostPlatformViewEventEmitter.h>
11-
#include <react/renderer/components/view/KeyEvent.h>
12-
13-
namespace facebook::react {
14-
15-
#pragma mark - Focus Events
16-
17-
void HostPlatformViewEventEmitter::onFocus() const {
18-
dispatchEvent("focus");
19-
}
20-
21-
void HostPlatformViewEventEmitter::onBlur() const {
22-
dispatchEvent("blur");
23-
}
24-
25-
#pragma mark - Keyboard Events
26-
27-
static jsi::Value keyEventPayload(jsi::Runtime& runtime, const KeyEvent& event) {
28-
auto payload = jsi::Object(runtime);
29-
payload.setProperty(runtime, "key", jsi::String::createFromUtf8(runtime, event.key));
30-
payload.setProperty(runtime, "ctrlKey", event.ctrlKey);
31-
payload.setProperty(runtime, "shiftKey", event.shiftKey);
32-
payload.setProperty(runtime, "altKey", event.altKey);
33-
payload.setProperty(runtime, "metaKey", event.metaKey);
34-
payload.setProperty(runtime, "capsLockKey", event.capsLockKey);
35-
payload.setProperty(runtime, "numericPadKey", event.numericPadKey);
36-
payload.setProperty(runtime, "helpKey", event.helpKey);
37-
payload.setProperty(runtime, "functionKey", event.functionKey);
38-
return payload;
39-
};
40-
41-
void HostPlatformViewEventEmitter::onKeyDown(const KeyEvent& keyEvent) const {
42-
dispatchEvent("keyDown", [keyEvent](jsi::Runtime& runtime) {
43-
return keyEventPayload(runtime, keyEvent);
44-
});
45-
}
46-
47-
void HostPlatformViewEventEmitter::onKeyUp(const KeyEvent& keyEvent) const {
48-
dispatchEvent("keyUp", [keyEvent](jsi::Runtime& runtime) {
49-
return keyEventPayload(runtime, keyEvent);
50-
});
51-
}
52-
53-
#pragma mark - Mouse Events
54-
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) {
57-
auto payload = jsi::Object(runtime);
58-
payload.setProperty(runtime, "clientX", event.clientX);
59-
payload.setProperty(runtime, "clientY", event.clientY);
60-
payload.setProperty(runtime, "screenX", event.screenX);
61-
payload.setProperty(runtime, "screenY", event.screenY);
62-
payload.setProperty(runtime, "altKey", event.altKey);
63-
payload.setProperty(runtime, "ctrlKey", event.ctrlKey);
64-
payload.setProperty(runtime, "shiftKey", event.shiftKey);
65-
payload.setProperty(runtime, "metaKey", event.metaKey);
66-
return payload;
67-
};
68-
69-
void HostPlatformViewEventEmitter::onMouseEnter(const MouseEvent& mouseEvent) const {
70-
dispatchEvent("mouseEnter", [mouseEvent](jsi::Runtime &runtime) {
71-
return mouseEventPayload(runtime, mouseEvent);
72-
});
73-
}
74-
75-
void HostPlatformViewEventEmitter::onMouseLeave(const MouseEvent& mouseEvent) const {
76-
dispatchEvent("mouseLeave", [mouseEvent](jsi::Runtime &runtime) {
77-
return mouseEventPayload(runtime, mouseEvent);
78-
});
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-
151-
} // namespace facebook::react
1+
/*
2+
* Copyright (c) Microsoft Corporation.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
// [macOS]
9+
10+
#include <react/renderer/components/view/HostPlatformViewEventEmitter.h>
11+
#include <react/renderer/components/view/KeyEvent.h>
12+
13+
namespace facebook::react {
14+
15+
#pragma mark - Focus Events
16+
17+
void HostPlatformViewEventEmitter::onFocus() const {
18+
dispatchEvent("focus");
19+
}
20+
21+
void HostPlatformViewEventEmitter::onBlur() const {
22+
dispatchEvent("blur");
23+
}
24+
25+
#pragma mark - Keyboard Events
26+
27+
static jsi::Value keyEventPayload(jsi::Runtime& runtime, const KeyEvent& event) {
28+
auto payload = jsi::Object(runtime);
29+
payload.setProperty(runtime, "key", jsi::String::createFromUtf8(runtime, event.key));
30+
payload.setProperty(runtime, "ctrlKey", event.ctrlKey);
31+
payload.setProperty(runtime, "shiftKey", event.shiftKey);
32+
payload.setProperty(runtime, "altKey", event.altKey);
33+
payload.setProperty(runtime, "metaKey", event.metaKey);
34+
payload.setProperty(runtime, "capsLockKey", event.capsLockKey);
35+
payload.setProperty(runtime, "numericPadKey", event.numericPadKey);
36+
payload.setProperty(runtime, "helpKey", event.helpKey);
37+
payload.setProperty(runtime, "functionKey", event.functionKey);
38+
return payload;
39+
};
40+
41+
void HostPlatformViewEventEmitter::onKeyDown(const KeyEvent& keyEvent) const {
42+
dispatchEvent("keyDown", [keyEvent](jsi::Runtime& runtime) {
43+
return keyEventPayload(runtime, keyEvent);
44+
});
45+
}
46+
47+
void HostPlatformViewEventEmitter::onKeyUp(const KeyEvent& keyEvent) const {
48+
dispatchEvent("keyUp", [keyEvent](jsi::Runtime& runtime) {
49+
return keyEventPayload(runtime, keyEvent);
50+
});
51+
}
52+
53+
#pragma mark - Mouse Events
54+
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) {
57+
auto payload = jsi::Object(runtime);
58+
payload.setProperty(runtime, "clientX", event.clientX);
59+
payload.setProperty(runtime, "clientY", event.clientY);
60+
payload.setProperty(runtime, "screenX", event.screenX);
61+
payload.setProperty(runtime, "screenY", event.screenY);
62+
payload.setProperty(runtime, "altKey", event.altKey);
63+
payload.setProperty(runtime, "ctrlKey", event.ctrlKey);
64+
payload.setProperty(runtime, "shiftKey", event.shiftKey);
65+
payload.setProperty(runtime, "metaKey", event.metaKey);
66+
return payload;
67+
};
68+
69+
void HostPlatformViewEventEmitter::onMouseEnter(const MouseEvent& mouseEvent) const {
70+
dispatchEvent("mouseEnter", [mouseEvent](jsi::Runtime &runtime) {
71+
return mouseEventPayload(runtime, mouseEvent);
72+
});
73+
}
74+
75+
void HostPlatformViewEventEmitter::onMouseLeave(const MouseEvent& mouseEvent) const {
76+
dispatchEvent("mouseLeave", [mouseEvent](jsi::Runtime &runtime) {
77+
return mouseEventPayload(runtime, mouseEvent);
78+
});
79+
}
80+
81+
#pragma mark - Drag and Drop Events
82+
83+
jsi::Value HostPlatformViewEventEmitter::dataTransferPayload(
84+
jsi::Runtime& runtime,
85+
std::vector<DataTransferItem> const& 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 = HostPlatformViewEventEmitter::dataTransferPayload(runtime, event.dataTransferItems);
128+
payload.setProperty(runtime, "dataTransfer", dataTransferObject);
129+
return payload;
130+
}
131+
132+
void HostPlatformViewEventEmitter::onDragEnter(DragEvent const& dragEvent) const {
133+
dispatchEvent("dragEnter", [dragEvent](jsi::Runtime &runtime) {
134+
return dragEventPayload(runtime, dragEvent);
135+
});
136+
}
137+
138+
void HostPlatformViewEventEmitter::onDragLeave(DragEvent const& dragEvent) const {
139+
dispatchEvent("dragLeave", [dragEvent](jsi::Runtime &runtime) {
140+
return dragEventPayload(runtime, dragEvent);
141+
});
142+
}
143+
144+
void HostPlatformViewEventEmitter::onDrop(DragEvent const& dragEvent) const {
145+
dispatchEvent("drop", [dragEvent](jsi::Runtime &runtime) {
146+
return dragEventPayload(runtime, dragEvent);
147+
});
148+
}
149+
150+
} // namespace facebook::react

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ class HostPlatformViewEventEmitter : public BaseViewEventEmitter {
3939
void onDragEnter(DragEvent const& dragEvent) const;
4040
void onDragLeave(DragEvent const& dragEvent) const;
4141
void onDrop(DragEvent const& dragEvent) const;
42+
43+
static jsi::Value dataTransferPayload(jsi::Runtime& runtime, std::vector<DataTransferItem> const& dataTransferItems);
44+
4245
};
4346

4447
} // namespace facebook::react

0 commit comments

Comments
 (0)