Skip to content

Commit af070cb

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 9006981 commit af070cb

File tree

3 files changed

+41
-8
lines changed

3 files changed

+41
-8
lines changed

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

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,29 @@ - (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &
588588
needsInvalidateLayer = YES;
589589
}
590590

591-
#if TARGET_OS_OSX // [macOS]
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+
592614
// `tooltip`
593615
if (oldViewProps.tooltip != newViewProps.tooltip) {
594616
if (newViewProps.tooltip.has_value()) {

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

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,24 @@ HostPlatformViewProps::HostPlatformViewProps(
6666
"keyUpEvents",
6767
sourceProps.keyUpEvents,
6868
{})),
69-
tooltip(
69+
draggedTypes(
7070
ReactNativeFeatureFlags::enableCppPropsIteratorSetter()
71-
? sourceProps.tooltip
71+
? sourceProps.draggedTypes
7272
: convertRawProp(
73-
context,
74-
rawProps,
75-
"tooltip",
76-
sourceProps.tooltip,
77-
{})) {}
73+
context,
74+
rawProps,
75+
"draggedTypes",
76+
sourceProps.draggedTypes,
77+
{}))
78+
tooltip(
79+
ReactNativeFeatureFlags::enableCppPropsIteratorSetter()
80+
? sourceProps.tooltip
81+
: convertRawProp(
82+
context,
83+
rawProps,
84+
"tooltip",
85+
sourceProps.tooltip,
86+
{})) {}
7887

7988
#define VIEW_EVENT_CASE_MACOS(eventType) \
8089
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
@@ -47,6 +47,8 @@ class HostPlatformViewProps : public BaseViewProps {
4747
std::vector<HandledKey> keyDownEvents{};
4848
std::vector<HandledKey> keyUpEvents{};
4949

50+
std::vector<std::string> draggedTypes{};
51+
5052
std::optional<std::string> tooltip{};
5153
};
5254
} // namespace facebook::react

0 commit comments

Comments
 (0)