@shortkitsdk/react-native 0.2.11 → 0.2.12

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.
Files changed (32) hide show
  1. package/android/build.gradle.kts +13 -1
  2. package/android/src/main/java/com/shortkit/reactnative/ReactCarouselOverlayHost.kt +115 -55
  3. package/android/src/main/java/com/shortkit/reactnative/ReactOverlayHost.kt +67 -56
  4. package/android/src/main/java/com/shortkit/reactnative/ShortKitBridge.kt +71 -26
  5. package/android/src/main/java/com/shortkit/reactnative/ShortKitFeedView.kt +160 -35
  6. package/android/src/main/java/com/shortkit/reactnative/ShortKitFeedViewManager.kt +5 -0
  7. package/android/src/main/java/com/shortkit/reactnative/ShortKitModule.kt +43 -10
  8. package/android/src/main/java/com/shortkit/reactnative/ShortKitPlayerNativeView.kt +9 -0
  9. package/ios/ReactOverlayHost.swift +13 -27
  10. package/ios/ShortKitBridge.swift +36 -2
  11. package/ios/ShortKitFeedView.swift +24 -3
  12. package/ios/ShortKitModule.mm +4 -1
  13. package/ios/ShortKitSDK.xcframework/ios-arm64/ShortKitSDK.framework/Modules/ShortKitSDK.swiftmodule/arm64-apple-ios.abi.json +720 -144
  14. package/ios/ShortKitSDK.xcframework/ios-arm64/ShortKitSDK.framework/Modules/ShortKitSDK.swiftmodule/arm64-apple-ios.private.swiftinterface +19 -5
  15. package/ios/ShortKitSDK.xcframework/ios-arm64/ShortKitSDK.framework/Modules/ShortKitSDK.swiftmodule/arm64-apple-ios.swiftdoc +0 -0
  16. package/ios/ShortKitSDK.xcframework/ios-arm64/ShortKitSDK.framework/Modules/ShortKitSDK.swiftmodule/arm64-apple-ios.swiftinterface +19 -5
  17. package/ios/ShortKitSDK.xcframework/ios-arm64/ShortKitSDK.framework/ShortKitSDK +0 -0
  18. package/ios/ShortKitSDK.xcframework/ios-arm64-simulator/ShortKitSDK.framework/Modules/ShortKitSDK.swiftmodule/arm64-apple-ios-simulator.abi.json +720 -144
  19. package/ios/ShortKitSDK.xcframework/ios-arm64-simulator/ShortKitSDK.framework/Modules/ShortKitSDK.swiftmodule/arm64-apple-ios-simulator.private.swiftinterface +19 -5
  20. package/ios/ShortKitSDK.xcframework/ios-arm64-simulator/ShortKitSDK.framework/Modules/ShortKitSDK.swiftmodule/arm64-apple-ios-simulator.swiftdoc +0 -0
  21. package/ios/ShortKitSDK.xcframework/ios-arm64-simulator/ShortKitSDK.framework/Modules/ShortKitSDK.swiftmodule/arm64-apple-ios-simulator.swiftinterface +19 -5
  22. package/ios/ShortKitSDK.xcframework/ios-arm64-simulator/ShortKitSDK.framework/ShortKitSDK +0 -0
  23. package/package.json +1 -1
  24. package/src/ShortKitContext.ts +2 -1
  25. package/src/ShortKitFeed.tsx +14 -0
  26. package/src/ShortKitOverlaySurface.tsx +153 -45
  27. package/src/ShortKitPlayer.tsx +25 -3
  28. package/src/ShortKitProvider.tsx +4 -2
  29. package/src/index.ts +4 -0
  30. package/src/serialization.ts +1 -0
  31. package/src/specs/NativeShortKitModule.ts +18 -1
  32. package/src/types.ts +6 -0
@@ -30,6 +30,9 @@ import ShortKitSDK
30
30
  /// Preload handles keyed by UUID, consumed by feed views via preloadId prop.
31
31
  public var preloadHandles: [String: FeedPreload] = [:]
32
32
 
33
+ /// Tracks the most recently created preload or registered feed ID for feedReady routing.
34
+ private var activeFeedId: String = ""
35
+
33
36
  // MARK: - Feed Instance Registry
34
37
 
35
38
  private struct WeakFeedRef {
@@ -41,6 +44,7 @@ import ShortKitSDK
41
44
 
42
45
  public func registerFeed(id: String, viewController vc: ShortKitFeedViewController) {
43
46
  feedRegistry[id] = WeakFeedRef(vc: vc)
47
+ activeFeedId = id
44
48
 
45
49
  // Wire per-feed remaining content count callback
46
50
  vc.onRemainingContentCountChange = { [weak self] count in
@@ -50,6 +54,11 @@ import ShortKitSDK
50
54
  ])
51
55
  }
52
56
 
57
+ // Wire per-feed ready callback
58
+ vc.onFeedReady = { [weak self] in
59
+ self?.emitOnMain("onFeedReady", body: ["feedId": id])
60
+ }
61
+
53
62
  // Replay buffered operations on the next run-loop tick so the VC's
54
63
  // view hierarchy is fully set up after didMoveToWindow returns.
55
64
  if let ops = pendingOps.removeValue(forKey: id) {
@@ -315,14 +324,35 @@ import ShortKitSDK
315
324
  }
316
325
  }
317
326
 
318
- @objc public func preloadFeed(_ configJSON: String, completion: @escaping (String) -> Void) {
327
+ @objc public func preloadFeed(_ configJSON: String, itemsJSON: String?, completion: @escaping (String) -> Void) {
319
328
  let config = Self.parseFeedConfig(configJSON)
320
- guard let preload = shortKit?.preloadFeed(filter: config.filter) else {
329
+ let preload: FeedPreload?
330
+
331
+ NSLog("[ShortKit Bridge] preloadFeed called — feedSource: %@, hasItemsJSON: %@",
332
+ config.feedSource == .custom ? "custom" : "algorithmic",
333
+ itemsJSON != nil ? "yes (\(itemsJSON!.prefix(100))...)" : "no")
334
+
335
+ if config.feedSource == .custom {
336
+ guard let json = itemsJSON, let items = Self.parseFeedInputs(json) else {
337
+ NSLog("[ShortKit Bridge] ❌ preloadFeed: feedSource=custom but no valid items — returning empty")
338
+ completion("")
339
+ return
340
+ }
341
+ NSLog("[ShortKit Bridge] preloadFeed: creating custom preload with %d items", items.count)
342
+ preload = shortKit?.preloadFeed(items: items)
343
+ } else {
344
+ preload = shortKit?.preloadFeed(filter: config.filter)
345
+ }
346
+
347
+ guard let preload else {
348
+ NSLog("[ShortKit Bridge] ❌ preloadFeed: shortKit?.preloadFeed returned nil")
321
349
  completion("")
322
350
  return
323
351
  }
324
352
  let uuid = UUID().uuidString
353
+ NSLog("[ShortKit Bridge] ✅ preloadFeed: created handle %@", uuid)
325
354
  preloadHandles[uuid] = preload
355
+ activeFeedId = uuid
326
356
  completion(uuid)
327
357
  }
328
358
 
@@ -624,8 +654,12 @@ import ShortKitSDK
624
654
 
625
655
  let filter = parseFeedFilter(obj["filter"] as? String)
626
656
 
657
+ let scrollAxisStr = obj["scrollAxis"] as? String ?? "vertical"
658
+ let scrollAxis: ScrollAxis = scrollAxisStr == "horizontal" ? .horizontal : .vertical
659
+
627
660
  return FeedConfig(
628
661
  feedHeight: feedHeight,
662
+ scrollAxis: scrollAxis,
629
663
  videoOverlay: videoOverlay,
630
664
  carouselOverlay: carouselOverlay,
631
665
  surveyOverlay: .none,
@@ -66,6 +66,7 @@ import ShortKitSDK
66
66
  feedVC.view.frame = bounds
67
67
  addSubview(feedVC.view)
68
68
  feedVC.didMove(toParent: parentVC)
69
+ feedVC.activate()
69
70
  if let feedId = self.feedId {
70
71
  ShortKitBridge.shared?.registerFeed(id: feedId, viewController: feedVC)
71
72
  }
@@ -80,12 +81,30 @@ import ShortKitSDK
80
81
  var feedConfig = ShortKitBridge.parseFeedConfig(self.config ?? "{}")
81
82
 
82
83
  // Consume preload handle if available
83
- if let preloadId = self.preloadId,
84
- let preload = ShortKitBridge.shared?.consumePreload(id: preloadId) {
85
- feedConfig.preload = preload
84
+ if let preloadId = self.preloadId {
85
+ NSLog("[ShortKit FeedView] preloadId prop: %@", preloadId)
86
+ if let preload = ShortKitBridge.shared?.consumePreload(id: preloadId) {
87
+ feedConfig.preload = preload
88
+ NSLog("[ShortKit FeedView] ✅ Preload handle consumed for feedId: %@", preloadId)
89
+ } else {
90
+ NSLog("[ShortKit FeedView] ❌ No preload handle found for feedId: %@", preloadId)
91
+ NSLog("[ShortKit FeedView] Available preload handles: %@", ShortKitBridge.shared?.preloadHandles.keys.joined(separator: ", ") ?? "none")
92
+ }
93
+ } else {
94
+ NSLog("[ShortKit FeedView] No preloadId prop set")
86
95
  }
87
96
 
97
+ NSLog("[ShortKit FeedView] feedConfig.preload is %@", feedConfig.preload != nil ? "SET" : "NIL")
98
+ NSLog("[ShortKit FeedView] feedConfig.feedSource: %@", feedConfig.feedSource == .custom ? "custom" : "algorithmic")
99
+
100
+ NSLog("[ShortKit FeedView] Creating ShortKitFeedViewController with config.preload=%@, config.feedSource=%@",
101
+ feedConfig.preload != nil ? "SET" : "NIL",
102
+ feedConfig.feedSource == .custom ? "custom" : "algorithmic")
103
+
88
104
  let feedVC = ShortKitFeedViewController(shortKit: sdk, config: feedConfig, startAtItemId: startAtItemId)
105
+ feedVC.setBridgeManaged()
106
+
107
+ NSLog("[ShortKit FeedView] VC created successfully (bridge-managed)")
89
108
 
90
109
  feedVC.onDismiss = {
91
110
  ShortKitBridge.shared?.emitDismiss()
@@ -113,6 +132,7 @@ import ShortKitSDK
113
132
  }
114
133
  guard let feedVC = feedViewController else { return }
115
134
 
135
+ feedVC.deactivate()
116
136
  feedVC.willMove(toParent: nil)
117
137
  feedVC.view.removeFromSuperview()
118
138
  feedVC.removeFromParent()
@@ -126,6 +146,7 @@ import ShortKitSDK
126
146
  }
127
147
  guard let feedVC = feedViewController else { return }
128
148
 
149
+ feedVC.deactivate()
129
150
  feedVC.willMove(toParent: nil)
130
151
  feedVC.view.removeFromSuperview()
131
152
  feedVC.removeFromParent()
@@ -71,6 +71,7 @@ RCT_EXPORT_MODULE(ShortKitModule)
71
71
  @"onSurveyResponse",
72
72
  @"onContentTapped",
73
73
  @"onDismiss",
74
+ @"onFeedReady",
74
75
  @"onRefreshRequested",
75
76
  @"onDidFetchContentItems",
76
77
  @"onOverlayActiveChanged",
@@ -81,6 +82,7 @@ RCT_EXPORT_MODULE(ShortKitModule)
81
82
  @"onOverlayActiveCueChanged",
82
83
  @"onOverlayFeedScrollPhaseChanged",
83
84
  @"onOverlayTimeUpdate",
85
+ @"onOverlayFullState",
84
86
  ];
85
87
  }
86
88
 
@@ -258,9 +260,10 @@ RCT_EXPORT_METHOD(applyFilter:(NSString *)feedId filterJSON:(NSString *)filterJS
258
260
  }
259
261
 
260
262
  RCT_EXPORT_METHOD(preloadFeed:(NSString *)configJSON
263
+ itemsJSON:(NSString *)itemsJSON
261
264
  resolve:(RCTPromiseResolveBlock)resolve
262
265
  reject:(RCTPromiseRejectBlock)reject) {
263
- [_shortKitBridge preloadFeed:configJSON completion:^(NSString *uuid) {
266
+ [_shortKitBridge preloadFeed:configJSON itemsJSON:itemsJSON completion:^(NSString *uuid) {
264
267
  resolve(uuid);
265
268
  }];
266
269
  }