diff --git a/.gitignore b/.gitignore index e734a3cffbb6f8..4fb90eba8a49f7 100644 --- a/.gitignore +++ b/.gitignore @@ -155,3 +155,6 @@ vendor/ # CircleCI .circleci/generated_config.yml +.circleci/storage + +.yarn diff --git a/packages/react-native/Libraries/SwiftExtensions/React-RCTSwiftExtensions.podspec b/packages/react-native/Libraries/SwiftExtensions/React-RCTSwiftExtensions.podspec index d5dbdafe37ff6d..531f1d8172ca7d 100644 --- a/packages/react-native/Libraries/SwiftExtensions/React-RCTSwiftExtensions.podspec +++ b/packages/react-native/Libraries/SwiftExtensions/React-RCTSwiftExtensions.podspec @@ -24,4 +24,5 @@ Pod::Spec.new do |s| s.frameworks = ["UIKit", "SwiftUI"] s.dependency "React-Core" + s.dependency "React-RCTXR" end diff --git a/packages/react-native/Libraries/XR/ImmersiveBridge.swift b/packages/react-native/Libraries/XR/ImmersiveBridge.swift new file mode 100644 index 00000000000000..45fdbcf4087b00 --- /dev/null +++ b/packages/react-native/Libraries/XR/ImmersiveBridge.swift @@ -0,0 +1,55 @@ +import Foundation +import SwiftUI + +@objc public enum ImmersiveSpaceResult: Int { + case opened + case userCancelled + case error +} + +public typealias CompletionHandlerType = (_ result: ImmersiveSpaceResult) -> Void + +/** + * Utility view used to bridge the gap between SwiftUI environment and UIKit. + * + * Calls `openImmersiveSpace` when view appears in the UIKit hierarchy and `dismissImmersiveSpace` when removed. + */ +struct ImmersiveBridgeView: View { + @Environment(\.openImmersiveSpace) private var openImmersiveSpace + @Environment(\.dismissImmersiveSpace) private var dismissImmersiveSpace + + var spaceId: String + var completionHandler: CompletionHandlerType + + var body: some View { + EmptyView() + .onAppear { + Task { + let result = await openImmersiveSpace(id: spaceId) + + switch result { + case .opened: + completionHandler(.opened) + case .error: + completionHandler(.error) + case .userCancelled: + completionHandler(.userCancelled) + default: + break + } + } + } + .onDisappear { + Task { await dismissImmersiveSpace() } + } + } +} + +@objc public class ImmersiveBridgeFactory: NSObject { + @objc public static func makeImmersiveBridgeView( + spaceId: String, + completionHandler: @escaping CompletionHandlerType + ) -> UIViewController { + return UIHostingController(rootView: ImmersiveBridgeView(spaceId: spaceId, completionHandler: completionHandler)) + } +} diff --git a/packages/react-native/Libraries/XR/NativeXRModule.js b/packages/react-native/Libraries/XR/NativeXRModule.js new file mode 100644 index 00000000000000..c34b296bc3e4a5 --- /dev/null +++ b/packages/react-native/Libraries/XR/NativeXRModule.js @@ -0,0 +1,8 @@ +/** + * @flow strict + * @format + */ + +export * from '../../src/private/specs/visionos_modules/NativeXRModule'; +import NativeXRModule from '../../src/private/specs/visionos_modules/NativeXRModule'; +export default NativeXRModule; diff --git a/packages/react-native/Libraries/XR/RCTXRModule.h b/packages/react-native/Libraries/XR/RCTXRModule.h new file mode 100644 index 00000000000000..450d8ad4681619 --- /dev/null +++ b/packages/react-native/Libraries/XR/RCTXRModule.h @@ -0,0 +1,6 @@ +#import +#import + +@interface RCTXRModule : NSObject + +@end diff --git a/packages/react-native/Libraries/XR/RCTXRModule.mm b/packages/react-native/Libraries/XR/RCTXRModule.mm new file mode 100644 index 00000000000000..8b5db6c7cbd008 --- /dev/null +++ b/packages/react-native/Libraries/XR/RCTXRModule.mm @@ -0,0 +1,88 @@ +#import + +#import + +#import +#import +#import +#import "RCTXR-Swift.h" + +@interface RCTXRModule () +@end + +@implementation RCTXRModule { + UIViewController *_immersiveBridgeView; +} + +RCT_EXPORT_MODULE() + +RCT_EXPORT_METHOD(endSession + : (RCTPromiseResolveBlock)resolve reject + : (RCTPromiseRejectBlock)reject) +{ + [self removeImmersiveBridge]; + resolve(nil); +} + + +RCT_EXPORT_METHOD(requestSession + : (NSString *)sessionId resolve + : (RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) +{ + RCTExecuteOnMainQueue(^{ + UIWindow *keyWindow = RCTKeyWindow(); + UIViewController *rootViewController = keyWindow.rootViewController; + + if (self->_immersiveBridgeView == nil) { + self->_immersiveBridgeView = [ImmersiveBridgeFactory makeImmersiveBridgeViewWithSpaceId:sessionId + completionHandler:^(enum ImmersiveSpaceResult result){ + if (result == ImmersiveSpaceResultError) { + reject(@"ERROR", @"Immersive Space failed to open, the system cannot fulfill the request.", nil); + [self removeImmersiveBridge]; + } else if (result == ImmersiveSpaceResultUserCancelled) { + reject(@"ERROR", @"Immersive Space canceled by user", nil); + [self removeImmersiveBridge]; + } else if (result == ImmersiveSpaceResultOpened) { + resolve(nil); + } + }]; + + [rootViewController.view addSubview:self->_immersiveBridgeView.view]; + [rootViewController addChildViewController:self->_immersiveBridgeView]; + [self->_immersiveBridgeView didMoveToParentViewController:rootViewController]; + } else { + reject(@"ERROR", @"Immersive Space already opened", nil); + } + }); +} + +- (facebook::react::ModuleConstants)constantsToExport { + return [self getConstants]; +} + +- (facebook::react::ModuleConstants)getConstants { + __block facebook::react::ModuleConstants constants; + RCTUnsafeExecuteOnMainQueueSync(^{ + constants = facebook::react::typedConstants({ + .supportsMultipleScenes = RCTSharedApplication().supportsMultipleScenes + }); + }); + + return constants; +} + +- (void) removeImmersiveBridge +{ + RCTExecuteOnMainQueue(^{ + [self->_immersiveBridgeView willMoveToParentViewController:nil]; + [self->_immersiveBridgeView.view removeFromSuperview]; + [self->_immersiveBridgeView removeFromParentViewController]; + self->_immersiveBridgeView = nil; + }); +} + +- (std::shared_ptr)getTurboModule:(const facebook::react::ObjCTurboModule::InitParams &)params { + return std::make_shared(params); +} + +@end diff --git a/packages/react-native/Libraries/XR/XR.d.ts b/packages/react-native/Libraries/XR/XR.d.ts new file mode 100644 index 00000000000000..11d397a4ebde34 --- /dev/null +++ b/packages/react-native/Libraries/XR/XR.d.ts @@ -0,0 +1,9 @@ + +export interface XRStatic { + requestSession(sessionId: string): Promise; + endSession(): Promise; + supportsMultipleScenes: boolean; +} + +export const XR: XRStatic; +export type XR = XRStatic; diff --git a/packages/react-native/Libraries/XR/XR.js b/packages/react-native/Libraries/XR/XR.js new file mode 100644 index 00000000000000..3487429aff1bb5 --- /dev/null +++ b/packages/react-native/Libraries/XR/XR.js @@ -0,0 +1,33 @@ +/** + * @format + * @flow strict + * @jsdoc + */ + +import NativeXRModule from './NativeXRModule'; + +const XR = { + requestSession: (sessionId?: string): Promise => { + if (NativeXRModule != null && NativeXRModule.requestSession != null) { + return NativeXRModule.requestSession(sessionId); + } + return Promise.reject(new Error('NativeXRModule is not available')); + }, + endSession: (): Promise => { + if (NativeXRModule != null && NativeXRModule.endSession != null) { + return NativeXRModule.endSession(); + } + return Promise.reject(new Error('NativeXRModule is not available')); + }, + // $FlowIgnore[unsafe-getters-setters] + get supportsMultipleScenes(): boolean { + if (NativeXRModule == null) { + return false; + } + + const nativeConstants = NativeXRModule.getConstants(); + return nativeConstants.supportsMultipleScenes || false; + }, +}; + +module.exports = XR; diff --git a/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap b/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap index 416f975e52d255..7ab5e938b91652 100644 --- a/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap +++ b/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap @@ -9771,6 +9771,22 @@ exports[`public API should not change unintentionally Libraries/WebSocket/WebSoc exports[`public API should not change unintentionally Libraries/WebSocket/WebSocketInterceptor.js 1`] = `"UNTYPED MODULE"`; +exports[`public API should not change unintentionally Libraries/XR/NativeXRModule.js 1`] = ` +"export * from \\"../../src/private/specs/visionos_modules/NativeXRModule\\"; +declare export default typeof NativeXRModule; +" +`; + +exports[`public API should not change unintentionally Libraries/XR/XR.js 1`] = ` +"declare const XR: { + requestSession: (sessionId?: string) => Promise, + endSession: () => Promise, + get supportsMultipleScenes(): boolean, +}; +declare module.exports: XR; +" +`; + exports[`public API should not change unintentionally Libraries/YellowBox/YellowBoxDeprecated.js 1`] = ` "declare const React: $FlowFixMe; type Props = $ReadOnly<{||}>; @@ -9889,6 +9905,7 @@ declare module.exports: { get PushNotificationIOS(): PushNotificationIOS, get Settings(): Settings, get Share(): Share, + get XR(): XR, get StyleSheet(): StyleSheet, get Systrace(): Systrace, get ToastAndroid(): ToastAndroid, diff --git a/packages/react-native/React-Core.podspec b/packages/react-native/React-Core.podspec index fe7db7b5e7f7a9..5b00320d9a570c 100644 --- a/packages/react-native/React-Core.podspec +++ b/packages/react-native/React-Core.podspec @@ -40,6 +40,7 @@ header_subspecs = { 'RCTSettingsHeaders' => 'Libraries/Settings/*.h', 'RCTTextHeaders' => 'Libraries/Text/**/*.h', 'RCTVibrationHeaders' => 'Libraries/Vibration/*.h', + 'RCTXRHeaders' => 'Libraries/XR/*.h', } frameworks_search_paths = [] diff --git a/packages/react-native/React.podspec b/packages/react-native/React.podspec index 59b9f8319ae306..2d085e63040906 100644 --- a/packages/react-native/React.podspec +++ b/packages/react-native/React.podspec @@ -53,4 +53,5 @@ Pod::Spec.new do |s| s.dependency "React-RCTSettings", version s.dependency "React-RCTText", version s.dependency "React-RCTVibration", version + s.dependency "React-RCTXR", version end diff --git a/packages/react-native/React/Base/RCTUtils.m b/packages/react-native/React/Base/RCTUtils.m index 40d4b4e4c87c73..1573a675f23a6b 100644 --- a/packages/react-native/React/Base/RCTUtils.m +++ b/packages/react-native/React/Base/RCTUtils.m @@ -577,6 +577,13 @@ BOOL RCTRunningInAppExtension(void) continue; } + #if TARGET_OS_VISION + /// Presenting scenes over Immersive Spaces leads to crash: "Presentations are not permitted within volumetric window scenes." + if (scene.session.role == UISceneSessionRoleImmersiveSpaceApplication) { + continue; + } +#endif + if (scene.activationState == UISceneActivationStateForegroundActive) { foregroundActiveScene = scene; break; diff --git a/packages/react-native/index.js b/packages/react-native/index.js index fc5fbe58e63eda..ed31324efdd00c 100644 --- a/packages/react-native/index.js +++ b/packages/react-native/index.js @@ -92,6 +92,7 @@ import typeof Platform from './Libraries/Utilities/Platform'; import typeof useColorScheme from './Libraries/Utilities/useColorScheme'; import typeof useWindowDimensions from './Libraries/Utilities/useWindowDimensions'; import typeof Vibration from './Libraries/Vibration/Vibration'; +import typeof XR from './Libraries/XR/XR'; import typeof YellowBox from './Libraries/YellowBox/YellowBoxDeprecated'; const warnOnce = require('./Libraries/Utilities/warnOnce'); @@ -302,6 +303,9 @@ module.exports = { get Share(): Share { return require('./Libraries/Share/Share'); }, + get XR(): XR { + return require('./Libraries/XR/XR'); + }, get StyleSheet(): StyleSheet { return require('./Libraries/StyleSheet/StyleSheet'); }, diff --git a/packages/react-native/package.json b/packages/react-native/package.json index b59de4f84c140f..b2fe163b813590 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -158,6 +158,13 @@ "android": {}, "jsSrcsDir": "src" }, + { + "name": "FBReactNativeSpec_visionOS", + "type": "modules", + "ios": {}, + "android": {}, + "jsSrcsDir": "src/private/specs/visionos_modules" + }, { "name": "rncore", "type": "components", diff --git a/packages/react-native/scripts/cocoapods/utils.rb b/packages/react-native/scripts/cocoapods/utils.rb index 480818ec16ea22..efa8e5ee5185e3 100644 --- a/packages/react-native/scripts/cocoapods/utils.rb +++ b/packages/react-native/scripts/cocoapods/utils.rb @@ -648,6 +648,7 @@ def self.react_native_pods "glog", "hermes-engine", "React-hermes", + "React-RCTXR", # visionOS ] end diff --git a/packages/react-native/scripts/react_native_pods.rb b/packages/react-native/scripts/react_native_pods.rb index f04a6fa2ecb30c..dc24b1215c042e 100644 --- a/packages/react-native/scripts/react_native_pods.rb +++ b/packages/react-native/scripts/react_native_pods.rb @@ -135,6 +135,7 @@ def use_react_native! ( pod 'React-nativeconfig', :path => "#{prefix}/ReactCommon" pod 'RCTDeprecation', :path => "#{prefix}/ReactApple/Libraries/RCTFoundation/RCTDeprecation" pod 'React-RCTSwiftExtensions', :path => "#{prefix}/Libraries/SwiftExtensions" + pod 'React-RCTXR', :path => "#{prefix}/Libraries/XR" if hermes_enabled setup_hermes!(:react_native_path => prefix) diff --git a/packages/react-native/src/private/specs/visionos_modules/NativeXRModule.js b/packages/react-native/src/private/specs/visionos_modules/NativeXRModule.js new file mode 100644 index 00000000000000..ce8d22dca68c49 --- /dev/null +++ b/packages/react-native/src/private/specs/visionos_modules/NativeXRModule.js @@ -0,0 +1,21 @@ +/** + * @flow strict + * @format + */ + +import type {TurboModule} from '../../../../Libraries/TurboModule/RCTExport'; + +import * as TurboModuleRegistry from '../../../../Libraries/TurboModule/TurboModuleRegistry'; + +export type XRModuleConstants = {| + +supportsMultipleScenes?: boolean, +|}; + +export interface Spec extends TurboModule { + +getConstants: () => XRModuleConstants; + + +requestSession: (sessionId?: string) => Promise; + +endSession: () => Promise; +} + +export default (TurboModuleRegistry.get('XRModule'): ?Spec); diff --git a/packages/react-native/types/index.d.ts b/packages/react-native/types/index.d.ts index 5aeec0685ed009..917b5cc65d098d 100644 --- a/packages/react-native/types/index.d.ts +++ b/packages/react-native/types/index.d.ts @@ -147,6 +147,7 @@ export * from '../Libraries/Utilities/Dimensions'; export * from '../Libraries/Utilities/PixelRatio'; export * from '../Libraries/Utilities/Platform'; export * from '../Libraries/Vibration/Vibration'; +export * from '../Libraries/XR/XR'; export * from '../Libraries/YellowBox/YellowBoxDeprecated'; export * from '../Libraries/vendor/core/ErrorUtils'; export { diff --git a/packages/rn-tester/Podfile.lock b/packages/rn-tester/Podfile.lock index c7fae7bb358f0c..34a9164eaa10fc 100644 --- a/packages/rn-tester/Podfile.lock +++ b/packages/rn-tester/Podfile.lock @@ -5,12 +5,10 @@ PODS: - fmt (9.1.0) - glog (0.3.5) - hermes-engine (1000.0.0): - - hermes-engine/cdp (= 1000.0.0) - hermes-engine/Hermes (= 1000.0.0) - hermes-engine/inspector (= 1000.0.0) - hermes-engine/inspector_chrome (= 1000.0.0) - hermes-engine/Public (= 1000.0.0) - - hermes-engine/cdp (1000.0.0) - hermes-engine/Hermes (1000.0.0) - hermes-engine/inspector (1000.0.0) - hermes-engine/inspector_chrome (1000.0.0) @@ -22,17 +20,16 @@ PODS: - RCT-Folly (= 2024.01.01.00) - RCTRequired - RCTTypeSafety + - React-Codegen - React-Core - React-debug - React-Fabric - - React-featureflags - React-graphics - React-ImageManager - React-NativeModulesApple - React-RCTFabric - React-rendererdebug - React-utils - - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga @@ -65,17 +62,16 @@ PODS: - RCT-Folly (= 2024.01.01.00) - RCTRequired - RCTTypeSafety + - React-Codegen - React-Core - React-debug - React-Fabric - - React-featureflags - React-graphics - React-ImageManager - React-NativeModulesApple - React-RCTFabric - React-rendererdebug - React-utils - - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga @@ -114,9 +110,27 @@ PODS: - React-RCTSettings (= 1000.0.0) - React-RCTText (= 1000.0.0) - React-RCTVibration (= 1000.0.0) - - React-RCTWindowManager (= 1000.0.0) - React-RCTXR (= 1000.0.0) - React-callinvoker (1000.0.0) + - React-Codegen (1000.0.0): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-FabricImage + - React-graphics + - React-jsi + - React-jsiexecutor + - React-NativeModulesApple + - React-rendererdebug + - React-utils + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core - React-Core (1000.0.0): - glog - hermes-engine @@ -124,11 +138,9 @@ PODS: - RCTDeprecation - React-Core/Default (= 1000.0.0) - React-cxxreact - - React-featureflags - React-hermes - React-jsi - React-jsiexecutor - - React-jsinspector - React-perflogger - React-runtimescheduler - React-utils @@ -141,11 +153,9 @@ PODS: - RCTDeprecation - React-Core/Default - React-cxxreact - - React-featureflags - React-hermes - React-jsi - React-jsiexecutor - - React-jsinspector - React-perflogger - React-runtimescheduler - React-utils @@ -157,11 +167,10 @@ PODS: - RCT-Folly (= 2024.01.01.00) - RCTDeprecation - React-cxxreact - - React-featureflags - React-hermes - React-jsi - React-jsiexecutor - - React-jsinspector + - React-jsinspector (= 1000.0.0) - React-perflogger - React-runtimescheduler - React-utils @@ -175,11 +184,10 @@ PODS: - React-Core/Default (= 1000.0.0) - React-Core/RCTWebSocket (= 1000.0.0) - React-cxxreact - - React-featureflags - React-hermes - React-jsi - React-jsiexecutor - - React-jsinspector + - React-jsinspector (= 1000.0.0) - React-perflogger - React-runtimescheduler - React-utils @@ -192,11 +200,9 @@ PODS: - RCTDeprecation - React-Core/Default - React-cxxreact - - React-featureflags - React-hermes - React-jsi - React-jsiexecutor - - React-jsinspector - React-perflogger - React-runtimescheduler - React-utils @@ -209,11 +215,9 @@ PODS: - RCTDeprecation - React-Core/Default - React-cxxreact - - React-featureflags - React-hermes - React-jsi - React-jsiexecutor - - React-jsinspector - React-perflogger - React-runtimescheduler - React-utils @@ -226,11 +230,9 @@ PODS: - RCTDeprecation - React-Core/Default - React-cxxreact - - React-featureflags - React-hermes - React-jsi - React-jsiexecutor - - React-jsinspector - React-perflogger - React-runtimescheduler - React-utils @@ -243,11 +245,9 @@ PODS: - RCTDeprecation - React-Core/Default - React-cxxreact - - React-featureflags - React-hermes - React-jsi - React-jsiexecutor - - React-jsinspector - React-perflogger - React-runtimescheduler - React-utils @@ -260,11 +260,9 @@ PODS: - RCTDeprecation - React-Core/Default - React-cxxreact - - React-featureflags - React-hermes - React-jsi - React-jsiexecutor - - React-jsinspector - React-perflogger - React-runtimescheduler - React-utils @@ -277,11 +275,9 @@ PODS: - RCTDeprecation - React-Core/Default - React-cxxreact - - React-featureflags - React-hermes - React-jsi - React-jsiexecutor - - React-jsinspector - React-perflogger - React-runtimescheduler - React-utils @@ -294,11 +290,9 @@ PODS: - RCTDeprecation - React-Core/Default - React-cxxreact - - React-featureflags - React-hermes - React-jsi - React-jsiexecutor - - React-jsinspector - React-perflogger - React-runtimescheduler - React-utils @@ -311,11 +305,9 @@ PODS: - RCTDeprecation - React-Core/Default - React-cxxreact - - React-featureflags - React-hermes - React-jsi - React-jsiexecutor - - React-jsinspector - React-perflogger - React-runtimescheduler - React-utils @@ -328,11 +320,9 @@ PODS: - RCTDeprecation - React-Core/Default - React-cxxreact - - React-featureflags - React-hermes - React-jsi - React-jsiexecutor - - React-jsinspector - React-perflogger - React-runtimescheduler - React-utils @@ -345,11 +335,9 @@ PODS: - RCTDeprecation - React-Core/Default - React-cxxreact - - React-featureflags - React-hermes - React-jsi - React-jsiexecutor - - React-jsinspector - React-perflogger - React-runtimescheduler - React-utils @@ -362,7 +350,6 @@ PODS: - RCTDeprecation - React-Core/Default (= 1000.0.0) - React-cxxreact - - React-featureflags - React-hermes - React-jsi - React-jsiexecutor @@ -373,17 +360,14 @@ PODS: - SocketRocket (= 0.7.1) - Yoga - React-CoreModules (1000.0.0): - - DoubleConversion - - fmt (= 9.1.0) - RCT-Folly (= 2024.01.01.00) - RCTTypeSafety (= 1000.0.0) + - React-Codegen - React-Core/CoreModulesHeaders (= 1000.0.0) - React-jsi (= 1000.0.0) - - React-jsinspector - React-NativeModulesApple - React-RCTBlob - React-RCTImage (= 1000.0.0) - - ReactCodegen - ReactCommon - SocketRocket (= 0.7.1) - React-cxxreact (1000.0.0): @@ -396,7 +380,7 @@ PODS: - React-callinvoker (= 1000.0.0) - React-debug (= 1000.0.0) - React-jsi (= 1000.0.0) - - React-jsinspector + - React-jsinspector (= 1000.0.0) - React-logger (= 1000.0.0) - React-perflogger (= 1000.0.0) - React-runtimeexecutor (= 1000.0.0) @@ -475,7 +459,6 @@ PODS: - React-Fabric/telemetry (= 1000.0.0) - React-Fabric/templateprocessor (= 1000.0.0) - React-Fabric/uimanager (= 1000.0.0) - - React-featureflags - React-graphics - React-jsi - React-jsiexecutor @@ -495,7 +478,6 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-featureflags - React-graphics - React-jsi - React-jsiexecutor @@ -515,7 +497,6 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-featureflags - React-graphics - React-jsi - React-jsiexecutor @@ -535,7 +516,6 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-featureflags - React-graphics - React-jsi - React-jsiexecutor @@ -555,7 +535,6 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-featureflags - React-graphics - React-jsi - React-jsiexecutor @@ -578,7 +557,6 @@ PODS: - React-Fabric/components/legacyviewmanagerinterop (= 1000.0.0) - React-Fabric/components/root (= 1000.0.0) - React-Fabric/components/view (= 1000.0.0) - - React-featureflags - React-graphics - React-jsi - React-jsiexecutor @@ -598,7 +576,6 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-featureflags - React-graphics - React-jsi - React-jsiexecutor @@ -618,7 +595,6 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-featureflags - React-graphics - React-jsi - React-jsiexecutor @@ -638,7 +614,6 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-featureflags - React-graphics - React-jsi - React-jsiexecutor @@ -659,7 +634,6 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-featureflags - React-graphics - React-jsi - React-jsiexecutor @@ -699,7 +673,6 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-featureflags - React-graphics - React-jsi - React-jsiexecutor @@ -719,7 +692,6 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-featureflags - React-graphics - React-jsi - React-jsiexecutor @@ -739,7 +711,6 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-featureflags - React-graphics - React-jsi - React-jsiexecutor @@ -780,7 +751,6 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-featureflags - React-graphics - React-jsi - React-jsiexecutor @@ -822,7 +792,6 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-featureflags - React-graphics - React-jsi - React-jsiexecutor @@ -842,7 +811,6 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-featureflags - React-graphics - React-jsi - React-jsiexecutor @@ -1199,35 +1167,10 @@ PODS: - React-utils - ReactCommon - Yoga - - React-featureflags (1000.0.0) - - React-featureflagsnativemodule (1000.0.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - React-graphics (1000.0.0): - - DoubleConversion - - fmt (= 9.1.0) - glog - RCT-Folly/Fabric (= 2024.01.01.00) - - React-jsi - - React-jsiexecutor + - React-Core/Default (= 1000.0.0) - React-utils - React-hermes (1000.0.0): - DoubleConversion @@ -1238,7 +1181,7 @@ PODS: - React-cxxreact (= 1000.0.0) - React-jsi - React-jsiexecutor (= 1000.0.0) - - React-jsinspector + - React-jsinspector (= 1000.0.0) - React-perflogger (= 1000.0.0) - React-runtimeexecutor - React-idlecallbacksnativemodule (1000.0.0): @@ -1294,12 +1237,10 @@ PODS: - RCT-Folly (= 2024.01.01.00) - React-cxxreact (= 1000.0.0) - React-jsi (= 1000.0.0) - - React-jsinspector - React-perflogger (= 1000.0.0) - React-jsinspector (1000.0.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly (= 2024.01.01.00) - React-featureflags - React-jsi @@ -1312,27 +1253,6 @@ PODS: - React-Mapbuffer (1000.0.0): - glog - React-debug - - React-microtasksnativemodule (1000.0.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - React-nativeconfig (1000.0.0) - React-NativeModulesApple (1000.0.0): - glog @@ -1341,7 +1261,6 @@ PODS: - React-Core - React-cxxreact - React-jsi - - React-jsinspector - React-runtimeexecutor - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core @@ -1357,10 +1276,10 @@ PODS: - React-RCTAnimation (1000.0.0): - RCT-Folly (= 2024.01.01.00) - RCTTypeSafety + - React-Codegen - React-Core/RCTAnimationHeaders - React-jsi - React-NativeModulesApple - - ReactCodegen - ReactCommon - React-RCTAppDelegate (1000.0.0): - RCT-Folly (= 2024.01.01.00) @@ -1385,20 +1304,16 @@ PODS: - React-RuntimeHermes - React-runtimescheduler - React-utils - - ReactCodegen - ReactCommon - React-RCTBlob (1000.0.0): - - DoubleConversion - - fmt (= 9.1.0) - hermes-engine - RCT-Folly (= 2024.01.01.00) + - React-Codegen - React-Core/RCTBlobHeaders - React-Core/RCTWebSocket - React-jsi - - React-jsinspector - React-NativeModulesApple - React-RCTNetwork - - ReactCodegen - ReactCommon - React-RCTFabric (1000.0.0): - glog @@ -1409,11 +1324,9 @@ PODS: - React-Fabric - React-FabricComponents - React-FabricImage - - React-featureflags - React-graphics - React-ImageManager - React-jsi - - React-jsinspector - React-nativeconfig - React-performancetimeline - React-RCTImage @@ -1426,45 +1339,44 @@ PODS: - React-RCTImage (1000.0.0): - RCT-Folly (= 2024.01.01.00) - RCTTypeSafety + - React-Codegen - React-Core/RCTImageHeaders - React-jsi - React-NativeModulesApple - React-RCTNetwork - - ReactCodegen - ReactCommon - React-RCTLinking (1000.0.0): + - React-Codegen - React-Core/RCTLinkingHeaders (= 1000.0.0) - React-jsi (= 1000.0.0) - React-NativeModulesApple - - ReactCodegen - ReactCommon - ReactCommon/turbomodule/core (= 1000.0.0) - React-RCTNetwork (1000.0.0): - RCT-Folly (= 2024.01.01.00) - RCTTypeSafety + - React-Codegen - React-Core/RCTNetworkHeaders - React-jsi - React-NativeModulesApple - - ReactCodegen - ReactCommon - React-RCTPushNotification (1000.0.0): - RCTTypeSafety + - React-Codegen - React-Core/RCTPushNotificationHeaders - React-jsi - React-NativeModulesApple - - ReactCodegen - ReactCommon - React-RCTSettings (1000.0.0): - RCT-Folly (= 2024.01.01.00) - RCTTypeSafety + - React-Codegen - React-Core/RCTSettingsHeaders - React-jsi - React-NativeModulesApple - - ReactCodegen - ReactCommon - React-RCTSwiftExtensions (1000.0.0): - React-Core - - React-RCTWindowManager - React-RCTXR - React-RCTTest (1000.0.0): - RCT-Folly (= 2024.01.01.00) @@ -1477,6 +1389,7 @@ PODS: - Yoga - React-RCTVibration (1000.0.0): - RCT-Folly (= 2024.01.01.00) + - React-Codegen - React-Core/RCTVibrationHeaders - React-jsi - React-NativeModulesApple @@ -1529,7 +1442,6 @@ PODS: - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - React-cxxreact - - React-featureflags - React-jserrorhandler - React-jsi - React-jsiexecutor @@ -1543,10 +1455,7 @@ PODS: - React-RuntimeHermes (1000.0.0): - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - - React-featureflags - - React-hermes - React-jsi - - React-jsinspector - React-jsitracing - React-nativeconfig - React-RuntimeCore @@ -1558,7 +1467,6 @@ PODS: - React-callinvoker - React-cxxreact - React-debug - - React-featureflags - React-jsi - React-performancetimeline - React-rendererconsistency @@ -1569,42 +1477,21 @@ PODS: - React-timing (1000.0.0) - React-utils (1000.0.0): - glog - - hermes-engine - RCT-Folly (= 2024.01.01.00) - React-debug - - React-jsi (= 1000.0.0) - - ReactCodegen (1000.0.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-FabricImage - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-NativeModulesApple - - React-rendererdebug - - React-utils - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - ReactCommon (1000.0.0): + - React-logger (= 1000.0.0) - ReactCommon/turbomodule (= 1000.0.0) - ReactCommon-Samples (1000.0.0): - DoubleConversion - fmt (= 9.1.0) - hermes-engine - RCT-Folly + - React-Codegen - React-Core - React-cxxreact - React-jsi - React-NativeModulesApple - - ReactCodegen - ReactCommon - ReactCommon/turbomodule (1000.0.0): - DoubleConversion @@ -1639,7 +1526,6 @@ PODS: - React-callinvoker (= 1000.0.0) - React-cxxreact (= 1000.0.0) - React-debug (= 1000.0.0) - - React-featureflags (= 1000.0.0) - React-jsi (= 1000.0.0) - React-logger (= 1000.0.0) - React-perflogger (= 1000.0.0) @@ -1651,17 +1537,16 @@ PODS: - RCT-Folly (= 2024.01.01.00) - RCTRequired - RCTTypeSafety + - React-Codegen - React-Core - React-debug - React-Fabric - - React-featureflags - React-graphics - React-ImageManager - React-NativeModulesApple - React-RCTFabric - React-rendererdebug - React-utils - - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga @@ -1686,6 +1571,7 @@ DEPENDENCIES: - RCTTypeSafety (from `../react-native/Libraries/TypeSafety`) - React (from `../react-native/`) - React-callinvoker (from `../react-native/ReactCommon/callinvoker`) + - React-Codegen (from `build/generated/ios`) - React-Core (from `../react-native/`) - React-Core/RCTWebSocket (from `../react-native/`) - React-CoreModules (from `../react-native/React/CoreModules`) @@ -1696,8 +1582,6 @@ DEPENDENCIES: - React-Fabric (from `../react-native/ReactCommon`) - React-FabricComponents (from `../react-native/ReactCommon`) - React-FabricImage (from `../react-native/ReactCommon`) - - React-featureflags (from `../react-native/ReactCommon/react/featureflags`) - - React-featureflagsnativemodule (from `../react-native/ReactCommon/react/nativemodule/featureflags`) - React-graphics (from `../react-native/ReactCommon/react/renderer/graphics`) - React-hermes (from `../react-native/ReactCommon/hermes`) - React-idlecallbacksnativemodule (from `../react-native/ReactCommon/react/nativemodule/idlecallbacks`) @@ -1709,7 +1593,6 @@ DEPENDENCIES: - React-jsitracing (from `../react-native/ReactCommon/hermes/executor/`) - React-logger (from `../react-native/ReactCommon/logger`) - React-Mapbuffer (from `../react-native/ReactCommon`) - - React-microtasksnativemodule (from `../react-native/ReactCommon/react/nativemodule/microtasks`) - React-nativeconfig (from `../react-native/ReactCommon`) - React-NativeModulesApple (from `../react-native/ReactCommon/react/nativemodule/core/platform/ios`) - React-perflogger (from `../react-native/ReactCommon/reactperflogger`) @@ -1740,7 +1623,6 @@ DEPENDENCIES: - React-runtimescheduler (from `../react-native/ReactCommon/react/renderer/runtimescheduler`) - React-timing (from `../react-native/ReactCommon/react/timing`) - React-utils (from `../react-native/ReactCommon/react/utils`) - - ReactCodegen (from `build/generated/ios`) - ReactCommon-Samples (from `../react-native/ReactCommon/react/nativemodule/samples`) - ReactCommon/turbomodule/core (from `../react-native/ReactCommon`) - ScreenshotManager (from `NativeModuleExample`) @@ -1779,6 +1661,8 @@ EXTERNAL SOURCES: :path: "../react-native/" React-callinvoker: :path: "../react-native/ReactCommon/callinvoker" + React-Codegen: + :path: build/generated/ios React-Core: :path: "../react-native/" React-CoreModules: @@ -1797,10 +1681,6 @@ EXTERNAL SOURCES: :path: "../react-native/ReactCommon" React-FabricImage: :path: "../react-native/ReactCommon" - React-featureflags: - :path: "../react-native/ReactCommon/react/featureflags" - React-featureflagsnativemodule: - :path: "../react-native/ReactCommon/react/nativemodule/featureflags" React-graphics: :path: "../react-native/ReactCommon/react/renderer/graphics" React-hermes: @@ -1823,8 +1703,6 @@ EXTERNAL SOURCES: :path: "../react-native/ReactCommon/logger" React-Mapbuffer: :path: "../react-native/ReactCommon" - React-microtasksnativemodule: - :path: "../react-native/ReactCommon/react/nativemodule/microtasks" React-nativeconfig: :path: "../react-native/ReactCommon" React-NativeModulesApple: @@ -1885,8 +1763,6 @@ EXTERNAL SOURCES: :path: "../react-native/ReactCommon/react/timing" React-utils: :path: "../react-native/ReactCommon/react/utils" - ReactCodegen: - :path: build/generated/ios ReactCommon: :path: "../react-native/ReactCommon" ReactCommon-Samples: diff --git a/packages/rn-tester/RNTester-visionOS/App.swift b/packages/rn-tester/RNTester-visionOS/App.swift index 39224b803cce1b..8e28482981e8a6 100644 --- a/packages/rn-tester/RNTester-visionOS/App.swift +++ b/packages/rn-tester/RNTester-visionOS/App.swift @@ -5,8 +5,11 @@ import React_RCTSwiftExtensions @main struct RNTesterApp: App { @UIApplicationDelegateAdaptor var delegate: AppDelegate + @State private var immersionLevel: ImmersionStyle = .full var body: some Scene { RCTMainWindow(moduleName: "RNTesterApp") + ImmersiveSpace(id: "TestImmersiveSpace") {} + .immersionStyle(selection: $immersionLevel, in: .mixed, .progressive, .full) } } diff --git a/packages/rn-tester/RNTester-visionOS/Info.plist b/packages/rn-tester/RNTester-visionOS/Info.plist index 940d4ef45518db..20f75e2afa73d1 100644 --- a/packages/rn-tester/RNTester-visionOS/Info.plist +++ b/packages/rn-tester/RNTester-visionOS/Info.plist @@ -7,7 +7,7 @@ UIApplicationPreferredDefaultSceneSessionRole UIWindowSceneSessionRoleApplication UIApplicationSupportsMultipleScenes - + UISceneConfigurations diff --git a/packages/rn-tester/js/examples/XR/XRExample.js b/packages/rn-tester/js/examples/XR/XRExample.js new file mode 100644 index 00000000000000..b9bd48e3f5c2c3 --- /dev/null +++ b/packages/rn-tester/js/examples/XR/XRExample.js @@ -0,0 +1,71 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + * @flow + */ + +'use strict'; + +const {XR} = require('@callstack/react-native-visionos'); +const React = require('react'); +const {Alert, Button, StyleSheet, Text, View} = require('react-native'); + +const OpenXRSession = () => { + const [isOpen, setIsOpen] = React.useState(false); + + const openXRSession = async () => { + try { + if (!XR.supportsMultipleScenes) { + Alert.alert('Error', 'Multiple scenes are not supported'); + return; + } + await XR.requestSession('TestImmersiveSpace'); + setIsOpen(true); + } catch (e) { + Alert.alert('Error', e.message); + setIsOpen(false); + } + }; + + const closeXRSession = async () => { + if (isOpen) { + await XR.endSession(); + } + }; + + return ( + + Is XR session open: {isOpen} +