diff --git a/.changeset/social-seas-see.md b/.changeset/social-seas-see.md new file mode 100644 index 00000000..7402a991 --- /dev/null +++ b/.changeset/social-seas-see.md @@ -0,0 +1,5 @@ +--- +'@callstack/react-native-brownfield': minor +--- + +feat(ios): add bundleURL provider for dynamic bundle loading diff --git a/docs/docs/docs/api-reference/react-native-brownfield/swift.mdx b/docs/docs/docs/api-reference/react-native-brownfield/swift.mdx index db1cd2da..a787050d 100644 --- a/docs/docs/docs/api-reference/react-native-brownfield/swift.mdx +++ b/docs/docs/docs/api-reference/react-native-brownfield/swift.mdx @@ -28,12 +28,13 @@ ReactNativeBrownfield.shared #### Properties -| Property | Type | Default | Description | -| ------------------ | --------- | --------------- | --------------------------------------------------------- | -| `entryFile` | `String` | `index` | Path to JavaScript root. | -| `fallbackResource` | `String?` | `nil` | Path to bundle fallback resource. | -| `bundlePath` | `String` | `main.jsbundle` | Path to bundle fallback resource. | -| `bundle` | `Bundle` | `Bundle.main` | Bundle instance to lookup the JavaScript bundle resource. | +| Property | Type | Default | Description | +| ------------------- | ------------------ | --------------- | --------------------------------------------------------------------------------------------- | +| `entryFile` | `String` | `index` | Path to JavaScript root. | +| `fallbackResource` | `String?` | `nil` | Path to bundle fallback resource. | +| `bundlePath` | `String` | `main.jsbundle` | Path to bundle fallback resource. | +| `bundle` | `Bundle` | `Bundle.main` | Bundle instance to lookup the JavaScript bundle resource. | +| `bundleURLOverride` | `(() -> URL?)?` | `nil` | Dynamic bundle URL provider called on every bundle load. When set, overrides default behavior. | --- diff --git a/packages/react-native-brownfield/ios/ReactNativeBrownfield.swift b/packages/react-native-brownfield/ios/ReactNativeBrownfield.swift index d52b5b2a..046e1cd9 100644 --- a/packages/react-native-brownfield/ios/ReactNativeBrownfield.swift +++ b/packages/react-native-brownfield/ios/ReactNativeBrownfield.swift @@ -7,6 +7,7 @@ class ReactNativeBrownfieldDelegate: RCTDefaultReactNativeFactoryDelegate { var entryFile = "index" var bundlePath = "main.jsbundle" var bundle = Bundle.main + var bundleURLOverride: (() -> URL?)? = nil // MARK: - RCTReactNativeFactoryDelegate Methods override func sourceURL(for bridge: RCTBridge) -> URL? { @@ -14,6 +15,10 @@ class ReactNativeBrownfieldDelegate: RCTDefaultReactNativeFactoryDelegate { } public override func bundleURL() -> URL? { + if let bundleURLProvider = bundleURLOverride { + return bundleURLProvider() + } + #if DEBUG return RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: entryFile) #else @@ -64,6 +69,17 @@ class ReactNativeBrownfieldDelegate: RCTDefaultReactNativeFactoryDelegate { delegate.bundle = bundle } } + /** + * Dynamic bundle URL provider called on every bundle load. + * When set, this overrides the default bundleURL() behavior in the delegate. + * Returns a URL to load a custom bundle, or nil to use default behavior. + * Default value: nil + */ + @objc public var bundleURLOverride: (() -> URL?)? = nil { + didSet { + delegate.bundleURLOverride = bundleURLOverride + } + } /** * React Native factory instance created when starting React Native. * Default value: nil