@bluebillywig/react-native-bb-player 8.47.0 → 8.47.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -78,6 +78,7 @@ repositories {
78
78
  }
79
79
  }
80
80
 
81
+
81
82
  dependencies {
82
83
  // React Native
83
84
  implementation 'com.facebook.react:react-android'
@@ -1,5 +1,5 @@
1
1
  import UIKit
2
- import GoogleCast
2
+ @preconcurrency import GoogleCast
3
3
 
4
4
  class BBCastButtonView: UIView {
5
5
  private var castButton: GCKUICastButton?
@@ -1,7 +1,7 @@
1
- import React
1
+ @preconcurrency import React
2
2
 
3
3
  @objc(BBCastButtonViewManager)
4
- class BBCastButtonViewManager: RCTViewManager {
4
+ class BBCastButtonViewManager: RCTViewManager, @unchecked Sendable {
5
5
  override func view() -> UIView! {
6
6
  return BBCastButtonView()
7
7
  }
@@ -1,5 +1,5 @@
1
1
  import UIKit
2
- import GoogleCast
2
+ @preconcurrency import GoogleCast
3
3
 
4
4
  class BBCastMiniControlsView: UIView {
5
5
  private var miniControlsViewController: GCKUIMiniMediaControlsViewController?
@@ -1,7 +1,7 @@
1
- import React
1
+ @preconcurrency import React
2
2
 
3
3
  @objc(BBCastMiniControlsViewManager)
4
- class BBCastMiniControlsViewManager: RCTViewManager {
4
+ class BBCastMiniControlsViewManager: RCTViewManager, @unchecked Sendable {
5
5
  override func view() -> UIView! {
6
6
  return BBCastMiniControlsView()
7
7
  }
@@ -1,5 +1,5 @@
1
1
  import Foundation
2
- import bbnativeshared
2
+ @preconcurrency import bbnativeshared
3
3
 
4
4
  extension Project {
5
5
  func toDictionary() -> [String: Any?] {
@@ -1,13 +1,13 @@
1
1
  import Foundation
2
- import React
3
- import BBNativePlayerKit
2
+ @preconcurrency import React
3
+ @preconcurrency import BBNativePlayerKit
4
4
 
5
5
  /**
6
6
  * Global registry for BBPlayerView instances.
7
- * This is needed because the bridge.uiManager.view(forReactTag:) doesn't work
8
- * with the New Architecture (Fabric). Views register themselves when created.
7
+ * Needed because bridge.uiManager.view(forReactTag:) doesn't work
8
+ * with Fabric. Views register themselves when added to the window.
9
9
  */
10
- class BBPlayerViewRegistry: NSObject {
10
+ final class BBPlayerViewRegistry: NSObject, @unchecked Sendable {
11
11
  static let shared = BBPlayerViewRegistry()
12
12
 
13
13
  private var views: [Int: BBPlayerView] = [:]
@@ -41,10 +41,10 @@ class BBPlayerViewRegistry: NSObject {
41
41
  /**
42
42
  * Native Module for BBPlayer commands.
43
43
  * Extends RCTEventEmitter to support module-level events (modal player).
44
- * This module looks up BBPlayerView instances by their React tag and dispatches commands to them.
44
+ * Looks up BBPlayerView instances by React tag and dispatches commands.
45
45
  */
46
46
  @objc(BBPlayerModule)
47
- class BBPlayerModule: RCTEventEmitter {
47
+ class BBPlayerModule: RCTEventEmitter, @unchecked Sendable {
48
48
 
49
49
  private var modalPlayerView: BBNativePlayerView?
50
50
  private var modalDelegate: ModalPlayerDelegate?
@@ -79,150 +79,113 @@ class BBPlayerModule: RCTEventEmitter {
79
79
  hasListeners = false
80
80
  }
81
81
 
82
- // MARK: - Helper to get view by tag
82
+ // MARK: - Helpers
83
83
 
84
84
  private func getView(_ reactTag: NSNumber) -> BBPlayerView? {
85
- // First try the view registry (works with both old and new architecture)
86
85
  if let view = BBPlayerViewRegistry.shared.getView(tag: reactTag.intValue) {
87
86
  return view
88
87
  }
89
-
90
- // Fallback to bridge.uiManager for old architecture
91
88
  if let bridge = self.bridge {
92
89
  if let view = bridge.uiManager.view(forReactTag: reactTag) as? BBPlayerView {
93
90
  return view
94
91
  }
95
92
  }
96
-
97
93
  NSLog("BBPlayerModule: Could not find view with tag %@", reactTag)
98
94
  return nil
99
95
  }
100
96
 
97
+ /// Dispatch to main queue and enter @MainActor context.
98
+ private func onMainActor(_ work: @MainActor @Sendable @escaping () -> Void) {
99
+ DispatchQueue.main.async {
100
+ MainActor.assumeIsolated(work)
101
+ }
102
+ }
103
+
101
104
  // MARK: - Commands
102
105
 
103
106
  @objc func play(_ viewTag: NSNumber) {
104
- DispatchQueue.main.async {
105
- self.getView(viewTag)?.play()
106
- }
107
+ onMainActor { self.getView(viewTag)?.play() }
107
108
  }
108
109
 
109
110
  @objc func pause(_ viewTag: NSNumber) {
110
- DispatchQueue.main.async {
111
- self.getView(viewTag)?.pause()
112
- }
111
+ onMainActor { self.getView(viewTag)?.pause() }
113
112
  }
114
113
 
115
114
  @objc func seek(_ viewTag: NSNumber, position: NSNumber) {
116
- DispatchQueue.main.async {
117
- self.getView(viewTag)?.seek(position.intValue)
118
- }
115
+ onMainActor { self.getView(viewTag)?.seek(position.intValue) }
119
116
  }
120
117
 
121
118
  @objc func seekRelative(_ viewTag: NSNumber, offsetSeconds: NSNumber) {
122
- DispatchQueue.main.async {
123
- self.getView(viewTag)?.seekRelative(offsetSeconds.doubleValue)
124
- }
119
+ onMainActor { self.getView(viewTag)?.seekRelative(offsetSeconds.doubleValue) }
125
120
  }
126
121
 
127
122
  @objc func setMuted(_ viewTag: NSNumber, muted: Bool) {
128
- DispatchQueue.main.async {
129
- self.getView(viewTag)?.setMuted(muted)
130
- }
123
+ onMainActor { self.getView(viewTag)?.setMuted(muted) }
131
124
  }
132
125
 
133
126
  @objc func setVolume(_ viewTag: NSNumber, volume: NSNumber) {
134
- DispatchQueue.main.async {
135
- self.getView(viewTag)?.setVolume(volume.doubleValue)
136
- }
127
+ onMainActor { self.getView(viewTag)?.setVolume(volume.doubleValue) }
137
128
  }
138
129
 
139
130
  @objc func enterFullscreen(_ viewTag: NSNumber) {
140
- DispatchQueue.main.async {
141
- self.getView(viewTag)?.enterFullscreen()
142
- }
131
+ onMainActor { self.getView(viewTag)?.enterFullscreen() }
143
132
  }
144
133
 
145
134
  @objc func enterFullscreenLandscape(_ viewTag: NSNumber) {
146
- DispatchQueue.main.async {
147
- self.getView(viewTag)?.enterFullscreenLandscape()
148
- }
135
+ onMainActor { self.getView(viewTag)?.enterFullscreenLandscape() }
149
136
  }
150
137
 
151
138
  @objc func exitFullscreen(_ viewTag: NSNumber) {
152
- DispatchQueue.main.async {
153
- self.getView(viewTag)?.exitFullscreen()
154
- }
139
+ onMainActor { self.getView(viewTag)?.exitFullscreen() }
155
140
  }
156
141
 
157
142
  @objc func collapse(_ viewTag: NSNumber) {
158
- DispatchQueue.main.async {
159
- self.getView(viewTag)?.collapse()
160
- }
143
+ onMainActor { self.getView(viewTag)?.collapse() }
161
144
  }
162
145
 
163
146
  @objc func expand(_ viewTag: NSNumber) {
164
- DispatchQueue.main.async {
165
- self.getView(viewTag)?.expand()
166
- }
147
+ onMainActor { self.getView(viewTag)?.expand() }
167
148
  }
168
149
 
169
150
  @objc func autoPlayNextCancel(_ viewTag: NSNumber) {
170
- DispatchQueue.main.async {
171
- self.getView(viewTag)?.autoPlayNextCancel()
172
- }
151
+ onMainActor { self.getView(viewTag)?.autoPlayNextCancel() }
173
152
  }
174
153
 
175
154
  @objc func destroy(_ viewTag: NSNumber) {
176
- DispatchQueue.main.async {
177
- self.getView(viewTag)?.destroy()
178
- }
155
+ onMainActor { self.getView(viewTag)?.destroy() }
179
156
  }
180
157
 
181
158
  @objc func showCastPicker(_ viewTag: NSNumber) {
182
- DispatchQueue.main.async {
183
- self.getView(viewTag)?.showCastPicker()
184
- }
159
+ onMainActor { self.getView(viewTag)?.showCastPicker() }
185
160
  }
186
161
 
187
162
  @objc func loadWithClipId(_ viewTag: NSNumber, clipId: String?, initiator: String?, autoPlay: Bool, seekTo: NSNumber?, contextJson: String?) {
188
- DispatchQueue.main.async {
189
- self.getView(viewTag)?.loadWithClipId(clipId ?? "", initiator: initiator, autoPlay: autoPlay, seekTo: seekTo?.doubleValue, contextJson: contextJson)
190
- }
163
+ onMainActor { self.getView(viewTag)?.loadWithClipId(clipId ?? "", initiator: initiator, autoPlay: autoPlay, seekTo: seekTo?.doubleValue, contextJson: contextJson) }
191
164
  }
192
165
 
193
166
  @objc func loadWithClipListId(_ viewTag: NSNumber, clipListId: String?, initiator: String?, autoPlay: Bool, seekTo: NSNumber?, contextJson: String?) {
194
- DispatchQueue.main.async {
195
- self.getView(viewTag)?.loadWithClipListId(clipListId ?? "", initiator: initiator, autoPlay: autoPlay, seekTo: seekTo?.doubleValue, contextJson: contextJson)
196
- }
167
+ onMainActor { self.getView(viewTag)?.loadWithClipListId(clipListId ?? "", initiator: initiator, autoPlay: autoPlay, seekTo: seekTo?.doubleValue, contextJson: contextJson) }
197
168
  }
198
169
 
199
170
  @objc func loadWithProjectId(_ viewTag: NSNumber, projectId: String?, initiator: String?, autoPlay: Bool, seekTo: NSNumber?, contextJson: String?) {
200
- DispatchQueue.main.async {
201
- self.getView(viewTag)?.loadWithProjectId(projectId ?? "", initiator: initiator, autoPlay: autoPlay, seekTo: seekTo?.doubleValue, contextJson: contextJson)
202
- }
171
+ onMainActor { self.getView(viewTag)?.loadWithProjectId(projectId ?? "", initiator: initiator, autoPlay: autoPlay, seekTo: seekTo?.doubleValue, contextJson: contextJson) }
203
172
  }
204
173
 
205
174
  @objc func loadWithClipJson(_ viewTag: NSNumber, clipJson: String?, initiator: String?, autoPlay: Bool, seekTo: NSNumber?, contextJson: String?) {
206
- DispatchQueue.main.async {
207
- self.getView(viewTag)?.loadWithClipJson(clipJson ?? "", initiator: initiator, autoPlay: autoPlay, seekTo: seekTo?.doubleValue, contextJson: contextJson)
208
- }
175
+ onMainActor { self.getView(viewTag)?.loadWithClipJson(clipJson ?? "", initiator: initiator, autoPlay: autoPlay, seekTo: seekTo?.doubleValue, contextJson: contextJson) }
209
176
  }
210
177
 
211
178
  @objc func loadWithClipListJson(_ viewTag: NSNumber, clipListJson: String?, initiator: String?, autoPlay: Bool, seekTo: NSNumber?, contextJson: String?) {
212
- DispatchQueue.main.async {
213
- self.getView(viewTag)?.loadWithClipListJson(clipListJson ?? "", initiator: initiator, autoPlay: autoPlay, seekTo: seekTo?.doubleValue, contextJson: contextJson)
214
- }
179
+ onMainActor { self.getView(viewTag)?.loadWithClipListJson(clipListJson ?? "", initiator: initiator, autoPlay: autoPlay, seekTo: seekTo?.doubleValue, contextJson: contextJson) }
215
180
  }
216
181
 
217
182
  @objc func loadWithProjectJson(_ viewTag: NSNumber, projectJson: String?, initiator: String?, autoPlay: Bool, seekTo: NSNumber?, contextJson: String?) {
218
- DispatchQueue.main.async {
219
- self.getView(viewTag)?.loadWithProjectJson(projectJson ?? "", initiator: initiator, autoPlay: autoPlay, seekTo: seekTo?.doubleValue, contextJson: contextJson)
220
- }
183
+ onMainActor { self.getView(viewTag)?.loadWithProjectJson(projectJson ?? "", initiator: initiator, autoPlay: autoPlay, seekTo: seekTo?.doubleValue, contextJson: contextJson) }
221
184
  }
222
185
 
223
186
  @objc func loadWithJsonUrl(_ viewTag: NSNumber, jsonUrl: String?, autoPlay: Bool, contextJson: String?) {
224
187
  NSLog("BBPlayerModule.loadWithJsonUrl called - viewTag: %@, jsonUrl: %@, autoPlay: %d, context: %@", viewTag, jsonUrl ?? "nil", autoPlay, contextJson ?? "nil")
225
- DispatchQueue.main.async {
188
+ onMainActor {
226
189
  let view = self.getView(viewTag)
227
190
  NSLog("BBPlayerModule.loadWithJsonUrl - view found: %@", view != nil ? "YES" : "NO")
228
191
  if let view = view, let url = jsonUrl {
@@ -235,7 +198,7 @@ class BBPlayerModule: RCTEventEmitter {
235
198
  }
236
199
 
237
200
  @objc func loadWithContentIdAndType(_ viewTag: NSNumber, contentId: String?, contentType: String?, autoPlay: Bool, contextJson: String?) {
238
- DispatchQueue.main.async {
201
+ onMainActor {
239
202
  let view = self.getView(viewTag)
240
203
  guard let view = view, let id = contentId, let type = contentType else {
241
204
  NSLog("BBPlayerModule.loadWithContentIdAndType - FAILED: view=%@, id=%@, type=%@",
@@ -247,101 +210,77 @@ class BBPlayerModule: RCTEventEmitter {
247
210
  }
248
211
 
249
212
  // MARK: - Getter methods with Promise support
213
+ // Note: nonisolated(unsafe) on resolver because RCTPromiseResolveBlock is a
214
+ // non-Sendable ObjC block, but RN guarantees safe cross-thread usage.
250
215
 
251
216
  @objc func getDuration(_ viewTag: NSNumber, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
252
- DispatchQueue.main.async {
253
- let duration = self.getView(viewTag)?.duration()
254
- resolver(duration)
255
- }
217
+ nonisolated(unsafe) let resolve = resolver
218
+ onMainActor { resolve(self.getView(viewTag)?.duration()) }
256
219
  }
257
220
 
258
221
  @objc func getMuted(_ viewTag: NSNumber, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
259
- DispatchQueue.main.async {
260
- let muted = self.getView(viewTag)?.muted()
261
- resolver(muted)
262
- }
222
+ nonisolated(unsafe) let resolve = resolver
223
+ onMainActor { resolve(self.getView(viewTag)?.muted()) }
263
224
  }
264
225
 
265
226
  @objc func getVolume(_ viewTag: NSNumber, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
266
- DispatchQueue.main.async {
267
- let volume = self.getView(viewTag)?.volume()
268
- resolver(volume)
269
- }
227
+ nonisolated(unsafe) let resolve = resolver
228
+ onMainActor { resolve(self.getView(viewTag)?.volume()) }
270
229
  }
271
230
 
272
231
  @objc func getPhase(_ viewTag: NSNumber, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
273
- DispatchQueue.main.async {
274
- let phase = self.getView(viewTag)?.phase()
275
- resolver(phase)
276
- }
232
+ nonisolated(unsafe) let resolve = resolver
233
+ onMainActor { resolve(self.getView(viewTag)?.phase()) }
277
234
  }
278
235
 
279
236
  @objc func getState(_ viewTag: NSNumber, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
280
- DispatchQueue.main.async {
281
- let state = self.getView(viewTag)?.state()
282
- resolver(state)
283
- }
237
+ nonisolated(unsafe) let resolve = resolver
238
+ onMainActor { resolve(self.getView(viewTag)?.state()) }
284
239
  }
285
240
 
286
241
  @objc func getMode(_ viewTag: NSNumber, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
287
- DispatchQueue.main.async {
288
- let mode = self.getView(viewTag)?.mode()
289
- resolver(mode)
290
- }
242
+ nonisolated(unsafe) let resolve = resolver
243
+ onMainActor { resolve(self.getView(viewTag)?.mode()) }
291
244
  }
292
245
 
293
246
  @objc func getClipData(_ viewTag: NSNumber, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
294
- DispatchQueue.main.async {
295
- let clipData = self.getView(viewTag)?.clipData()
296
- resolver(clipData)
297
- }
247
+ nonisolated(unsafe) let resolve = resolver
248
+ onMainActor { resolve(self.getView(viewTag)?.clipData()) }
298
249
  }
299
250
 
300
251
  @objc func getProjectData(_ viewTag: NSNumber, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
301
- DispatchQueue.main.async {
302
- let projectData = self.getView(viewTag)?.projectData()
303
- resolver(projectData)
304
- }
252
+ nonisolated(unsafe) let resolve = resolver
253
+ onMainActor { resolve(self.getView(viewTag)?.projectData()) }
305
254
  }
306
255
 
307
256
  @objc func getPlayoutData(_ viewTag: NSNumber, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
308
- DispatchQueue.main.async {
309
- let playoutData = self.getView(viewTag)?.playoutData()
310
- resolver(playoutData)
311
- }
257
+ nonisolated(unsafe) let resolve = resolver
258
+ onMainActor { resolve(self.getView(viewTag)?.playoutData()) }
312
259
  }
313
260
 
314
261
  @objc func setInView(_ viewTag: NSNumber, inView: Bool) {
315
- DispatchQueue.main.async {
316
- self.getView(viewTag)?.setInView(inView)
317
- }
262
+ onMainActor { self.getView(viewTag)?.setInView(inView) }
318
263
  }
319
264
 
320
265
  @objc func getInView(_ viewTag: NSNumber, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
321
- DispatchQueue.main.async {
322
- let inView = self.getView(viewTag)?.inView()
323
- resolver(inView)
324
- }
266
+ nonisolated(unsafe) let resolve = resolver
267
+ onMainActor { resolve(self.getView(viewTag)?.inView()) }
325
268
  }
326
269
 
327
270
  @objc func getAdMediaWidth(_ viewTag: NSNumber, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
328
- DispatchQueue.main.async {
329
- let width = self.getView(viewTag)?.adMediaWidth()
330
- resolver(width)
331
- }
271
+ nonisolated(unsafe) let resolve = resolver
272
+ onMainActor { resolve(self.getView(viewTag)?.adMediaWidth()) }
332
273
  }
333
274
 
334
275
  @objc func getAdMediaHeight(_ viewTag: NSNumber, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
335
- DispatchQueue.main.async {
336
- let height = self.getView(viewTag)?.adMediaHeight()
337
- resolver(height)
338
- }
276
+ nonisolated(unsafe) let resolve = resolver
277
+ onMainActor { resolve(self.getView(viewTag)?.adMediaHeight()) }
339
278
  }
340
279
 
341
280
  // MARK: - Modal Player API
342
281
 
343
282
  @objc func presentModalPlayer(_ jsonUrl: String, optionsJson: String?, contextJson: String?) {
344
- DispatchQueue.main.async {
283
+ onMainActor {
345
284
  // RCTPresentedViewController() can return nil with RCTReactNativeFactory (RN 0.83+).
346
285
  // Fallback to UIScene-based lookup to find the root view controller.
347
286
  guard let rootVC = RCTPresentedViewController()
@@ -371,14 +310,9 @@ class BBPlayerModule: RCTEventEmitter {
371
310
  }
372
311
  loadOptions["showBackArrow"] = options?["showBackArrow"] as? Bool ?? false
373
312
 
374
- // When context has a cliplist (contextCollectionId), load clip by ID
375
- // with cliplist context. ProgramController will swap to loading the
376
- // cliplist and find the clip by ID (matching web standardplayer pattern).
377
- // Deferred until apiReady to avoid racing with initial jsonUrl load.
378
313
  let collectionId = context?["contextCollectionId"] as? String
379
314
  let clipId = context?["contextEntityId"] as? String
380
315
 
381
- // Create and present modal player using SDK factory method
382
316
  let playerView = BBNativePlayer.createModalPlayerView(uiViewContoller: rootVC, jsonUrl: jsonUrl, options: loadOptions)
383
317
 
384
318
  if let collectionId = collectionId, let clipId = clipId {
@@ -391,38 +325,16 @@ class BBPlayerModule: RCTEventEmitter {
391
325
  }
392
326
  }
393
327
 
394
- // Set up delegate for event forwarding
395
328
  let delegate = ModalPlayerDelegate(module: self)
396
329
  playerView.delegate = delegate
397
330
 
398
331
  self.modalPlayerView = playerView
399
332
  self.modalDelegate = delegate
400
-
401
- }
402
- }
403
-
404
- private func extractIdFromUrl(_ url: String, pattern: String) -> String? {
405
- do {
406
- let regex = try NSRegularExpression(pattern: pattern, options: [])
407
- let range = NSRange(url.startIndex..., in: url)
408
- if let match = regex.firstMatch(in: url, options: [], range: range) {
409
- for i in 1..<match.numberOfRanges {
410
- if let groupRange = Range(match.range(at: i), in: url) {
411
- let extracted = String(url[groupRange])
412
- if !extracted.isEmpty {
413
- return extracted
414
- }
415
- }
416
- }
417
- }
418
- } catch {
419
- NSLog("BBPlayerModule: Regex error: %@", error.localizedDescription)
420
333
  }
421
- return nil
422
334
  }
423
335
 
424
336
  @objc func dismissModalPlayer() {
425
- DispatchQueue.main.async {
337
+ onMainActor {
426
338
  self.modalPlayerView?.player.closeModalPlayer()
427
339
  self.modalPlayerView = nil
428
340
  self.modalDelegate = nil
@@ -446,7 +358,9 @@ class BBPlayerModule: RCTEventEmitter {
446
358
 
447
359
  // MARK: - Modal Player Delegate
448
360
 
361
+ @MainActor
449
362
  private class ModalPlayerDelegate: NSObject, BBNativePlayerViewDelegate {
363
+ // Module ref is @unchecked Sendable, safe to access from @MainActor
450
364
  weak var module: BBPlayerModule?
451
365
 
452
366
  init(module: BBPlayerModule) {
@@ -1,8 +1,9 @@
1
- import BBNativePlayerKit
1
+ @preconcurrency import BBNativePlayerKit
2
+ @preconcurrency import React
2
3
  import WebKit
3
- import bbnativeshared
4
+ @preconcurrency import bbnativeshared
4
5
  import os
5
- import GoogleCast
6
+ @preconcurrency import GoogleCast
6
7
 
7
8
  // MARK: - Logging Helper
8
9
  private enum LogLevel {
@@ -49,6 +50,8 @@ class BBPlayerView: UIView, BBNativePlayerViewDelegate {
49
50
  private var independentCastButton: GCKUICastButton?
50
51
  // Store parent view controller reference for SDK
51
52
  private weak var parentViewController: UIViewController?
53
+ // Cached tag for deinit (nonisolated(unsafe) because deinit is nonisolated in Swift 6)
54
+ nonisolated(unsafe) private var _cachedTag: Int?
52
55
 
53
56
  // MARK: - Props (set from React Native)
54
57
 
@@ -130,7 +133,9 @@ class BBPlayerView: UIView, BBNativePlayerViewDelegate {
130
133
 
131
134
  // Register with view registry for command dispatch (supports New Architecture)
132
135
  if let tag = self.reactTag {
133
- BBPlayerViewRegistry.shared.register(self, tag: tag.intValue)
136
+ let tagInt = tag.intValue
137
+ _cachedTag = tagInt
138
+ BBPlayerViewRegistry.shared.register(self, tag: tagInt)
134
139
  }
135
140
 
136
141
  // Find the parent view controller from the responder chain
@@ -163,12 +168,11 @@ class BBPlayerView: UIView, BBNativePlayerViewDelegate {
163
168
  }
164
169
 
165
170
  deinit {
166
- // Unregister from view registry
167
- if let tag = self.reactTag {
168
- BBPlayerViewRegistry.shared.unregister(tag: tag.intValue)
171
+ // Unregister from view registry using cached tag
172
+ // (deinit is nonisolated in Swift 6, can't access @MainActor properties)
173
+ if let tag = _cachedTag {
174
+ BBPlayerViewRegistry.shared.unregister(tag: tag)
169
175
  }
170
- independentCastButton?.removeFromSuperview()
171
- independentCastButton = nil
172
176
  }
173
177
 
174
178
 
@@ -1,8 +1,8 @@
1
1
  import Foundation
2
- import React
2
+ @preconcurrency import React
3
3
 
4
4
  @objc(BBPlayerViewManager)
5
- class BBPlayerViewManager: RCTViewManager {
5
+ class BBPlayerViewManager: RCTViewManager, @unchecked Sendable {
6
6
 
7
7
  override func view() -> UIView! {
8
8
  return BBPlayerView()
@@ -12,154 +12,115 @@ class BBPlayerViewManager: RCTViewManager {
12
12
  return true
13
13
  }
14
14
 
15
- // Override moduleName to expose as "BBPlayerView" instead of default "BBPlayer"
16
- // This is required for Fabric interop to find the component correctly
17
15
  @objc override static func moduleName() -> String! {
18
16
  return "BBPlayerView"
19
17
  }
20
18
 
21
- // MARK: - Helper to get view by tag
19
+ // MARK: - Helpers
22
20
 
23
21
  private func getView(_ reactTag: NSNumber) -> BBPlayerView? {
24
22
  return self.bridge.uiManager.view(forReactTag: reactTag) as? BBPlayerView
25
23
  }
26
24
 
25
+ /// Dispatch to main queue and enter @MainActor context for calling UIView methods.
26
+ private func onMainActor(_ work: @MainActor @Sendable @escaping () -> Void) {
27
+ DispatchQueue.main.async {
28
+ MainActor.assumeIsolated(work)
29
+ }
30
+ }
31
+
27
32
  // MARK: - Commands
28
33
 
29
34
  @objc func play(_ reactTag: NSNumber) {
30
- DispatchQueue.main.async {
31
- self.getView(reactTag)?.play()
32
- }
35
+ onMainActor { self.getView(reactTag)?.play() }
33
36
  }
34
37
 
35
38
  @objc func pause(_ reactTag: NSNumber) {
36
- DispatchQueue.main.async {
37
- self.getView(reactTag)?.pause()
38
- }
39
+ onMainActor { self.getView(reactTag)?.pause() }
39
40
  }
40
41
 
41
42
  @objc func seek(_ reactTag: NSNumber, offsetInSeconds: NSNumber) {
42
- DispatchQueue.main.async {
43
- self.getView(reactTag)?.seek(offsetInSeconds.intValue)
44
- }
43
+ onMainActor { self.getView(reactTag)?.seek(offsetInSeconds.intValue) }
45
44
  }
46
45
 
47
46
  @objc func seekRelative(_ reactTag: NSNumber, offsetInSeconds: NSNumber) {
48
- DispatchQueue.main.async {
49
- self.getView(reactTag)?.seekRelative(offsetInSeconds.doubleValue)
50
- }
47
+ onMainActor { self.getView(reactTag)?.seekRelative(offsetInSeconds.doubleValue) }
51
48
  }
52
49
 
53
50
  @objc func setMuted(_ reactTag: NSNumber, muted: Bool) {
54
- DispatchQueue.main.async {
55
- self.getView(reactTag)?.setMuted(muted)
56
- }
51
+ onMainActor { self.getView(reactTag)?.setMuted(muted) }
57
52
  }
58
53
 
59
54
  @objc func setVolume(_ reactTag: NSNumber, volume: NSNumber) {
60
- DispatchQueue.main.async {
61
- self.getView(reactTag)?.setVolume(volume.doubleValue)
62
- }
55
+ onMainActor { self.getView(reactTag)?.setVolume(volume.doubleValue) }
63
56
  }
64
57
 
65
58
  @objc func presentModal(_ reactTag: NSNumber) {
66
- DispatchQueue.main.async {
67
- self.getView(reactTag)?.presentModal()
68
- }
59
+ onMainActor { self.getView(reactTag)?.presentModal() }
69
60
  }
70
61
 
71
62
  @objc func closeModal(_ reactTag: NSNumber) {
72
- DispatchQueue.main.async {
73
- self.getView(reactTag)?.closeModal()
74
- }
63
+ onMainActor { self.getView(reactTag)?.closeModal() }
75
64
  }
76
65
 
77
66
  @objc func enterFullscreen(_ reactTag: NSNumber) {
78
- DispatchQueue.main.async {
79
- self.getView(reactTag)?.enterFullscreen()
80
- }
67
+ onMainActor { self.getView(reactTag)?.enterFullscreen() }
81
68
  }
82
69
 
83
70
  @objc func enterFullscreenLandscape(_ reactTag: NSNumber) {
84
- DispatchQueue.main.async {
85
- self.getView(reactTag)?.enterFullscreenLandscape()
86
- }
71
+ onMainActor { self.getView(reactTag)?.enterFullscreenLandscape() }
87
72
  }
88
73
 
89
74
  @objc func exitFullscreen(_ reactTag: NSNumber) {
90
- DispatchQueue.main.async {
91
- self.getView(reactTag)?.exitFullscreen()
92
- }
75
+ onMainActor { self.getView(reactTag)?.exitFullscreen() }
93
76
  }
94
77
 
95
78
  @objc func collapse(_ reactTag: NSNumber) {
96
- DispatchQueue.main.async {
97
- self.getView(reactTag)?.collapse()
98
- }
79
+ onMainActor { self.getView(reactTag)?.collapse() }
99
80
  }
100
81
 
101
82
  @objc func expand(_ reactTag: NSNumber) {
102
- DispatchQueue.main.async {
103
- self.getView(reactTag)?.expand()
104
- }
83
+ onMainActor { self.getView(reactTag)?.expand() }
105
84
  }
106
85
 
107
86
  @objc func autoPlayNextCancel(_ reactTag: NSNumber) {
108
- DispatchQueue.main.async {
109
- self.getView(reactTag)?.autoPlayNextCancel()
110
- }
87
+ onMainActor { self.getView(reactTag)?.autoPlayNextCancel() }
111
88
  }
112
89
 
113
90
  @objc func destroy(_ reactTag: NSNumber) {
114
- DispatchQueue.main.async {
115
- self.getView(reactTag)?.destroy()
116
- }
91
+ onMainActor { self.getView(reactTag)?.destroy() }
117
92
  }
118
93
 
119
94
  @objc func showCastPicker(_ reactTag: NSNumber) {
120
- DispatchQueue.main.async {
121
- self.getView(reactTag)?.showCastPicker()
122
- }
95
+ onMainActor { self.getView(reactTag)?.showCastPicker() }
123
96
  }
124
97
 
125
98
  @objc func loadWithClipId(_ reactTag: NSNumber, clipId: String?, initiator: String?, autoPlay: Bool, seekTo: NSNumber?) {
126
- DispatchQueue.main.async {
127
- self.getView(reactTag)?.loadWithClipId(clipId ?? "", initiator: initiator, autoPlay: autoPlay, seekTo: seekTo?.doubleValue)
128
- }
99
+ onMainActor { self.getView(reactTag)?.loadWithClipId(clipId ?? "", initiator: initiator, autoPlay: autoPlay, seekTo: seekTo?.doubleValue) }
129
100
  }
130
101
 
131
102
  @objc func loadWithClipListId(_ reactTag: NSNumber, clipListId: String?, initiator: String?, autoPlay: Bool, seekTo: NSNumber?) {
132
- DispatchQueue.main.async {
133
- self.getView(reactTag)?.loadWithClipListId(clipListId ?? "", initiator: initiator, autoPlay: autoPlay, seekTo: seekTo?.doubleValue)
134
- }
103
+ onMainActor { self.getView(reactTag)?.loadWithClipListId(clipListId ?? "", initiator: initiator, autoPlay: autoPlay, seekTo: seekTo?.doubleValue) }
135
104
  }
136
105
 
137
106
  @objc func loadWithProjectId(_ reactTag: NSNumber, projectId: String?, initiator: String?, autoPlay: Bool, seekTo: NSNumber?) {
138
- DispatchQueue.main.async {
139
- self.getView(reactTag)?.loadWithProjectId(projectId ?? "", initiator: initiator, autoPlay: autoPlay, seekTo: seekTo?.doubleValue)
140
- }
107
+ onMainActor { self.getView(reactTag)?.loadWithProjectId(projectId ?? "", initiator: initiator, autoPlay: autoPlay, seekTo: seekTo?.doubleValue) }
141
108
  }
142
109
 
143
110
  @objc func loadWithClipJson(_ reactTag: NSNumber, clipJson: String?, initiator: String?, autoPlay: Bool, seekTo: NSNumber?) {
144
- DispatchQueue.main.async {
145
- self.getView(reactTag)?.loadWithClipJson(clipJson ?? "", initiator: initiator, autoPlay: autoPlay, seekTo: seekTo?.doubleValue)
146
- }
111
+ onMainActor { self.getView(reactTag)?.loadWithClipJson(clipJson ?? "", initiator: initiator, autoPlay: autoPlay, seekTo: seekTo?.doubleValue) }
147
112
  }
148
113
 
149
114
  @objc func loadWithClipListJson(_ reactTag: NSNumber, clipListJson: String?, initiator: String?, autoPlay: Bool, seekTo: NSNumber?) {
150
- DispatchQueue.main.async {
151
- self.getView(reactTag)?.loadWithClipListJson(clipListJson ?? "", initiator: initiator, autoPlay: autoPlay, seekTo: seekTo?.doubleValue)
152
- }
115
+ onMainActor { self.getView(reactTag)?.loadWithClipListJson(clipListJson ?? "", initiator: initiator, autoPlay: autoPlay, seekTo: seekTo?.doubleValue) }
153
116
  }
154
117
 
155
118
  @objc func loadWithProjectJson(_ reactTag: NSNumber, projectJson: String?, initiator: String?, autoPlay: Bool, seekTo: NSNumber?) {
156
- DispatchQueue.main.async {
157
- self.getView(reactTag)?.loadWithProjectJson(projectJson ?? "", initiator: initiator, autoPlay: autoPlay, seekTo: seekTo?.doubleValue)
158
- }
119
+ onMainActor { self.getView(reactTag)?.loadWithProjectJson(projectJson ?? "", initiator: initiator, autoPlay: autoPlay, seekTo: seekTo?.doubleValue) }
159
120
  }
160
121
 
161
122
  @objc func loadWithJsonUrl(_ reactTag: NSNumber, jsonUrl: String?, autoPlay: Bool) {
162
- DispatchQueue.main.async {
123
+ onMainActor {
163
124
  if let url = jsonUrl {
164
125
  self.getView(reactTag)?.loadWithJsonUrl(url, autoPlay: autoPlay)
165
126
  }
@@ -1,5 +1,6 @@
1
- import BBNativePlayerKit
2
- import bbnativeshared
1
+ @preconcurrency import BBNativePlayerKit
2
+ @preconcurrency import React
3
+ @preconcurrency import bbnativeshared
3
4
  import os
4
5
 
5
6
  // MARK: - Logging Helper
@@ -1,8 +1,8 @@
1
1
  import Foundation
2
- import React
2
+ @preconcurrency import React
3
3
 
4
4
  @objc(BBShortsViewManager)
5
- class BBShortsViewManager: RCTViewManager {
5
+ class BBShortsViewManager: RCTViewManager, @unchecked Sendable {
6
6
 
7
7
  override func view() -> UIView! {
8
8
  return BBShortsView()
@@ -12,23 +12,25 @@ class BBShortsViewManager: RCTViewManager {
12
12
  return true
13
13
  }
14
14
 
15
- // Override moduleName to expose as "BBShortsView" instead of default "BBShorts"
16
- // This is required for Fabric interop to find the component correctly
17
15
  @objc override static func moduleName() -> String! {
18
16
  return "BBShortsView"
19
17
  }
20
18
 
21
- // MARK: - Helper to get view by tag
19
+ // MARK: - Helpers
22
20
 
23
21
  private func getView(_ reactTag: NSNumber) -> BBShortsView? {
24
22
  return self.bridge.uiManager.view(forReactTag: reactTag) as? BBShortsView
25
23
  }
26
24
 
25
+ private func onMainActor(_ work: @MainActor @Sendable @escaping () -> Void) {
26
+ DispatchQueue.main.async {
27
+ MainActor.assumeIsolated(work)
28
+ }
29
+ }
30
+
27
31
  // MARK: - Commands
28
32
 
29
33
  @objc func destroy(_ reactTag: NSNumber) {
30
- DispatchQueue.main.async {
31
- self.getView(reactTag)?.destroy()
32
- }
34
+ onMainActor { self.getView(reactTag)?.destroy() }
33
35
  }
34
36
  }
@@ -61,10 +61,6 @@ Object.defineProperty(exports, "ExpoBBPlayerView", {
61
61
  return _BBPlayerView.default;
62
62
  }
63
63
  });
64
- require("./specs/BBPlayerViewNativeComponent");
65
- require("./specs/BBShortsViewNativeComponent");
66
- require("./specs/BBCastButtonViewNativeComponent");
67
- require("./specs/BBCastMiniControlsViewNativeComponent");
68
64
  var _BBPlayerView = _interopRequireDefault(require("./BBPlayerView"));
69
65
  var _BBShortsView = _interopRequireWildcard(require("./BBShortsView"));
70
66
  Object.keys(_BBShortsView).forEach(function (key) {
@@ -1 +1 @@
1
- {"version":3,"names":["require","_BBPlayerView","_interopRequireDefault","_BBShortsView","_interopRequireWildcard","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_BBOutstreamView","_BBCastButton","_BBCastMiniControls","_BBModalPlayer","_BBPlayer","_types","_utils","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","set","getOwnPropertyDescriptor"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_BBPlayerView","_interopRequireDefault","require","_BBShortsView","_interopRequireWildcard","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_BBOutstreamView","_BBCastButton","_BBCastMiniControls","_BBModalPlayer","_BBPlayer","_types","_utils","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","set","getOwnPropertyDescriptor"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"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","ignoreList":[]}
@@ -1,13 +1,5 @@
1
1
  "use strict";
2
2
 
3
- // Fabric codegen component registrations (side-effect imports for New Architecture).
4
- // These trigger NativeComponentRegistry.register on Fabric, falling back to
5
- // requireNativeComponent's lazy resolution on old architecture.
6
- import "./specs/BBPlayerViewNativeComponent";
7
- import "./specs/BBShortsViewNativeComponent";
8
- import "./specs/BBCastButtonViewNativeComponent";
9
- import "./specs/BBCastMiniControlsViewNativeComponent";
10
-
11
3
  // Main exports
12
4
  export { default as BBPlayerView } from "./BBPlayerView";
13
5
  export { default as BBShortsView } from "./BBShortsView";
@@ -1 +1 @@
1
- {"version":3,"names":["default","BBPlayerView","BBShortsView","BBOutstreamPlayerView","BBCastButton","BBCastMiniControls","BBModalPlayer","BBOutstreamView","ExpoBBPlayerView"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA;AACA;AACA;AACA,OAAO,qCAAqC;AAC5C,OAAO,qCAAqC;AAC5C,OAAO,yCAAyC;AAChD,OAAO,+CAA+C;;AAEtD;AACA,SAASA,OAAO,IAAIC,YAAY,QAAQ,gBAAgB;AACxD,SAASD,OAAO,IAAIE,YAAY,QAAQ,gBAAgB;AACxD,SAASF,OAAO,IAAIG,qBAAqB,QAAQ,mBAAmB;AACpE,SAASH,OAAO,IAAII,YAAY,QAAQ,gBAAgB;AACxD,SAASJ,OAAO,IAAIK,kBAAkB,QAAQ,sBAAsB;AACpE,SAASC,aAAa,QAAQ,iBAAiB;AAE/C,cAAc,kBAAkB;AAChC,cAAc,gBAAgB,CAAC,CAAC;AAChC,cAAc,mBAAmB,CAAC,CAAC;AACnC,cAAc,gBAAgB,CAAC,CAAC;AAChC,cAAc,sBAAsB,CAAC,CAAC;AACtC,cAAc,SAAS;AACvB,cAAc,SAAS;;AAEvB;AACA;AACA,SAASN,OAAO,IAAIO,eAAe,QAAQ,mBAAmB;AAC9D;AACA,SAASP,OAAO,IAAIQ,gBAAgB,QAAQ,gBAAgB","ignoreList":[]}
1
+ {"version":3,"names":["default","BBPlayerView","BBShortsView","BBOutstreamPlayerView","BBCastButton","BBCastMiniControls","BBModalPlayer","BBOutstreamView","ExpoBBPlayerView"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA;AACA,SAASA,OAAO,IAAIC,YAAY,QAAQ,gBAAgB;AACxD,SAASD,OAAO,IAAIE,YAAY,QAAQ,gBAAgB;AACxD,SAASF,OAAO,IAAIG,qBAAqB,QAAQ,mBAAmB;AACpE,SAASH,OAAO,IAAII,YAAY,QAAQ,gBAAgB;AACxD,SAASJ,OAAO,IAAIK,kBAAkB,QAAQ,sBAAsB;AACpE,SAASC,aAAa,QAAQ,iBAAiB;AAE/C,cAAc,kBAAkB;AAChC,cAAc,gBAAgB,CAAC,CAAC;AAChC,cAAc,mBAAmB,CAAC,CAAC;AACnC,cAAc,gBAAgB,CAAC,CAAC;AAChC,cAAc,sBAAsB,CAAC,CAAC;AACtC,cAAc,SAAS;AACvB,cAAc,SAAS;;AAEvB;AACA;AACA,SAASN,OAAO,IAAIO,eAAe,QAAQ,mBAAmB;AAC9D;AACA,SAASP,OAAO,IAAIQ,gBAAgB,QAAQ,gBAAgB","ignoreList":[]}
@@ -1,7 +1,3 @@
1
- import "./specs/BBPlayerViewNativeComponent";
2
- import "./specs/BBShortsViewNativeComponent";
3
- import "./specs/BBCastButtonViewNativeComponent";
4
- import "./specs/BBCastMiniControlsViewNativeComponent";
5
1
  export { default as BBPlayerView } from "./BBPlayerView";
6
2
  export { default as BBShortsView } from "./BBShortsView";
7
3
  export { default as BBOutstreamPlayerView } from "./BBOutstreamView";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,qCAAqC,CAAC;AAC7C,OAAO,qCAAqC,CAAC;AAC7C,OAAO,yCAAyC,CAAC;AACjD,OAAO,+CAA+C,CAAC;AAGvD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC9E,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AAGxB,uDAAuD;AACvD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/D,uDAAuD;AACvD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EACL,KAAK,iBAAiB,IAAI,qBAAqB,EAC/C,KAAK,mBAAmB,IAAI,oBAAoB,GACjD,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC9E,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AAGxB,uDAAuD;AACvD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/D,uDAAuD;AACvD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EACL,KAAK,iBAAiB,IAAI,qBAAqB,EAC/C,KAAK,mBAAmB,IAAI,oBAAoB,GACjD,MAAM,kBAAkB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bluebillywig/react-native-bb-player",
3
- "version": "8.47.0",
3
+ "version": "8.47.2",
4
4
  "description": "Blue Billywig Native Video Player for React Native - iOS AVPlayer and Android ExoPlayer integration",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
@@ -18,7 +18,7 @@ Pod::Spec.new do |s|
18
18
  s.author = 'Blue Billywig'
19
19
  s.homepage = 'https://github.com/bluebillywig/react-native-bb-player'
20
20
  s.platforms = { :ios => '14.0' }
21
- s.swift_version = '5.4'
21
+ s.swift_version = '6.0'
22
22
  s.source = { :git => 'https://github.com/bluebillywig/react-native-bb-player.git', :tag => "v#{s.version}" }
23
23
  s.static_framework = true
24
24
 
@@ -40,7 +40,8 @@ Pod::Spec.new do |s|
40
40
  # Swift/Objective-C compatibility
41
41
  s.pod_target_xcconfig = {
42
42
  'DEFINES_MODULE' => 'YES',
43
- 'SWIFT_COMPILATION_MODE' => 'wholemodule'
43
+ 'SWIFT_COMPILATION_MODE' => 'wholemodule',
44
+ 'SWIFT_STRICT_CONCURRENCY' => 'complete'
44
45
  }
45
46
 
46
47
  s.source_files = "ios/*.{h,m,mm,swift,hpp,cpp}"
package/src/index.ts CHANGED
@@ -1,11 +1,3 @@
1
- // Fabric codegen component registrations (side-effect imports for New Architecture).
2
- // These trigger NativeComponentRegistry.register on Fabric, falling back to
3
- // requireNativeComponent's lazy resolution on old architecture.
4
- import "./specs/BBPlayerViewNativeComponent";
5
- import "./specs/BBShortsViewNativeComponent";
6
- import "./specs/BBCastButtonViewNativeComponent";
7
- import "./specs/BBCastMiniControlsViewNativeComponent";
8
-
9
1
  // Main exports
10
2
  export { default as BBPlayerView } from "./BBPlayerView";
11
3
  export { default as BBShortsView } from "./BBShortsView";