react-native-firework-sdk 2.10.1 → 2.11.0

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 (158) hide show
  1. package/android/gradle.properties +1 -1
  2. package/android/src/main/java/com/fireworksdk/bridge/components/storyblock/StoryBlockFragment.kt +18 -1
  3. package/android/src/main/java/com/fireworksdk/bridge/components/videofeed/FWVideoFeed.kt +4 -0
  4. package/android/src/main/java/com/fireworksdk/bridge/models/FWSDKInitOptionsModel.kt +0 -1
  5. package/android/src/main/java/com/fireworksdk/bridge/models/FWSDKInitOptionsModelDeserializer.kt +0 -3
  6. package/android/src/main/java/com/fireworksdk/bridge/models/FWSDKInitOptionsModelSerializer.kt +0 -2
  7. package/android/src/main/java/com/fireworksdk/bridge/models/FWSdkInitResultModel.kt +6 -0
  8. package/android/src/main/java/com/fireworksdk/bridge/models/FWTrackPurchaseModel.kt +9 -0
  9. package/android/src/main/java/com/fireworksdk/bridge/models/FWTrackPurchaseModelDeserializer.kt +45 -0
  10. package/android/src/main/java/com/fireworksdk/bridge/models/FWTrackPurchaseModelSerializer.kt +34 -0
  11. package/android/src/main/java/com/fireworksdk/bridge/models/FWVideoFeedItemDetailsModel.kt +1 -0
  12. package/android/src/main/java/com/fireworksdk/bridge/models/FWVideoPlaybackDetails.kt +1 -0
  13. package/android/src/main/java/com/fireworksdk/bridge/models/FWVideoPlayerConfigModel.kt +2 -1
  14. package/android/src/main/java/com/fireworksdk/bridge/models/FWVideoPlayerConfigModelDeserializer.kt +4 -1
  15. package/android/src/main/java/com/fireworksdk/bridge/models/FWVideoPlayerConfigModelSerializer.kt +2 -0
  16. package/android/src/main/java/com/fireworksdk/bridge/models/FWVideoPlayerLogoConfigurationModel.kt +8 -0
  17. package/android/src/main/java/com/fireworksdk/bridge/models/FWVideoPlayerLogoConfigurationModelDeserializer.kt +23 -0
  18. package/android/src/main/java/com/fireworksdk/bridge/models/FWVideoPlayerLogoConfigurationModelSerializer.kt +18 -0
  19. package/android/src/main/java/com/fireworksdk/bridge/models/enums/FWEventName.kt +2 -0
  20. package/android/src/main/java/com/fireworksdk/bridge/models/enums/FWVideoPlayerLogoOption.kt +19 -0
  21. package/android/src/main/java/com/fireworksdk/bridge/reactnative/FWReactNativeSDK.kt +103 -0
  22. package/android/src/main/java/com/fireworksdk/bridge/reactnative/manager/FWStoryBlockManager.kt +12 -0
  23. package/android/src/main/java/com/fireworksdk/bridge/reactnative/manager/FWVideoFeedManager.kt +8 -0
  24. package/android/src/main/java/com/fireworksdk/bridge/reactnative/models/FireworkSDKInterface.kt +2 -0
  25. package/android/src/main/java/com/fireworksdk/bridge/reactnative/module/FWVideoShoppingModule.kt +22 -9
  26. package/android/src/main/java/com/fireworksdk/bridge/reactnative/module/FireworkSDKModule.kt +74 -122
  27. package/android/src/main/java/com/fireworksdk/bridge/reactnative/utils/FWEventUtils.kt +34 -9
  28. package/android/src/main/java/com/fireworksdk/bridge/utils/FWConfigUtil.kt +13 -0
  29. package/android/src/main/java/com/fireworksdk/bridge/utils/FWFragmentUtil.kt +3 -3
  30. package/android/src/main/java/com/fireworksdk/bridge/utils/FWGlobalDataUtil.kt +5 -2
  31. package/android/src/main/java/com/fireworksdk/bridge/utils/FWModelUtils.kt +64 -0
  32. package/ios/Components/ReplayBadgeConfiguration.swift +12 -0
  33. package/ios/Components/StoryBlock.swift +31 -0
  34. package/ios/Components/StoryBlockConfiguration.swift +1 -0
  35. package/ios/Components/StoryBlockManager.m +24 -0
  36. package/ios/Components/StoryBlockManager.swift +6 -3
  37. package/ios/Components/VideoFeed.swift +18 -3
  38. package/ios/Components/VideoFeedConfiguration.swift +1 -0
  39. package/ios/Components/VideoFeedManager.m +4 -1
  40. package/ios/Components/VideoFeedManager.swift +6 -3
  41. package/ios/Components/VideoPlayerConfiguration.swift +1 -0
  42. package/ios/FWReactNativeSDK.swift +14 -0
  43. package/ios/FireworkSdk.xcodeproj/project.pbxproj +4 -0
  44. package/ios/Modules/FireworkSDKModule/FireworkSDKModule+CTA.swift +17 -15
  45. package/ios/Modules/FireworkSDKModule/FireworkSDKModule+EventTracking.swift +1 -11
  46. package/ios/Modules/FireworkSDKModule/FireworkSDKModule.m +1 -0
  47. package/ios/Modules/FireworkSDKModule/FireworkSDKModule.swift +80 -81
  48. package/ios/Modules/FireworkSDKModule/SDKInitOptions.swift +9 -5
  49. package/ios/Modules/Shopping/ShoppingModule.swift +10 -74
  50. package/lib/commonjs/FireworkSDK.js +30 -25
  51. package/lib/commonjs/FireworkSDK.js.map +1 -1
  52. package/lib/commonjs/VideoShopping.js +6 -12
  53. package/lib/commonjs/VideoShopping.js.map +1 -1
  54. package/lib/commonjs/components/StoryBlock.js +54 -3
  55. package/lib/commonjs/components/StoryBlock.js.map +1 -1
  56. package/lib/commonjs/components/VideoFeed.js +46 -4
  57. package/lib/commonjs/components/VideoFeed.js.map +1 -1
  58. package/lib/commonjs/index.js.map +1 -1
  59. package/lib/commonjs/models/FWNativeErrorAction.js +14 -0
  60. package/lib/commonjs/models/FWNativeErrorAction.js.map +1 -0
  61. package/lib/commonjs/models/ReplayBadgeConfiguration.js +2 -0
  62. package/lib/commonjs/models/ReplayBadgeConfiguration.js.map +1 -0
  63. package/lib/commonjs/modules/FireworkSDKModule.js.map +1 -1
  64. package/lib/module/FireworkSDK.js +29 -25
  65. package/lib/module/FireworkSDK.js.map +1 -1
  66. package/lib/module/VideoShopping.js +6 -12
  67. package/lib/module/VideoShopping.js.map +1 -1
  68. package/lib/module/components/StoryBlock.js +53 -3
  69. package/lib/module/components/StoryBlock.js.map +1 -1
  70. package/lib/module/components/VideoFeed.js +42 -4
  71. package/lib/module/components/VideoFeed.js.map +1 -1
  72. package/lib/module/index.js.map +1 -1
  73. package/lib/module/models/FWNativeErrorAction.js +7 -0
  74. package/lib/module/models/FWNativeErrorAction.js.map +1 -0
  75. package/lib/module/models/ReplayBadgeConfiguration.js +2 -0
  76. package/lib/module/models/ReplayBadgeConfiguration.js.map +1 -0
  77. package/lib/module/modules/FireworkSDKModule.js.map +1 -1
  78. package/lib/typescript/VideoShopping.d.ts +2 -2
  79. package/lib/typescript/components/StoryBlock.d.ts +18 -1
  80. package/lib/typescript/components/VideoFeed.d.ts +7 -1
  81. package/lib/typescript/index.d.ts +2 -2
  82. package/lib/typescript/models/FWEvents.d.ts +26 -3
  83. package/lib/typescript/models/FWNativeErrorAction.d.ts +4 -0
  84. package/lib/typescript/models/FeedItemDetails.d.ts +6 -1
  85. package/lib/typescript/models/ReplayBadgeConfiguration.d.ts +7 -0
  86. package/lib/typescript/models/StoryBlockConfiguration.d.ts +6 -1
  87. package/lib/typescript/models/VideoFeedConfiguration.d.ts +6 -0
  88. package/lib/typescript/models/VideoPlayerConfiguration.d.ts +6 -1
  89. package/lib/typescript/modules/FireworkSDKModule.d.ts +1 -0
  90. package/package.json +1 -5
  91. package/react-native-firework-sdk.podspec +3 -5
  92. package/src/FireworkSDK.ts +27 -24
  93. package/src/VideoShopping.ts +9 -11
  94. package/src/components/StoryBlock.tsx +69 -7
  95. package/src/components/VideoFeed.tsx +57 -12
  96. package/src/index.ts +2 -0
  97. package/src/models/FWEvents.ts +28 -3
  98. package/src/models/FWNativeErrorAction.ts +4 -0
  99. package/src/models/FeedItemDetails.ts +7 -1
  100. package/src/models/ReplayBadgeConfiguration.ts +7 -0
  101. package/src/models/StoryBlockConfiguration.ts +6 -1
  102. package/src/models/VideoFeedConfiguration.ts +6 -0
  103. package/src/models/VideoPlayerConfiguration.ts +6 -1
  104. package/src/modules/FireworkSDKModule.ts +1 -0
  105. package/FireworkVideoUI.xcframework/Info.plist +0 -40
  106. package/FireworkVideoUI.xcframework/ios-arm64/FireworkVideoUI.framework/FireworkVideoUI +0 -0
  107. package/FireworkVideoUI.xcframework/ios-arm64/FireworkVideoUI.framework/Headers/FireworkVideoUI-Swift.h +0 -280
  108. package/FireworkVideoUI.xcframework/ios-arm64/FireworkVideoUI.framework/Headers/FireworkVideoUI.h +0 -18
  109. package/FireworkVideoUI.xcframework/ios-arm64/FireworkVideoUI.framework/Info.plist +0 -0
  110. package/FireworkVideoUI.xcframework/ios-arm64/FireworkVideoUI.framework/Modules/FireworkVideoUI.swiftmodule/arm64-apple-ios.abi.json +0 -1313
  111. package/FireworkVideoUI.xcframework/ios-arm64/FireworkVideoUI.framework/Modules/FireworkVideoUI.swiftmodule/arm64-apple-ios.private.swiftinterface +0 -42
  112. package/FireworkVideoUI.xcframework/ios-arm64/FireworkVideoUI.framework/Modules/FireworkVideoUI.swiftmodule/arm64-apple-ios.swiftdoc +0 -0
  113. package/FireworkVideoUI.xcframework/ios-arm64/FireworkVideoUI.framework/Modules/FireworkVideoUI.swiftmodule/arm64-apple-ios.swiftinterface +0 -42
  114. package/FireworkVideoUI.xcframework/ios-arm64/FireworkVideoUI.framework/Modules/module.modulemap +0 -11
  115. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/FireworkVideoUI +0 -0
  116. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/Headers/FireworkVideoUI-Swift.h +0 -556
  117. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/Headers/FireworkVideoUI.h +0 -18
  118. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/Info.plist +0 -0
  119. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/Modules/FireworkVideoUI.swiftmodule/arm64-apple-ios-simulator.abi.json +0 -1313
  120. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/Modules/FireworkVideoUI.swiftmodule/arm64-apple-ios-simulator.private.swiftinterface +0 -42
  121. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/Modules/FireworkVideoUI.swiftmodule/arm64-apple-ios-simulator.swiftdoc +0 -0
  122. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/Modules/FireworkVideoUI.swiftmodule/arm64-apple-ios-simulator.swiftinterface +0 -42
  123. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/Modules/FireworkVideoUI.swiftmodule/x86_64-apple-ios-simulator.abi.json +0 -1313
  124. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/Modules/FireworkVideoUI.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface +0 -42
  125. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/Modules/FireworkVideoUI.swiftmodule/x86_64-apple-ios-simulator.swiftdoc +0 -0
  126. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/Modules/FireworkVideoUI.swiftmodule/x86_64-apple-ios-simulator.swiftinterface +0 -42
  127. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/Modules/module.modulemap +0 -11
  128. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/_CodeSignature/CodeResources +0 -245
  129. package/ios/FireworkVideoUI/FireworkVideoUI/FireworkVideoUI.docc/FireworkVideoUI.md +0 -13
  130. package/ios/FireworkVideoUI/FireworkVideoUI/FireworkVideoUI.h +0 -18
  131. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/AppLanguage/AppLanguageManager.swift +0 -154
  132. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/AppLanguage/Extensions/Foundation/Bundle+AppLanguage.swift +0 -73
  133. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/AppLanguage/Extensions/Foundation/NumberFormatter+AppLanguage.swift +0 -25
  134. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/AppLanguage/Extensions/Foundation/URLSession+AppLanguage.swift +0 -52
  135. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/AppLanguage/Extensions/UIKit/UIImageView+AppLanguage.swift +0 -60
  136. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/AppLanguage/Extensions/UIKit/UILabel+AppLanguage.swift +0 -98
  137. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/AppLanguage/Extensions/UIKit/UITextField+AppLanguage.swift +0 -97
  138. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/AppLanguage/Extensions/UIKit/UITextView+AppLanguage.swift +0 -97
  139. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/AppLanguage/Extensions/UIKit/UIView+AppLanguage.swift +0 -71
  140. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/AppLanguage/Extensions/UIKit/UIViewController+AppLanguage.swift +0 -48
  141. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/AppLanguage/Extensions/UIKit/UIWindow+AppLanguage.swift +0 -26
  142. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/AppLanguage/LanguageUtil.swift +0 -43
  143. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/LayoutFlip/Extensions/Foundation/NSObject+LayoutFlip.swift +0 -42
  144. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/LayoutFlip/Extensions/UIKit/CALayer+LayoutFlip.swift +0 -149
  145. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/LayoutFlip/Extensions/UIKit/UILabel+LayoutFlip.swift +0 -35
  146. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/LayoutFlip/Extensions/UIKit/UIView+LayoutFlip.swift +0 -202
  147. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/LayoutFlip/LayoutFlipManager.swift +0 -59
  148. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/Utils/Extensions/Foundation/DispatchQueue+Once.swift +0 -32
  149. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/Utils/Extensions/Foundation/String+Base64.swift +0 -18
  150. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/Utils/Extensions/UIKit/UIView+UIHierarchy.swift +0 -46
  151. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/Utils/Swizzle.swift +0 -37
  152. package/ios/FireworkVideoUI/FireworkVideoUI.xcodeproj/project.pbxproj +0 -766
  153. package/ios/FireworkVideoUI/FireworkVideoUI.xcworkspace/contents.xcworkspacedata +0 -10
  154. package/ios/FireworkVideoUI/FireworkVideoUI.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  155. package/ios/FireworkVideoUI/FireworkVideoUITests/FireworkVideoUITests.swift +0 -37
  156. package/ios/FireworkVideoUI/Podfile +0 -15
  157. package/ios/FireworkVideoUI/Podfile.lock +0 -16
  158. package/ios/scripts/react_native_firework_sdk_pods.rb +0 -27
@@ -7,9 +7,7 @@
7
7
 
8
8
  import FireworkVideo
9
9
  import Foundation
10
- #if canImport(FireworkVideoUI)
11
10
  import FireworkVideoUI
12
- #endif
13
11
 
14
12
  @objc(StoryBlockManager)
15
13
  class StoryBlockManager: RCTViewManager, StoryBlockViewDelegate {
@@ -34,6 +32,11 @@ class StoryBlockManager: RCTViewManager, StoryBlockViewDelegate {
34
32
  }
35
33
 
36
34
  func storyBlock(_ view: StoryBlock, didFailToLoadFeed error: StoryBlockError) {
37
- view.onStoryBlockLoadFinished?(error.jsObject)
35
+ if case let .contentSourceError(feedContentSourceError) = error,
36
+ case .emptyFeed = feedContentSourceError {
37
+ view.onStoryBlockEmpty?(nil)
38
+ } else {
39
+ view.onStoryBlockLoadFinished?(error.jsObject)
40
+ }
38
41
  }
39
42
  }
@@ -9,9 +9,7 @@
9
9
 
10
10
  import FireworkVideo
11
11
  import UIKit
12
- #if canImport(FireworkVideoUI)
13
12
  import FireworkVideoUI
14
- #endif
15
13
 
16
14
  @objc
17
15
  public enum VideoFeedMode: Int {
@@ -77,12 +75,15 @@ public class VideoFeed: UIView, VideoFeedViewControllerDelegate, PictureInPictur
77
75
  @objc public var adConfiguration: AdConfiguration?
78
76
 
79
77
  @objc var onVideoFeedLoadFinished: RCTBubblingEventBlock?
80
- // @objc var onVideoFeedClick: RCTBubblingEventBlock?
78
+
79
+ @objc var onVideoFeedEmpty: RCTBubblingEventBlock?
81
80
 
82
81
  @objc var onVideoFeedDidStartPictureInPicture: RCTBubblingEventBlock?
83
82
 
84
83
  @objc var onVideoFeedDidStopPictureInPicture: RCTBubblingEventBlock?
85
84
 
85
+ @objc var onVideoFeedGetFeedId: RCTBubblingEventBlock?
86
+
86
87
  public weak var delegate: VideoFeedDelegate?
87
88
 
88
89
  private var feedVC: VideoFeedViewController?
@@ -193,6 +194,8 @@ public class VideoFeed: UIView, VideoFeedViewControllerDelegate, PictureInPictur
193
194
  return
194
195
  }
195
196
 
197
+ onVideoFeedGetFeedId?(["feedId": feedVC.feedID])
198
+
196
199
  var viewConfiguration = convertToVideoFeedContentConfiguration()
197
200
  if viewConfiguration.itemView.autoplay.isEnabled {
198
201
  viewConfiguration.itemView.autoplay.isEnabled = false
@@ -511,6 +514,12 @@ extension VideoFeed {
511
514
  }
512
515
  }
513
516
  }
517
+
518
+ if let replayBadgeConfiguration = config.replayBadgeConfiguration {
519
+ vpcConfig.replayBadge.isHidden = replayBadgeConfiguration.isHidden
520
+ } else {
521
+ vpcConfig.replayBadge.isHidden = false
522
+ }
514
523
  return vpcConfig
515
524
  }
516
525
 
@@ -534,6 +543,12 @@ extension VideoFeed {
534
543
  videoConfig.adBadge = adBadge
535
544
  }
536
545
 
546
+ if let replayBadge = feedViewConfig?.replayBadge {
547
+ videoConfig.replayBadge.isHidden = replayBadge.isHidden
548
+ } else {
549
+ videoConfig.replayBadge.isHidden = false
550
+ }
551
+
537
552
  return videoConfig
538
553
  }
539
554
  }
@@ -21,6 +21,7 @@ public class VideoFeedConfiguration: NSObject, Codable {
21
21
  var itemSpacing: Double?
22
22
  var enableAutoplay: Bool?
23
23
  var gridColumns: Int?
24
+ var replayBadge: ReplayBadgeConfiguration?
24
25
 
25
26
  class VideoFeedTitleConfiguration: NSObject, Codable {
26
27
  public var hidden: Bool?
@@ -53,12 +53,15 @@ RCT_CUSTOM_VIEW_PROPERTY(adConfiguration, AdConfiguration, VideoFeed) {
53
53
  }
54
54
 
55
55
  RCT_EXPORT_VIEW_PROPERTY(onVideoFeedLoadFinished, RCTBubblingEventBlock)
56
- //RCT_EXPORT_VIEW_PROPERTY(onVideoFeedClick, RCTBubblingEventBlock)
56
+
57
+ RCT_EXPORT_VIEW_PROPERTY(onVideoFeedEmpty, RCTBubblingEventBlock)
57
58
 
58
59
  RCT_EXPORT_VIEW_PROPERTY(onVideoFeedDidStartPictureInPicture, RCTBubblingEventBlock)
59
60
 
60
61
  RCT_EXPORT_VIEW_PROPERTY(onVideoFeedDidStopPictureInPicture, RCTBubblingEventBlock)
61
62
 
63
+ RCT_EXPORT_VIEW_PROPERTY(onVideoFeedGetFeedId, RCTBubblingEventBlock)
64
+
62
65
  RCT_EXPORT_METHOD(refresh:(nonnull NSNumber *)reactTag) {
63
66
  [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) {
64
67
  VideoFeed *view = (VideoFeed *)(viewRegistry[reactTag]);
@@ -8,9 +8,7 @@
8
8
 
9
9
  import FireworkVideo
10
10
  import Foundation
11
- #if canImport(FireworkVideoUI)
12
11
  import FireworkVideoUI
13
- #endif
14
12
 
15
13
  @objc(VideoFeedManager)
16
14
  class VideoFeedManager: RCTViewManager, VideoFeedDelegate {
@@ -37,7 +35,12 @@ class VideoFeedManager: RCTViewManager, VideoFeedDelegate {
37
35
  }
38
36
 
39
37
  func videoFeed(_ view: VideoFeed, didFailToLoadFeed error: VideoFeedError) {
40
- view.onVideoFeedLoadFinished?(error.jsObject)
38
+ if case .contentSourceError(let feedContentSourceError) = error,
39
+ case .emptyFeed = feedContentSourceError {
40
+ view.onVideoFeedEmpty?(nil)
41
+ } else {
42
+ view.onVideoFeedLoadFinished?(error.jsObject)
43
+ }
41
44
  }
42
45
 
43
46
  // // MARK: - FireworkVideoFeedDelegate
@@ -73,4 +73,5 @@ public class VideoPlayerConfiguration: NSObject, Codable {
73
73
  var buttonConfiguration: VideoPlayerButtonConfiguration?
74
74
  var showVideoDetailTitle: Bool?
75
75
  var videoPlayerLogoConfiguration: VideoPlayerLogoConfiguration?
76
+ var replayBadgeConfiguration: ReplayBadgeConfiguration?
76
77
  }
@@ -0,0 +1,14 @@
1
+ //
2
+ // FWReactNativeSDK.swift
3
+ // FireworkSdk
4
+ //
5
+ // Created by linjie jiang on 1/20/24.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ public class FWReactNativeSDK {
11
+ public static func initializeSDK(_ options: SDKInitOptions?) {
12
+ FireworkSDKModule.initializeSDK(options)
13
+ }
14
+ }
@@ -10,6 +10,7 @@
10
10
  891F4AF62A67E12800A9E8DA /* FWRNContainerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 891F4AF52A67E12800A9E8DA /* FWRNContainerViewController.swift */; };
11
11
  891F4AF82A68DEDF00A9E8DA /* PushRNContainerParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = 891F4AF72A68DEDF00A9E8DA /* PushRNContainerParams.swift */; };
12
12
  891F4AFA2A68DF2B00A9E8DA /* RCTConvert+FWNavigatorModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 891F4AF92A68DF2B00A9E8DA /* RCTConvert+FWNavigatorModule.swift */; };
13
+ 8930E1E22B5BED6100EB3512 /* FWReactNativeSDK.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8930E1E12B5BED6100EB3512 /* FWReactNativeSDK.swift */; };
13
14
  897523872817DEF80070EBB6 /* (null) in Sources */ = {isa = PBXBuildFile; };
14
15
  897523882817DEF80070EBB6 /* (null) in Sources */ = {isa = PBXBuildFile; };
15
16
  897523892817DEF80070EBB6 /* (null) in Sources */ = {isa = PBXBuildFile; };
@@ -96,6 +97,7 @@
96
97
  891F4AF52A67E12800A9E8DA /* FWRNContainerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FWRNContainerViewController.swift; sourceTree = "<group>"; };
97
98
  891F4AF72A68DEDF00A9E8DA /* PushRNContainerParams.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PushRNContainerParams.swift; sourceTree = "<group>"; };
98
99
  891F4AF92A68DF2B00A9E8DA /* RCTConvert+FWNavigatorModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "RCTConvert+FWNavigatorModule.swift"; sourceTree = "<group>"; };
100
+ 8930E1E12B5BED6100EB3512 /* FWReactNativeSDK.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FWReactNativeSDK.swift; sourceTree = "<group>"; };
99
101
  894FADB229BAD571000FB51A /* libFireworkSdk.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libFireworkSdk.a; sourceTree = BUILT_PRODUCTS_DIR; };
100
102
  897523632817DEF80070EBB6 /* react_native_firework_sdk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = react_native_firework_sdk.h; sourceTree = "<group>"; };
101
103
  898873132A0A8E7E0089CD1C /* UIViewController+AttachChild.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIViewController+AttachChild.swift"; sourceTree = "<group>"; };
@@ -157,6 +159,7 @@
157
159
  898873102A0A8E7E0089CD1C /* Utils */,
158
160
  1F6F718A2771B48100224AF3 /* FireworkSdk-Bridging-Header.h */,
159
161
  897523632817DEF80070EBB6 /* react_native_firework_sdk.h */,
162
+ 8930E1E12B5BED6100EB3512 /* FWReactNativeSDK.swift */,
160
163
  894FADB229BAD571000FB51A /* libFireworkSdk.a */,
161
164
  );
162
165
  sourceTree = "<group>";
@@ -358,6 +361,7 @@
358
361
  897523952817DEF80070EBB6 /* (null) in Sources */,
359
362
  898873532A0A8E7E0089CD1C /* Product.swift in Sources */,
360
363
  8988736C2A0A8E7E0089CD1C /* VideoPlayerConfiguration.swift in Sources */,
364
+ 8930E1E22B5BED6100EB3512 /* FWReactNativeSDK.swift in Sources */,
361
365
  8988734D2A0A8E7E0089CD1C /* FWNavigatorModule.swift in Sources */,
362
366
  898873692A0A8E7E0089CD1C /* StoryBlockManager.m in Sources */,
363
367
  897523A02817DEF80070EBB6 /* (null) in Sources */,
@@ -8,25 +8,27 @@
8
8
  import FireworkVideo
9
9
  import Foundation
10
10
 
11
+ var gVideoDetailsForTappingCTAButton: VideoDetails?
12
+
11
13
  extension FireworkSDKModule: FireworkVideoCTADelegate {
12
14
  func handleCustomCTAClick(_ viewController: PlayerViewController, url: URL) -> Bool {
13
- #if DEBUG
14
- let formatter = DateFormatter()
15
- formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
16
- sendEvent(
17
- withName: FWEventName.logMessage.rawValue,
18
- body: [
19
- "message":
20
- "[iOS] Receive CustomCTAClick event \(formatter.string(from: Date()))"
21
- ])
22
- #endif
23
15
  let callbackId = UUID().uuidString
24
16
  playerMap.setObject(viewController, forKey: callbackId as NSString)
25
- sendEvent(withName: FWEventName.customCTAClick.rawValue,
26
- body: [
27
- "url": url.absoluteString,
28
- "callbackId": callbackId
29
- ])
17
+
18
+ DispatchQueue.main.async { [weak self] in
19
+ var body: [String: Any?] = [
20
+ "url": url.absoluteString,
21
+ "callbackId": callbackId
22
+ ]
23
+
24
+ if let video = gVideoDetailsForTappingCTAButton {
25
+ body["video"] = video.jsObject
26
+ gVideoDetailsForTappingCTAButton = nil
27
+ }
28
+
29
+ self?.sendEvent(withName: FWEventName.customCTAClick.rawValue,
30
+ body: body)
31
+ }
30
32
 
31
33
  return customCTAClickEnabled
32
34
  }
@@ -110,6 +110,7 @@ extension FireworkSDKModule: FireworkVideoPlaybackDelegate {
110
110
  }
111
111
 
112
112
  func fireworkVideoDidTapCTAButton(_ videoPlayback: VideoPlaybackDetails) {
113
+ gVideoDetailsForTappingCTAButton = videoPlayback
113
114
  guard enableVideoPlayBackEvent else { return }
114
115
  sendEvent(
115
116
  withName: FWEventName.videoPlayback.rawValue,
@@ -132,17 +133,6 @@ extension FireworkSDKModule: FireworkVideoPlaybackDelegate {
132
133
 
133
134
  extension FireworkSDKModule: FireworkVideoFeedDelegate {
134
135
  func fireworkVideoDidTapThumbnail(_ eventDetails: FeedEventDetails) {
135
- #if DEBUG
136
- let formatter = DateFormatter()
137
- formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
138
- sendEvent(
139
- withName: FWEventName.logMessage.rawValue,
140
- body: [
141
- "message":
142
- "[iOS] Send VideoFeedClick event id: \(eventDetails.id) \(formatter.string(from: Date()))"
143
- ])
144
- #endif
145
-
146
136
  sendEvent(
147
137
  withName: FWEventName.videoFeedClick.rawValue, body: ["info": eventDetails.jsObject])
148
138
  }
@@ -11,6 +11,7 @@
11
11
  @interface RCT_EXTERN_REMAP_MODULE(FireworkSDK, FireworkSDKModule, NSObject)
12
12
 
13
13
  _RCT_EXTERN_REMAP_METHOD(init, initializeSDK:(NSDictionary * __nullable)options resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter, NO)
14
+ RCT_EXTERN_METHOD(markInitCalled:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
14
15
  RCT_EXTERN_METHOD(openVideoPlayer:(NSString *)url config:(NSDictionary *)config)
15
16
  RCT_EXTERN_METHOD(setVideoFeedClickCallbackEnabled:(BOOL)enabled)
16
17
  RCT_EXTERN_METHOD(setCustomCTAClickEnabled:(BOOL)enabled)
@@ -7,16 +7,18 @@
7
7
  // The FireworkSDKModule Wrap native FireworkVideoSDK class,then expose to JavaScript in Objective-C
8
8
 
9
9
  import FireworkVideo
10
- #if canImport(FireworkVideoUI)
11
10
  import FireworkVideoUI
12
- #endif
13
11
 
14
12
  var gShareBaseURL: String?
15
13
  var gAdBadgeConfiguration: AdBadgeConfiguration?
16
- var gVideoLaunchBehavior: VideoLaunchBehavior?
14
+ var gVideoLaunchBehavior: FWRVideoLaunchBehavior?
17
15
 
18
16
  @objc(FireworkSDKModule)
19
17
  class FireworkSDKModule: RCTEventEmitter, FireworkVideoSDKDelegate {
18
+ static var shared: FireworkSDKModule?
19
+ static var cachedSDKInitOptions: SDKInitOptions?
20
+ static var hasCachedSDKInitOptions: Bool = false
21
+
20
22
  // var shareBaseURL: String?
21
23
  var customCTAClickEnabled: Bool = false
22
24
 
@@ -26,8 +28,17 @@ class FireworkSDKModule: RCTEventEmitter, FireworkVideoSDKDelegate {
26
28
  // player view controller
27
29
  var playerMap: NSMapTable<NSString, UIViewController> = NSMapTable.strongToWeakObjects()
28
30
 
31
+ private var hasCalledSDKInitFromNative: Bool = false
32
+ private var argumentsForInitEvent: [String: Any]?
33
+ private var hasListeners = false
34
+
29
35
  override init() {
30
36
  super.init()
37
+ Self.shared = self
38
+ if Self.hasCachedSDKInitOptions {
39
+ self.initializeSDK(Self.cachedSDKInitOptions, true)
40
+ }
41
+
31
42
  _ = AppLanguageManager.shared
32
43
  NotificationCenter.default.addObserver(
33
44
  self, selector: #selector(Self.onAppLanguageChanged),
@@ -46,46 +57,62 @@ class FireworkSDKModule: RCTEventEmitter, FireworkVideoSDKDelegate {
46
57
  return DispatchQueue.main
47
58
  }
48
59
 
60
+ static func initializeSDK(_ options: SDKInitOptions?) {
61
+ if let shared = shared {
62
+ shared.initializeSDK(options, true)
63
+ } else {
64
+ hasCachedSDKInitOptions = true
65
+ cachedSDKInitOptions = options
66
+ }
67
+ }
68
+
49
69
  @objc(initializeSDK:resolver:rejecter:)
50
70
  func initializeSDK(
51
71
  _ options: NSDictionary? = nil,
52
72
  resolver: RCTPromiseResolveBlock,
53
73
  rejecter: RCTPromiseRejectBlock
54
74
  ) {
55
- #if DEBUG
56
- let formatter = DateFormatter()
57
- formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
58
- let iOSSDKBundle = Bundle(for: FireworkVideoSDK.self)
59
-
60
- let messageForLocalizations = """
61
- [iOS] localizations information \(formatter.string(from: Date()))
62
- AppleLanguages: \((UserDefaults.standard.object(forKey: "AppleLanguages") as? [String]) ?? [])
63
- Bundle.main.localizations \(Bundle.main.localizations)
64
- Bundle.main.preferredLocalizations \(Bundle.main.preferredLocalizations)
65
- iOSSDKBundle.localizations \(iOSSDKBundle.localizations)
66
- iOSSDKBundle.preferredLocalizations \(iOSSDKBundle.preferredLocalizations)
67
- """
68
- print("[react-native-firework-sdk] [swift] \(messageForLocalizations)")
69
- sendEvent(withName: FWEventName.logMessage.rawValue, body: ["message": messageForLocalizations])
70
-
71
- let message = "[iOS] Call initializeSDK \(formatter.string(from: Date()))"
72
- print("[react-native-firework-sdk] [swift] \(message)")
73
-
74
- sendEvent(withName: FWEventName.logMessage.rawValue, body: ["message": message])
75
- #endif
76
75
  var sdkInitOptions: SDKInitOptions?
77
76
  if let options = options as? [String: Any] {
78
77
  sdkInitOptions = RCTConvert.sdkInitOptions(options)
79
78
  }
80
- gVideoLaunchBehavior = sdkInitOptions?.videoLaunchBehavior
81
-
82
- FireworkVideoSDK.initializeSDK(delegate: self, userID: sdkInitOptions?.userId)
83
- FireworkVideoSDK.ctaDelegate = self
84
- FireworkVideoSDK.eventTracking.videoPlaybackDelegate = self
85
- FireworkVideoSDK.eventTracking.feedDelegate = self
79
+ initializeSDK(sdkInitOptions, false)
86
80
  resolver([:])
87
81
  }
88
82
 
83
+ @objc(markInitCalled:rejecter:)
84
+ func markInitCalled(
85
+ _ resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock
86
+ ) {
87
+ if hasCalledSDKInitFromNative,
88
+ let argumentsForInitEvent = argumentsForInitEvent {
89
+ // The sdk init event was received before.
90
+ sendEvent(withName: FWEventName.sdkInit.rawValue, body: argumentsForInitEvent)
91
+ }
92
+
93
+ resolver(hasCalledSDKInitFromNative)
94
+ }
95
+
96
+ func initializeSDK(_ options: SDKInitOptions?, _ fromNative: Bool) {
97
+ if hasCalledSDKInitFromNative && !fromNative {
98
+ if let argumentsForInitEvent = argumentsForInitEvent {
99
+ // The sdk init event was received before.
100
+ sendEvent(withName: FWEventName.sdkInit.rawValue, body: argumentsForInitEvent)
101
+ }
102
+ } else {
103
+ gVideoLaunchBehavior = options?.videoLaunchBehavior
104
+
105
+ FireworkVideoSDK.initializeSDK(delegate: self, userID: options?.userId)
106
+ FireworkVideoSDK.ctaDelegate = self
107
+ FireworkVideoSDK.eventTracking.videoPlaybackDelegate = self
108
+ FireworkVideoSDK.eventTracking.feedDelegate = self
109
+ }
110
+
111
+ if fromNative {
112
+ hasCalledSDKInitFromNative = true
113
+ }
114
+ }
115
+
89
116
  @objc(openVideoPlayer:config:)
90
117
  func openVideoPlayer(_ url: String, config: NSDictionary?) {
91
118
  guard let urlString = URL.init(string: url) else {
@@ -166,18 +193,6 @@ class FireworkSDKModule: RCTEventEmitter, FireworkVideoSDKDelegate {
166
193
  }
167
194
 
168
195
  guard let trackPurchaseParameters = RCTConvert.trackPurchaseParameters(parameters) else {
169
- #if DEBUG
170
- let formatter = DateFormatter()
171
- formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
172
-
173
- let message = """
174
- "[iOS] Fail to parse parameters of trackPurchase \
175
- method: \(String(describing: parameters)) \(formatter.string(from: Date()))
176
- """
177
- print("[react-native-firework-sdk] [swift] \(message)")
178
-
179
- sendEvent(withName: FWEventName.logMessage.rawValue, body: ["message": message])
180
- #endif
181
196
  return
182
197
  }
183
198
  FireworkVideoSDK.trackPurchase(
@@ -195,58 +210,42 @@ class FireworkSDKModule: RCTEventEmitter, FireworkVideoSDKDelegate {
195
210
  resolver: @escaping RCTPromiseResolveBlock,
196
211
  rejecter: @escaping RCTPromiseRejectBlock
197
212
  ) {
198
- #if DEBUG
199
- let formatter = DateFormatter()
200
- formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
201
- let message = "[iOS] Call changeAppLanguage: \(language ?? "") \(formatter.string(from: Date()))"
202
- sendEvent(withName: FWEventName.logMessage.rawValue, body: ["message": message])
203
- #endif
204
-
205
213
  let result = AppLanguageManager.shared.changeAppLanguage(language)
206
214
 
207
215
  resolver(result)
208
216
  }
209
217
 
210
- // MARK: - FireworkVideoSDKDelegate
211
- func fireworkVideoDidLoadSuccessfully() {
212
- #if DEBUG
213
- let formatter = DateFormatter()
214
- formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
218
+ override func startObserving() {
219
+ super.startObserving()
220
+ hasListeners = true
221
+ }
215
222
 
216
- let message =
217
- "[iOS] Send SDK initialization successful event \(formatter.string(from: Date()))"
218
- print("[react-native-firework-sdk] [swift] \(message)")
223
+ override func stopObserving() {
224
+ super.stopObserving()
225
+ hasListeners = false
226
+ }
219
227
 
220
- sendEvent(withName: FWEventName.logMessage.rawValue, body: ["message": message])
221
- #endif
228
+ // MARK: - FireworkVideoSDKDelegate
229
+ func fireworkVideoDidLoadSuccessfully() {
230
+ argumentsForInitEvent = [:]
222
231
 
223
- sendEvent(withName: FWEventName.sdkInit.rawValue, body: [:])
232
+ if hasListeners {
233
+ sendEvent(withName: FWEventName.sdkInit.rawValue, body: argumentsForInitEvent)
234
+ }
224
235
  }
225
236
 
226
237
  func fireworkVideoDidLoadWith(error: FireworkVideoSDKError) {
227
- #if DEBUG
228
- let formatter = DateFormatter()
229
- formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
230
-
231
- let message =
232
- "[iOS] Send SDK initialization failure event \(formatter.string(from: Date()))"
233
- print("[react-native-firework-sdk] [swift] \(message)")
238
+ argumentsForInitEvent = [
239
+ "error": [
240
+ "name": error.jsErrorName, "reason": error.recoverySuggestion ?? "default"
241
+ ]
242
+ ]
234
243
 
244
+ if hasListeners {
235
245
  sendEvent(
236
- withName: FWEventName.logMessage.rawValue,
237
- body: [
238
- "message":
239
- "[iOS] Send SDK initialization failure event \(formatter.string(from: Date()))"
240
- ])
241
- #endif
242
-
243
- sendEvent(
244
- withName: FWEventName.sdkInit.rawValue,
245
- body: [
246
- "error": [
247
- "name": error.jsErrorName, "reason": error.recoverySuggestion ?? "default"
248
- ]
249
- ])
246
+ withName: FWEventName.sdkInit.rawValue,
247
+ body: argumentsForInitEvent)
248
+ }
250
249
  }
251
250
 
252
251
  @objc func onAppLanguageChanged() {
@@ -7,16 +7,20 @@
7
7
  import Foundation
8
8
  import FireworkVideo
9
9
 
10
- struct SDKInitOptions: Codable {
11
- var userId: String?
12
- var videoLaunchBehavior: VideoLaunchBehavior?
10
+ public struct SDKInitOptions: Codable {
11
+ public var userId: String?
12
+ public var videoLaunchBehavior: FWRVideoLaunchBehavior?
13
+ public init(userId: String? = nil, videoLaunchBehavior: FWRVideoLaunchBehavior? = nil) {
14
+ self.userId = userId
15
+ self.videoLaunchBehavior = videoLaunchBehavior
16
+ }
13
17
  }
14
18
 
15
- public enum VideoLaunchBehavior: String, Codable {
19
+ public enum FWRVideoLaunchBehavior: String, Codable {
16
20
  case `default`, muteOnFirstLaunch
17
21
  }
18
22
 
19
- extension VideoLaunchBehavior {
23
+ extension FWRVideoLaunchBehavior {
20
24
  func behavior() -> VideoPlayerContentConfiguration.VideoLaunchBehavior {
21
25
  switch self {
22
26
  case .muteOnFirstLaunch:
@@ -5,7 +5,7 @@
5
5
  // Created by Jeff Zheng on 2021/12/30.
6
6
  //
7
7
 
8
- // swiftlint:disable file_length type_body_length
8
+ // swiftlint:disable file_length
9
9
  import FireworkVideo
10
10
  import Foundation
11
11
 
@@ -75,55 +75,16 @@ class ShoppingModule: RCTEventEmitter, FireworkVideoShoppingDelegate {
75
75
 
76
76
  @objc
77
77
  func updateVideoProducts(_ products: [AnyObject]?, cbId: NSNumber) {
78
- #if DEBUG
79
- let formatter = DateFormatter()
80
- formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
81
- let message1 = "[iOS] Call updateVideoProducts 1 \(formatter.string(from: Date()))"
82
- print("[react-native-firework-sdk] [swift] \(message1)")
83
-
84
- sendEvent(
85
- withName: FWEventName.logMessage.rawValue,
86
- body: [
87
- "message": message1
88
- ])
89
- #endif
90
-
91
78
  guard let productHydrating = productHydratingMap[Int(truncating: cbId)] else {
92
79
  return
93
80
  }
94
81
 
95
82
  productHydratingMap.removeValue(forKey: Int(truncating: cbId))
96
83
 
97
- #if DEBUG
98
- let message2 = "[iOS] Call updateVideoProducts 2 \(formatter.string(from: Date()))"
99
- print("[react-native-firework-sdk] [swift] \(message2)")
100
-
101
- sendEvent(
102
- withName: FWEventName.logMessage.rawValue,
103
- body: [
104
- "message": message2
105
- ])
106
- #endif
107
-
108
84
  guard let rProducts = RCTConvert.buildProducts(products) else {
109
85
  return
110
86
  }
111
87
 
112
- #if DEBUG
113
- let productIds = rProducts.map({ product in
114
- return product.productId
115
- }).joined(separator: ",")
116
- let message3 =
117
- "[iOS] Call updateVideoProducts 3 productIds: \(productIds) \(formatter.string(from: Date()))"
118
- print("[react-native-firework-sdk] [swift] \(message3)")
119
-
120
- sendEvent(
121
- withName: FWEventName.logMessage.rawValue,
122
- body: [
123
- "message": message3
124
- ])
125
- #endif
126
-
127
88
  for product in rProducts {
128
89
  productHydrating.hydrateProduct(
129
90
  product.productId, { build in
@@ -188,10 +149,6 @@ class ShoppingModule: RCTEventEmitter, FireworkVideoShoppingDelegate {
188
149
  return
189
150
  }
190
151
 
191
- #if DEBUG
192
- print("ctaResult res \(String(describing: ctaResult.res))")
193
- #endif
194
-
195
152
  guard let handler = shoppingCTAHandlerMap[Int(truncating: cbId)] else {
196
153
  return
197
154
  }
@@ -244,19 +201,6 @@ class ShoppingModule: RCTEventEmitter, FireworkVideoShoppingDelegate {
244
201
  if let productInfoViewConfiguration = productInfoViewConfiguration {
245
202
  ShoppingModule.hydrateProductViewConfig(productInfoViewConfiguration, productInfoViewConfigurator)
246
203
  }
247
-
248
- #if DEBUG
249
- let formatter = DateFormatter()
250
- formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
251
-
252
- let message =
253
- "[iOS] Send WillDisplayProduct event videoId: \(video.videoID) \(formatter.string(from: Date()))"
254
- print("[react-native-firework-sdk] [swift] \(message)")
255
-
256
- sendEvent(
257
- withName: FWEventName.logMessage.rawValue,
258
- body: ["message": message])
259
- #endif
260
204
  }
261
205
 
262
206
  func fireworkShopping(
@@ -266,24 +210,13 @@ class ShoppingModule: RCTEventEmitter, FireworkVideoShoppingDelegate {
266
210
  let callbackId = ShoppingModule.generateCallbackId()
267
211
  self.productHydratingMap[callbackId] = productHydrator
268
212
 
269
- #if DEBUG
270
- let formatter = DateFormatter()
271
- formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
272
-
273
- let message = """
274
- "[iOS] Send UpdateProductDetails event productIds: \(products) and \
275
- videoId: \(video.videoID) \(formatter.string(from: Date()))
276
- """
277
- print("[react-native-firework-sdk] [swift] \(message)")
278
-
279
- sendEvent(
280
- withName: FWEventName.logMessage.rawValue,
281
- body: ["message": message])
282
- #endif
283
-
284
213
  sendEvent(
285
214
  withName: ShoppingEventName.updateProductDetails.rawValue,
286
- body: ["productIds": products, "callbackId": callbackId])
215
+ body: [
216
+ "productIds": products,
217
+ "callbackId": callbackId,
218
+ "video": video.jsObject
219
+ ])
287
220
  }
288
221
 
289
222
  func fireworkShopping(
@@ -296,6 +229,7 @@ class ShoppingModule: RCTEventEmitter, FireworkVideoShoppingDelegate {
296
229
  self.shoppingCTAHandlerMap[callbackId] = ctaCompletionHandler
297
230
  var body = item.jsObject
298
231
  body["callbackId"] = callbackId
232
+ body["video"] = video.jsObject
299
233
  sendEvent(
300
234
  withName: ShoppingEventName.ctaButtonClick.rawValue,
301
235
  body: body)
@@ -319,7 +253,9 @@ class ShoppingModule: RCTEventEmitter, FireworkVideoShoppingDelegate {
319
253
  didTapCartIconForVideo videoDetails: VideoDetails
320
254
  ) {
321
255
  sendEvent(
322
- withName: ShoppingEventName.clickCartIcon.rawValue, body: [:])
256
+ withName: ShoppingEventName.clickCartIcon.rawValue, body: [
257
+ "video": videoDetails.jsObject
258
+ ])
323
259
  }
324
260
 
325
261
  func fireworkShopping(