react-native-firework-sdk 2.13.0 → 2.14.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 (103) hide show
  1. package/android/.idea/codeStyles/Project.xml +124 -0
  2. package/android/.idea/codeStyles/codeStyleConfig.xml +5 -0
  3. package/android/gradle.properties +1 -1
  4. package/android/src/main/java/com/fireworksdk/bridge/models/FWLiveStreamEventDetailsModel.kt +1 -0
  5. package/android/src/main/java/com/fireworksdk/bridge/models/FWVideoFeedConfigModel.kt +1 -0
  6. package/android/src/main/java/com/fireworksdk/bridge/models/FWVideoFeedConfigModelDeserializer.kt +3 -0
  7. package/android/src/main/java/com/fireworksdk/bridge/models/FWVideoFeedConfigModelSerializer.kt +2 -0
  8. package/android/src/main/java/com/fireworksdk/bridge/models/enums/FWDataTrackingLevel.kt +7 -0
  9. package/android/src/main/java/com/fireworksdk/bridge/models/enums/FWEventName.kt +2 -1
  10. package/android/src/main/java/com/fireworksdk/bridge/models/enums/FWSwitchLanguageBehavior.kt +6 -0
  11. package/android/src/main/java/com/fireworksdk/bridge/reactnative/FWReactNativeSDK.kt +19 -7
  12. package/android/src/main/java/com/fireworksdk/bridge/reactnative/models/FireworkSDKInterface.kt +1 -0
  13. package/android/src/main/java/com/fireworksdk/bridge/reactnative/module/FWLiveStreamModule.kt +6 -4
  14. package/android/src/main/java/com/fireworksdk/bridge/reactnative/module/FWVideoShoppingModule.kt +29 -19
  15. package/android/src/main/java/com/fireworksdk/bridge/reactnative/module/FireworkSDKModule.kt +41 -17
  16. package/android/src/main/java/com/fireworksdk/bridge/reactnative/utils/FWEventUtils.kt +25 -13
  17. package/android/src/main/java/com/fireworksdk/bridge/utils/FWConfigUtil.kt +4 -0
  18. package/android/src/main/java/com/fireworksdk/bridge/utils/FWGlobalDataUtil.kt +5 -0
  19. package/android/src/main/java/com/fireworksdk/bridge/utils/FWLanguageUtil.kt +57 -15
  20. package/android/src/main/java/com/fireworksdk/bridge/utils/FWModelUtils.kt +9 -1
  21. package/ios/Components/StoryBlock.swift +14 -3
  22. package/ios/Components/VideoFeed.swift +4 -0
  23. package/ios/FireworkSdk.xcodeproj/project.pbxproj +4 -0
  24. package/ios/Models/NativeToRN/FireworkEventName.swift +1 -0
  25. package/ios/Models/NativeToRN/FireworkSDK+Json.swift +6 -2
  26. package/ios/Models/RNToNative/RCTConvert+FireworkSDKModule.swift +13 -0
  27. package/ios/Modules/FireworkSDKModule/FireworkSDKModule+CTA.swift +8 -16
  28. package/ios/Modules/FireworkSDKModule/FireworkSDKModule+EventTracking.swift +9 -1
  29. package/ios/Modules/FireworkSDKModule/FireworkSDKModule.m +1 -0
  30. package/ios/Modules/FireworkSDKModule/FireworkSDKModule.swift +96 -31
  31. package/ios/Modules/FireworkSDKModule/SDKInitOptions.swift +9 -0
  32. package/ios/Modules/Shopping/ShoppingModule.swift +12 -3
  33. package/ios/Utils/Extensions/NumberFormatter+AppLanguage.swift +27 -0
  34. package/lib/commonjs/FireworkSDK.js +66 -12
  35. package/lib/commonjs/FireworkSDK.js.map +1 -1
  36. package/lib/commonjs/VideoShopping.js +15 -0
  37. package/lib/commonjs/VideoShopping.js.map +1 -1
  38. package/lib/commonjs/components/StoryBlock.js +6 -0
  39. package/lib/commonjs/components/StoryBlock.js.map +1 -1
  40. package/lib/commonjs/components/VideoFeed.js +14 -6
  41. package/lib/commonjs/components/VideoFeed.js.map +1 -1
  42. package/lib/commonjs/index.js +14 -6
  43. package/lib/commonjs/index.js.map +1 -1
  44. package/lib/commonjs/models/DataTrackingLevel.js +2 -0
  45. package/lib/commonjs/models/DataTrackingLevel.js.map +1 -0
  46. package/lib/commonjs/models/FWComponentType.js +14 -0
  47. package/lib/commonjs/models/FWComponentType.js.map +1 -0
  48. package/lib/commonjs/models/FWEventName.js +1 -0
  49. package/lib/commonjs/models/FWEventName.js.map +1 -1
  50. package/lib/commonjs/modules/FireworkSDKModule.js.map +1 -1
  51. package/lib/commonjs/utils/FWGlobalState.js +2 -0
  52. package/lib/commonjs/utils/FWGlobalState.js.map +1 -1
  53. package/lib/module/FireworkSDK.js +64 -11
  54. package/lib/module/FireworkSDK.js.map +1 -1
  55. package/lib/module/VideoShopping.js +15 -0
  56. package/lib/module/VideoShopping.js.map +1 -1
  57. package/lib/module/components/StoryBlock.js +5 -0
  58. package/lib/module/components/StoryBlock.js.map +1 -1
  59. package/lib/module/components/VideoFeed.js +13 -6
  60. package/lib/module/components/VideoFeed.js.map +1 -1
  61. package/lib/module/index.js +6 -5
  62. package/lib/module/index.js.map +1 -1
  63. package/lib/module/models/DataTrackingLevel.js +2 -0
  64. package/lib/module/models/DataTrackingLevel.js.map +1 -0
  65. package/lib/module/models/FWComponentType.js +7 -0
  66. package/lib/module/models/FWComponentType.js.map +1 -0
  67. package/lib/module/models/FWEventName.js +1 -0
  68. package/lib/module/models/FWEventName.js.map +1 -1
  69. package/lib/module/modules/FireworkSDKModule.js.map +1 -1
  70. package/lib/module/utils/FWGlobalState.js +2 -0
  71. package/lib/module/utils/FWGlobalState.js.map +1 -1
  72. package/lib/typescript/FireworkSDK.d.ts +22 -1
  73. package/lib/typescript/VideoShopping.d.ts +8 -1
  74. package/lib/typescript/index.d.ts +15 -13
  75. package/lib/typescript/models/DataTrackingLevel.d.ts +1 -0
  76. package/lib/typescript/models/FWComponentType.d.ts +4 -0
  77. package/lib/typescript/models/FWEventName.d.ts +2 -1
  78. package/lib/typescript/models/FWEvents.d.ts +18 -1
  79. package/lib/typescript/models/FeedItemDetails.d.ts +0 -1
  80. package/lib/typescript/models/LiveStreamEventDetails.d.ts +1 -0
  81. package/lib/typescript/models/StoryBlockConfiguration.d.ts +0 -2
  82. package/lib/typescript/models/VideoFeedConfiguration.d.ts +0 -1
  83. package/lib/typescript/models/VideoPlayerConfiguration.d.ts +1 -1
  84. package/lib/typescript/modules/FireworkSDKModule.d.ts +2 -0
  85. package/lib/typescript/utils/FWGlobalState.d.ts +2 -0
  86. package/package.json +1 -1
  87. package/react-native-firework-sdk.podspec +4 -3
  88. package/src/FireworkSDK.ts +59 -14
  89. package/src/VideoShopping.ts +24 -0
  90. package/src/components/StoryBlock.tsx +8 -0
  91. package/src/components/VideoFeed.tsx +11 -1
  92. package/src/index.ts +38 -30
  93. package/src/models/DataTrackingLevel.ts +1 -0
  94. package/src/models/FWComponentType.ts +4 -0
  95. package/src/models/FWEventName.ts +1 -0
  96. package/src/models/FWEvents.ts +19 -1
  97. package/src/models/FeedItemDetails.ts +0 -1
  98. package/src/models/LiveStreamEventDetails.ts +1 -0
  99. package/src/models/StoryBlockConfiguration.ts +0 -2
  100. package/src/models/VideoFeedConfiguration.ts +0 -1
  101. package/src/models/VideoPlayerConfiguration.ts +1 -1
  102. package/src/modules/FireworkSDKModule.ts +2 -0
  103. package/src/utils/FWGlobalState.ts +3 -0
@@ -0,0 +1,124 @@
1
+ <component name="ProjectCodeStyleConfiguration">
2
+ <code_scheme name="Project" version="173">
3
+ <codeStyleSettings language="XML">
4
+ <option name="FORCE_REARRANGE_MODE" value="1" />
5
+ <indentOptions>
6
+ <option name="CONTINUATION_INDENT_SIZE" value="4" />
7
+ </indentOptions>
8
+ <arrangement>
9
+ <rules>
10
+ <section>
11
+ <rule>
12
+ <match>
13
+ <AND>
14
+ <NAME>xmlns:android</NAME>
15
+ <XML_ATTRIBUTE />
16
+ <XML_NAMESPACE>^$</XML_NAMESPACE>
17
+ </AND>
18
+ </match>
19
+ </rule>
20
+ </section>
21
+ <section>
22
+ <rule>
23
+ <match>
24
+ <AND>
25
+ <NAME>xmlns:.*</NAME>
26
+ <XML_ATTRIBUTE />
27
+ <XML_NAMESPACE>^$</XML_NAMESPACE>
28
+ </AND>
29
+ </match>
30
+ <order>BY_NAME</order>
31
+ </rule>
32
+ </section>
33
+ <section>
34
+ <rule>
35
+ <match>
36
+ <AND>
37
+ <NAME>.*:id</NAME>
38
+ <XML_ATTRIBUTE />
39
+ <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
40
+ </AND>
41
+ </match>
42
+ </rule>
43
+ </section>
44
+ <section>
45
+ <rule>
46
+ <match>
47
+ <AND>
48
+ <NAME>.*:name</NAME>
49
+ <XML_ATTRIBUTE />
50
+ <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
51
+ </AND>
52
+ </match>
53
+ </rule>
54
+ </section>
55
+ <section>
56
+ <rule>
57
+ <match>
58
+ <AND>
59
+ <NAME>name</NAME>
60
+ <XML_ATTRIBUTE />
61
+ <XML_NAMESPACE>^$</XML_NAMESPACE>
62
+ </AND>
63
+ </match>
64
+ </rule>
65
+ </section>
66
+ <section>
67
+ <rule>
68
+ <match>
69
+ <AND>
70
+ <NAME>style</NAME>
71
+ <XML_ATTRIBUTE />
72
+ <XML_NAMESPACE>^$</XML_NAMESPACE>
73
+ </AND>
74
+ </match>
75
+ </rule>
76
+ </section>
77
+ <section>
78
+ <rule>
79
+ <match>
80
+ <AND>
81
+ <NAME>.*</NAME>
82
+ <XML_ATTRIBUTE />
83
+ <XML_NAMESPACE>^$</XML_NAMESPACE>
84
+ </AND>
85
+ </match>
86
+ <order>BY_NAME</order>
87
+ </rule>
88
+ </section>
89
+ <section>
90
+ <rule>
91
+ <match>
92
+ <AND>
93
+ <NAME>.*</NAME>
94
+ <XML_ATTRIBUTE />
95
+ <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
96
+ </AND>
97
+ </match>
98
+ <order>ANDROID_ATTRIBUTE_ORDER</order>
99
+ </rule>
100
+ </section>
101
+ <section>
102
+ <rule>
103
+ <match>
104
+ <AND>
105
+ <NAME>.*</NAME>
106
+ <XML_ATTRIBUTE />
107
+ <XML_NAMESPACE>.*</XML_NAMESPACE>
108
+ </AND>
109
+ </match>
110
+ <order>BY_NAME</order>
111
+ </rule>
112
+ </section>
113
+ </rules>
114
+ </arrangement>
115
+ </codeStyleSettings>
116
+ <codeStyleSettings language="kotlin">
117
+ <indentOptions>
118
+ <option name="INDENT_SIZE" value="2" />
119
+ <option name="CONTINUATION_INDENT_SIZE" value="2" />
120
+ <option name="TAB_SIZE" value="2" />
121
+ </indentOptions>
122
+ </codeStyleSettings>
123
+ </code_scheme>
124
+ </component>
@@ -0,0 +1,5 @@
1
+ <component name="ProjectCodeStyleConfiguration">
2
+ <state>
3
+ <option name="USE_PER_PROJECT_SETTINGS" value="true" />
4
+ </state>
5
+ </component>
@@ -6,4 +6,4 @@ FireworkSDK_minSdkVersion=21
6
6
  FireworkSDK_compileSdkVersion=33
7
7
  FireworkSDK_targetSdkVersion=33
8
8
  FireworkSDK_fwPlayerLaunchMode=singleTask
9
- FireworkSDK_fwNativeVersion=6.10.2
9
+ FireworkSDK_fwNativeVersion=6.13.1
@@ -2,4 +2,5 @@ package com.fireworksdk.bridge.models
2
2
 
3
3
  data class FWLiveStreamEventDetailsModel(
4
4
  val id: String? = null,
5
+ val feedId: String? = null,
5
6
  )
@@ -18,6 +18,7 @@ data class FWVideoFeedConfigModel(
18
18
  val hidden: Boolean? = null,
19
19
  val textColor: String? = null,
20
20
  val fontSize: Int? = null,
21
+ val numberOfLines: Int? = null,
21
22
  val fontInfo: FWFontInfoModel? = null,
22
23
  val backgroundColor: String? = null,
23
24
  val gradientDrawable: FWGradientDrawableModel? = null,
@@ -18,6 +18,7 @@ object FWVideoFeedConfigModelDeserializer {
18
18
  private const val HIDDEN_KEY = "hidden"
19
19
  private const val TEXT_COLOR_KEY = "textColor"
20
20
  private const val FONT_SIZE_KEY = "fontSize"
21
+ private const val NUMBER_OF_LINES = "numberOfLines"
21
22
  private const val FONT_INFO_KEY = "androidFontInfo"
22
23
  private const val GRADIENT_DRAWABLE_KEY = "gradientDrawable"
23
24
 
@@ -55,6 +56,7 @@ object FWVideoFeedConfigModelDeserializer {
55
56
  val hidden = if (titleJson.has(HIDDEN_KEY)) titleJson.optBoolean(HIDDEN_KEY) else null
56
57
  val textColor = if (titleJson.has(TEXT_COLOR_KEY)) titleJson.optString(TEXT_COLOR_KEY) else null
57
58
  val fontSize = if (titleJson.has(FONT_SIZE_KEY)) titleJson.optInt(FONT_SIZE_KEY) else null
59
+ val numberOfLines = if (titleJson.has(NUMBER_OF_LINES)) titleJson.optInt(NUMBER_OF_LINES) else null
58
60
  val fontInfo = FWFontInfoModelDeserializer.deserialize(titleJson.optJSONObject(FONT_INFO_KEY))
59
61
  val backgroundColor = if (titleJson.has(BACKGROUND_COLOR_KEY)) titleJson.optString(BACKGROUND_COLOR_KEY) else null
60
62
  val gradientDrawable = FWGradientDrawableModelDeserializer.deserialize(titleJson.optJSONObject(GRADIENT_DRAWABLE_KEY))
@@ -63,6 +65,7 @@ object FWVideoFeedConfigModelDeserializer {
63
65
  hidden = hidden,
64
66
  textColor = textColor,
65
67
  fontSize = fontSize,
68
+ numberOfLines = numberOfLines,
66
69
  fontInfo = fontInfo,
67
70
  backgroundColor = backgroundColor,
68
71
  gradientDrawable = gradientDrawable,
@@ -18,6 +18,7 @@ object FWVideoFeedConfigModelSerializer {
18
18
  private const val HIDDEN_KEY = "hidden"
19
19
  private const val TEXT_COLOR_KEY = "textColor"
20
20
  private const val FONT_SIZE_KEY = "fontSize"
21
+ private const val NUMBER_OF_LINES = "numberOfLines"
21
22
  private const val FONT_INFO_KEY = "androidFontInfo"
22
23
  private const val GRADIENT_DRAWABLE_KEY = "gradientDrawable"
23
24
 
@@ -44,6 +45,7 @@ object FWVideoFeedConfigModelSerializer {
44
45
  jsonObject.put(HIDDEN_KEY, model.hidden)
45
46
  jsonObject.put(TEXT_COLOR_KEY, model.textColor)
46
47
  jsonObject.put(FONT_SIZE_KEY, model.fontSize)
48
+ jsonObject.put(NUMBER_OF_LINES, model.numberOfLines)
47
49
  jsonObject.put(FONT_INFO_KEY, FWFontInfoModelSerializer.serialize(model.fontInfo))
48
50
  jsonObject.put(GRADIENT_DRAWABLE_KEY, FWGradientDrawableModelSerializer.serialize(model.gradientDrawable))
49
51
  return jsonObject
@@ -0,0 +1,7 @@
1
+ package com.fireworksdk.bridge.models.enums
2
+
3
+ enum class FWDataTrackingLevel(val rawValue: String) {
4
+ ALL("all"),
5
+ ESSENTIAL_ONLY("essentialOnly"),
6
+ NONE("none")
7
+ }
@@ -1,7 +1,7 @@
1
1
  package com.fireworksdk.bridge.models.enums
2
2
 
3
3
  enum class FWEventName(val rawValue: String) {
4
- SDKIni("fw:sdk-init"),
4
+ SDKInit("fw:sdk-init"),
5
5
  CustomCTAClick("fw:custom-cta-click"),
6
6
  VideoPlayback("fw:video-playback"),
7
7
  VideoFeedClick("fw:video-feed-click"),
@@ -42,6 +42,7 @@ enum class FWVideoShoppingEventName(val rawValue: String) {
42
42
  WillDisplayProduct("fw:shopping:will-display-product"),
43
43
  CustomLinkButtonClick("fw:shopping:custom-link-button-click"),
44
44
  CustomProductCardTap("fw:shopping:custom-product-card-tap"),
45
+ ProductClick("fw:shopping:product-click"),
45
46
  }
46
47
 
47
48
  enum class FWLiveStreamEventName(val rawValue: String) {
@@ -0,0 +1,6 @@
1
+ package com.fireworksdk.bridge.models.enums
2
+
3
+ enum class FWSwitchLanguageBehavior {
4
+ RestartingActivity,
5
+ NotRestartingActivity
6
+ }
@@ -1,11 +1,8 @@
1
1
  package com.fireworksdk.bridge.reactnative
2
2
 
3
- import android.annotation.SuppressLint
4
3
  import android.app.Activity
5
4
  import android.content.Context
6
5
  import android.content.pm.PackageManager
7
- import android.provider.Settings
8
- import android.util.Base64
9
6
  import com.firework.imageloading.ImageLoader
10
7
  import com.firework.livestream.LivestreamPlayerInitializer
11
8
  import com.firework.sdk.FireworkSdk
@@ -13,13 +10,12 @@ import com.firework.sdk.FireworkSdkConfig
13
10
  import com.fireworksdk.bridge.models.FWSDKInitOptionsModel
14
11
  import com.fireworksdk.bridge.models.FWSdkInitResultModel
15
12
  import com.fireworksdk.bridge.models.enums.FWPlayerLaunchBehavior
13
+ import com.fireworksdk.bridge.models.enums.FWSwitchLanguageBehavior
16
14
  import com.fireworksdk.bridge.utils.FWGlobalDataUtil
17
15
  import com.fireworksdk.bridge.utils.FWImageLoaderUtil
18
16
  import com.fireworksdk.bridge.utils.FWLanguageUtil
19
17
  import com.fireworksdk.bridge.utils.FWLiveStreamUtil
20
18
  import com.fireworksdk.bridge.utils.FWLogUtils
21
- import java.nio.charset.StandardCharsets
22
- import java.security.MessageDigest
23
19
 
24
20
  object FWReactNativeSDK {
25
21
 
@@ -36,11 +32,13 @@ object FWReactNativeSDK {
36
32
  success = false,
37
33
  reason = it
38
34
  )
35
+ FWGlobalDataUtil.initCompletedListener?.invoke()
39
36
  }, onSuccess = {
40
37
  FWGlobalDataUtil.sdkInitResultModel = FWSdkInitResultModel(
41
38
  success = true,
42
39
  reason = null
43
40
  )
41
+ FWGlobalDataUtil.initCompletedListener?.invoke()
44
42
  })
45
43
  }
46
44
 
@@ -56,8 +54,21 @@ object FWReactNativeSDK {
56
54
  return FWLanguageUtil.getInstance(context).updateBaseContextLocale(context)
57
55
  }
58
56
 
59
- fun changeLanguage(localeString: String, activity: Activity) {
60
- FWLanguageUtil.getInstance(activity).changeLanguage(localeString, activity)
57
+ fun changeLanguage(localeString: String?, context: Context): Boolean {
58
+ val isSameLanguageWithCache = FWLanguageUtil.getInstance(context).isSameLanguageWithCache(localeString)
59
+ return if (!isSameLanguageWithCache) {
60
+ // execute change language behavior
61
+ val changeLanguageResult = FWLanguageUtil.getInstance(context).changeLanguage(localeString)
62
+ // change language success, execute rest of logic
63
+ if (changeLanguageResult && context is Activity && FWGlobalDataUtil.switchLanguageBehavior == FWSwitchLanguageBehavior.RestartingActivity) {
64
+ // restart activity
65
+ FWLanguageUtil.getInstance(context).restartActivity(context)
66
+ }
67
+ changeLanguageResult
68
+ } else {
69
+ // no need to change language, return true means change successfully
70
+ true
71
+ }
61
72
  }
62
73
 
63
74
  fun initSdkInternal(
@@ -95,6 +106,7 @@ object FWReactNativeSDK {
95
106
  FWPlayerLaunchBehavior.MuteOnFirstLaunch -> {
96
107
  configBuilder.muteOnLaunch(true)
97
108
  }
109
+
98
110
  else -> {}
99
111
  }
100
112
 
@@ -15,4 +15,5 @@ interface FireworkSDKInterface {
15
15
  fun changeAppLanguage(language: String?, promise: Promise)
16
16
  fun restart(promise: Promise)
17
17
  fun trackPurchase(config: ReadableMap?, promise: Promise)
18
+ fun setDataTrackingLevel(level: String?, promise: Promise)
18
19
  }
@@ -13,6 +13,7 @@ import com.fireworksdk.bridge.models.enums.FWLiveStreamEventName
13
13
  import com.fireworksdk.bridge.reactnative.models.FWLiveStreamInterface
14
14
  import com.fireworksdk.bridge.reactnative.utils.FWEventUtils
15
15
  import com.fireworksdk.bridge.utils.FWLogUtils
16
+ import com.fireworksdk.bridge.utils.FWModelUtils
16
17
 
17
18
 
18
19
  class FWLiveStreamModule(
@@ -27,6 +28,7 @@ class FWLiveStreamModule(
27
28
  @Keep
28
29
  @FwAnalyticCallable
29
30
  fun onLivestreamEvent(event: LivestreamAnalyticEvent) {
31
+ val liveStreamEventDetailsModel = FWModelUtils.convertVideoInfo2LivestreamDetails(event.videoInfo)
30
32
  when (event) {
31
33
  is LivestreamAnalyticEvent.UserSentChatMessage -> {
32
34
  FWLogUtils.d { "userSentChat: $event" }
@@ -34,7 +36,7 @@ class FWLiveStreamModule(
34
36
  reactApplicationContext,
35
37
  FWLiveStreamEventName.UserSendChat.rawValue,
36
38
  FWLiveStreamMessageDetailsModel(event.messageId, event.username, event.messageText),
37
- FWLiveStreamEventDetailsModel(event.livestreamId)
39
+ liveStreamEventDetailsModel
38
40
  )
39
41
  }
40
42
  is LivestreamAnalyticEvent.UserJoined -> {
@@ -42,7 +44,7 @@ class FWLiveStreamModule(
42
44
  FWEventUtils.sendLiveStreamEvent(
43
45
  reactApplicationContext,
44
46
  FWLiveStreamEventName.UserJoin.rawValue,
45
- FWLiveStreamEventDetailsModel(event.livestreamId)
47
+ liveStreamEventDetailsModel
46
48
  )
47
49
  }
48
50
  is LivestreamAnalyticEvent.UserLeft -> {
@@ -50,7 +52,7 @@ class FWLiveStreamModule(
50
52
  FWEventUtils.sendLiveStreamEvent(
51
53
  reactApplicationContext,
52
54
  FWLiveStreamEventName.UserLeave.rawValue,
53
- FWLiveStreamEventDetailsModel(event.livestreamId)
55
+ liveStreamEventDetailsModel
54
56
  )
55
57
  }
56
58
  is LivestreamAnalyticEvent.UserSentLike -> {
@@ -58,7 +60,7 @@ class FWLiveStreamModule(
58
60
  FWEventUtils.sendLiveStreamEvent(
59
61
  reactApplicationContext,
60
62
  FWLiveStreamEventName.UserSendLike.rawValue,
61
- FWLiveStreamEventDetailsModel(event.livestreamId)
63
+ liveStreamEventDetailsModel
62
64
  )
63
65
  }
64
66
  }
@@ -34,11 +34,13 @@ class FWVideoShoppingModule(
34
34
  private var ctaHandler: Triple<Int, String, String>? = null
35
35
  private val updateProductHandler: HashMap<String, List<Product>> = HashMap()
36
36
  private val updateProductHydratorHandler: HashMap<String, ProductHydrator> = HashMap()
37
+ private var isCustomProductCardEnabled = false
37
38
 
38
39
  @ReactMethod
39
40
  override fun init() {
40
41
  cartListener()
41
42
  productListener()
43
+ productCardListener()
42
44
  }
43
45
 
44
46
  @ReactMethod
@@ -344,13 +346,27 @@ class FWVideoShoppingModule(
344
346
 
345
347
  @ReactMethod
346
348
  override fun setCustomTapProductCardEnabled(value: Boolean?, promise: Promise) {
349
+ isCustomProductCardEnabled = value ?: false
350
+ promise.resolve(true)
351
+ }
347
352
 
348
- if (value == true) {
349
- FireworkSdk.shopping.setOnProductCardClickListener { productId, unitId, productWebUrl, videoInfo ->
350
- FWLogUtils.d { "FWVideoShoppingModule productCardClick $productId $unitId $productWebUrl" }
353
+ @ReactMethod
354
+ fun addListener(eventName: String?) {
355
+ // Set up any upstream listeners or background tasks as necessary
356
+ FWLogUtils.d { "addListener: $eventName" }
357
+ }
351
358
 
352
- val videoPlaybackDetails = FWModelUtils.convertVideoInfo2PlaybackDetails(videoInfo)
359
+ @ReactMethod
360
+ fun removeListeners(count: Int?) {
361
+ // Remove upstream listeners, stop unnecessary background tasks
362
+ FWLogUtils.d { "removeListeners: $count" }
363
+ }
353
364
 
365
+ private fun productCardListener() {
366
+ FireworkSdk.shopping.setOnProductCardClickListener { productId, unitId, productWebUrl, videoInfo ->
367
+ FWLogUtils.d { "FWVideoShoppingModule productCardClick $productId $unitId $productWebUrl" }
368
+ val videoPlaybackDetails = FWModelUtils.convertVideoInfo2PlaybackDetails(videoInfo)
369
+ if (isCustomProductCardEnabled) {
354
370
  FWEventUtils.sendProductCardClickEvent(
355
371
  reactApplicationContext,
356
372
  productWebUrl,
@@ -360,25 +376,19 @@ class FWVideoShoppingModule(
360
376
  callbackId
361
377
  )
362
378
  }
363
- } else {
364
- FireworkSdk.shopping.setOnProductCardClickListener(null)
379
+ // send onClickProduct
380
+ FWEventUtils.sendProductClickEvent(
381
+ reactApplicationContext,
382
+ productWebUrl,
383
+ productId,
384
+ unitId,
385
+ videoPlaybackDetails
386
+ )
387
+ isCustomProductCardEnabled
365
388
  }
366
-
367
-
368
- promise.resolve(true)
369
389
  }
370
390
 
371
- @ReactMethod
372
- fun addListener(eventName: String?) {
373
- // Set up any upstream listeners or background tasks as necessary
374
- FWLogUtils.d { "addListener: $eventName" }
375
- }
376
391
 
377
- @ReactMethod
378
- fun removeListeners(count: Int?) {
379
- // Remove upstream listeners, stop unnecessary background tasks
380
- FWLogUtils.d { "removeListeners: $count" }
381
- }
382
392
 
383
393
  override fun getName(): String {
384
394
  return "ShoppingModule"
@@ -13,8 +13,10 @@ import com.firework.analyticsevents.player.PlayerLifecycleAnalyticsEvent
13
13
  import com.firework.analyticsevents.share.ShareButtonAnalyticsEvent
14
14
  import com.firework.bus.FwAnalyticCallable
15
15
  import com.firework.sdk.FireworkSdk
16
+ import com.firework.sdk.FwTrackingLevel
16
17
  import com.fireworksdk.bridge.FWInitializationProvider
17
18
  import com.fireworksdk.bridge.models.*
19
+ import com.fireworksdk.bridge.models.enums.FWDataTrackingLevel
18
20
  import com.fireworksdk.bridge.models.enums.FWVideoPlaybackSubEventName
19
21
  import com.fireworksdk.bridge.reactnative.FWReactNativeSDK
20
22
  import com.fireworksdk.bridge.reactnative.models.FireworkSDKInterface
@@ -29,6 +31,30 @@ class FireworkSDKModule(
29
31
  reactContext: ReactApplicationContext
30
32
  ) : ReactContextBaseJavaModule(reactContext), FireworkSDKInterface {
31
33
 
34
+ init {
35
+ FWGlobalDataUtil.initCompletedListener = {
36
+ initCallback()
37
+ }
38
+ }
39
+
40
+ private fun initCallback(): Boolean {
41
+ val sdkInitResultModel = FWGlobalDataUtil.sdkInitResultModel
42
+ return if (sdkInitResultModel != null) { // init in application
43
+ if (sdkInitResultModel.success == true) {
44
+ FWEventUtils.sendInitSuccessEvent(reactApplicationContext)
45
+ } else if (sdkInitResultModel.success == false) {
46
+ FWEventUtils.sendInitFailedEvent(reactApplicationContext, sdkInitResultModel.reason)
47
+ }
48
+
49
+ FireworkSdk.analytics.register(this)
50
+ true
51
+ } else {
52
+ false
53
+ }
54
+ }
55
+
56
+
57
+
32
58
  /**
33
59
  * Initializes FW SDK
34
60
  *
@@ -63,22 +89,7 @@ class FireworkSDKModule(
63
89
  override fun markInitCalled(promise: Promise) {
64
90
  FWColorUtil.useRgba = true
65
91
  FWGlobalDataUtil.pauseWhenNotVisible = true
66
-
67
- val sdkInitResultModel = FWGlobalDataUtil.sdkInitResultModel
68
- if (sdkInitResultModel != null) { // init in application
69
- if (sdkInitResultModel.success == true) {
70
- FWEventUtils.sendInitSuccessEvent(reactApplicationContext)
71
- } else if (sdkInitResultModel.success == false) {
72
- FWEventUtils.sendInitFailedEvent(reactApplicationContext, sdkInitResultModel.reason)
73
- }
74
-
75
- FireworkSdk.analytics.register(this)
76
- promise.resolve(true)
77
-
78
- return
79
- }
80
-
81
- promise.resolve(false)
92
+ promise.resolve(initCallback())
82
93
  }
83
94
 
84
95
  /**
@@ -236,7 +247,7 @@ class FireworkSDKModule(
236
247
  return
237
248
  }
238
249
  UiThreadUtil.runOnUiThread {
239
- val result = FWLanguageUtil.getInstance(activity).changeLanguage(language, activity)
250
+ val result = FWReactNativeSDK.changeLanguage(language, activity)
240
251
  promise.resolve(result)
241
252
  }
242
253
  }
@@ -299,6 +310,19 @@ class FireworkSDKModule(
299
310
  }
300
311
  }
301
312
 
313
+ @ReactMethod
314
+ override fun setDataTrackingLevel(level: String?, promise: Promise) {
315
+ val trackingLevel =
316
+ when (level) {
317
+ FWDataTrackingLevel.ALL.rawValue -> FwTrackingLevel.ALL
318
+ FWDataTrackingLevel.NONE.rawValue -> FwTrackingLevel.NONE
319
+ FWDataTrackingLevel.ESSENTIAL_ONLY.rawValue -> FwTrackingLevel.ESSENTIAL_ONLY
320
+ else -> FwTrackingLevel.ALL
321
+ }
322
+ FireworkSdk.setTrackingLevel(trackingLevel)
323
+ promise.resolve(true)
324
+ }
325
+
302
326
  @ReactMethod
303
327
  fun addListener(eventName: String?, promise: Promise) {
304
328
  // Set up any upstream listeners or background tasks as necessary
@@ -18,7 +18,7 @@ import java.util.*
18
18
  object FWEventUtils {
19
19
 
20
20
  fun sendInitSuccessEvent(reactContext: ReactContext) {
21
- sendEvent(reactContext, FWEventName.SDKIni.rawValue, Arguments.createMap())
21
+ sendEvent(reactContext, FWEventName.SDKInit.rawValue, Arguments.createMap())
22
22
  }
23
23
 
24
24
  fun sendInitFailedEvent(reactContext: ReactContext, reason: String?) {
@@ -26,7 +26,7 @@ object FWEventUtils {
26
26
  val contentMap = Arguments.createMap()
27
27
  contentMap.putString(FWSDKInitSubEventName.InitFailed.rawValue, reason?:"unknown")
28
28
  eventMap.putMap("error", contentMap)
29
- sendEvent(reactContext, FWEventName.SDKIni.rawValue, eventMap)
29
+ sendEvent(reactContext, FWEventName.SDKInit.rawValue, eventMap)
30
30
  }
31
31
 
32
32
  fun sendVideoFeedClickEvent(reactContext: ReactContext, info: FWVideoFeedItemDetailsModel) {
@@ -79,6 +79,17 @@ object FWEventUtils {
79
79
  sendEvent(reactContext, FWEventName.VideoPlayback.rawValue, eventMap)
80
80
  }
81
81
 
82
+ private fun convertLiveStreamDetails2Map(info: FWLiveStreamEventDetailsModel?): WritableMap {
83
+ val contentMap = Arguments.createMap()
84
+ if (!info?.id.isNullOrBlank()) {
85
+ contentMap.putString("id", info?.id)
86
+ }
87
+ if (!info?.feedId.isNullOrBlank()) {
88
+ contentMap.putString("feedId", info?.feedId)
89
+ }
90
+ return contentMap
91
+ }
92
+
82
93
  private fun convertVideoPlaybackDetails2Map(info: FWVideoPlaybackDetails?): WritableMap {
83
94
  val contentMap = Arguments.createMap()
84
95
  if (!info?.id.isNullOrBlank()) {
@@ -244,11 +255,7 @@ object FWEventUtils {
244
255
  val eventMap = Arguments.createMap()
245
256
  eventMap.putString("eventName", eventName)
246
257
 
247
- val contentMap = Arguments.createMap()
248
- if (!info?.id.isNullOrBlank()) {
249
- contentMap.putString("id", info?.id)
250
- }
251
- eventMap.putMap("info", contentMap)
258
+ eventMap.putMap("info", convertLiveStreamDetails2Map(info))
252
259
  sendEvent(reactContext, FWEventName.LiveStream.rawValue, eventMap)
253
260
  }
254
261
 
@@ -267,14 +274,10 @@ object FWEventUtils {
267
274
  if (!message?.text.isNullOrBlank()) {
268
275
  chatMap.putString("text", message?.text)
269
276
  }
270
- eventMap.putMap("chat", chatMap)
277
+ eventMap.putMap("message", chatMap)
271
278
 
272
279
  // live stream map
273
- val liveStreamMap = Arguments.createMap()
274
- if (!liveStream?.id.isNullOrBlank()) {
275
- liveStreamMap.putString("id", liveStream?.id)
276
- }
277
- eventMap.putMap("liveStream", liveStreamMap)
280
+ eventMap.putMap("liveStream", convertLiveStreamDetails2Map(liveStream))
278
281
 
279
282
  sendEvent(reactContext, FWEventName.LiveStreamChat.rawValue, eventMap)
280
283
  }
@@ -289,6 +292,15 @@ object FWEventUtils {
289
292
  sendEvent(reactContext, FWVideoShoppingEventName.CustomProductCardTap.rawValue, eventMap)
290
293
  }
291
294
 
295
+ fun sendProductClickEvent(reactContext: ReactContext, url: String?, productId: String?, unitId: String?, info: FWVideoPlaybackDetails?) {
296
+ val eventMap = Arguments.createMap()
297
+ eventMap.putString("url", url?:"")
298
+ eventMap.putString("productId", productId)
299
+ eventMap.putString("unitId", unitId)
300
+ eventMap.putMap("video", convertVideoPlaybackDetails2Map(info))
301
+ sendEvent(reactContext, FWVideoShoppingEventName.ProductClick.rawValue, eventMap)
302
+ }
303
+
292
304
  fun sendCustomLinkButtonClickEvent(reactContext: ReactContext, url: String?, productId: String?, unitId: String?, info: FWVideoPlaybackDetails?, callbackId: Int?) {
293
305
  val eventMap = Arguments.createMap()
294
306
  eventMap.putString("url", url ?: "")
@@ -137,6 +137,7 @@ object FWConfigUtil {
137
137
  val titleHidden = title.hidden
138
138
  val titleTextColor = title.textColor
139
139
  val titleFontSize = title.fontSize
140
+ val titleNumberOfLines = title.numberOfLines
140
141
  val titleBackgroundColor = title.backgroundColor
141
142
  val titleGradientDrawable = title.gradientDrawable
142
143
  val typeface = getTypeface(context, title.fontInfo)
@@ -149,6 +150,9 @@ object FWConfigUtil {
149
150
  if (titleFontSize != null && titleFontSize > 0) {
150
151
  titleOptionBuilder.feedTitleTextSize(FWCommonUtil.spToPx(titleFontSize.toFloat(), context))
151
152
  }
153
+ if (titleNumberOfLines != null && titleNumberOfLines > 0 && titleNumberOfLines < 6) {
154
+ titleOptionBuilder.feedTitleTextNumberOfLines(titleNumberOfLines.toInt())
155
+ }
152
156
  typeface?.let {
153
157
  titleOptionBuilder.feedTitleTextTypeface(it)
154
158
  }
@@ -2,6 +2,7 @@ package com.fireworksdk.bridge.utils
2
2
 
3
3
  import com.fireworksdk.bridge.models.FWAdBadgeConfigModel
4
4
  import com.fireworksdk.bridge.models.FWSdkInitResultModel
5
+ import com.fireworksdk.bridge.models.enums.FWSwitchLanguageBehavior
5
6
 
6
7
  object FWGlobalDataUtil {
7
8
 
@@ -18,4 +19,8 @@ object FWGlobalDataUtil {
18
19
  var shareBaseUrl: String? = null
19
20
 
20
21
  var pauseWhenNotVisible: Boolean = false
22
+
23
+ var switchLanguageBehavior = FWSwitchLanguageBehavior.RestartingActivity
24
+
25
+ var initCompletedListener: (() -> Unit)? = null
21
26
  }