|
| 1 | +/* |
| 2 | + * Copyright (c) Meta Platforms, Inc. and affiliates. |
| 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 | +#include "HostPlatformViewEventEmitter.h" |
| 9 | + |
| 10 | +namespace facebook::react { |
| 11 | + |
| 12 | +#pragma mark - Keyboard Events |
| 13 | + |
| 14 | +static jsi::Value keyEventPayload( |
| 15 | + jsi::Runtime& runtime, |
| 16 | + const KeyEvent& event) { |
| 17 | + auto payload = jsi::Object(runtime); |
| 18 | + payload.setProperty( |
| 19 | + runtime, "key", jsi::String::createFromUtf8(runtime, event.key)); |
| 20 | + payload.setProperty(runtime, "ctrlKey", event.ctrlKey); |
| 21 | + payload.setProperty(runtime, "shiftKey", event.shiftKey); |
| 22 | + payload.setProperty(runtime, "altKey", event.altKey); |
| 23 | + payload.setProperty(runtime, "metaKey", event.metaKey); |
| 24 | + payload.setProperty(runtime, "capsLockKey", event.capsLockKey); |
| 25 | + payload.setProperty(runtime, "numericPadKey", event.numericPadKey); |
| 26 | + payload.setProperty(runtime, "helpKey", event.helpKey); |
| 27 | + payload.setProperty(runtime, "functionKey", event.functionKey); |
| 28 | + return payload; |
| 29 | +}; |
| 30 | + |
| 31 | +void HostPlatformViewEventEmitter::onKeyDown(const KeyEvent& keyEvent) const { |
| 32 | + dispatchEvent("keyDown", [keyEvent](jsi::Runtime& runtime) { |
| 33 | + return keyEventPayload(runtime, keyEvent); |
| 34 | + }); |
| 35 | +} |
| 36 | + |
| 37 | +void HostPlatformViewEventEmitter::onKeyUp(const KeyEvent& keyEvent) const { |
| 38 | + dispatchEvent("keyUp", [keyEvent](jsi::Runtime& runtime) { |
| 39 | + return keyEventPayload(runtime, keyEvent); |
| 40 | + }); |
| 41 | +} |
| 42 | + |
| 43 | +#pragma mark - Mouse Events |
| 44 | + |
| 45 | +static jsi::Object mouseEventPayload( |
| 46 | + jsi::Runtime& runtime, |
| 47 | + const MouseEvent& event) { |
| 48 | + auto payload = jsi::Object(runtime); |
| 49 | + payload.setProperty(runtime, "clientX", event.clientX); |
| 50 | + payload.setProperty(runtime, "clientY", event.clientY); |
| 51 | + payload.setProperty(runtime, "screenX", event.screenX); |
| 52 | + payload.setProperty(runtime, "screenY", event.screenY); |
| 53 | + payload.setProperty(runtime, "altKey", event.altKey); |
| 54 | + payload.setProperty(runtime, "ctrlKey", event.ctrlKey); |
| 55 | + payload.setProperty(runtime, "shiftKey", event.shiftKey); |
| 56 | + payload.setProperty(runtime, "metaKey", event.metaKey); |
| 57 | + return payload; |
| 58 | +}; |
| 59 | + |
| 60 | +void HostPlatformViewEventEmitter::onMouseEnter( |
| 61 | + const MouseEvent& mouseEvent) const { |
| 62 | + dispatchEvent("mouseEnter", [mouseEvent](jsi::Runtime& runtime) { |
| 63 | + return mouseEventPayload(runtime, mouseEvent); |
| 64 | + }); |
| 65 | +} |
| 66 | + |
| 67 | +void HostPlatformViewEventEmitter::onMouseLeave( |
| 68 | + const MouseEvent& mouseEvent) const { |
| 69 | + dispatchEvent("mouseLeave", [mouseEvent](jsi::Runtime& runtime) { |
| 70 | + return mouseEventPayload(runtime, mouseEvent); |
| 71 | + }); |
| 72 | +} |
| 73 | + |
| 74 | +void HostPlatformViewEventEmitter::onDoubleClick( |
| 75 | + const MouseEvent& mouseEvent) const { |
| 76 | + dispatchEvent("doubleClick", [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( |
| 134 | + const DragEvent& dragEvent) const { |
| 135 | + dispatchEvent("dragEnter", [dragEvent](jsi::Runtime& runtime) { |
| 136 | + return dragEventPayload(runtime, dragEvent); |
| 137 | + }); |
| 138 | +} |
| 139 | + |
| 140 | +void HostPlatformViewEventEmitter::onDragLeave( |
| 141 | + const DragEvent& dragEvent) const { |
| 142 | + dispatchEvent("dragLeave", [dragEvent](jsi::Runtime& runtime) { |
| 143 | + return dragEventPayload(runtime, dragEvent); |
| 144 | + }); |
| 145 | +} |
| 146 | + |
| 147 | +void HostPlatformViewEventEmitter::onDrop(const DragEvent& dragEvent) const { |
| 148 | + dispatchEvent("drop", [dragEvent](jsi::Runtime& runtime) { |
| 149 | + return dragEventPayload(runtime, dragEvent); |
| 150 | + }); |
| 151 | +} |
| 152 | + |
| 153 | +#pragma mark - Focus Events |
| 154 | + |
| 155 | +void HostPlatformViewEventEmitter::onFocus() const { |
| 156 | + dispatchEvent("focus"); |
| 157 | +} |
| 158 | + |
| 159 | +void HostPlatformViewEventEmitter::onBlur() const { |
| 160 | + dispatchEvent("blur"); |
| 161 | +} |
| 162 | + |
| 163 | +} // namespace facebook::react |
0 commit comments