Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,13 @@
#import "RCTSurfaceView.h"
#import "RCTUtils.h"

#if __has_include(<React/RCTDevMenu.h>) && RCT_DEV
#import <React/RCTDevMenu.h>
#import <React/RCTSurfacePresenter.h>

Check failure on line 18 in packages/react-native/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingView.mm

View workflow job for this annotation

GitHub Actions / Build RNTester / ios, oldarch, jsc

'React/RCTSurfacePresenter.h' file not found

Check failure on line 18 in packages/react-native/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingView.mm

View workflow job for this annotation

GitHub Actions / Build RNTester / visionos, oldarch, jsc

'React/RCTSurfacePresenter.h' file not found

Check failure on line 18 in packages/react-native/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingView.mm

View workflow job for this annotation

GitHub Actions / Build RNTester / macos, newarch, jsc

'React/RCTSurfacePresenter.h' file not found

Check failure on line 18 in packages/react-native/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingView.mm

View workflow job for this annotation

GitHub Actions / Build RNTester / macos, oldarch, jsc

'React/RCTSurfacePresenter.h' file not found

Check failure on line 18 in packages/react-native/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingView.mm

View workflow job for this annotation

GitHub Actions / Build RNTester / macos, newarch, hermes

'React/RCTSurfacePresenter.h' file not found

Check failure on line 18 in packages/react-native/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingView.mm

View workflow job for this annotation

GitHub Actions / Build RNTester / ios, oldarch, hermes

'React/RCTSurfacePresenter.h' file not found

Check failure on line 18 in packages/react-native/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingView.mm

View workflow job for this annotation

GitHub Actions / Build RNTester / macos, oldarch, hermes

'React/RCTSurfacePresenter.h' file not found

Check failure on line 18 in packages/react-native/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingView.mm

View workflow job for this annotation

GitHub Actions / Build RNTester / visionos, newarch, jsc

'React/RCTSurfacePresenter.h' file not found

Check failure on line 18 in packages/react-native/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingView.mm

View workflow job for this annotation

GitHub Actions / Build RNTester / ios, newarch, jsc

'React/RCTSurfacePresenter.h' file not found

Check failure on line 18 in packages/react-native/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingView.mm

View workflow job for this annotation

GitHub Actions / Build RNTester / visionos, oldarch, hermes

'React/RCTSurfacePresenter.h' file not found

Check failure on line 18 in packages/react-native/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingView.mm

View workflow job for this annotation

GitHub Actions / Build RNTester / ios, newarch, hermes

'React/RCTSurfacePresenter.h' file not found

Check failure on line 18 in packages/react-native/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingView.mm

View workflow job for this annotation

GitHub Actions / Build RNTester / visionos, newarch, hermes

'React/RCTSurfacePresenter.h' file not found
#import <react/utils/ContextContainer.h>
#import <react/utils/ManagedObjectWrapper.h>
#endif

@interface RCTSurfaceHostingView ()

@property (nonatomic, assign) BOOL isActivityIndicatorViewVisible;
Expand Down Expand Up @@ -278,4 +285,42 @@
});
}

#if TARGET_OS_OSX // [macOS
- (NSMenu *)menuForEvent:(NSEvent *)event
{
NSMenu *menu = nil;
#if __has_include(<React/RCTDevMenu.h>) && RCT_DEV
// Try to get DevMenu from the contextContainer via the surface presenter
// This works in Fabric architecture where DevMenu is stored in contextContainer
if ([self.surface respondsToSelector:@selector(surfacePresenter)]) {
RCTSurfacePresenter *surfacePresenter = [self.surface performSelector:@selector(surfacePresenter)];
if (surfacePresenter) {
auto contextContainer = surfacePresenter.contextContainer;
if (contextContainer) {
auto optionalDevMenu = contextContainer->find<std::shared_ptr<void>>("RCTDevMenu");
if (optionalDevMenu) {
RCTDevMenu *devMenu = facebook::react::unwrapManagedObject(optionalDevMenu.value());
if (devMenu) {
menu = [devMenu menu];
}
}
}
}
}

// Fall back to notification-based approach if contextContainer access fails
if (menu == nil) {
[[NSNotificationCenter defaultCenter] postNotificationName:RCTShowDevMenuNotification object:nil];
// Return nil as the menu will be shown programmatically via notification
return nil;
}
#endif

if (menu == nil) {
menu = [super menuForEvent:event];
}
return menu;
}
#endif // macOS]

@end
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@
#import <React/RCTSurfacePresenter.h>
#import <React/RCTSurfacePresenterStub.h>

#if __has_include(<React/RCTDevMenu.h>) && RCT_DEV
#import <React/RCTDevMenu.h>
#endif

#import <ReactCommon/RuntimeExecutor.h>
#import <react/utils/ContextContainer.h>
#import <react/utils/ManagedObjectWrapper.h>
Expand All @@ -39,6 +43,15 @@ - (void)invokeAsync:(std::function<void()> &&)func;

contextContainer->insert("Bridge", wrapManagedObjectWeakly(bridge));
contextContainer->insert("RCTImageLoader", wrapManagedObject((id<RCTImageLoaderWithAttributionProtocol>)imageLoader));

#if __has_include(<React/RCTDevMenu.h>) && RCT_DEV
// Add DevMenu to contextContainer for Fabric views to access
RCTDevMenu *devMenu = [bridge devMenu];
if (devMenu) {
contextContainer->insert("RCTDevMenu", wrapManagedObject(devMenu));
}
#endif

return contextContainer;
}

Expand Down
Loading