Skip to content

Commit a56d1e4

Browse files
Nick LefeverSaadnajmi
authored andcommitted
[fabric] Add draggedTypes prop to View
Summary: Add support for `draggedTypes` to the View component, enabling the configuration of a native view as a drop target. Test Plan: * Run Zeratul with Fabric enabled * Drag a file over the messages view and check that the cursor is changing indicating a drop target https://pxl.cl/4ldkW Reviewers: shawndempsey, #rn-desktop Reviewed By: shawndempsey Subscribers: taskcreeper Differential Revision: https://phabricator.intern.facebook.com/D53674739
1 parent ea52bb4 commit a56d1e4

File tree

3 files changed

+36
-1
lines changed

3 files changed

+36
-1
lines changed

packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,30 @@ - (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &
588588
needsInvalidateLayer = YES;
589589
}
590590

591+
#if TARGET_OS_OSX // [macOS
592+
// `draggedTypes`
593+
if (oldViewProps.draggedTypes != newViewProps.draggedTypes) {
594+
if (oldViewProps.draggedTypes.has_value()) {
595+
[self unregisterDraggedTypes];
596+
}
597+
598+
if (newViewProps.draggedTypes.has_value()) {
599+
NSMutableArray<NSPasteboardType> *pasteboardTypes = [NSMutableArray new];
600+
for (const auto &draggedType : *newViewProps.draggedTypes) {
601+
if (draggedType == "fileUrl") {
602+
[pasteboardTypes addObject:NSFilenamesPboardType];
603+
} else if (draggedType == "image") {
604+
[pasteboardTypes addObject:NSPasteboardTypePNG];
605+
[pasteboardTypes addObject:NSPasteboardTypeTIFF];
606+
} else if (draggedType == "string") {
607+
[pasteboardTypes addObject:NSPasteboardTypeString];
608+
}
609+
}
610+
[self registerForDraggedTypes:pasteboardTypes];
611+
}
612+
}
613+
#endif // macOS]
614+
591615
_needsInvalidateLayer = _needsInvalidateLayer || needsInvalidateLayer;
592616

593617
_props = std::static_pointer_cast<const ViewProps>(props);

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,16 @@ HostPlatformViewProps::HostPlatformViewProps(
6565
rawProps,
6666
"keyUpEvents",
6767
sourceProps.keyUpEvents,
68-
{})) {}
68+
{})),
69+
draggedTypes(
70+
ReactNativeFeatureFlags::enableCppPropsIteratorSetter()
71+
? sourceProps.draggedTypes
72+
: convertRawProp(
73+
context,
74+
rawProps,
75+
"draggedTypes",
76+
sourceProps.draggedTypes,
77+
{})) {};
6978

7079
#define VIEW_EVENT_CASE_MACOS(eventType) \
7180
case CONSTEXPR_RAW_PROPS_KEY_HASH("on" #eventType): { \

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,7 @@ class HostPlatformViewProps : public BaseViewProps {
4343

4444
std::vector<HandledKey> keyDownEvents{};
4545
std::vector<HandledKey> keyUpEvents{};
46+
47+
std::vector<std::string> draggedTypes{};
4648
};
4749
} // namespace facebook::react

0 commit comments

Comments
 (0)