react-native-firework-sdk 2.0.0-beta.5 → 2.1.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 (139) hide show
  1. package/android/build.gradle +5 -3
  2. package/android/src/main/java/com/fireworksdk/bridge/components/videofeed/StoryBlockFragment.kt +129 -0
  3. package/android/src/main/java/com/fireworksdk/bridge/components/videofeed/StoryBlockFrameLayout.kt +84 -0
  4. package/android/src/main/java/com/fireworksdk/bridge/models/FWEventName.kt +2 -1
  5. package/android/src/main/java/com/fireworksdk/bridge/models/FWProductInfoViewConfiguration.kt +18 -5
  6. package/android/src/main/java/com/fireworksdk/bridge/models/FWProductInfoViewConfigurationDeserializer.kt +33 -9
  7. package/android/src/main/java/com/fireworksdk/bridge/models/FWShoppingCtaResult.kt +17 -0
  8. package/android/src/main/java/com/fireworksdk/bridge/models/FWShoppingCtaResultDeserializer.kt +33 -0
  9. package/android/src/main/java/com/fireworksdk/bridge/reactnative/manager/FWStoryBlockManager.kt +126 -45
  10. package/android/src/main/java/com/fireworksdk/bridge/reactnative/manager/FWVideoFeedManager.kt +6 -3
  11. package/android/src/main/java/com/fireworksdk/bridge/reactnative/models/FWVideoShoppingInterface.kt +2 -2
  12. package/android/src/main/java/com/fireworksdk/bridge/reactnative/module/FWNavigatorModule.kt +9 -1
  13. package/android/src/main/java/com/fireworksdk/bridge/reactnative/module/FWVideoShoppingModule.kt +81 -50
  14. package/android/src/main/java/com/fireworksdk/bridge/reactnative/utils/FWEventUtils.kt +9 -2
  15. package/android/src/main/java/com/fireworksdk/bridge/utils/FWConfigUtil.kt +1 -1
  16. package/android/src/main/java/com/fireworksdk/bridge/utils/FWGlobalDataUtil.kt +4 -0
  17. package/android/src/main/java/com/fireworksdk/bridge/utils/FWLanguageUtil.kt +48 -16
  18. package/android/src/main/res/layout/fw_bridge_story_block.xml +24 -0
  19. package/ios/Components/StoryBlock.swift +33 -2
  20. package/ios/Components/StoryBlockManager.m +32 -0
  21. package/ios/Components/VideoFeed.swift +9 -29
  22. package/ios/Components/VideoFeedManager.m +11 -6
  23. package/ios/FireworkSdk.xcodeproj/project.pbxproj +378 -104
  24. package/ios/Models/NativeToRN/FireworkEventName.swift +3 -1
  25. package/ios/Models/RNToNative/RCTConvert+Shopping.swift +21 -0
  26. package/ios/Models/RNToNative/RCTConvert+VideoFeed.swift +27 -0
  27. package/ios/Modules/FWNavigatorModule/FWNavigatorModule.swift +5 -1
  28. package/ios/Modules/FireworkSDKModule/FireworkSDKModule.m +1 -0
  29. package/ios/Modules/FireworkSDKModule/FireworkSDKModule.swift +30 -0
  30. package/ios/Modules/Shopping/ProductInfoViewConfiguration.swift +13 -0
  31. package/ios/Modules/Shopping/ShoppingCTAResult.swift +16 -0
  32. package/ios/Modules/Shopping/ShoppingModule.m +2 -1
  33. package/ios/Modules/Shopping/ShoppingModule.swift +106 -30
  34. package/ios/Support/MultiHostStreaming/FWMultiHostStreaming.podspec +24 -0
  35. package/ios/Support/MultiHostStreaming/src/MultiHostStreamingSDK.swift +17 -0
  36. package/ios/Utils/AppLanguage/Bundle+FWSwizzle.swift +58 -0
  37. package/ios/Utils/AppLanguage/FWAppLanguageManager.swift +139 -0
  38. package/ios/Utils/AppLanguage/FWLanguageUtil.swift +43 -0
  39. package/ios/Utils/AppLanguage/NumberFormatter+FWSwizzle.swift +25 -0
  40. package/ios/Utils/AppLanguage/UIImageView+FWSwizzle.swift +91 -0
  41. package/ios/Utils/AppLanguage/UILabel+FWSwizzle.swift +98 -0
  42. package/ios/Utils/AppLanguage/UITextField+FWSwizzle.swift +97 -0
  43. package/ios/Utils/AppLanguage/UITextView+FWSwizzle.swift +97 -0
  44. package/ios/Utils/AppLanguage/UIView+FWSwizzle.swift +38 -0
  45. package/ios/Utils/AppLanguage/UIViewController+FWSwizzle.swift +32 -0
  46. package/ios/Utils/AppLanguage/UIWindow+FWSwizzle.swift +26 -0
  47. package/ios/Utils/AppLanguage/URLSession+FWSwizzle.swift +69 -0
  48. package/ios/Utils/{DispatchQueue+FWOnce.swift → Extensions/DispatchQueue+FWOnce.swift} +3 -3
  49. package/ios/Utils/{UINavigationController+FWSwizzle.swift → Extensions/Swizzle/UINavigationController+FWSwizzle.swift} +6 -8
  50. package/ios/Utils/Extensions/UIView+FWUIHierarchy.swift +47 -0
  51. package/ios/Utils/FWRTL/Classes/Manager/FWRTLManager.h +25 -0
  52. package/ios/Utils/FWRTL/Classes/Manager/FWRTLManager.m +75 -0
  53. package/ios/Utils/FWRTL/Classes/UICategories/CALayer+FWRTL.h +21 -0
  54. package/ios/Utils/FWRTL/Classes/UICategories/CALayer+FWRTL.m +124 -0
  55. package/ios/Utils/FWRTL/Classes/UICategories/FWRTLRemoteViewControllerAdaptor.h +11 -0
  56. package/ios/Utils/FWRTL/Classes/UICategories/FWRTLRemoteViewControllerAdaptor.m +86 -0
  57. package/ios/Utils/FWRTL/Classes/UICategories/FWRTLWhiteListManager.h +16 -0
  58. package/ios/Utils/FWRTL/Classes/UICategories/FWRTLWhiteListManager.m +55 -0
  59. package/ios/Utils/FWRTL/Classes/UICategories/UILabel+FWRTL.h +18 -0
  60. package/ios/Utils/FWRTL/Classes/UICategories/UILabel+FWRTL.m +39 -0
  61. package/ios/Utils/FWRTL/Classes/UICategories/UIView+FWRTL.h +54 -0
  62. package/ios/Utils/FWRTL/Classes/UICategories/UIView+FWRTL.m +141 -0
  63. package/ios/Utils/FWRTL/Classes/UICategories/UIWindow+FWRTL.h +16 -0
  64. package/ios/Utils/FWRTL/Classes/UICategories/UIWindow+FWRTL.m +20 -0
  65. package/ios/Utils/FWRTL/Classes/Utils/FWRTLDefinitions.h +52 -0
  66. package/ios/Utils/FWRTL/Classes/Utils/NSObject+FWRTLReloadBlock.h +19 -0
  67. package/ios/Utils/FWRTL/Classes/Utils/NSObject+FWRTLReloadBlock.m +49 -0
  68. package/ios/Utils/FWRTL/Classes/Utils/NSString+FWRTL.h +21 -0
  69. package/ios/Utils/FWRTL/Classes/Utils/NSString+FWRTL.m +38 -0
  70. package/ios/Utils/FWRTL/Classes/Utils/UIImage+FWRTL.h +18 -0
  71. package/ios/Utils/FWRTL/Classes/Utils/UIImage+FWRTL.m +43 -0
  72. package/ios/Utils/FWSwizzleLoader.m +6 -1
  73. package/ios/Utils/FWSwizzleLoader.swift +13 -0
  74. package/ios/Utils/FWSwizzleUtil.swift +17 -9
  75. package/ios/react_native_firework_sdk.h +1 -0
  76. package/ios/scripts/react_native_firework_sdk_pods.rb +31 -0
  77. package/lib/commonjs/FireworkSDK.js +21 -4
  78. package/lib/commonjs/FireworkSDK.js.map +1 -1
  79. package/lib/commonjs/VideoShopping.js +20 -37
  80. package/lib/commonjs/VideoShopping.js.map +1 -1
  81. package/lib/commonjs/components/StoryBlock.js +193 -116
  82. package/lib/commonjs/components/StoryBlock.js.map +1 -1
  83. package/lib/commonjs/components/VideoFeed.js +32 -10
  84. package/lib/commonjs/components/VideoFeed.js.map +1 -1
  85. package/lib/commonjs/index.js.map +1 -1
  86. package/lib/commonjs/models/FWEventName.js +2 -0
  87. package/lib/commonjs/models/FWEventName.js.map +1 -1
  88. package/lib/commonjs/models/ShoppingCTAResult.js +2 -0
  89. package/lib/commonjs/modules/FireworkSDKModule.js.map +1 -1
  90. package/lib/commonjs/modules/ShoppingModule.js.map +1 -1
  91. package/lib/module/FireworkSDK.js +21 -4
  92. package/lib/module/FireworkSDK.js.map +1 -1
  93. package/lib/module/VideoShopping.js +20 -39
  94. package/lib/module/VideoShopping.js.map +1 -1
  95. package/lib/module/components/StoryBlock.js +181 -116
  96. package/lib/module/components/StoryBlock.js.map +1 -1
  97. package/lib/module/components/VideoFeed.js +37 -10
  98. package/lib/module/components/VideoFeed.js.map +1 -1
  99. package/lib/module/index.js.map +1 -1
  100. package/lib/module/models/FWEventName.js +2 -0
  101. package/lib/module/models/FWEventName.js.map +1 -1
  102. package/lib/module/models/ShoppingCTAResult.js +2 -0
  103. package/lib/module/modules/FireworkSDKModule.js.map +1 -1
  104. package/lib/module/modules/ShoppingModule.js.map +1 -1
  105. package/lib/typescript/FireworkSDK.d.ts +7 -4
  106. package/lib/typescript/VideoShopping.d.ts +9 -11
  107. package/lib/typescript/components/StoryBlock.d.ts +19 -16
  108. package/lib/typescript/components/VideoFeed.d.ts +15 -6
  109. package/lib/typescript/index.d.ts +6 -6
  110. package/lib/typescript/models/FWEventName.d.ts +2 -0
  111. package/lib/typescript/models/FWEvents.d.ts +14 -1
  112. package/lib/typescript/models/ProductInfoViewConfiguration.d.ts +36 -1
  113. package/lib/typescript/models/ShoppingCTAResult.d.ts +11 -0
  114. package/lib/typescript/modules/FireworkSDKModule.d.ts +1 -2
  115. package/lib/typescript/modules/ShoppingModule.d.ts +2 -1
  116. package/package.json +5 -4
  117. package/react-native-firework-sdk.podspec +26 -24
  118. package/src/FireworkSDK.ts +18 -5
  119. package/src/VideoShopping.ts +40 -53
  120. package/src/components/StoryBlock.tsx +201 -88
  121. package/src/components/VideoFeed.tsx +32 -12
  122. package/src/index.ts +15 -7
  123. package/src/models/FWEventName.ts +2 -0
  124. package/src/models/FWEvents.ts +14 -1
  125. package/src/models/ProductInfoViewConfiguration.ts +38 -1
  126. package/src/models/ShoppingCTAResult.ts +11 -0
  127. package/src/modules/FireworkSDKModule.ts +1 -2
  128. package/src/modules/ShoppingModule.ts +5 -5
  129. package/android/src/main/java/com/fireworksdk/bridge/constants/FWCommandConstant.kt +0 -6
  130. package/ios/Utils/UIView+ParentViewController.swift +0 -21
  131. package/lib/commonjs/models/AddToCartResult.js +0 -2
  132. package/lib/module/models/AddToCartResult.js +0 -2
  133. package/lib/typescript/models/AddToCartResult.d.ts +0 -10
  134. package/src/models/AddToCartResult.ts +0 -10
  135. /package/ios/Utils/{String+Color.swift → Extensions/String+Color.swift} +0 -0
  136. /package/ios/Utils/{UIView+Constraints.swift → Extensions/UIView+Constraints.swift} +0 -0
  137. /package/ios/Utils/{UIViewController+AttachChild.swift → Extensions/UIViewController+AttachChild.swift} +0 -0
  138. /package/lib/commonjs/models/{AddToCartResult.js.map → ShoppingCTAResult.js.map} +0 -0
  139. /package/lib/module/models/{AddToCartResult.js.map → ShoppingCTAResult.js.map} +0 -0
@@ -26,10 +26,8 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
26
26
  */
27
27
  class VideoShopping {
28
28
  /**
29
- * This callback is triggered when the user clicks the "Add to cart" button.
30
- *
31
- * The host apps can return an AddToCartResult object to tell FireworkSDK the result of adding to cart.
32
- * If the host apps want to customize the processing logic of clicking "Add to cart" button, they could return null or undefined in the callback.
29
+ * This callback is triggered when the user clicks the "Add to cart" or "Shop now" button.
30
+ * The host app can return a ShoppingCTAResult object to tell SDK how to handle the result.
33
31
  */
34
32
 
35
33
  /**
@@ -65,8 +63,8 @@ class VideoShopping {
65
63
  }
66
64
 
67
65
  /**
68
- * The host app can use this property to configure "Add to cart" button style
69
- * and hide the link button next to "Add to cart" button. Only supported on iOS.
66
+ * The configuration of product info view.
67
+ * Please refer to {@link ProductInfoViewConfiguration} for more details.
70
68
  */
71
69
  get productInfoViewConfiguration() {
72
70
  return this._productInfoViewConfiguration;
@@ -75,9 +73,7 @@ class VideoShopping {
75
73
  set productInfoViewConfiguration(value) {
76
74
  this._productInfoViewConfiguration = value;
77
75
 
78
- if (_reactNative.Platform.OS === 'ios') {
79
- _ShoppingModule.default.setProductInfoViewConfiguration(value !== null && value !== void 0 ? value : {});
80
- }
76
+ _ShoppingModule.default.setProductInfoViewConfiguration(value !== null && value !== void 0 ? value : {});
81
77
  }
82
78
 
83
79
  /**
@@ -94,9 +90,7 @@ class VideoShopping {
94
90
  set onCustomClickLinkButton(value) {
95
91
  this._onCustomClickLinkButton = value;
96
92
 
97
- if (_reactNative.Platform.OS === 'android') {
98
- _ShoppingModule.default.setCustomClickLinkButtonEnabled(!!value);
99
- }
93
+ _ShoppingModule.default.setCustomClickLinkButtonEnabled(!!value);
100
94
  }
101
95
 
102
96
  get eventEmitter() {
@@ -114,7 +108,7 @@ class VideoShopping {
114
108
  }
115
109
 
116
110
  constructor() {
117
- _defineProperty(this, "onAddToCart", void 0);
111
+ _defineProperty(this, "onShoppingCTA", void 0);
118
112
 
119
113
  _defineProperty(this, "_onCustomClickCartIcon", void 0);
120
114
 
@@ -126,10 +120,10 @@ class VideoShopping {
126
120
 
127
121
  _defineProperty(this, "_onCustomClickLinkButton", void 0);
128
122
 
129
- this.eventEmitter.addListener(_FWEventName.FWEventName.AddToCart, event => {
130
- _FWLoggerUtil.default.log(`Receive AddToCart event productId: ${event === null || event === void 0 ? void 0 : event.productId} unitId: ${event === null || event === void 0 ? void 0 : event.unitId}`);
123
+ this.eventEmitter.addListener(_FWEventName.FWEventName.ShoppingCTAButtonClick, event => {
124
+ _FWLoggerUtil.default.log(`Receive ShoppingCTA event productId: ${event === null || event === void 0 ? void 0 : event.productId} unitId: ${event === null || event === void 0 ? void 0 : event.unitId} url: ${event === null || event === void 0 ? void 0 : event.url}`);
131
125
 
132
- this.handleAddToCartEvent(event);
126
+ this.handleShoppingCTAEvent(event);
133
127
  });
134
128
  this.eventEmitter.addListener(_FWEventName.FWEventName.ClickCartIcon, () => {
135
129
  _FWLoggerUtil.default.log('Receive ClickCartIcon event');
@@ -142,14 +136,11 @@ class VideoShopping {
142
136
  this.handleUpdateProductDetailsEvent(event);
143
137
  });
144
138
  this.eventEmitter.addListener(_FWEventName.FWEventName.LogMessage, () => {});
139
+ this.eventEmitter.addListener(_FWEventName.FWEventName.CustomLinkButtonClick, event => {
140
+ _FWLoggerUtil.default.log(`Receive CustomLinkButtonClick event url: ${event === null || event === void 0 ? void 0 : event.url}`);
145
141
 
146
- if (_reactNative.Platform.OS === 'android') {
147
- this.eventEmitter.addListener(_FWEventName.FWEventName.CustomLinkButtonClick, event => {
148
- _FWLoggerUtil.default.log(`Receive CustomLinkButtonClick event url: ${event === null || event === void 0 ? void 0 : event.url}`);
149
-
150
- this.handleCustomLinkButtonClickEvent(event);
151
- });
152
- }
142
+ this.handleCustomLinkButtonClickEvent(event);
143
+ });
153
144
  }
154
145
  /**
155
146
  *
@@ -165,28 +156,20 @@ class VideoShopping {
165
156
  _ShoppingModule.default.setCartItemCount(count);
166
157
  }
167
158
 
168
- async handleAddToCartEvent(event) {
159
+ async handleShoppingCTAEvent(event) {
169
160
  const callbackId = event.callbackId;
170
161
  delete event.callbackId;
171
162
 
172
- if (this.onAddToCart) {
173
- const result = await this.onAddToCart(event);
163
+ if (this.onShoppingCTA) {
164
+ const result = await this.onShoppingCTA(event);
174
165
 
175
- if (result) {
176
- if (callbackId) {
177
- _ShoppingModule.default.updateAddToCartStatus(result.res, result.tips, callbackId);
178
- }
179
- } else {
180
- if (callbackId) {
181
- if (_reactNative.Platform.OS === 'ios') {
182
- _ShoppingModule.default.clearCallbackId(callbackId, _FWEventName.FWEventName.AddToCart);
183
- }
184
- }
166
+ if (callbackId) {
167
+ _ShoppingModule.default.updateShoppingCTAResult(result, callbackId);
185
168
  }
186
169
  } else {
187
170
  if (callbackId) {
188
171
  if (_reactNative.Platform.OS === 'ios') {
189
- _ShoppingModule.default.clearCallbackId(callbackId, _FWEventName.FWEventName.AddToCart);
172
+ _ShoppingModule.default.clearCallbackId(callbackId, _FWEventName.FWEventName.ShoppingCTAButtonClick);
190
173
  }
191
174
  }
192
175
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["VideoShopping.ts"],"names":["VideoShopping","onCustomClickCartIcon","_onCustomClickCartIcon","value","Platform","OS","ShoppingModule","setCustomClickCartIconEnabled","cartIconVisible","_cartIconVisible","setCartIconVisible","productInfoViewConfiguration","_productInfoViewConfiguration","setProductInfoViewConfiguration","onCustomClickLinkButton","_onCustomClickLinkButton","setCustomClickLinkButtonEnabled","eventEmitter","ShoppingModuleEventEmitter","getInstance","FWLoggerUtil","log","_instance","constructor","addListener","FWEventName","AddToCart","event","productId","unitId","handleAddToCartEvent","ClickCartIcon","handleClickCartIconEvent","UpdateProductDetails","productIds","handleUpdateProductDetailsEvent","LogMessage","CustomLinkButtonClick","url","handleCustomLinkButtonClickEvent","setCartItemCount","count","callbackId","onAddToCart","result","updateAddToCartStatus","res","tips","clearCallbackId","onUpdateProductDetails","productList","map","product","length","updateVideoProducts"],"mappings":"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","sourcesContent":["import { NativeEventEmitter, Platform } from 'react-native';\n\nimport type AddToCartResult from './models/AddToCartResult';\nimport { FWEventName } from './models/FWEventName';\nimport type {\n AddToCartEvent,\n CustomClickLinkButtonEvent,\n UpdateProductDetailsEvent,\n} from './models/FWEvents';\nimport type Product from './models/Product';\nimport type ProductInfoViewConfiguration from './models/ProductInfoViewConfiguration';\nimport ShoppingModule, {\n ShoppingModuleEventEmitter,\n} from './modules/ShoppingModule';\nimport FWLoggerUtil from './utils/FWLoggerUtil';\n\nexport type AddToCartCallback = (\n event: AddToCartEvent\n) => Promise<AddToCartResult | undefined | null>;\n\nexport type CustomClickCartIconCallback = () => Promise<void>;\n\nexport type UpdateProductDetailsCallback = (\n event: UpdateProductDetailsEvent\n) => Promise<Product[] | undefined | null>;\n\nexport type CustomClickLinkButtonCallback = (\n event: CustomClickLinkButtonEvent\n) => Promise<void>;\n\n/**\n * The entry class of video shopping.\n */\nclass VideoShopping {\n private static _instance?: VideoShopping;\n\n /**\n * This callback is triggered when the user clicks the \"Add to cart\" button.\n *\n * The host apps can return an AddToCartResult object to tell FireworkSDK the result of adding to cart.\n * If the host apps want to customize the processing logic of clicking \"Add to cart\" button, they could return null or undefined in the callback.\n */\n public onAddToCart?: AddToCartCallback;\n\n /**\n * This callback is triggered when the user clicks the shopping cart icon.\n *\n * The host app can customize the click event processing logic of\n * the shopping cart icon by setting the callback.\n */\n public get onCustomClickCartIcon(): CustomClickCartIconCallback | undefined {\n return this._onCustomClickCartIcon;\n }\n public set onCustomClickCartIcon(\n value: CustomClickCartIconCallback | undefined\n ) {\n this._onCustomClickCartIcon = value;\n if (Platform.OS === 'ios') {\n ShoppingModule.setCustomClickCartIconEnabled(!!value);\n }\n }\n private _onCustomClickCartIcon?: CustomClickCartIconCallback | undefined;\n\n /**\n * This callback is triggered when the video will be shown.\n *\n * The host app can return a Product list to update the latest product information.\n */\n public onUpdateProductDetails?: UpdateProductDetailsCallback;\n\n /**\n * Defaults to true.\n * You can hide the cart icon by setting this property to false.\n */\n public get cartIconVisible(): boolean {\n return this._cartIconVisible;\n }\n public set cartIconVisible(value: boolean) {\n this._cartIconVisible = value;\n ShoppingModule.setCartIconVisible(value);\n }\n private _cartIconVisible: boolean = true;\n\n /**\n * The host app can use this property to configure \"Add to cart\" button style\n * and hide the link button next to \"Add to cart\" button. Only supported on iOS.\n */\n public get productInfoViewConfiguration():\n | ProductInfoViewConfiguration\n | undefined {\n return this._productInfoViewConfiguration;\n }\n\n public set productInfoViewConfiguration(\n value: ProductInfoViewConfiguration | undefined\n ) {\n this._productInfoViewConfiguration = value;\n if (Platform.OS === 'ios') {\n ShoppingModule.setProductInfoViewConfiguration(value ?? {});\n }\n }\n\n private _productInfoViewConfiguration?:\n | ProductInfoViewConfiguration\n | undefined;\n\n /**\n * This callback is triggered when the user clicks\n * the link button next to Add to cart button. Only supported on Android.\n *\n * The host app can customize the click event processing logic of\n * the link button by setting the callback.\n */\n public get onCustomClickLinkButton():\n | CustomClickLinkButtonCallback\n | undefined {\n return this._onCustomClickLinkButton;\n }\n public set onCustomClickLinkButton(\n value: CustomClickLinkButtonCallback | undefined\n ) {\n this._onCustomClickLinkButton = value;\n if (Platform.OS === 'android') {\n ShoppingModule.setCustomClickLinkButtonEnabled(!!value);\n }\n }\n private _onCustomClickLinkButton?: CustomClickLinkButtonCallback | undefined;\n\n private get eventEmitter(): NativeEventEmitter {\n return ShoppingModuleEventEmitter;\n }\n\n public static getInstance() {\n FWLoggerUtil.log('VideoShopping constructor');\n if (!VideoShopping._instance) {\n VideoShopping._instance = new VideoShopping();\n }\n\n return VideoShopping._instance!;\n }\n\n private constructor() {\n this.eventEmitter.addListener(FWEventName.AddToCart, (event) => {\n FWLoggerUtil.log(\n `Receive AddToCart event productId: ${event?.productId} unitId: ${event?.unitId}`\n );\n this.handleAddToCartEvent(event);\n });\n\n this.eventEmitter.addListener(FWEventName.ClickCartIcon, () => {\n FWLoggerUtil.log('Receive ClickCartIcon event');\n this.handleClickCartIconEvent();\n });\n\n this.eventEmitter.addListener(FWEventName.UpdateProductDetails, (event) => {\n FWLoggerUtil.log(\n `Receive UpdateProductDetails event productIds: ${event?.productIds}`\n );\n this.handleUpdateProductDetailsEvent(event);\n });\n\n this.eventEmitter.addListener(FWEventName.LogMessage, () => {});\n\n if (Platform.OS === 'android') {\n this.eventEmitter.addListener(\n FWEventName.CustomLinkButtonClick,\n (event) => {\n FWLoggerUtil.log(\n `Receive CustomLinkButtonClick event url: ${event?.url}`\n );\n this.handleCustomLinkButtonClickEvent(event);\n }\n );\n }\n }\n\n /**\n *\n * @param {number} count The number of items in the host app cart.\n * The count should be greater than or equal to 0.\n * We just use count to show or hide red indicator on the cart icon.\n * If cound > 0, we will show the red indicator on the cart icon.\n * Otherwise, we will hide the red indicator on the cart icon.\n */\n public setCartItemCount(count: number) {\n ShoppingModule.setCartItemCount(count);\n }\n\n private async handleAddToCartEvent(event: any) {\n const callbackId = event.callbackId;\n delete event.callbackId;\n if (this.onAddToCart) {\n const result = await this.onAddToCart(event as AddToCartEvent);\n if (result) {\n if (callbackId) {\n ShoppingModule.updateAddToCartStatus(\n result.res,\n result.tips,\n callbackId\n );\n }\n } else {\n if (callbackId) {\n if (Platform.OS === 'ios') {\n ShoppingModule.clearCallbackId(callbackId, FWEventName.AddToCart);\n }\n }\n }\n } else {\n if (callbackId) {\n if (Platform.OS === 'ios') {\n ShoppingModule.clearCallbackId(callbackId, FWEventName.AddToCart);\n }\n }\n }\n }\n\n private async handleClickCartIconEvent() {\n if (this.onCustomClickCartIcon) {\n this.onCustomClickCartIcon();\n }\n }\n\n private async handleUpdateProductDetailsEvent(event: any) {\n const callbackId = event.callbackId;\n delete event.callbackId;\n if (this.onUpdateProductDetails) {\n FWLoggerUtil.log(\n `Call onUpdateProductDetails callback productIds: ${event.productIds} callbackId: ${callbackId}`\n );\n const productList = await this.onUpdateProductDetails(\n event as UpdateProductDetailsEvent\n );\n\n const productIds = (productList || []).map(\n (product) => product.productId ?? ''\n );\n\n FWLoggerUtil.log(\n `Get result from onUpdateProductDetails callback productIds: ${productIds} productListLength: ${\n (productList || []).length\n }`\n );\n\n if (productList) {\n if (callbackId) {\n ShoppingModule.updateVideoProducts(productList, callbackId);\n }\n } else {\n if (callbackId) {\n if (Platform.OS === 'ios') {\n ShoppingModule.clearCallbackId(\n callbackId,\n FWEventName.UpdateProductDetails\n );\n }\n }\n }\n } else {\n FWLoggerUtil.log('onUpdateProductDetails callback is not set.');\n if (callbackId) {\n if (Platform.OS === 'ios') {\n ShoppingModule.clearCallbackId(\n callbackId,\n FWEventName.UpdateProductDetails\n );\n }\n }\n }\n }\n\n private async handleCustomLinkButtonClickEvent(\n event: CustomClickLinkButtonEvent\n ) {\n if (this.onCustomClickLinkButton) {\n this.onCustomClickLinkButton(event);\n }\n }\n}\n\nexport default VideoShopping;\n"]}
1
+ {"version":3,"sources":["VideoShopping.ts"],"names":["VideoShopping","onCustomClickCartIcon","_onCustomClickCartIcon","value","Platform","OS","ShoppingModule","setCustomClickCartIconEnabled","cartIconVisible","_cartIconVisible","setCartIconVisible","productInfoViewConfiguration","_productInfoViewConfiguration","setProductInfoViewConfiguration","onCustomClickLinkButton","_onCustomClickLinkButton","setCustomClickLinkButtonEnabled","eventEmitter","ShoppingModuleEventEmitter","getInstance","FWLoggerUtil","log","_instance","constructor","addListener","FWEventName","ShoppingCTAButtonClick","event","productId","unitId","url","handleShoppingCTAEvent","ClickCartIcon","handleClickCartIconEvent","UpdateProductDetails","productIds","handleUpdateProductDetailsEvent","LogMessage","CustomLinkButtonClick","handleCustomLinkButtonClickEvent","setCartItemCount","count","callbackId","onShoppingCTA","result","updateShoppingCTAResult","clearCallbackId","onUpdateProductDetails","productList","map","product","length","updateVideoProducts"],"mappings":"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","sourcesContent":["import { NativeEventEmitter, Platform } from 'react-native';\n\nimport { FWEventName } from './models/FWEventName';\nimport type {\n CustomClickLinkButtonEvent,\n ShoppingCTAEvent,\n UpdateProductDetailsEvent,\n} from './models/FWEvents';\nimport type Product from './models/Product';\nimport type ProductInfoViewConfiguration from './models/ProductInfoViewConfiguration';\nimport ShoppingModule, {\n ShoppingModuleEventEmitter,\n} from './modules/ShoppingModule';\nimport FWLoggerUtil from './utils/FWLoggerUtil';\nimport type ShoppingCTAResult from './models/ShoppingCTAResult';\n\nexport type ShoppingCTACallback = (\n event: ShoppingCTAEvent\n) => Promise<ShoppingCTAResult>;\n\nexport type CustomClickCartIconCallback = () => Promise<void>;\n\nexport type UpdateProductDetailsCallback = (\n event: UpdateProductDetailsEvent\n) => Promise<Product[] | undefined | null>;\n\nexport type CustomClickLinkButtonCallback = (\n event: CustomClickLinkButtonEvent\n) => Promise<void>;\n\n/**\n * The entry class of video shopping.\n */\nclass VideoShopping {\n private static _instance?: VideoShopping;\n\n /**\n * This callback is triggered when the user clicks the \"Add to cart\" or \"Shop now\" button.\n * The host app can return a ShoppingCTAResult object to tell SDK how to handle the result.\n */\n public onShoppingCTA?: ShoppingCTACallback;\n\n /**\n * This callback is triggered when the user clicks the shopping cart icon.\n *\n * The host app can customize the click event processing logic of\n * the shopping cart icon by setting the callback.\n */\n public get onCustomClickCartIcon(): CustomClickCartIconCallback | undefined {\n return this._onCustomClickCartIcon;\n }\n public set onCustomClickCartIcon(\n value: CustomClickCartIconCallback | undefined\n ) {\n this._onCustomClickCartIcon = value;\n if (Platform.OS === 'ios') {\n ShoppingModule.setCustomClickCartIconEnabled(!!value);\n }\n }\n private _onCustomClickCartIcon?: CustomClickCartIconCallback | undefined;\n\n /**\n * This callback is triggered when the video will be shown.\n *\n * The host app can return a Product list to update the latest product information.\n */\n public onUpdateProductDetails?: UpdateProductDetailsCallback;\n\n /**\n * Defaults to true.\n * You can hide the cart icon by setting this property to false.\n */\n public get cartIconVisible(): boolean {\n return this._cartIconVisible;\n }\n public set cartIconVisible(value: boolean) {\n this._cartIconVisible = value;\n ShoppingModule.setCartIconVisible(value);\n }\n private _cartIconVisible: boolean = true;\n\n /**\n * The configuration of product info view.\n * Please refer to {@link ProductInfoViewConfiguration} for more details.\n */\n public get productInfoViewConfiguration():\n | ProductInfoViewConfiguration\n | undefined {\n return this._productInfoViewConfiguration;\n }\n\n public set productInfoViewConfiguration(\n value: ProductInfoViewConfiguration | undefined\n ) {\n this._productInfoViewConfiguration = value;\n ShoppingModule.setProductInfoViewConfiguration(value ?? {});\n }\n\n private _productInfoViewConfiguration?:\n | ProductInfoViewConfiguration\n | undefined;\n\n /**\n * This callback is triggered when the user clicks\n * the link button next to Add to cart button. Only supported on Android.\n *\n * The host app can customize the click event processing logic of\n * the link button by setting the callback.\n */\n public get onCustomClickLinkButton():\n | CustomClickLinkButtonCallback\n | undefined {\n return this._onCustomClickLinkButton;\n }\n public set onCustomClickLinkButton(\n value: CustomClickLinkButtonCallback | undefined\n ) {\n this._onCustomClickLinkButton = value;\n ShoppingModule.setCustomClickLinkButtonEnabled(!!value);\n }\n private _onCustomClickLinkButton?: CustomClickLinkButtonCallback | undefined;\n\n private get eventEmitter(): NativeEventEmitter {\n return ShoppingModuleEventEmitter;\n }\n\n public static getInstance() {\n FWLoggerUtil.log('VideoShopping constructor');\n if (!VideoShopping._instance) {\n VideoShopping._instance = new VideoShopping();\n }\n\n return VideoShopping._instance!;\n }\n\n private constructor() {\n this.eventEmitter.addListener(\n FWEventName.ShoppingCTAButtonClick,\n (event) => {\n FWLoggerUtil.log(\n `Receive ShoppingCTA event productId: ${event?.productId} unitId: ${event?.unitId} url: ${event?.url}`\n );\n this.handleShoppingCTAEvent(event);\n }\n );\n\n this.eventEmitter.addListener(FWEventName.ClickCartIcon, () => {\n FWLoggerUtil.log('Receive ClickCartIcon event');\n this.handleClickCartIconEvent();\n });\n\n this.eventEmitter.addListener(FWEventName.UpdateProductDetails, (event) => {\n FWLoggerUtil.log(\n `Receive UpdateProductDetails event productIds: ${event?.productIds}`\n );\n this.handleUpdateProductDetailsEvent(event);\n });\n\n this.eventEmitter.addListener(FWEventName.LogMessage, () => {});\n\n this.eventEmitter.addListener(\n FWEventName.CustomLinkButtonClick,\n (event) => {\n FWLoggerUtil.log(\n `Receive CustomLinkButtonClick event url: ${event?.url}`\n );\n this.handleCustomLinkButtonClickEvent(event);\n }\n );\n }\n\n /**\n *\n * @param {number} count The number of items in the host app cart.\n * The count should be greater than or equal to 0.\n * We just use count to show or hide red indicator on the cart icon.\n * If cound > 0, we will show the red indicator on the cart icon.\n * Otherwise, we will hide the red indicator on the cart icon.\n */\n public setCartItemCount(count: number) {\n ShoppingModule.setCartItemCount(count);\n }\n\n private async handleShoppingCTAEvent(event: any) {\n const callbackId = event.callbackId;\n delete event.callbackId;\n\n if (this.onShoppingCTA) {\n const result = await this.onShoppingCTA(event as ShoppingCTAEvent);\n if (callbackId) {\n ShoppingModule.updateShoppingCTAResult(result, callbackId);\n }\n } else {\n if (callbackId) {\n if (Platform.OS === 'ios') {\n ShoppingModule.clearCallbackId(\n callbackId,\n FWEventName.ShoppingCTAButtonClick\n );\n }\n }\n }\n }\n\n private async handleClickCartIconEvent() {\n if (this.onCustomClickCartIcon) {\n this.onCustomClickCartIcon();\n }\n }\n\n private async handleUpdateProductDetailsEvent(event: any) {\n const callbackId = event.callbackId;\n delete event.callbackId;\n if (this.onUpdateProductDetails) {\n FWLoggerUtil.log(\n `Call onUpdateProductDetails callback productIds: ${event.productIds} callbackId: ${callbackId}`\n );\n const productList = await this.onUpdateProductDetails(\n event as UpdateProductDetailsEvent\n );\n\n const productIds = (productList || []).map(\n (product) => product.productId ?? ''\n );\n\n FWLoggerUtil.log(\n `Get result from onUpdateProductDetails callback productIds: ${productIds} productListLength: ${\n (productList || []).length\n }`\n );\n\n if (productList) {\n if (callbackId) {\n ShoppingModule.updateVideoProducts(productList, callbackId);\n }\n } else {\n if (callbackId) {\n if (Platform.OS === 'ios') {\n ShoppingModule.clearCallbackId(\n callbackId,\n FWEventName.UpdateProductDetails\n );\n }\n }\n }\n } else {\n FWLoggerUtil.log('onUpdateProductDetails callback is not set.');\n if (callbackId) {\n if (Platform.OS === 'ios') {\n ShoppingModule.clearCallbackId(\n callbackId,\n FWEventName.UpdateProductDetails\n );\n }\n }\n }\n }\n\n private async handleCustomLinkButtonClickEvent(\n event: CustomClickLinkButtonEvent\n ) {\n if (this.onCustomClickLinkButton) {\n this.onCustomClickLinkButton(event);\n }\n }\n}\n\nexport default VideoShopping;\n"]}
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
- var _react = _interopRequireDefault(require("react"));
8
+ var _react = _interopRequireWildcard(require("react"));
9
9
 
10
10
  var _reactNative = require("react-native");
11
11
 
@@ -21,174 +21,251 @@ var _FWStoryBlock = _interopRequireDefault(require("./FWStoryBlock"));
21
21
 
22
22
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
23
 
24
- function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
24
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
25
+
26
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
25
27
 
26
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
28
+ function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
27
29
 
28
30
  const NativeComponentName = 'FWStoryBlock';
29
31
 
30
- const createFragment = viewId => {
31
- if (_reactNative.Platform.OS === 'android') {
32
- _reactNative.UIManager.dispatchViewManagerCommand(viewId, _reactNative.UIManager.getViewManagerConfig(NativeComponentName).Commands.create.toString(), [viewId]);
33
- }
34
- };
35
- /**
36
- * The props type of StoryBlock component.
37
- */
38
-
39
-
40
- /**
41
- * StoryBlock component. Only supported on iOS.
42
- */
43
- class StoryBlock extends _react.default.Component {
44
- constructor() {
45
- super(...arguments);
46
-
47
- _defineProperty(this, "nativeComponentRef", /*#__PURE__*/_react.default.createRef());
48
-
49
- _defineProperty(this, "subscriptions", []);
50
-
51
- _defineProperty(this, "_onStoryBlockLoadFinished", event => {
52
- _FWLoggerUtil.default.log(`StoryBlock _onStoryBlockLoadFinished ${event.nativeEvent.name}`);
53
-
54
- const {
55
- onStoryBlockLoadFinished
56
- } = this.props;
57
- const {
58
- name,
59
- reason
60
- } = event.nativeEvent;
61
-
62
- if (onStoryBlockLoadFinished) {
63
- if (name) {
64
- if (reason) {
65
- onStoryBlockLoadFinished({
66
- name,
67
- reason
68
- });
69
- } else {
70
- onStoryBlockLoadFinished({
71
- name
72
- });
73
- }
74
- } else {
75
- onStoryBlockLoadFinished();
76
- }
32
+ const StoryBlock = (props, forwardedRef) => {
33
+ const nativeComponentRef = (0, _react.useRef)(null);
34
+ const [isFullscreenState, setIsFullscreenState] = (0, _react.useState)(false);
35
+ const [, forceUpdate] = (0, _react.useReducer)(x => x + 1, 0);
36
+ (0, _react.useImperativeHandle)(forwardedRef, () => {
37
+ const sendCommand = command => {
38
+ const nativeNodeHandle = (0, _reactNative.findNodeHandle)(nativeComponentRef.current);
39
+
40
+ let commandId = _reactNative.UIManager.getViewManagerConfig(NativeComponentName).Commands[command];
41
+
42
+ if (_reactNative.Platform.OS === 'android') {
43
+ commandId = commandId.toString();
77
44
  }
78
- });
79
- }
80
45
 
81
- componentDidMount() {
46
+ _reactNative.UIManager.dispatchViewManagerCommand((0, _reactNative.findNodeHandle)(nativeNodeHandle), commandId, []);
47
+ };
48
+
49
+ return {
50
+ play: () => {
51
+ sendCommand('play');
52
+ },
53
+ pause: () => {
54
+ sendCommand('pause');
55
+ }
56
+ };
57
+ }, []);
58
+ (0, _react.useEffect)(() => {
82
59
  const subscriptionOfShareBaseURLUpdated = _FireworkSDKModule.FireworkSDKModuleEventEmitter.addListener(_FWEventName.FWEventName.ShareBaseURLUpdated, () => {
83
- this.setState({});
84
- });
60
+ _FWLoggerUtil.default.log('Receive FWEventName.ShareBaseURLUpdated');
85
61
 
86
- this.subscriptions.push(subscriptionOfShareBaseURLUpdated);
62
+ forceUpdate();
63
+ });
87
64
 
88
65
  const subscriptionOfAdBadgeConfigurationUpdated = _FireworkSDKModule.FireworkSDKModuleEventEmitter.addListener(_FWEventName.FWEventName.AdBadgeConfigurationUpdated, () => {
89
- this.setState({});
90
- });
66
+ _FWLoggerUtil.default.log('Receive FWEventName.AdBadgeConfigurationUpdated');
91
67
 
92
- this.subscriptions.push(subscriptionOfAdBadgeConfigurationUpdated);
68
+ forceUpdate();
69
+ });
93
70
 
94
71
  const subscriptionOfVideoLaunchBehaviorUpdated = _FireworkSDKModule.FireworkSDKModuleEventEmitter.addListener(_FWEventName.FWEventName.VideoLaunchBehaviorUpdated, () => {
95
72
  _FWLoggerUtil.default.log('Receive FWEventName.VideoLaunchBehaviorUpdated');
96
73
 
97
- this.setState({});
74
+ forceUpdate();
98
75
  });
99
76
 
100
- this.subscriptions.push(subscriptionOfVideoLaunchBehaviorUpdated);
77
+ const subscriptionOfAppLanguageUpdated = _FireworkSDKModule.FireworkSDKModuleEventEmitter.addListener(_FWEventName.FWEventName.AppLanguageUpdated, () => {
78
+ _FWLoggerUtil.default.log('Receive FWEventName.AppLanguageUpdated');
79
+
80
+ forceUpdate();
81
+ });
101
82
 
102
83
  if (_reactNative.Platform.OS === 'android') {
103
- const viewId = (0, _reactNative.findNodeHandle)(this.nativeComponentRef.current);
84
+ setTimeout(() => {
85
+ const viewId = (0, _reactNative.findNodeHandle)(nativeComponentRef.current);
104
86
 
105
- _FWLoggerUtil.default.log(`StoryBlock componentDidMount createFragment viewId: ${viewId}`);
87
+ _FWLoggerUtil.default.log(`StoryBlock createFragment viewId: ${viewId}`);
106
88
 
107
- createFragment(viewId);
89
+ _reactNative.UIManager.dispatchViewManagerCommand(viewId, _reactNative.UIManager.getViewManagerConfig(NativeComponentName).Commands.create.toString(), [viewId]);
90
+ }, 500);
108
91
  }
109
- }
110
92
 
111
- componentWillUnmount() {
112
- this.subscriptions.forEach(value => {
113
- value.remove();
114
- });
115
- this.subscriptions = [];
116
- }
93
+ return () => {
94
+ subscriptionOfShareBaseURLUpdated.remove();
95
+ subscriptionOfAdBadgeConfigurationUpdated.remove();
96
+ subscriptionOfVideoLaunchBehaviorUpdated.remove();
97
+ subscriptionOfAppLanguageUpdated.remove();
98
+ };
99
+ }, []);
117
100
 
118
- render() {
101
+ const handleStoryBlockLoadFinished = event => {
102
+ _FWLoggerUtil.default.log(`StoryBlock handleStoryBlockLoadFinished ${event.nativeEvent.name}`);
103
+
104
+ const {
105
+ onStoryBlockLoadFinished
106
+ } = props;
119
107
  const {
120
- style
121
- } = this.props;
122
- return /*#__PURE__*/_react.default.createElement(_FWStoryBlock.default, _extends({
123
- ref: this.nativeComponentRef,
124
- key: this._generateKey()
125
- }, this.props, {
126
- onStoryBlockLoadFinished: this._onStoryBlockLoadFinished,
127
- style: Object.assign({}, style, {
128
- zIndex: -1
129
- })
130
- }));
131
- }
132
-
133
- _generateKey() {
134
- var _FireworkSDK$getInsta, _FireworkSDK$getInsta2, _adBadgeConfiguration, _adBadgeConfiguration2, _adBadgeConfiguration3, _FireworkSDK$getInsta3;
108
+ name,
109
+ reason
110
+ } = event.nativeEvent;
111
+
112
+ if (onStoryBlockLoadFinished) {
113
+ if (name) {
114
+ if (reason) {
115
+ onStoryBlockLoadFinished({
116
+ name,
117
+ reason
118
+ });
119
+ } else {
120
+ onStoryBlockLoadFinished({
121
+ name
122
+ });
123
+ }
124
+ } else {
125
+ onStoryBlockLoadFinished();
126
+ }
127
+ }
128
+ };
129
+
130
+ const handleStoryBlockFullscreenStateChanged = event => {
131
+ _FWLoggerUtil.default.log(`StoryBlock handleStoryBlockFullscreenStateChanged ${event.nativeEvent.isFullScreen}`);
132
+
133
+ const {
134
+ isFullScreen
135
+ } = event.nativeEvent;
136
+ setIsFullscreenState(isFullScreen);
137
+ };
138
+
139
+ const generateDynamicContentParametersString = () => {
140
+ const {
141
+ dynamicContentParameters
142
+ } = props;
143
+
144
+ if (!dynamicContentParameters) {
145
+ return '';
146
+ }
147
+
148
+ let resultString = '';
149
+ const sortedKeyList = Object.keys(dynamicContentParameters).sort();
150
+
151
+ for (const key of sortedKeyList) {
152
+ const value = dynamicContentParameters[key];
153
+ const valueString = value.join(',');
154
+
155
+ if (resultString.length > 0) {
156
+ resultString += '_';
157
+ }
158
+
159
+ resultString += `${key}:${valueString}`;
160
+ }
161
+
162
+ return resultString;
163
+ };
164
+
165
+ const generateVastAttributesString = () => {
166
+ var _adConfiguration$vast;
167
+
168
+ const {
169
+ adConfiguration
170
+ } = props;
171
+ const vastAttributes = (_adConfiguration$vast = adConfiguration === null || adConfiguration === void 0 ? void 0 : adConfiguration.vastAttributes) !== null && _adConfiguration$vast !== void 0 ? _adConfiguration$vast : '';
172
+
173
+ if (!vastAttributes) {
174
+ return '';
175
+ }
176
+
177
+ let resultString = '';
178
+
179
+ for (const attribute of vastAttributes) {
180
+ var _attribute$name;
181
+
182
+ if (resultString.length > 0) {
183
+ resultString += '_';
184
+ }
185
+
186
+ resultString += `${(_attribute$name = attribute.name) !== null && _attribute$name !== void 0 ? _attribute$name : ''}:${attribute.value}`;
187
+ }
188
+
189
+ return resultString;
190
+ };
191
+
192
+ const generateKey = () => {
193
+ var _FireworkSDK$getInsta, _FireworkSDK$getInsta2, _adBadgeConfiguration, _adBadgeConfiguration2, _adBadgeConfiguration3, _FireworkSDK$getInsta3, _adConfiguration$requ, _adConfiguration$adsF;
135
194
 
136
195
  const {
137
196
  source,
138
197
  channel = '',
139
198
  playlist = '',
140
- enablePictureInPicture = false
141
- } = this.props;
199
+ enablePictureInPicture = false,
200
+ adConfiguration
201
+ } = props;
142
202
  const shareBaseURL = (_FireworkSDK$getInsta = _FireworkSDK.default.getInstance().getShareBaseURL()) !== null && _FireworkSDK$getInsta !== void 0 ? _FireworkSDK$getInsta : '';
203
+
204
+ const videoLaunchBehavior = _FireworkSDK.default.getInstance().getVideoLaunchBehavior();
205
+
143
206
  const adBadgeConfiguration = (_FireworkSDK$getInsta2 = _FireworkSDK.default.getInstance().getAdBadgeConfiguration()) !== null && _FireworkSDK$getInsta2 !== void 0 ? _FireworkSDK$getInsta2 : {};
144
207
  const adBadgeTextType = (_adBadgeConfiguration = adBadgeConfiguration.badgeTextType) !== null && _adBadgeConfiguration !== void 0 ? _adBadgeConfiguration : '';
145
208
  const backgroundColorOfAdBadge = (_adBadgeConfiguration2 = adBadgeConfiguration.backgroundColor) !== null && _adBadgeConfiguration2 !== void 0 ? _adBadgeConfiguration2 : '';
146
209
  const textColorOfAdBadge = (_adBadgeConfiguration3 = adBadgeConfiguration.textColor) !== null && _adBadgeConfiguration3 !== void 0 ? _adBadgeConfiguration3 : '';
147
-
148
- const dynamicContentParametersString = this._generateDynamicContentParametersString();
149
-
150
- const videoLaunchBehavior = (_FireworkSDK$getInsta3 = _FireworkSDK.default.getInstance().getVideoLaunchBehavior()) !== null && _FireworkSDK$getInsta3 !== void 0 ? _FireworkSDK$getInsta3 : 'default';
210
+ const dynamicContentParametersString = generateDynamicContentParametersString();
211
+ const appLanguage = (_FireworkSDK$getInsta3 = _FireworkSDK.default.getInstance().appLanguage) !== null && _FireworkSDK$getInsta3 !== void 0 ? _FireworkSDK$getInsta3 : '';
212
+ const requiresAds = (_adConfiguration$requ = adConfiguration === null || adConfiguration === void 0 ? void 0 : adConfiguration.requiresAds) !== null && _adConfiguration$requ !== void 0 ? _adConfiguration$requ : false;
213
+ const adsFetchTimeout = (_adConfiguration$adsF = adConfiguration === null || adConfiguration === void 0 ? void 0 : adConfiguration.adsFetchTimeout) !== null && _adConfiguration$adsF !== void 0 ? _adConfiguration$adsF : 10;
214
+ const vastAttributesString = generateVastAttributesString();
151
215
  let key = `source:${source}`;
152
216
  key += `_channel:${channel}`;
153
217
  key += `_playlist:${playlist}`;
154
218
  key += `_shareBaseURL:${shareBaseURL}`;
219
+ key += `_videoLaunchBehavior:${videoLaunchBehavior}`;
155
220
  key += `_adBadgeTextType:${adBadgeTextType}`;
156
221
  key += `_backgroundColorOfAdBadge:${backgroundColorOfAdBadge}`;
157
222
  key += `_textColorOfAdBadge:${textColorOfAdBadge}`;
158
223
  key += `_dynamicContentParameters:${dynamicContentParametersString}`;
159
224
  key += `_enablePictureInPicture:${enablePictureInPicture}`;
160
- key += `_videoLaunchBehavior:${videoLaunchBehavior}`;
225
+ key += `_appLanguage:${appLanguage}`;
226
+ key += `_requiresAds:${requiresAds}`;
227
+ key += `_adsFetchTimeout:${adsFetchTimeout}`;
228
+ key += `_vastAttributes:${vastAttributesString}`;
161
229
  return key;
162
- }
163
-
164
- _generateDynamicContentParametersString() {
165
- const {
166
- dynamicContentParameters
167
- } = this.props;
230
+ };
168
231
 
169
- if (!dynamicContentParameters) {
170
- return '';
171
- }
232
+ (0, _react.useEffect)(() => {
233
+ if (_reactNative.Platform.OS === 'android') {
234
+ const onBackPress = () => {
235
+ if (isFullscreenState) {
236
+ _FireworkSDK.default.getInstance().navigator.popNativeContainer();
172
237
 
173
- let resultString = '';
174
- const sortedKeyList = Object.keys(dynamicContentParameters).sort();
238
+ return true;
239
+ }
175
240
 
176
- for (const key of sortedKeyList) {
177
- const value = dynamicContentParameters[key];
178
- const valueString = value.join(',');
241
+ return false;
242
+ };
179
243
 
180
- if (resultString.length > 0) {
181
- resultString += '_';
182
- }
244
+ const subscription = _reactNative.BackHandler.addEventListener('hardwareBackPress', onBackPress);
183
245
 
184
- resultString += `${key}:${valueString}`;
246
+ return () => {
247
+ subscription.remove();
248
+ };
185
249
  }
186
250
 
187
- return resultString;
188
- }
251
+ return;
252
+ }, [isFullscreenState]);
253
+ const {
254
+ style
255
+ } = props;
256
+ return /*#__PURE__*/_react.default.createElement(_FWStoryBlock.default, _extends({
257
+ ref: nativeComponentRef,
258
+ key: generateKey()
259
+ }, props, {
260
+ onStoryBlockLoadFinished: handleStoryBlockLoadFinished,
261
+ onStoryBlockFullScreenStateChanged: handleStoryBlockFullscreenStateChanged,
262
+ style: Object.assign({}, style, {
263
+ zIndex: -1
264
+ })
265
+ }));
266
+ };
189
267
 
190
- }
268
+ var _default = /*#__PURE__*/(0, _react.forwardRef)(StoryBlock);
191
269
 
192
- var _default = StoryBlock;
193
270
  exports.default = _default;
194
271
  //# sourceMappingURL=StoryBlock.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["StoryBlock.tsx"],"names":["NativeComponentName","createFragment","viewId","Platform","OS","UIManager","dispatchViewManagerCommand","getViewManagerConfig","Commands","create","toString","StoryBlock","React","Component","createRef","event","FWLoggerUtil","log","nativeEvent","name","onStoryBlockLoadFinished","props","reason","componentDidMount","subscriptionOfShareBaseURLUpdated","FireworkSDKModuleEventEmitter","addListener","FWEventName","ShareBaseURLUpdated","setState","subscriptions","push","subscriptionOfAdBadgeConfigurationUpdated","AdBadgeConfigurationUpdated","subscriptionOfVideoLaunchBehaviorUpdated","VideoLaunchBehaviorUpdated","nativeComponentRef","current","componentWillUnmount","forEach","value","remove","render","style","_generateKey","_onStoryBlockLoadFinished","Object","assign","zIndex","source","channel","playlist","enablePictureInPicture","shareBaseURL","FireworkSDK","getInstance","getShareBaseURL","adBadgeConfiguration","getAdBadgeConfiguration","adBadgeTextType","badgeTextType","backgroundColorOfAdBadge","backgroundColor","textColorOfAdBadge","textColor","dynamicContentParametersString","_generateDynamicContentParametersString","videoLaunchBehavior","getVideoLaunchBehavior","key","dynamicContentParameters","resultString","sortedKeyList","keys","sort","valueString","join","length"],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport type {\n EmitterSubscription,\n NativeSyntheticEvent,\n StyleProp,\n ViewStyle,\n} from 'react-native';\nimport { findNodeHandle, Platform, UIManager } from 'react-native';\n\nimport FireworkSDK from '../FireworkSDK';\nimport type FWError from '../models/FWError';\nimport { FWEventName } from '../models/FWEventName';\nimport type { StoryBlockSource } from '../models/StoryBlockSource';\nimport { FireworkSDKModuleEventEmitter } from '../modules/FireworkSDKModule';\nimport FWLoggerUtil from '../utils/FWLoggerUtil';\nimport FWStoryBlock from './FWStoryBlock';\n\nconst NativeComponentName = 'FWStoryBlock';\n\nconst createFragment = (viewId: any) => {\n if (Platform.OS === 'android') {\n UIManager.dispatchViewManagerCommand(\n viewId,\n UIManager.getViewManagerConfig(\n NativeComponentName\n ).Commands.create.toString(),\n [viewId]\n );\n }\n};\n\n/**\n * The props type of StoryBlock component.\n */\nexport interface IStoryBlockProps {\n /**\n * Standard React Native View Style.\n */\n style?: StyleProp<ViewStyle>;\n /**\n * One of four available story block sources.\n */\n source: StoryBlockSource;\n /**\n * Channel id of the story block. Required when the source is set as channel or playlist or dynamicContent.\n */\n channel?: string;\n /**\n * Playlist id of the story block. Please note channel id is necessary. Required when the source is set as playlist.\n */\n playlist?: string;\n /**\n * The dynamic content parameters of the story block. Required when the source is set as dynamicContent.\n */\n dynamicContentParameters?: { [key: string]: string[] };\n /**\n * Specifies if Picture in Picture is enabled.\n */\n enablePictureInPicture?: boolean;\n /**\n * The feed loading result callback. It means loading successfully when error equals to undefined.\n */\n onStoryBlockLoadFinished?: (error?: FWError) => void;\n}\n\n/**\n * StoryBlock component. Only supported on iOS.\n */\nclass StoryBlock extends React.Component<IStoryBlockProps> {\n nativeComponentRef = React.createRef<any>();\n\n subscriptions: EmitterSubscription[] = [];\n componentDidMount() {\n const subscriptionOfShareBaseURLUpdated =\n FireworkSDKModuleEventEmitter.addListener(\n FWEventName.ShareBaseURLUpdated,\n () => {\n this.setState({});\n }\n );\n this.subscriptions.push(subscriptionOfShareBaseURLUpdated);\n\n const subscriptionOfAdBadgeConfigurationUpdated =\n FireworkSDKModuleEventEmitter.addListener(\n FWEventName.AdBadgeConfigurationUpdated,\n () => {\n this.setState({});\n }\n );\n this.subscriptions.push(subscriptionOfAdBadgeConfigurationUpdated);\n\n const subscriptionOfVideoLaunchBehaviorUpdated =\n FireworkSDKModuleEventEmitter.addListener(\n FWEventName.VideoLaunchBehaviorUpdated,\n () => {\n FWLoggerUtil.log('Receive FWEventName.VideoLaunchBehaviorUpdated');\n this.setState({});\n }\n );\n this.subscriptions.push(subscriptionOfVideoLaunchBehaviorUpdated);\n\n if (Platform.OS === 'android') {\n const viewId = findNodeHandle(this.nativeComponentRef.current);\n FWLoggerUtil.log(\n `StoryBlock componentDidMount createFragment viewId: ${viewId}`\n );\n createFragment(viewId);\n }\n }\n\n componentWillUnmount() {\n this.subscriptions.forEach((value) => {\n value.remove();\n });\n\n this.subscriptions = [];\n }\n\n render() {\n const { style } = this.props;\n\n return (\n <FWStoryBlock\n ref={this.nativeComponentRef}\n key={this._generateKey()}\n {...this.props}\n onStoryBlockLoadFinished={this._onStoryBlockLoadFinished}\n style={Object.assign({}, style, { zIndex: -1 })}\n />\n );\n }\n\n private _onStoryBlockLoadFinished = (event: NativeSyntheticEvent<any>) => {\n FWLoggerUtil.log(\n `StoryBlock _onStoryBlockLoadFinished ${event.nativeEvent.name}`\n );\n\n const { onStoryBlockLoadFinished } = this.props;\n const { name, reason } = event.nativeEvent;\n\n if (onStoryBlockLoadFinished) {\n if (name) {\n if (reason) {\n onStoryBlockLoadFinished({ name, reason });\n } else {\n onStoryBlockLoadFinished({ name });\n }\n } else {\n onStoryBlockLoadFinished();\n }\n }\n };\n\n private _generateKey(): string {\n const {\n source,\n channel = '',\n playlist = '',\n enablePictureInPicture = false,\n } = this.props;\n\n const shareBaseURL = FireworkSDK.getInstance().getShareBaseURL() ?? '';\n const adBadgeConfiguration =\n FireworkSDK.getInstance().getAdBadgeConfiguration() ?? {};\n const adBadgeTextType = adBadgeConfiguration.badgeTextType ?? '';\n const backgroundColorOfAdBadge = adBadgeConfiguration.backgroundColor ?? '';\n const textColorOfAdBadge = adBadgeConfiguration.textColor ?? '';\n const dynamicContentParametersString =\n this._generateDynamicContentParametersString();\n const videoLaunchBehavior =\n FireworkSDK.getInstance().getVideoLaunchBehavior() ?? 'default';\n\n let key = `source:${source}`;\n key += `_channel:${channel}`;\n key += `_playlist:${playlist}`;\n key += `_shareBaseURL:${shareBaseURL}`;\n key += `_adBadgeTextType:${adBadgeTextType}`;\n key += `_backgroundColorOfAdBadge:${backgroundColorOfAdBadge}`;\n key += `_textColorOfAdBadge:${textColorOfAdBadge}`;\n key += `_dynamicContentParameters:${dynamicContentParametersString}`;\n key += `_enablePictureInPicture:${enablePictureInPicture}`;\n key += `_videoLaunchBehavior:${videoLaunchBehavior}`;\n\n return key;\n }\n\n private _generateDynamicContentParametersString(): string {\n const { dynamicContentParameters } = this.props;\n\n if (!dynamicContentParameters) {\n return '';\n }\n\n let resultString = '';\n const sortedKeyList = Object.keys(dynamicContentParameters).sort();\n for (const key of sortedKeyList) {\n const value = dynamicContentParameters[key];\n const valueString = value.join(',');\n if (resultString.length > 0) {\n resultString += '_';\n }\n\n resultString += `${key}:${valueString}`;\n }\n\n return resultString;\n }\n}\n\nexport default StoryBlock;\n"]}
1
+ {"version":3,"sources":["StoryBlock.tsx"],"names":["NativeComponentName","StoryBlock","props","forwardedRef","nativeComponentRef","isFullscreenState","setIsFullscreenState","forceUpdate","x","sendCommand","command","nativeNodeHandle","current","commandId","UIManager","getViewManagerConfig","Commands","Platform","OS","toString","dispatchViewManagerCommand","play","pause","subscriptionOfShareBaseURLUpdated","FireworkSDKModuleEventEmitter","addListener","FWEventName","ShareBaseURLUpdated","FWLoggerUtil","log","subscriptionOfAdBadgeConfigurationUpdated","AdBadgeConfigurationUpdated","subscriptionOfVideoLaunchBehaviorUpdated","VideoLaunchBehaviorUpdated","subscriptionOfAppLanguageUpdated","AppLanguageUpdated","setTimeout","viewId","create","remove","handleStoryBlockLoadFinished","event","nativeEvent","name","onStoryBlockLoadFinished","reason","handleStoryBlockFullscreenStateChanged","isFullScreen","generateDynamicContentParametersString","dynamicContentParameters","resultString","sortedKeyList","Object","keys","sort","key","value","valueString","join","length","generateVastAttributesString","adConfiguration","vastAttributes","attribute","generateKey","source","channel","playlist","enablePictureInPicture","shareBaseURL","FireworkSDK","getInstance","getShareBaseURL","videoLaunchBehavior","getVideoLaunchBehavior","adBadgeConfiguration","getAdBadgeConfiguration","adBadgeTextType","badgeTextType","backgroundColorOfAdBadge","backgroundColor","textColorOfAdBadge","textColor","dynamicContentParametersString","appLanguage","requiresAds","adsFetchTimeout","vastAttributesString","onBackPress","navigator","popNativeContainer","subscription","BackHandler","addEventListener","style","assign","zIndex"],"mappings":"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","sourcesContent":["import type { ForwardRefRenderFunction } from 'react';\nimport React, {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useReducer,\n useRef,\n useState,\n} from 'react';\n\nimport {\n BackHandler,\n findNodeHandle,\n NativeSyntheticEvent,\n Platform,\n StyleProp,\n UIManager,\n ViewStyle,\n} from 'react-native';\n\nimport FireworkSDK from '../FireworkSDK';\nimport type AdConfiguration from '../models/AdConfiguration';\nimport type FWError from '../models/FWError';\nimport { FWEventName } from '../models/FWEventName';\nimport type { StoryBlockSource } from '../models/StoryBlockSource';\nimport { FireworkSDKModuleEventEmitter } from '../modules/FireworkSDKModule';\nimport FWLoggerUtil from '../utils/FWLoggerUtil';\nimport FWStoryBlock from './FWStoryBlock';\n\nconst NativeComponentName = 'FWStoryBlock';\n\nexport interface IStoryBlockMethods {\n /**\n * Play the story block.\n */\n play: () => void;\n /**\n * Pause the story block.\n */\n pause: () => void;\n}\n\n/**\n * The props type of StoryBlock component.\n */\nexport interface IStoryBlockProps {\n /**\n * Standard React Native View Style.\n */\n style?: StyleProp<ViewStyle>;\n /**\n * One of four available story block sources.\n */\n source: StoryBlockSource;\n /**\n * Channel id of the story block. Required when the source is set as channel or playlist or dynamicContent.\n */\n channel?: string;\n /**\n * Playlist id of the story block. Please note channel id is necessary. Required when the source is set as playlist.\n */\n playlist?: string;\n /**\n * The dynamic content parameters of the story block. Required when the source is set as dynamicContent.\n */\n dynamicContentParameters?: { [key: string]: string[] };\n /**\n * Specifies if Picture in Picture is enabled. Only supported on iOS.\n */\n enablePictureInPicture?: boolean;\n /**\n * Ad configuration of the feed. Only supported on iOS.\n */\n adConfiguration?: AdConfiguration;\n /**\n * The feed loading result callback. It means loading successfully when error equals to undefined.\n */\n onStoryBlockLoadFinished?: (error?: FWError) => void;\n}\n\nconst StoryBlock: ForwardRefRenderFunction<\n IStoryBlockMethods,\n IStoryBlockProps\n> = (props: IStoryBlockProps, forwardedRef) => {\n const nativeComponentRef = useRef(null);\n const [isFullscreenState, setIsFullscreenState] = useState<boolean>(false);\n const [, forceUpdate] = useReducer((x) => x + 1, 0);\n useImperativeHandle(\n forwardedRef,\n () => {\n const sendCommand = (command: string) => {\n const nativeNodeHandle = findNodeHandle(nativeComponentRef.current);\n\n let commandId: string | number =\n UIManager.getViewManagerConfig(NativeComponentName).Commands[command];\n if (Platform.OS === 'android') {\n commandId = commandId.toString();\n }\n\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(nativeNodeHandle),\n commandId,\n []\n );\n };\n return {\n play: () => {\n sendCommand('play');\n },\n pause: () => {\n sendCommand('pause');\n },\n };\n },\n []\n );\n useEffect(() => {\n const subscriptionOfShareBaseURLUpdated =\n FireworkSDKModuleEventEmitter.addListener(\n FWEventName.ShareBaseURLUpdated,\n () => {\n FWLoggerUtil.log('Receive FWEventName.ShareBaseURLUpdated');\n forceUpdate();\n }\n );\n const subscriptionOfAdBadgeConfigurationUpdated =\n FireworkSDKModuleEventEmitter.addListener(\n FWEventName.AdBadgeConfigurationUpdated,\n () => {\n FWLoggerUtil.log('Receive FWEventName.AdBadgeConfigurationUpdated');\n forceUpdate();\n }\n );\n\n const subscriptionOfVideoLaunchBehaviorUpdated =\n FireworkSDKModuleEventEmitter.addListener(\n FWEventName.VideoLaunchBehaviorUpdated,\n () => {\n FWLoggerUtil.log('Receive FWEventName.VideoLaunchBehaviorUpdated');\n forceUpdate();\n }\n );\n\n const subscriptionOfAppLanguageUpdated =\n FireworkSDKModuleEventEmitter.addListener(\n FWEventName.AppLanguageUpdated,\n () => {\n FWLoggerUtil.log('Receive FWEventName.AppLanguageUpdated');\n forceUpdate();\n }\n );\n\n if (Platform.OS === 'android') {\n setTimeout(() => {\n const viewId = findNodeHandle(nativeComponentRef.current);\n FWLoggerUtil.log(`StoryBlock createFragment viewId: ${viewId}`);\n UIManager.dispatchViewManagerCommand(\n viewId,\n UIManager.getViewManagerConfig(\n NativeComponentName\n ).Commands.create.toString(),\n [viewId]\n );\n }, 500);\n }\n\n return () => {\n subscriptionOfShareBaseURLUpdated.remove();\n subscriptionOfAdBadgeConfigurationUpdated.remove();\n subscriptionOfVideoLaunchBehaviorUpdated.remove();\n subscriptionOfAppLanguageUpdated.remove();\n };\n }, []);\n\n const handleStoryBlockLoadFinished = (event: NativeSyntheticEvent<any>) => {\n FWLoggerUtil.log(\n `StoryBlock handleStoryBlockLoadFinished ${event.nativeEvent.name}`\n );\n\n const { onStoryBlockLoadFinished } = props;\n const { name, reason } = event.nativeEvent;\n\n if (onStoryBlockLoadFinished) {\n if (name) {\n if (reason) {\n onStoryBlockLoadFinished({ name, reason });\n } else {\n onStoryBlockLoadFinished({ name });\n }\n } else {\n onStoryBlockLoadFinished();\n }\n }\n };\n\n const handleStoryBlockFullscreenStateChanged = (\n event: NativeSyntheticEvent<any>\n ) => {\n FWLoggerUtil.log(\n `StoryBlock handleStoryBlockFullscreenStateChanged ${event.nativeEvent.isFullScreen}`\n );\n const { isFullScreen } = event.nativeEvent;\n setIsFullscreenState(isFullScreen);\n };\n\n const generateDynamicContentParametersString = (): string => {\n const { dynamicContentParameters } = props;\n\n if (!dynamicContentParameters) {\n return '';\n }\n\n let resultString = '';\n const sortedKeyList = Object.keys(dynamicContentParameters).sort();\n for (const key of sortedKeyList) {\n const value = dynamicContentParameters[key];\n const valueString = value.join(',');\n if (resultString.length > 0) {\n resultString += '_';\n }\n\n resultString += `${key}:${valueString}`;\n }\n\n return resultString;\n };\n\n const generateVastAttributesString = () => {\n const { adConfiguration } = props;\n const vastAttributes = adConfiguration?.vastAttributes ?? '';\n if (!vastAttributes) {\n return '';\n }\n\n let resultString = '';\n for (const attribute of vastAttributes) {\n if (resultString.length > 0) {\n resultString += '_';\n }\n resultString += `${attribute.name ?? ''}:${attribute.value}`;\n }\n\n return resultString;\n };\n\n const generateKey = (): string => {\n const {\n source,\n channel = '',\n playlist = '',\n enablePictureInPicture = false,\n adConfiguration,\n } = props;\n\n const shareBaseURL = FireworkSDK.getInstance().getShareBaseURL() ?? '';\n const videoLaunchBehavior =\n FireworkSDK.getInstance().getVideoLaunchBehavior();\n const adBadgeConfiguration =\n FireworkSDK.getInstance().getAdBadgeConfiguration() ?? {};\n const adBadgeTextType = adBadgeConfiguration.badgeTextType ?? '';\n const backgroundColorOfAdBadge = adBadgeConfiguration.backgroundColor ?? '';\n const textColorOfAdBadge = adBadgeConfiguration.textColor ?? '';\n const dynamicContentParametersString =\n generateDynamicContentParametersString();\n const appLanguage = FireworkSDK.getInstance().appLanguage ?? '';\n const requiresAds = adConfiguration?.requiresAds ?? false;\n const adsFetchTimeout = adConfiguration?.adsFetchTimeout ?? 10;\n const vastAttributesString = generateVastAttributesString();\n\n let key = `source:${source}`;\n key += `_channel:${channel}`;\n key += `_playlist:${playlist}`;\n key += `_shareBaseURL:${shareBaseURL}`;\n key += `_videoLaunchBehavior:${videoLaunchBehavior}`;\n key += `_adBadgeTextType:${adBadgeTextType}`;\n key += `_backgroundColorOfAdBadge:${backgroundColorOfAdBadge}`;\n key += `_textColorOfAdBadge:${textColorOfAdBadge}`;\n key += `_dynamicContentParameters:${dynamicContentParametersString}`;\n key += `_enablePictureInPicture:${enablePictureInPicture}`;\n key += `_appLanguage:${appLanguage}`;\n key += `_requiresAds:${requiresAds}`;\n key += `_adsFetchTimeout:${adsFetchTimeout}`;\n key += `_vastAttributes:${vastAttributesString}`;\n\n return key;\n };\n\n useEffect(() => {\n if (Platform.OS === 'android') {\n const onBackPress = () => {\n if (isFullscreenState) {\n FireworkSDK.getInstance().navigator.popNativeContainer();\n return true;\n }\n return false;\n };\n const subscription = BackHandler.addEventListener(\n 'hardwareBackPress',\n onBackPress\n );\n return () => {\n subscription.remove();\n };\n }\n\n return;\n }, [isFullscreenState]);\n\n const { style } = props;\n return (\n <FWStoryBlock\n ref={nativeComponentRef}\n key={generateKey()}\n {...props}\n onStoryBlockLoadFinished={handleStoryBlockLoadFinished}\n onStoryBlockFullScreenStateChanged={\n handleStoryBlockFullscreenStateChanged\n }\n style={Object.assign({}, style, { zIndex: -1 })}\n />\n );\n};\n\nexport default forwardRef(StoryBlock);\n"]}