react-native-firework-sdk 2.0.0 → 2.2.0-beta.1

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 (202) hide show
  1. package/FireworkVideoUI.xcframework/Info.plist +40 -0
  2. package/FireworkVideoUI.xcframework/ios-arm64/FireworkVideoUI.framework/FireworkVideoUI +0 -0
  3. package/FireworkVideoUI.xcframework/ios-arm64/FireworkVideoUI.framework/Headers/FireworkVideoUI-Swift.h +280 -0
  4. package/FireworkVideoUI.xcframework/ios-arm64/FireworkVideoUI.framework/Headers/FireworkVideoUI.h +18 -0
  5. package/FireworkVideoUI.xcframework/ios-arm64/FireworkVideoUI.framework/Info.plist +0 -0
  6. package/FireworkVideoUI.xcframework/ios-arm64/FireworkVideoUI.framework/Modules/FireworkVideoUI.swiftmodule/arm64-apple-ios.abi.json +1327 -0
  7. package/FireworkVideoUI.xcframework/ios-arm64/FireworkVideoUI.framework/Modules/FireworkVideoUI.swiftmodule/arm64-apple-ios.private.swiftinterface +41 -0
  8. package/FireworkVideoUI.xcframework/ios-arm64/FireworkVideoUI.framework/Modules/FireworkVideoUI.swiftmodule/arm64-apple-ios.swiftdoc +0 -0
  9. package/FireworkVideoUI.xcframework/ios-arm64/FireworkVideoUI.framework/Modules/FireworkVideoUI.swiftmodule/arm64-apple-ios.swiftinterface +41 -0
  10. package/FireworkVideoUI.xcframework/ios-arm64/FireworkVideoUI.framework/Modules/module.modulemap +11 -0
  11. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/FireworkVideoUI +0 -0
  12. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/Headers/FireworkVideoUI-Swift.h +556 -0
  13. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/Headers/FireworkVideoUI.h +18 -0
  14. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/Info.plist +0 -0
  15. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/Modules/FireworkVideoUI.swiftmodule/arm64-apple-ios-simulator.abi.json +1327 -0
  16. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/Modules/FireworkVideoUI.swiftmodule/arm64-apple-ios-simulator.private.swiftinterface +41 -0
  17. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/Modules/FireworkVideoUI.swiftmodule/arm64-apple-ios-simulator.swiftdoc +0 -0
  18. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/Modules/FireworkVideoUI.swiftmodule/arm64-apple-ios-simulator.swiftinterface +41 -0
  19. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/Modules/FireworkVideoUI.swiftmodule/x86_64-apple-ios-simulator.abi.json +1327 -0
  20. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/Modules/FireworkVideoUI.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface +41 -0
  21. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/Modules/FireworkVideoUI.swiftmodule/x86_64-apple-ios-simulator.swiftdoc +0 -0
  22. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/Modules/FireworkVideoUI.swiftmodule/x86_64-apple-ios-simulator.swiftinterface +41 -0
  23. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/Modules/module.modulemap +11 -0
  24. package/FireworkVideoUI.xcframework/ios-arm64_x86_64-simulator/FireworkVideoUI.framework/_CodeSignature/CodeResources +245 -0
  25. package/README.md +1 -1
  26. package/android/build.gradle +5 -4
  27. package/android/src/main/java/com/fireworksdk/bridge/components/videofeed/FWVideoFeed.kt +6 -0
  28. package/android/src/main/java/com/fireworksdk/bridge/components/videofeed/StoryBlockFragment.kt +129 -0
  29. package/android/src/main/java/com/fireworksdk/bridge/components/videofeed/StoryBlockFrameLayout.kt +90 -0
  30. package/android/src/main/java/com/fireworksdk/bridge/models/FWAdBadgeConfigModelDeserializer.kt +3 -3
  31. package/android/src/main/java/com/fireworksdk/bridge/models/FWEventName.kt +5 -1
  32. package/android/src/main/java/com/fireworksdk/bridge/models/FWFontInfoModelDeserializer.kt +1 -1
  33. package/android/src/main/java/com/fireworksdk/bridge/models/FWProductInfoViewConfiguration.kt +18 -5
  34. package/android/src/main/java/com/fireworksdk/bridge/models/FWProductInfoViewConfigurationDeserializer.kt +36 -8
  35. package/android/src/main/java/com/fireworksdk/bridge/models/FWSDKInitOptionsModelDeserializer.kt +3 -3
  36. package/android/src/main/java/com/fireworksdk/bridge/models/FWShoppingCtaResult.kt +17 -0
  37. package/android/src/main/java/com/fireworksdk/bridge/models/FWShoppingCtaResultDeserializer.kt +33 -0
  38. package/android/src/main/java/com/fireworksdk/bridge/models/FWVideoFeedConfigModelDeserializer.kt +14 -12
  39. package/android/src/main/java/com/fireworksdk/bridge/models/FWVideoFeedPropsModel.kt +1 -0
  40. package/android/src/main/java/com/fireworksdk/bridge/models/FWVideoFeedPropsModelDeserializer.kt +11 -7
  41. package/android/src/main/java/com/fireworksdk/bridge/models/FWVideoFeedSource.kt +1 -0
  42. package/android/src/main/java/com/fireworksdk/bridge/models/FWVideoPlaybackDetails.kt +8 -8
  43. package/android/src/main/java/com/fireworksdk/bridge/models/FWVideoPlayerConfigModel.kt +1 -0
  44. package/android/src/main/java/com/fireworksdk/bridge/models/FWVideoPlayerConfigModelDeserializer.kt +19 -12
  45. package/android/src/main/java/com/fireworksdk/bridge/models/FWVideoShoppingProductDeserializer.kt +11 -11
  46. package/android/src/main/java/com/fireworksdk/bridge/reactnative/manager/FWStoryBlockManager.kt +131 -45
  47. package/android/src/main/java/com/fireworksdk/bridge/reactnative/manager/FWVideoFeedManager.kt +11 -3
  48. package/android/src/main/java/com/fireworksdk/bridge/reactnative/models/FWVideoShoppingInterface.kt +2 -2
  49. package/android/src/main/java/com/fireworksdk/bridge/reactnative/module/FWLiveStreamModule.kt +45 -4
  50. package/android/src/main/java/com/fireworksdk/bridge/reactnative/module/FWNavigatorModule.kt +9 -1
  51. package/android/src/main/java/com/fireworksdk/bridge/reactnative/module/FWVideoShoppingModule.kt +83 -50
  52. package/android/src/main/java/com/fireworksdk/bridge/reactnative/module/FireworkSDKModule.kt +112 -36
  53. package/android/src/main/java/com/fireworksdk/bridge/reactnative/utils/FWEventUtils.kt +16 -6
  54. package/android/src/main/java/com/fireworksdk/bridge/utils/FWConfigUtil.kt +26 -32
  55. package/android/src/main/java/com/fireworksdk/bridge/utils/FWGlobalDataUtil.kt +10 -0
  56. package/android/src/main/java/com/fireworksdk/bridge/utils/FWLanguageUtil.kt +48 -16
  57. package/android/src/main/res/layout/fw_bridge_story_block.xml +24 -0
  58. package/ios/Components/StoryBlock.swift +32 -2
  59. package/ios/Components/StoryBlockManager.m +33 -0
  60. package/ios/Components/StoryBlockManager.swift +4 -0
  61. package/ios/Components/VideoFeed.swift +16 -32
  62. package/ios/Components/VideoFeedManager.m +12 -6
  63. package/ios/Components/VideoFeedManager.swift +4 -0
  64. package/ios/Components/VideoPlayerConfiguration.swift +1 -0
  65. package/ios/FireworkSdk.xcodeproj/project.pbxproj +276 -212
  66. package/ios/FireworkVideoUI/FireworkVideoUI/FireworkVideoUI.docc/FireworkVideoUI.md +13 -0
  67. package/ios/FireworkVideoUI/FireworkVideoUI/FireworkVideoUI.h +18 -0
  68. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/AppLanguage/AppLanguageManager.swift +147 -0
  69. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/AppLanguage/Extensions/Foundation/Bundle+AppLanguage.swift +58 -0
  70. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/AppLanguage/Extensions/Foundation/NumberFormatter+AppLanguage.swift +25 -0
  71. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/AppLanguage/Extensions/Foundation/URLSession+AppLanguage.swift +69 -0
  72. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/AppLanguage/Extensions/UIKit/UIImageView+AppLanguage.swift +91 -0
  73. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/AppLanguage/Extensions/UIKit/UILabel+AppLanguage.swift +98 -0
  74. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/AppLanguage/Extensions/UIKit/UITextField+AppLanguage.swift +97 -0
  75. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/AppLanguage/Extensions/UIKit/UITextView+AppLanguage.swift +97 -0
  76. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/AppLanguage/Extensions/UIKit/UIView+AppLanguage.swift +38 -0
  77. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/AppLanguage/Extensions/UIKit/UIViewController+AppLanguage.swift +46 -0
  78. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/AppLanguage/Extensions/UIKit/UIWindow+AppLanguage.swift +26 -0
  79. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/AppLanguage/LanguageUtil.swift +43 -0
  80. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/LayoutFlip/Extensions/Foundation/NSObject+LayoutFlip.swift +42 -0
  81. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/LayoutFlip/Extensions/UIKit/CALayer+LayoutFlip.swift +160 -0
  82. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/LayoutFlip/Extensions/UIKit/UILabel+LayoutFlip.swift +35 -0
  83. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/LayoutFlip/Extensions/UIKit/UIView+LayoutFlip.swift +199 -0
  84. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/LayoutFlip/LayoutFlipManager.swift +59 -0
  85. package/ios/{Utils/DispatchQueue+FWOnce.swift → FireworkVideoUI/FireworkVideoUI/Sources/Utils/Extensions/Foundation/DispatchQueue+Once.swift} +5 -5
  86. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/Utils/Extensions/Foundation/String+Base64.swift +18 -0
  87. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/Utils/Extensions/UIKit/UIView+UIHierarchy.swift +46 -0
  88. package/ios/FireworkVideoUI/FireworkVideoUI/Sources/Utils/Swizzle.swift +37 -0
  89. package/ios/FireworkVideoUI/FireworkVideoUI.xcodeproj/project.pbxproj +766 -0
  90. package/ios/FireworkVideoUI/FireworkVideoUI.xcworkspace/contents.xcworkspacedata +10 -0
  91. package/ios/FireworkVideoUI/FireworkVideoUI.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  92. package/ios/FireworkVideoUI/FireworkVideoUITests/FireworkVideoUITests.swift +37 -0
  93. package/ios/FireworkVideoUI/Podfile +15 -0
  94. package/ios/FireworkVideoUI/Podfile.lock +16 -0
  95. package/ios/Models/NativeToRN/FireworkEventName.swift +7 -1
  96. package/ios/Models/NativeToRN/FireworkSDK+Json.swift +5 -1
  97. package/ios/Models/RNToNative/RCTConvert+Shopping.swift +21 -0
  98. package/ios/Models/RNToNative/RCTConvert+StoryBlock.swift +2 -1
  99. package/ios/Models/RNToNative/RCTConvert+VideoFeed.swift +29 -1
  100. package/ios/Modules/FWNavigatorModule/FWNavigatorModule.swift +13 -101
  101. package/ios/Modules/FireworkSDKModule/FireworkSDKModule+EventTracking.swift +34 -16
  102. package/ios/Modules/FireworkSDKModule/FireworkSDKModule.m +1 -0
  103. package/ios/Modules/FireworkSDKModule/FireworkSDKModule.swift +48 -2
  104. package/ios/Modules/FireworkSDKModule/SDKInitOptions.swift +0 -1
  105. package/ios/Modules/LiveStream/LiveStreamModule.swift +1 -0
  106. package/ios/Modules/Shopping/ProductInfoViewConfiguration.swift +7 -2
  107. package/ios/Modules/Shopping/ShoppingCTAResult.swift +16 -0
  108. package/ios/Modules/Shopping/ShoppingModule.m +2 -1
  109. package/ios/Modules/Shopping/ShoppingModule.swift +92 -34
  110. package/ios/Support/MultiHostStreaming/FWMultiHostStreaming.podspec +22 -0
  111. package/ios/Support/MultiHostStreaming/Sources/MultiHostStreamingSDK.swift +17 -0
  112. package/ios/Utils/{UINavigationController+FWSwizzle.swift → Extensions/Swizzle/UINavigationController+FWSwizzle.swift} +9 -8
  113. package/ios/Utils/FWSwizzleLoader.m +6 -1
  114. package/ios/Utils/FWSwizzleLoader.swift +13 -0
  115. package/ios/react_native_firework_sdk.h +1 -0
  116. package/ios/scripts/react_native_firework_sdk_pods.rb +27 -0
  117. package/lib/commonjs/FireworkSDK.js +55 -15
  118. package/lib/commonjs/FireworkSDK.js.map +1 -1
  119. package/lib/commonjs/LiveStream.js +2 -2
  120. package/lib/commonjs/LiveStream.js.map +1 -1
  121. package/lib/commonjs/VideoShopping.js +21 -38
  122. package/lib/commonjs/VideoShopping.js.map +1 -1
  123. package/lib/commonjs/components/StoryBlock.js +193 -128
  124. package/lib/commonjs/components/StoryBlock.js.map +1 -1
  125. package/lib/commonjs/components/VideoFeed.js +17 -5
  126. package/lib/commonjs/components/VideoFeed.js.map +1 -1
  127. package/lib/commonjs/index.js.map +1 -1
  128. package/lib/commonjs/models/FWEventName.js +3 -0
  129. package/lib/commonjs/models/FWEventName.js.map +1 -1
  130. package/lib/commonjs/models/ShoppingCTAResult.js +2 -0
  131. package/lib/commonjs/models/VideoPlaybackEventName.js +3 -0
  132. package/lib/commonjs/models/VideoPlaybackEventName.js.map +1 -1
  133. package/lib/commonjs/modules/FireworkSDKModule.js.map +1 -1
  134. package/lib/commonjs/modules/ShoppingModule.js.map +1 -1
  135. package/lib/module/FireworkSDK.js +54 -15
  136. package/lib/module/FireworkSDK.js.map +1 -1
  137. package/lib/module/LiveStream.js +2 -2
  138. package/lib/module/LiveStream.js.map +1 -1
  139. package/lib/module/VideoShopping.js +21 -40
  140. package/lib/module/VideoShopping.js.map +1 -1
  141. package/lib/module/components/StoryBlock.js +183 -133
  142. package/lib/module/components/StoryBlock.js.map +1 -1
  143. package/lib/module/components/VideoFeed.js +16 -5
  144. package/lib/module/components/VideoFeed.js.map +1 -1
  145. package/lib/module/index.js.map +1 -1
  146. package/lib/module/models/FWEventName.js +3 -0
  147. package/lib/module/models/FWEventName.js.map +1 -1
  148. package/lib/module/models/ShoppingCTAResult.js +2 -0
  149. package/lib/module/models/VideoPlaybackEventName.js +3 -0
  150. package/lib/module/models/VideoPlaybackEventName.js.map +1 -1
  151. package/lib/module/modules/FireworkSDKModule.js.map +1 -1
  152. package/lib/module/modules/ShoppingModule.js.map +1 -1
  153. package/lib/typescript/FireworkSDK.d.ts +15 -8
  154. package/lib/typescript/LiveStream.d.ts +2 -2
  155. package/lib/typescript/VideoShopping.d.ts +10 -12
  156. package/lib/typescript/components/StoryBlock.d.ts +25 -24
  157. package/lib/typescript/components/VideoFeed.d.ts +7 -0
  158. package/lib/typescript/index.d.ts +6 -6
  159. package/lib/typescript/models/FWEventName.d.ts +3 -0
  160. package/lib/typescript/models/FWEvents.d.ts +14 -1
  161. package/lib/typescript/models/ProductInfoViewConfiguration.d.ts +12 -8
  162. package/lib/typescript/models/SDKInitOptions.d.ts +6 -1
  163. package/lib/typescript/models/ShoppingCTAResult.d.ts +11 -0
  164. package/lib/typescript/models/StoryBlockSource.d.ts +1 -1
  165. package/lib/typescript/models/VideoFeedSource.d.ts +1 -1
  166. package/lib/typescript/models/VideoPlaybackDetails.d.ts +16 -0
  167. package/lib/typescript/models/VideoPlaybackEventName.d.ts +13 -1
  168. package/lib/typescript/models/VideoPlayerConfiguration.d.ts +4 -0
  169. package/lib/typescript/modules/FireworkSDKModule.d.ts +1 -2
  170. package/lib/typescript/modules/ShoppingModule.d.ts +2 -1
  171. package/package.json +8 -3
  172. package/react-native-firework-sdk.podspec +31 -24
  173. package/src/FireworkSDK.ts +54 -15
  174. package/src/LiveStream.ts +2 -2
  175. package/src/VideoShopping.ts +41 -54
  176. package/src/components/StoryBlock.tsx +210 -98
  177. package/src/components/VideoFeed.tsx +23 -4
  178. package/src/index.ts +15 -9
  179. package/src/models/FWEventName.ts +3 -0
  180. package/src/models/FWEvents.ts +14 -1
  181. package/src/models/ProductInfoViewConfiguration.ts +13 -8
  182. package/src/models/SDKInitOptions.ts +6 -1
  183. package/src/models/ShoppingCTAResult.ts +11 -0
  184. package/src/models/StoryBlockSource.ts +2 -1
  185. package/src/models/VideoFeedSource.ts +2 -1
  186. package/src/models/VideoPlaybackDetails.ts +16 -0
  187. package/src/models/VideoPlaybackEventName.ts +13 -1
  188. package/src/models/VideoPlayerConfiguration.ts +4 -0
  189. package/src/modules/FireworkSDKModule.ts +1 -2
  190. package/src/modules/ShoppingModule.ts +5 -5
  191. package/android/src/main/java/com/fireworksdk/bridge/constants/FWCommandConstant.kt +0 -6
  192. package/ios/Utils/FWSwizzleUtil.swift +0 -29
  193. package/ios/Utils/UIView+ParentViewController.swift +0 -21
  194. package/lib/commonjs/models/AddToCartResult.js +0 -2
  195. package/lib/module/models/AddToCartResult.js +0 -2
  196. package/lib/typescript/models/AddToCartResult.d.ts +0 -10
  197. package/src/models/AddToCartResult.ts +0 -10
  198. /package/ios/Utils/{String+Color.swift → Extensions/String+Color.swift} +0 -0
  199. /package/ios/Utils/{UIView+Constraints.swift → Extensions/UIView+Constraints.swift} +0 -0
  200. /package/ios/Utils/{UIViewController+AttachChild.swift → Extensions/UIViewController+AttachChild.swift} +0 -0
  201. /package/lib/commonjs/models/{AddToCartResult.js.map → ShoppingCTAResult.js.map} +0 -0
  202. /package/lib/module/models/{AddToCartResult.js.map → ShoppingCTAResult.js.map} +0 -0
@@ -3,10 +3,7 @@ package com.fireworksdk.bridge.reactnative.manager
3
3
  import android.view.Choreographer
4
4
  import android.view.View
5
5
  import android.view.ViewGroup
6
- import android.widget.FrameLayout
7
- import androidx.annotation.Nullable
8
6
  import androidx.appcompat.app.AppCompatActivity
9
- import com.facebook.react.bridge.Dynamic
10
7
  import com.facebook.react.bridge.ReactApplicationContext
11
8
  import com.facebook.react.bridge.ReadableArray
12
9
  import com.facebook.react.bridge.ReadableMap
@@ -14,78 +11,107 @@ import com.facebook.react.common.MapBuilder
14
11
  import com.facebook.react.uimanager.ThemedReactContext
15
12
  import com.facebook.react.uimanager.ViewGroupManager
16
13
  import com.facebook.react.uimanager.annotations.ReactProp
17
- import com.facebook.react.uimanager.annotations.ReactPropGroup
18
- import com.fireworksdk.bridge.models.FWStoryBlockEventName
19
- import com.fireworksdk.bridge.models.FWVideoFeedPropsModel
14
+ import com.firework.storyblock.FeedLoadState
15
+ import com.fireworksdk.bridge.components.videofeed.StoryBlockFragment
16
+ import com.fireworksdk.bridge.components.videofeed.StoryBlockFrameLayout
17
+ import com.fireworksdk.bridge.models.*
18
+ import com.fireworksdk.bridge.reactnative.utils.FWEventUtils
19
+ import com.fireworksdk.bridge.utils.FWGlobalDataUtil
20
20
  import com.fireworksdk.bridge.utils.FWLogUtils
21
+ import org.json.JSONObject
21
22
 
22
23
 
23
24
  class FWStoryBlockManager(
24
25
  private val reactContext: ReactApplicationContext
25
- ) : ViewGroupManager<FrameLayout>() {
26
-
27
- private val videoFeedPropsModel: FWVideoFeedPropsModel by lazy { FWVideoFeedPropsModel() }
28
-
29
- private var viewId: Int? = null
26
+ ) : ViewGroupManager<StoryBlockFrameLayout>() {
30
27
 
31
28
  override fun getName(): String {
32
29
  return REACT_CLASS
33
30
  }
34
31
 
35
- override fun createViewInstance(reactContext: ThemedReactContext): FrameLayout {
36
- return FrameLayout(reactContext)
32
+ override fun createViewInstance(reactContext: ThemedReactContext): StoryBlockFrameLayout {
33
+ return StoryBlockFrameLayout(reactContext)
37
34
  }
38
35
 
39
- override fun onAfterUpdateTransaction(view: FrameLayout) {
36
+ override fun onAfterUpdateTransaction(view: StoryBlockFrameLayout) {
40
37
  super.onAfterUpdateTransaction(view)
38
+ // after createFragment
41
39
  FWLogUtils.d { "FWStoryBlockManager onAfterUpdateTransaction" }
42
40
  }
43
41
 
44
- @Nullable
45
- override fun getCommandsMap(): Map<String, Int>? {
46
- return MapBuilder.of("create", COMMAND_CREATE)
42
+ override fun getCommandsMap(): Map<String, Int> {
43
+ val map: MutableMap<String, Int> = HashMap()
44
+ map["create"] = COMMAND_CREATE
45
+ map["play"] = COMMAND_PLAY
46
+ map["pause"] = COMMAND_PAUSE
47
+ map["toggle_full_screen"] = COMMAND_TOGGLE_FULL_SCREEN
48
+ return map
47
49
  }
48
50
 
49
51
  override fun receiveCommand(
50
- root: FrameLayout,
52
+ root: StoryBlockFrameLayout,
51
53
  commandId: String?,
52
54
  args: ReadableArray?
53
55
  ) {
54
56
  super.receiveCommand(root, commandId, args)
55
- val reactNativeViewId = requireNotNull(args).getInt(0)
56
-
57
- FWLogUtils.d { "FWStoryBlockManager receiveCommand commandId: $commandId, reactNativeViewId: $reactNativeViewId" }
57
+ FWLogUtils.d { "FWStoryBlockManager receiveCommand commandId: $commandId, root.isAttachedToWindow: ${root.isAttachedToWindow}" }
58
58
  when (commandId?.toInt()) {
59
- COMMAND_CREATE -> createFragment(root, reactNativeViewId)
59
+ COMMAND_CREATE -> {
60
+ val reactNativeViewId = requireNotNull(args).getInt(0)
61
+ createFragment(root, reactNativeViewId)
62
+ }
63
+ COMMAND_PLAY -> root.play()
64
+ COMMAND_PAUSE -> root.pause()
65
+ COMMAND_TOGGLE_FULL_SCREEN -> root.toggleFullScreen()
60
66
  else -> {}
61
67
  }
62
68
  }
63
69
 
64
70
  @ReactProp(name = "source")
65
- fun setSource(view: FrameLayout, source: String?) {
66
- // videoFeedPropsModel.source = source
71
+ fun setSource(view: StoryBlockFrameLayout, source: String?) {
72
+ view.setSource(source)
67
73
  }
68
74
 
69
75
  @ReactProp(name = "channel")
70
- fun setChannel(view: FrameLayout, channel: String?) {
71
- // videoFeedPropsModel.channel = channel
76
+ fun setChannel(view: StoryBlockFrameLayout, channel: String?) {
77
+ view.setChannel(channel)
72
78
  }
73
79
 
74
80
  @ReactProp(name = "playlist")
75
- fun setPlaylist(view: FrameLayout, playlist: String?) {
76
- // videoFeedPropsModel.playlist = playlist
81
+ fun setPlaylist(view: StoryBlockFrameLayout, playlist: String?) {
82
+ view.setPlaylist(playlist)
83
+ }
84
+
85
+ @ReactProp(name = "hashtagFilterExpression")
86
+ fun setHashtagFilterExpression(view: StoryBlockFrameLayout, hashtagFilterExpression: String?) {
87
+ view.setHashtagFilterExpressionProps(hashtagFilterExpression)
77
88
  }
78
89
 
79
90
  @ReactProp(name = "dynamicContentParameters")
80
- fun setDynamicContentParameters(view: FrameLayout, parameters: ReadableMap?) {
91
+ fun setDynamicContentParameters(view: StoryBlockFrameLayout, parameters: ReadableMap?) {
81
92
  val parametersMap = parameters?.toHashMap() as? HashMap<String, List<String>>
82
- // videoFeedPropsModel.dynamicContentParameters = parametersMap
93
+ view.setDynamicContentParameters(parametersMap)
94
+ }
95
+
96
+ @ReactProp(name = "enablePictureInPicture")
97
+ fun setEnablePictureInPicture(view: StoryBlockFrameLayout, enablePictureInPicture: Boolean?) {
98
+ view.setEnablePictureInPicture(enablePictureInPicture)
83
99
  }
84
100
 
85
- @ReactPropGroup(names = ["width", "height"], customType = "Style")
86
- fun setStyle(view: FrameLayout, index: Int, value: Dynamic) {
87
- // if (index == 0) propWidth = value
88
- // if (index == 1) propHeight = value
101
+ @ReactProp(name = "videoFeedConfiguration")
102
+ fun setVideoFeedConfig(view: StoryBlockFrameLayout, config: ReadableMap?) {
103
+ val configMap = config?.toHashMap() ?: hashMapOf()
104
+ val jsonObject = JSONObject(configMap)
105
+ val videoFeedConfigModel = FWVideoFeedConfigModelDeserializer.deserialize(jsonObject)
106
+ view.setVideoFeedConfig(videoFeedConfigModel)
107
+ }
108
+
109
+ @ReactProp(name = "videoPlayerConfiguration")
110
+ fun setVideoPlayerConfig(view: StoryBlockFrameLayout, config: ReadableMap?) {
111
+ val configMap = config?.toHashMap() ?: hashMapOf()
112
+ val jsonObject = JSONObject(configMap)
113
+ val videoPlayerConfigModel = FWVideoPlayerConfigModelDeserializer.deserialize(jsonObject)
114
+ view.setVideoPlayerConfig(videoPlayerConfigModel)
89
115
  }
90
116
 
91
117
  private fun setupLayout(view: View) {
@@ -100,46 +126,106 @@ class FWStoryBlockManager(
100
126
  })
101
127
  }
102
128
 
103
- /**
104
- * Layout all children properly
105
- */
106
129
  private fun manuallyLayoutChildren(view: View) {
107
130
  view.measure(
108
131
  View.MeasureSpec.makeMeasureSpec(view.measuredWidth, View.MeasureSpec.EXACTLY),
109
132
  View.MeasureSpec.makeMeasureSpec(view.measuredHeight, View.MeasureSpec.EXACTLY)
110
133
  )
111
-
112
134
  view.layout(view.left, view.top, view.right, view.bottom)
113
135
  }
114
136
 
137
+ private fun addStoryBlockListener(fragment: StoryBlockFragment, reactNativeViewId: Int) {
138
+ fragment.setFeedLoadListener { feedLoadState ->
139
+ when (feedLoadState) {
140
+ FeedLoadState.FeedLoaded -> {
141
+ FWEventUtils.receiveStoryBlockLoadFinishedSuccessEvent(reactContext, reactNativeViewId)
142
+ }
143
+ FeedLoadState.FeedLoadFailed -> {
144
+ FWEventUtils.receiveStoryBlockLoadFinishedFailedEvent(
145
+ reactContext,
146
+ reactNativeViewId,
147
+ "FeedLoadFailed",
148
+ "FeedLoadFailed"
149
+ )
150
+ }
151
+ else -> {}
152
+ }
153
+ }
115
154
 
116
- private fun createFragment(root: FrameLayout, reactNativeViewId: Int?) {
155
+ fragment.setOnFullScreenStateChangedListener { isFullScreen ->
156
+ if (isFullScreen) {
157
+ FWGlobalDataUtil.storyBlockFragment = fragment
158
+ }
159
+ FWEventUtils.receiveStoryBlockFullScreenStateChangedEvent(
160
+ reactContext,
161
+ reactNativeViewId,
162
+ isFullScreen
163
+ )
164
+ }
165
+ }
166
+
167
+
168
+ private fun createFragment(root: StoryBlockFrameLayout, reactNativeViewId: Int?) {
117
169
  FWLogUtils.d { "FWStoryBlockManager createFragment, reactNativeViewId = $reactNativeViewId" }
118
170
  reactNativeViewId ?: return
119
171
  val activity = (reactContext.currentActivity as AppCompatActivity?) ?: return
120
172
 
121
- viewId = reactNativeViewId
122
-
123
173
  val parentView = root.findViewById(reactNativeViewId) as ViewGroup
124
174
  // parentView.setBackgroundColor(Color.YELLOW)
125
175
  setupLayout(parentView)
176
+
177
+ val fragment = StoryBlockFragment()
178
+ root.setFragment(fragment)
179
+ addStoryBlockListener(fragment, reactNativeViewId)
180
+
181
+ if (parentView.isAttachedToWindow) {
182
+ if (!fragment.isAdded) {
183
+ activity.supportFragmentManager
184
+ .beginTransaction()
185
+ .replace(reactNativeViewId, fragment, reactNativeViewId.toString())
186
+ .commit()
187
+ }
188
+ } else {
189
+ parentView.addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener {
190
+ override fun onViewAttachedToWindow(v: View?) {
191
+ FWLogUtils.d { "FWStoryBlockManager createFragment doOnAttach" }
192
+ if (!fragment.isAdded) {
193
+ activity.supportFragmentManager
194
+ .beginTransaction()
195
+ .replace(reactNativeViewId, fragment, reactNativeViewId.toString())
196
+ .commit()
197
+ }
198
+ }
199
+
200
+ override fun onViewDetachedFromWindow(v: View?) {
201
+ }
202
+ })
203
+ }
126
204
  }
127
205
 
128
- override fun onDropViewInstance(view: FrameLayout) {
206
+ override fun onDropViewInstance(view: StoryBlockFrameLayout) {
207
+ val activity = reactContext.currentActivity as AppCompatActivity
208
+ val fragment = view.getFragment()
209
+ fragment?.let {
210
+ activity.supportFragmentManager.beginTransaction().remove(it).commit()
211
+ }
212
+ view.destroy()
129
213
  super.onDropViewInstance(view)
130
214
  }
131
215
 
132
216
  override fun getExportedCustomBubblingEventTypeConstants(): MutableMap<String, Any>? {
133
217
  return MapBuilder.builder<String, Any>()
134
218
  .put(FWStoryBlockEventName.StoryBlockLoadFinished.rawValue, MapBuilder.of("phasedRegistrationNames", MapBuilder.of("bubbled", FWStoryBlockEventName.StoryBlockLoadFinished.rawValue)))
219
+ .put(FWStoryBlockEventName.StoryBlockFullScreenStateChanged.rawValue, MapBuilder.of("phasedRegistrationNames", MapBuilder.of("bubbled", FWStoryBlockEventName.StoryBlockFullScreenStateChanged.rawValue)))
135
220
  .build()
136
221
  }
137
222
 
138
223
  companion object {
139
224
  private const val REACT_CLASS = "FWStoryBlock"
140
- const val FW_STORY_BLOCK_INIT_ACTION = "FW_STORY_BLOCK_INIT_ACTION"
141
- const val FW_STORY_BLOCK_INIT_INTENT = "FW_STORY_BLOCK_INIT_INTENT"
142
- private const val COMMAND_CREATE = 1
225
+ private const val COMMAND_CREATE = 1000000
226
+ private const val COMMAND_PLAY = 1000001
227
+ private const val COMMAND_PAUSE = 1000002
228
+ private const val COMMAND_TOGGLE_FULL_SCREEN = 1000003
143
229
  }
144
230
 
145
231
  }
@@ -7,7 +7,6 @@ import com.facebook.react.uimanager.SimpleViewManager
7
7
  import com.facebook.react.uimanager.ThemedReactContext
8
8
 
9
9
  import com.facebook.react.uimanager.annotations.ReactProp
10
- import com.fireworksdk.bridge.constants.FWCommandConstant
11
10
  import com.facebook.react.common.MapBuilder
12
11
  import com.firework.videofeed.FeedItemClickListener
13
12
  import com.firework.videofeed.FeedViewState
@@ -67,6 +66,11 @@ class FWVideoFeedManager : SimpleViewManager<FWVideoFeed>() {
67
66
  view.setPlaylistGroupProps(playlistGroup)
68
67
  }
69
68
 
69
+ @ReactProp(name = "hashtagFilterExpression")
70
+ fun setHashtagFilterExpression(view: FWVideoFeed, hashtagFilterExpression: String?) {
71
+ view.setHashtagFilterExpressionProps(hashtagFilterExpression)
72
+ }
73
+
70
74
  @ReactProp(name = "mode")
71
75
  fun setMode(view: FWVideoFeed, mode: String?) {
72
76
  view.setModeProps(mode)
@@ -148,7 +152,7 @@ class FWVideoFeedManager : SimpleViewManager<FWVideoFeed>() {
148
152
 
149
153
  override fun getCommandsMap(): MutableMap<String, Int> {
150
154
  val map: MutableMap<String, Int> = HashMap()
151
- map["refresh"] = FWCommandConstant.FW_COMMAND_VIDEO_FEED_REFRESH
155
+ map["refresh"] = COMMAND_REFRESH
152
156
  return map
153
157
  }
154
158
 
@@ -156,7 +160,7 @@ class FWVideoFeedManager : SimpleViewManager<FWVideoFeed>() {
156
160
  super.receiveCommand(root, commandId, args)
157
161
  FWLogUtils.d { "FWVideoFeedManager receiveCommand commandId: $commandId" }
158
162
  when (commandId?.toInt()) {
159
- FWCommandConstant.FW_COMMAND_VIDEO_FEED_REFRESH -> {
163
+ COMMAND_REFRESH -> {
160
164
  FWLogUtils.d { "FWVideoFeedManager call refresh" }
161
165
  root.refresh()
162
166
  }
@@ -175,4 +179,8 @@ class FWVideoFeedManager : SimpleViewManager<FWVideoFeed>() {
175
179
  .build()
176
180
  }
177
181
 
182
+ companion object {
183
+ private const val COMMAND_REFRESH = 1000001
184
+ }
185
+
178
186
  }
@@ -8,8 +8,8 @@ interface FWVideoShoppingInterface {
8
8
 
9
9
  fun init()
10
10
  fun updateVideoProducts(productArray: ReadableArray?, callbackId: String?)
11
- fun updateProductViewConfig(config: ReadableMap?, callbackId: Int?)
12
- fun updateAddToCartStatus(res: String?, tip: String?, callbackId: Int?)
11
+ fun setProductInfoViewConfiguration(config: ReadableMap?)
12
+ fun updateShoppingCTAResult(result: ReadableMap?, callbackId: Int?)
13
13
  fun jumpToCartPage(callbackId: Int?, props: ReadableMap?)
14
14
  fun setCartIconVisible(visible: Boolean?)
15
15
  fun setCartItemCount(count: Int?)
@@ -3,7 +3,14 @@ package com.fireworksdk.bridge.reactnative.module
3
3
  import com.facebook.react.bridge.ReactApplicationContext
4
4
  import com.facebook.react.bridge.ReactContextBaseJavaModule
5
5
  import com.facebook.react.bridge.ReactMethod
6
+ import com.firework.analyticsevents.livestream.LivestreamAnalyticEvent
7
+ import com.firework.bus.FwAnalyticCallable
8
+ import com.firework.sdk.FireworkSdk
9
+ import com.fireworksdk.bridge.models.FWLiveStreamEventDetailsModel
10
+ import com.fireworksdk.bridge.models.FWLiveStreamEventName
11
+ import com.fireworksdk.bridge.models.FWLiveStreamMessageDetailsModel
6
12
  import com.fireworksdk.bridge.reactnative.models.FWLiveStreamInterface
13
+ import com.fireworksdk.bridge.reactnative.utils.FWEventUtils
7
14
  import com.fireworksdk.bridge.utils.FWLogUtils
8
15
 
9
16
 
@@ -13,14 +20,48 @@ class FWLiveStreamModule(
13
20
 
14
21
  @ReactMethod
15
22
  override fun init() {
16
- addFireworkLiveStreamEventListener()
23
+ FireworkSdk.analytics.register(this)
17
24
  }
18
25
 
19
- private fun addFireworkLiveStreamEventListener() {
20
-
26
+ @FwAnalyticCallable
27
+ fun onLivestreamEvent(event: LivestreamAnalyticEvent) {
28
+ when (event) {
29
+ is LivestreamAnalyticEvent.UserSentChatMessage -> {
30
+ FWLogUtils.d { "userSentChat: $event" }
31
+ FWEventUtils.sendLiveStreamChatEvent(
32
+ reactApplicationContext,
33
+ FWLiveStreamEventName.UserSendChat.rawValue,
34
+ FWLiveStreamMessageDetailsModel(event.messageId, event.username, event.messageText),
35
+ FWLiveStreamEventDetailsModel(event.livestreamId)
36
+ )
37
+ }
38
+ is LivestreamAnalyticEvent.UserJoined -> {
39
+ FWLogUtils.d { "userJoined: $event" }
40
+ FWEventUtils.sendLiveStreamEvent(
41
+ reactApplicationContext,
42
+ FWLiveStreamEventName.UserJoin.rawValue,
43
+ FWLiveStreamEventDetailsModel(event.livestreamId)
44
+ )
45
+ }
46
+ is LivestreamAnalyticEvent.UserLeft -> {
47
+ FWLogUtils.d { "userLeft: $event" }
48
+ FWEventUtils.sendLiveStreamEvent(
49
+ reactApplicationContext,
50
+ FWLiveStreamEventName.UserLeave.rawValue,
51
+ FWLiveStreamEventDetailsModel(event.livestreamId)
52
+ )
53
+ }
54
+ is LivestreamAnalyticEvent.UserSentLike -> {
55
+ FWLogUtils.d { "userSentLike: $event" }
56
+ FWEventUtils.sendLiveStreamEvent(
57
+ reactApplicationContext,
58
+ FWLiveStreamEventName.UserSendLike.rawValue,
59
+ FWLiveStreamEventDetailsModel(event.livestreamId)
60
+ )
61
+ }
62
+ }
21
63
  }
22
64
 
23
-
24
65
  @ReactMethod
25
66
  fun addListener(eventName: String?) {
26
67
  // Set up any upstream listeners or background tasks as necessary
@@ -3,10 +3,10 @@ package com.fireworksdk.bridge.reactnative.module
3
3
  import android.app.Activity
4
4
  import com.facebook.react.bridge.*
5
5
  import com.firework.sdk.FireworkSdk
6
- import com.firework.videofeed.PlayerActivity
7
6
  import com.fireworksdk.bridge.FWInitializationProvider
8
7
  import com.fireworksdk.bridge.reactnative.models.FWNavigatorInterface
9
8
  import com.fireworksdk.bridge.reactnative.utils.FWEventUtils
9
+ import com.fireworksdk.bridge.utils.FWGlobalDataUtil
10
10
  import com.fireworksdk.bridge.utils.FWLogUtils
11
11
 
12
12
 
@@ -30,6 +30,14 @@ class FWNavigatorModule(
30
30
  }
31
31
 
32
32
  if (isTaskRoot(activity)) {
33
+ if (FWGlobalDataUtil.storyBlockFragment?.isFullScreen() == true) {
34
+ UiThreadUtil.runOnUiThread {
35
+ FWGlobalDataUtil.storyBlockFragment?.toggleFullScreen()
36
+ }
37
+ promise.resolve(true)
38
+ return
39
+ }
40
+
33
41
  promise.resolve(false)
34
42
  return
35
43
  }
@@ -7,12 +7,9 @@ import com.firework.common.product.CurrencyCode
7
7
  import com.firework.common.product.Product
8
8
  import com.firework.error.shopping.ShoppingError
9
9
  import com.firework.sdk.FireworkSdk
10
- import com.firework.shopping.ProductHydrator
11
- import com.firework.shopping.Shopping
10
+ import com.firework.shopping.*
12
11
  import com.fireworksdk.bridge.FWInitializationProvider
13
- import com.fireworksdk.bridge.models.FWProductInfoViewConfigurationDeserializer
14
- import com.fireworksdk.bridge.models.FWVideoShoppingProduct
15
- import com.fireworksdk.bridge.models.FWVideoShoppingProductDeserializer
12
+ import com.fireworksdk.bridge.models.*
16
13
  import com.fireworksdk.bridge.reactnative.models.FWVideoShoppingInterface
17
14
  import com.fireworksdk.bridge.reactnative.utils.FWEventUtils
18
15
  import com.fireworksdk.bridge.utils.FWDateUtils
@@ -28,7 +25,7 @@ class FWVideoShoppingModule(
28
25
  reactContext: ReactApplicationContext
29
26
  ) : ReactContextBaseJavaModule(reactContext), FWVideoShoppingInterface {
30
27
 
31
- private var addToCartHandler: Triple<Int, String, String>? = null
28
+ private var ctaHandler: Triple<Int, String, String>? = null
32
29
  private var cartClickHandler: Pair<Int, Activity>? = null
33
30
  private val updateProductHandler: HashMap<String, List<Product>> = HashMap()
34
31
  private val updateProductHydratorHandler: HashMap<String, ProductHydrator> = HashMap()
@@ -115,6 +112,8 @@ class FWVideoShoppingModule(
115
112
  else unit.price.currencyCode
116
113
 
117
114
  variant(variantId) {
115
+ imageUrl((vpu.imageUrl ?: unit.image?.url) ?: "")
116
+ url(vpu.url ?: unit.url)
118
117
  currency(currency)
119
118
  price(price = vpu.price?.amount ?: unit.price.amount)
120
119
  name((vpu.name ?: unit.name) ?: "")
@@ -129,47 +128,80 @@ class FWVideoShoppingModule(
129
128
  }
130
129
 
131
130
  @ReactMethod
132
- override fun updateProductViewConfig(config: ReadableMap?, callbackId: Int?) {
133
- FWLogUtils.d { "FWVideoShoppingModule updateProductViewConfig: $callbackId, config: $config" }
131
+ override fun setProductInfoViewConfiguration(config: ReadableMap?) {
132
+ FWLogUtils.d { "FWVideoShoppingModule setProductInfoViewConfiguration: $callbackId, config: $config" }
134
133
  val configMap = config?.toHashMap() ?: hashMapOf()
135
134
  val jsonObject = JSONObject(configMap)
136
135
  val configModel = FWProductInfoViewConfigurationDeserializer.deserialize(jsonObject)
137
- FWLogUtils.d { "FWVideoShoppingModule updateProductViewConfig: $callbackId, configModel: $configModel" }
136
+ FWLogUtils.d { "FWVideoShoppingModule setProductInfoViewConfiguration: $callbackId, configModel: $configModel" }
137
+
138
+ if (configModel == null) {
139
+ return
140
+ }
141
+
142
+ val isLinkButtonHidden = configModel.linkButton?.isHidden == true
143
+ var text = ShoppingCtaButtonOptions.Text.ADD_TO_CART
144
+ when (configModel.ctaButton?.text) {
145
+ FWProductInfoViewConfiguration.CtaButtonConfiguration.TextValue.ShopNow -> {
146
+ text = ShoppingCtaButtonOptions.Text.SHOP_NOW
147
+ }
148
+ else -> {}
149
+ }
150
+
151
+ FireworkSdk.shopping.setShoppingViewOptions(
152
+ ShoppingViewOptions(
153
+ ProductDetailsOptions(
154
+ linkButtonOptions = LinkButtonOptions(isVisible = !isLinkButtonHidden),
155
+ shoppingCtaButtonOptions = ShoppingCtaButtonOptions(text = text),
156
+ ),
157
+ ),
158
+ )
138
159
  }
139
160
 
140
161
  @ReactMethod
141
- override fun updateAddToCartStatus(res: String?, tip: String?, callbackId: Int?) {
142
- FWLogUtils.d { "FWVideoShoppingModule updateAddToCartStatus: $callbackId, res: $res, tip: $tip, addToCartHandler: ${addToCartHandler?.first}" }
143
- if (callbackId == null || addToCartHandler?.first != callbackId) {
162
+ override fun updateShoppingCTAResult(result: ReadableMap?, callbackId: Int?) {
163
+ FWLogUtils.d { "FWVideoShoppingModule updateShoppingCTAResult: $callbackId, result: $result, ctaHandler: ${ctaHandler?.first}" }
164
+ val resultMap = result?.toHashMap() ?: hashMapOf()
165
+ val jsonObject = JSONObject(resultMap)
166
+ val resultModel = FWShoppingCtaResultDeserializer.deserialize(jsonObject)
167
+ FWLogUtils.d { "FWVideoShoppingModule updateShoppingCTAResult: $callbackId, resultModel: $resultModel" }
168
+
169
+ if (resultModel == null) {
170
+ return
171
+ }
172
+
173
+ if (callbackId == null || ctaHandler?.first != callbackId) {
144
174
  return
145
175
  }
146
176
 
147
- val productId = addToCartHandler?.second
177
+ val productId = ctaHandler?.second
148
178
  productId ?: return
149
179
 
150
- val unitId = addToCartHandler?.third
180
+ val unitId = ctaHandler?.third
151
181
  if (unitId.isNullOrBlank()) {
152
182
  return
153
183
  }
154
184
 
155
- when {
156
- res.equals("success") -> {
157
- val status = Shopping.AddToCartStatus.Success(
158
- productId = productId,
159
- unitId = unitId
160
- )
161
- FireworkSdk.shopping.setAddToCartStatus(status)
162
- Toast.makeText(currentActivity, tip, Toast.LENGTH_LONG).show()
185
+ when (resultModel.res) {
186
+ FWShoppingCtaResult.Res.Success -> {
187
+ val numberOfItemsInCart = FireworkSdk.shopping.numberOfItemsInCart
188
+ FireworkSdk.shopping.setCtaButtonStatus(Shopping.CtaButtonStatus.Success)
189
+ FireworkSdk.shopping.numberOfItemsInCart = numberOfItemsInCart
190
+ }
191
+ FWShoppingCtaResult.Res.Fail -> {
192
+ FireworkSdk.shopping.setCtaButtonStatus(Shopping.CtaButtonStatus.Error)
163
193
  }
164
- res.equals("fail") -> {
165
- val status = Shopping.AddToCartStatus.Error(productId = productId, unitId = unitId)
166
- FireworkSdk.shopping.setAddToCartStatus(status)
167
- Toast.makeText(currentActivity, tip, Toast.LENGTH_LONG).show()
194
+ FWShoppingCtaResult.Res.Loading -> {
195
+ FireworkSdk.shopping.setCtaButtonStatus(Shopping.CtaButtonStatus.Loading)
168
196
  }
169
- res.equals("loading") -> {
170
- FireworkSdk.shopping.setAddToCartStatus(Shopping.AddToCartStatus.Loading)
197
+ else -> {
198
+ // throw IllegalStateException("Not allowed: ${resultModel.res}")
171
199
  }
172
200
  }
201
+
202
+ if (!resultModel.tips.isNullOrBlank()) {
203
+ Toast.makeText(currentActivity, resultModel.tips, Toast.LENGTH_LONG).show()
204
+ }
173
205
  }
174
206
 
175
207
  @ReactMethod
@@ -196,33 +228,32 @@ class FWVideoShoppingModule(
196
228
  }
197
229
 
198
230
  private fun cartListener() {
199
- FireworkSdk.shopping.setOnCartActionListener(
200
- object : Shopping.OnCartActionListener {
201
- override fun onProductAddedToCart(productId: String, unitId: String) {
202
- FWLogUtils.d { "FWVideoShoppingModule updateCart, productId: $productId, unitId: $unitId" }
231
+ FireworkSdk.shopping.setOnCartClickListener(object : Shopping.OnCartClickListener {
232
+ override fun onCartClick() {
233
+ FWLogUtils.d { "FWVideoShoppingModule cartClicked" }
234
+ val activity = FWInitializationProvider.INSTANCE.resumedActivity
235
+ activity ?: return
236
+ val callbackId = generateCallbackId()
237
+ cartClickHandler = Pair(callbackId, activity)
238
+ FWEventUtils.sendCartIconClickEvent(reactApplicationContext, callbackId)
239
+ }
240
+ })
203
241
 
204
- FireworkSdk.shopping.setAddToCartStatus(Shopping.AddToCartStatus.Loading)
242
+ FireworkSdk.shopping.setOnCtaButtonClicked { productId, unitId, productWebUrl ->
243
+ FWLogUtils.d { "FWVideoShoppingModule updateCart, productId: $productId, unitId: $unitId" }
205
244
 
206
- val callbackId = generateCallbackId()
207
- addToCartHandler = Triple(callbackId, productId, unitId)
208
- FWEventUtils.sendAddToCartClickEvent(reactApplicationContext, productId, unitId, callbackId)
209
- }
245
+ FireworkSdk.shopping.setCtaButtonStatus(Shopping.CtaButtonStatus.Loading)
246
+
247
+ val callbackId = generateCallbackId()
248
+ ctaHandler = Triple(callbackId, productId, unitId)
249
+ FWEventUtils.sendShoppingCtaButtonClickEvent(reactApplicationContext, productId, unitId, productWebUrl, callbackId)
250
+ }
210
251
 
211
- override fun onCartClicked() {
212
- FWLogUtils.d { "FWVideoShoppingModule cartClicked" }
213
- val activity = FWInitializationProvider.INSTANCE.resumedActivity
214
- activity ?: return
215
- val callbackId = generateCallbackId()
216
- cartClickHandler = Pair(callbackId, activity)
217
- FWEventUtils.sendCartIconClickEvent(reactApplicationContext, callbackId)
218
- }
219
- },
220
- )
221
252
  FireworkSdk.shopping.setOnShoppingErrorListener(
222
253
  object : Shopping.OnShoppingErrorListener {
223
254
  override fun onShoppingError(error: ShoppingError) {
224
255
  when (error) {
225
- is ShoppingError.AddToCartError.Timeout -> {
256
+ is ShoppingError.CtaButtonClickError.Timeout -> {
226
257
  }
227
258
  else -> {}
228
259
  }
@@ -232,7 +263,7 @@ class FWVideoShoppingModule(
232
263
  }
233
264
 
234
265
  private fun productListener() {
235
- FireworkSdk.shopping.setOnProductActionListener(object : Shopping.OnProductActionListener {
266
+ FireworkSdk.shopping.setOnProductHydrationListener(object : Shopping.OnProductHydrationListener {
236
267
  override fun onProductHydration(products: List<Product>, hydrator: ProductHydrator) {
237
268
  FWLogUtils.d { "FWVideoShoppingModule hydrateProducts, hydrator: ${hydrator.hashCode()}" }
238
269
  if (products.isEmpty()) {
@@ -243,8 +274,10 @@ class FWVideoShoppingModule(
243
274
  updateProductHydratorHandler[callbackId] = hydrator
244
275
  FWEventUtils.sendUpdateProductsDetailsEvent(reactApplicationContext, products, callbackId)
245
276
  }
277
+ })
246
278
 
247
- override fun onDisplayProductInfo(
279
+ FireworkSdk.shopping.setOnProductLinkClickListener(object : Shopping.OnProductLinkClickListener {
280
+ override fun onProductLinkClick(
248
281
  productId: String,
249
282
  unitId: String,
250
283
  productWebUrl: String?