@capillarytech/creatives-library 7.18.0-beta.0 → 8.0.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 (334) hide show
  1. package/app.js +27 -54
  2. package/assets/Line_Preview_English.svg +24 -0
  3. package/assets/Line_Preview_Japanese.svg +24 -0
  4. package/components/CapTagList/index.js +2 -2
  5. package/components/CapTagList/messages.js +8 -0
  6. package/components/Ckeditor/index.js +4 -2
  7. package/components/Ckeditor/style.scss +3 -0
  8. package/components/FormBuilder/_formBuilder.scss +4 -16
  9. package/components/FormBuilder/index.js +4 -3
  10. package/components/FormBuilder/messages.js +4 -0
  11. package/components/Sidebar/index.js +4 -4
  12. package/config/path.js +1 -1
  13. package/containers/App/constants.js +95 -0
  14. package/containers/App/index.js +52 -0
  15. package/containers/App/sagas.js +8 -3
  16. package/containers/Assets/Gallery/index.js +17 -3
  17. package/containers/Assets/Gallery/messages.js +4 -0
  18. package/containers/Assets/Gallery/sagas.js +14 -14
  19. package/containers/Cap/index.js +84 -50
  20. package/containers/Cap/sagas.js +20 -12
  21. package/containers/Cap/selectors.js +13 -13
  22. package/containers/Cap/tests/__snapshots__/index.test.js.snap +1 -1
  23. package/containers/Cap/tests/saga.test.js +81 -1
  24. package/containers/Dashboard/index.js +34 -17
  25. package/containers/Dashboard/sagas.js +7 -1
  26. package/containers/Ebill/index.js +16 -3
  27. package/containers/Ebill/sagas.js +18 -11
  28. package/containers/Email/index.js +20 -3
  29. package/containers/Email/sagas.js +34 -23
  30. package/containers/LanguageProvider/index.js +49 -31
  31. package/containers/LanguageProvider/tests/index.test.js +5 -3
  32. package/containers/Line/Create/index.js +15 -2
  33. package/containers/Line/Create/sagas.js +26 -17
  34. package/containers/Line/Edit/sagas.js +12 -13
  35. package/containers/Login/index.js +36 -11
  36. package/containers/MobilePush/Create/index.js +17 -2
  37. package/containers/MobilePush/Create/sagas.js +18 -12
  38. package/containers/MobilePush/Edit/index.js +20 -3
  39. package/containers/MobilePush/Edit/sagas.js +30 -20
  40. package/containers/Sms/Create/index.js +15 -2
  41. package/containers/Sms/Create/sagas.js +8 -6
  42. package/containers/Sms/Edit/index.js +15 -3
  43. package/containers/Sms/Edit/sagas.js +14 -8
  44. package/containers/TagList/constants.js +23 -0
  45. package/containers/Templates/actions.js +0 -5
  46. package/containers/Templates/index.js +47 -14
  47. package/containers/Templates/sagas.js +20 -23
  48. package/containers/WeChat/MapTemplates/index.js +19 -2
  49. package/containers/WeChat/MapTemplates/sagas.js +17 -17
  50. package/containers/WeChat/RichmediaTemplates/Create/index.js +18 -2
  51. package/containers/WeChat/RichmediaTemplates/Create/sagas.js +11 -8
  52. package/containers/WeChat/RichmediaTemplates/Edit/index.js +21 -2
  53. package/containers/WeChat/RichmediaTemplates/Edit/sagas.js +9 -5
  54. package/entry.js +2 -0
  55. package/global-styles.js +2 -2
  56. package/gtm/eventDefinitionsMap.js +1 -1
  57. package/helpers/intl-enzym-test-helpers.js +1 -1
  58. package/hoc/withReactRouterV3Compatibility.js +66 -0
  59. package/index.js +12 -0
  60. package/initialReducer.js +32 -0
  61. package/initialState.js +1 -0
  62. package/mfe-exposed-components.js +8 -0
  63. package/package.json +16 -11
  64. package/routes.js +206 -749
  65. package/services/api.js +62 -17
  66. package/services/tests/api.test.js +248 -1
  67. package/styles/components/navigation/_leftnav.scss +13 -0
  68. package/styles/containers/layout/_layoutPage.scss +14 -0
  69. package/tests/integration/TemplateCreation/TemplateCreation.integration.test.js +21 -16
  70. package/tests/store.test.js +5 -3
  71. package/translations/en.json +1 -9
  72. package/translations/ja-JP.json +0 -8
  73. package/translations/zh.json +0 -8
  74. package/utils/authWrapper.js +43 -17
  75. package/utils/cdnTransformation.js +73 -44
  76. package/utils/checkStore.js +21 -0
  77. package/utils/common.js +198 -8
  78. package/utils/commonUtils.js +17 -1
  79. package/utils/customAuthWrapper.js +62 -0
  80. package/utils/customConnectedAuthWrapper.js +26 -0
  81. package/utils/history.js +8 -0
  82. package/utils/injectReducer.js +2 -0
  83. package/utils/injectSaga.js +2 -0
  84. package/utils/tagValidations.js +2 -2
  85. package/utils/tests/cdnTransformation.test.js +6 -4
  86. package/utils/tests/common.mockdata.js +623 -0
  87. package/utils/tests/common.test.js +273 -0
  88. package/utils/tests/commonUtil.test.js +79 -0
  89. package/v2Components/CapDeviceContent/index.js +330 -0
  90. package/v2Components/CapDeviceContent/index.scss +115 -0
  91. package/v2Components/CapDeviceContent/messages.js +94 -0
  92. package/v2Components/CapDeviceContent/tests/index.test.js +89 -0
  93. package/v2Components/CapImageUpload/constants.js +6 -0
  94. package/v2Components/CapImageUpload/index.js +23 -15
  95. package/v2Components/CapImageUpload/index.scss +6 -0
  96. package/v2Components/CapImageUpload/messages.js +7 -7
  97. package/v2Components/CapInAppCTA/constants.js +25 -0
  98. package/v2Components/CapInAppCTA/index.js +279 -0
  99. package/v2Components/CapInAppCTA/index.scss +99 -0
  100. package/v2Components/CapInAppCTA/messages.js +85 -0
  101. package/v2Components/CapTagList/index.js +149 -26
  102. package/v2Components/CapTagList/messages.js +12 -0
  103. package/v2Components/CapTagList/style.scss +26 -0
  104. package/v2Components/CapVideoUpload/constants.js +6 -0
  105. package/v2Components/CapVideoUpload/index.js +48 -22
  106. package/v2Components/CapVideoUpload/index.scss +4 -2
  107. package/v2Components/CapVideoUpload/messages.js +10 -6
  108. package/v2Components/CapWhatsappQuickReply/index.js +255 -0
  109. package/v2Components/CapWhatsappQuickReply/index.scss +54 -0
  110. package/v2Components/CapWhatsappQuickReply/messages.js +32 -0
  111. package/v2Components/Ckeditor/index.js +56 -22
  112. package/v2Components/Ckeditor/style.scss +3 -0
  113. package/v2Components/Ckeditor/tests/index.test.js +44 -0
  114. package/v2Components/CmsTemplatesComponent/index.js +1 -0
  115. package/v2Components/CmsTemplatesComponent/messages.js +4 -0
  116. package/v2Components/EmailMobilePreview/index.js +4 -2
  117. package/v2Components/EmailPreviewV2/index.js +6 -4
  118. package/v2Components/EmailPreviewV2/tests/__snapshots__/index.test.js.snap +0 -3
  119. package/v2Components/FormBuilder/_formBuilder.scss +1 -0
  120. package/v2Components/FormBuilder/constants.js +1 -1
  121. package/v2Components/FormBuilder/index.js +111 -29
  122. package/v2Components/FormBuilder/messages.js +4 -0
  123. package/v2Components/FormBuilder/tests/index.test.js +5 -2
  124. package/v2Components/MobilePushPreviewV2/index.js +57 -22
  125. package/v2Components/NavigationBar/constants.js +1 -0
  126. package/v2Components/NavigationBar/index.js +84 -113
  127. package/v2Components/NavigationBar/messages.js +8 -0
  128. package/v2Components/NavigationBar/style.js +9 -0
  129. package/v2Components/NavigationBar/tests/index.test.js +32 -9
  130. package/v2Components/NavigationBar/tests/mockData.js +1 -0
  131. package/v2Components/NewCallTask/tests/index.test.js +5 -3
  132. package/v2Components/Pagination/index.js +2 -1
  133. package/v2Components/RenderRoute/RenderRoute.js +11 -0
  134. package/v2Components/RenderRoute/index.js +1 -0
  135. package/v2Components/TemplatePreview/_templatePreview.scss +535 -0
  136. package/v2Components/TemplatePreview/assets/images/inapp_mobile_android_bottom.svg +11 -0
  137. package/v2Components/TemplatePreview/assets/images/inapp_mobile_android_full.svg +11 -0
  138. package/v2Components/TemplatePreview/assets/images/inapp_mobile_android_modal.svg +11 -0
  139. package/v2Components/TemplatePreview/assets/images/inapp_mobile_android_top.svg +11 -0
  140. package/v2Components/TemplatePreview/assets/images/inapp_mobile_ios_bottom.svg +6 -0
  141. package/v2Components/TemplatePreview/assets/images/inapp_mobile_ios_full.svg +18 -0
  142. package/v2Components/TemplatePreview/assets/images/inapp_mobile_ios_modal.svg +7 -0
  143. package/v2Components/TemplatePreview/assets/images/inapp_mobile_ios_top.svg +13 -0
  144. package/v2Components/TemplatePreview/index.js +745 -362
  145. package/v2Components/TemplatePreview/messages.js +8 -0
  146. package/v2Components/TemplatePreview/tests/__snapshots__/index.test.js.snap +47 -14
  147. package/v2Components/TemplatePreview/tests/index.test.js +9 -0
  148. package/v2Components/WhatsappStatusContainer/_whatsappStatusContainer.scss +8 -1
  149. package/v2Containers/App/constants.js +12 -6
  150. package/v2Containers/App/sagas.js +0 -1
  151. package/v2Containers/Assets/Gallery/index.js +1 -0
  152. package/v2Containers/Assets/Gallery/sagas.js +15 -14
  153. package/v2Containers/BeeEditor/index.js +3 -1
  154. package/v2Containers/BeeEditor/sagas.js +8 -5
  155. package/v2Containers/CallTask/sagas.js +7 -1
  156. package/v2Containers/Cap/actions.js +4 -0
  157. package/v2Containers/Cap/constants.js +20 -1
  158. package/v2Containers/Cap/index.js +116 -17
  159. package/v2Containers/Cap/messages.js +8 -0
  160. package/v2Containers/Cap/reducer.js +18 -3
  161. package/v2Containers/Cap/sagas.js +64 -9
  162. package/v2Containers/Cap/selectors.js +27 -13
  163. package/v2Containers/Cap/tests/Cap.test.js +164 -0
  164. package/v2Containers/Cap/tests/__snapshots__/index.test.js.snap +2 -1
  165. package/v2Containers/Cap/tests/actions.test.js +11 -0
  166. package/v2Containers/Cap/tests/reducer.test.js +59 -0
  167. package/v2Containers/Cap/tests/saga.test.js +181 -2
  168. package/v2Containers/Cap/tests/selectors.test.js +42 -18
  169. package/v2Containers/CapFacebookPreview/sagas.js +7 -5
  170. package/v2Containers/CreativesContainer/SlideBoxContent.js +86 -4
  171. package/v2Containers/CreativesContainer/SlideBoxFooter.js +4 -3
  172. package/v2Containers/CreativesContainer/SlideBoxHeader.js +30 -14
  173. package/v2Containers/CreativesContainer/constants.js +5 -0
  174. package/v2Containers/CreativesContainer/index.js +157 -38
  175. package/v2Containers/CreativesContainer/index.scss +12 -0
  176. package/v2Containers/CreativesContainer/messages.js +33 -1
  177. package/v2Containers/CreativesContainer/tests/SlideBoxContent.test.js +11 -0
  178. package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +5 -2
  179. package/v2Containers/CreativesContainer/tests/SlideBoxHeader.test.js +7 -1
  180. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +227 -0
  181. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxHeader.test.js.snap +73 -0
  182. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +80 -0
  183. package/v2Containers/CreativesContainer/tests/index.test.js +16 -0
  184. package/v2Containers/Ebill/sagas.js +3 -10
  185. package/v2Containers/Email/index.js +38 -19
  186. package/v2Containers/Email/initialSchema.js +1 -1
  187. package/v2Containers/Email/sagas.js +22 -26
  188. package/v2Containers/EmailWrapper/index.js +18 -8
  189. package/v2Containers/FTP/index.js +2 -2
  190. package/v2Containers/FTP/sagas.js +3 -4
  191. package/v2Containers/Facebook/sagas.js +26 -17
  192. package/v2Containers/InApp/actions.js +64 -0
  193. package/v2Containers/InApp/constants.js +160 -0
  194. package/v2Containers/InApp/index.js +792 -0
  195. package/v2Containers/InApp/index.scss +50 -0
  196. package/v2Containers/InApp/messages.js +114 -0
  197. package/v2Containers/InApp/reducer.js +109 -0
  198. package/v2Containers/InApp/sagas.js +151 -0
  199. package/v2Containers/InApp/selectors.js +12 -0
  200. package/v2Containers/InApp/tests/action.test.js +53 -0
  201. package/v2Containers/InApp/tests/index.test.js +165 -0
  202. package/v2Containers/InApp/tests/mockData.js +898 -0
  203. package/v2Containers/InApp/tests/reducer.test.js +177 -0
  204. package/v2Containers/InApp/tests/sagas.test.js +391 -0
  205. package/v2Containers/InApp/utils.js +12 -0
  206. package/v2Containers/LanguageProvider/index.js +17 -5
  207. package/v2Containers/LanguageProvider/reducer.js +3 -2
  208. package/v2Containers/LanguageProvider/sagas.js +7 -8
  209. package/v2Containers/LanguageProvider/selectors.js +2 -1
  210. package/v2Containers/LanguageProvider/tests/index.test.js +5 -2
  211. package/v2Containers/LanguageProvider/tests/reducer.test.js +6 -3
  212. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +28 -16
  213. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +2 -2
  214. package/v2Containers/Line/Container/ImageCarousel/tests/content.test.js +5 -3
  215. package/v2Containers/Line/Container/ImageCarousel/tests/index.test.js +5 -3
  216. package/v2Containers/Line/Container/ImageMap/index.js +1 -1
  217. package/v2Containers/Line/Container/Text/index.js +16 -1
  218. package/v2Containers/Line/Container/Video/index.js +2 -1
  219. package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +18134 -107
  220. package/v2Containers/Line/Container/Wrapper/tests/index.test.js +5 -3
  221. package/v2Containers/Line/Container/Wrapper/utils.js +1 -1
  222. package/v2Containers/Line/Container/index.js +4 -0
  223. package/v2Containers/Line/Container/sagas.js +30 -20
  224. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +123 -81
  225. package/v2Containers/Line/Container/tests/index.test.js +5 -2
  226. package/v2Containers/Login/index.js +1 -2
  227. package/v2Containers/MobilePush/Create/index.js +40 -17
  228. package/v2Containers/MobilePush/Create/sagas.js +18 -12
  229. package/v2Containers/MobilePush/Edit/index.js +16 -7
  230. package/v2Containers/MobilePush/Edit/sagas.js +30 -20
  231. package/v2Containers/MobilepushWrapper/index.js +3 -0
  232. package/v2Containers/Rcs/sagas.js +14 -14
  233. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +123 -87
  234. package/v2Containers/Rcs/tests/index.test.js +5 -3
  235. package/v2Containers/Sms/Create/sagas.js +10 -6
  236. package/v2Containers/Sms/Edit/sagas.js +14 -8
  237. package/v2Containers/SmsTrai/Create/sagas.js +9 -10
  238. package/v2Containers/SmsTrai/Create/tests/__snapshots__/index.test.js.snap +4 -4
  239. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +12 -8
  240. package/v2Containers/SmsTrai/Edit/tests/index.test.js +5 -3
  241. package/v2Containers/TagList/_tagList.scss +18 -0
  242. package/v2Containers/TagList/index.js +81 -42
  243. package/v2Containers/TagList/tests/TagList.test.js +6 -7
  244. package/v2Containers/TagList/tests/mockdata.js +10 -166
  245. package/v2Containers/TagList/tests/utils.test.js +17 -0
  246. package/v2Containers/TagList/utils.js +15 -0
  247. package/v2Containers/Templates/_templates.scss +60 -5
  248. package/v2Containers/Templates/actions.js +6 -5
  249. package/v2Containers/Templates/constants.js +2 -1
  250. package/v2Containers/Templates/index.js +576 -181
  251. package/v2Containers/Templates/messages.js +52 -8
  252. package/v2Containers/Templates/reducer.js +3 -1
  253. package/v2Containers/Templates/sagas.js +54 -38
  254. package/v2Containers/Templates/tests/__snapshots__/index.test.js.snap +669 -43
  255. package/v2Containers/Templates/tests/actions.test.js +19 -0
  256. package/v2Containers/Templates/tests/index.test.js +53 -1
  257. package/v2Containers/Templates/tests/mockData.js +45 -1
  258. package/v2Containers/Templates/tests/reducer.test.js +50 -0
  259. package/v2Containers/Templates/tests/sagas.test.js +116 -3
  260. package/v2Containers/Templates/tests/selector.test.js +17 -0
  261. package/v2Containers/TemplatesV2/index.js +180 -8
  262. package/v2Containers/TemplatesV2/messages.js +8 -0
  263. package/v2Containers/TemplatesV2/tests/index.test.js +104 -0
  264. package/v2Containers/TemplatesV2/tests/mockData.js +685 -0
  265. package/v2Containers/Viber/constants.js +58 -0
  266. package/v2Containers/Viber/index.js +404 -421
  267. package/v2Containers/Viber/index.scss +107 -0
  268. package/v2Containers/Viber/messages.js +70 -2
  269. package/v2Containers/Viber/sagas.js +22 -14
  270. package/v2Containers/Viber/style.js +20 -0
  271. package/v2Containers/Viber/tests/index.test.js +299 -0
  272. package/v2Containers/Viber/tests/mockData.js +134 -0
  273. package/v2Containers/WeChat/MapTemplates/sagas.js +22 -14
  274. package/v2Containers/WeChat/RichmediaTemplates/Create/sagas.js +12 -11
  275. package/v2Containers/WeChat/RichmediaTemplates/Edit/sagas.js +9 -5
  276. package/v2Containers/Whatsapp/actions.js +16 -0
  277. package/v2Containers/Whatsapp/constants.js +24 -0
  278. package/v2Containers/Whatsapp/index.js +892 -222
  279. package/v2Containers/Whatsapp/index.scss +91 -1
  280. package/v2Containers/Whatsapp/messages.js +98 -1
  281. package/v2Containers/Whatsapp/reducer.js +19 -0
  282. package/v2Containers/Whatsapp/sagas.js +67 -12
  283. package/v2Containers/Whatsapp/styles.scss +35 -0
  284. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +34983 -24886
  285. package/v2Containers/Whatsapp/tests/__snapshots__/utils.test.js.snap +12 -0
  286. package/v2Containers/Whatsapp/tests/actions.test.js +21 -0
  287. package/v2Containers/Whatsapp/tests/index.test.js +17 -4
  288. package/v2Containers/Whatsapp/tests/mockData.js +77 -0
  289. package/v2Containers/Whatsapp/tests/reducer.test.js +67 -0
  290. package/v2Containers/Whatsapp/tests/saga.test.js +201 -0
  291. package/v2Containers/Whatsapp/tests/utils.test.js +18 -0
  292. package/v2Containers/Whatsapp/utils.js +65 -4
  293. package/v2Containers/Zalo/actions.js +24 -0
  294. package/v2Containers/Zalo/constants.js +59 -0
  295. package/v2Containers/Zalo/index.js +548 -0
  296. package/v2Containers/Zalo/index.scss +75 -0
  297. package/v2Containers/Zalo/messages.js +86 -0
  298. package/v2Containers/Zalo/reducer.js +63 -0
  299. package/v2Containers/Zalo/saga.js +45 -0
  300. package/v2Containers/Zalo/selectors.js +19 -0
  301. package/v2Containers/Zalo/tests/actions.test.js +26 -0
  302. package/v2Containers/Zalo/tests/index.test.js +149 -0
  303. package/v2Containers/Zalo/tests/mockData.js +11527 -0
  304. package/v2Containers/Zalo/tests/reducer.test.js +96 -0
  305. package/v2Containers/Zalo/tests/saga.test.js +118 -0
  306. package/v2Containers/Zalo/tests/selector.test.js +51 -0
  307. package/v2Containers/mockdata.js +1531 -680
  308. package/containers/TestPage/constants.js +0 -7
  309. package/containers/TestPage/index.js +0 -31
  310. package/containers/TestPage/messages.js +0 -13
  311. package/containers/TestPage/reducer.js +0 -21
  312. package/containers/TestPage/sagas.js +0 -11
  313. package/containers/Testv2/actions.js +0 -15
  314. package/containers/Testv2/constants.js +0 -7
  315. package/containers/Testv2/index.js +0 -47
  316. package/containers/Testv2/messages.js +0 -21
  317. package/containers/Testv2/reducer.js +0 -23
  318. package/containers/Testv2/sagas.js +0 -11
  319. package/containers/Testv2/selectors.js +0 -25
  320. package/reducers.js +0 -73
  321. package/store.js +0 -61
  322. package/utils/tests/asyncInjectors.test.js +0 -173
  323. package/v2Containers/TestPage/constants.js +0 -7
  324. package/v2Containers/TestPage/index.js +0 -31
  325. package/v2Containers/TestPage/messages.js +0 -13
  326. package/v2Containers/TestPage/reducer.js +0 -21
  327. package/v2Containers/TestPage/sagas.js +0 -11
  328. package/v2Containers/Testv2/actions.js +0 -15
  329. package/v2Containers/Testv2/constants.js +0 -7
  330. package/v2Containers/Testv2/index.js +0 -47
  331. package/v2Containers/Testv2/messages.js +0 -21
  332. package/v2Containers/Testv2/reducer.js +0 -23
  333. package/v2Containers/Testv2/sagas.js +0 -11
  334. package/v2Containers/Testv2/selectors.js +0 -25
@@ -0,0 +1,273 @@
1
+ import React from 'react';
2
+ import Bugsnag from '@bugsnag/js';
3
+ import { FormattedMessage } from 'react-intl';
4
+ import "@testing-library/jest-dom";
5
+ import {
6
+ filterTags,
7
+ getTreeStructuredTags,
8
+ handleInjectedData,
9
+ intlKeyGenerator,
10
+ bytes2Size,
11
+ getUserNameById,
12
+ iframePreviewAdjustWidth,
13
+ getDecodedFileName
14
+ } from "../common";
15
+ import * as mockdata from "./common.mockdata";
16
+
17
+ describe("getTreeStructuredTags test", () => {
18
+ it("test for getTreeStructuredTags when tagsList is not empty", () => {
19
+ expect(getTreeStructuredTags({ tagsList: mockdata.tagsList })).toEqual(mockdata.output1);
20
+ });
21
+ it("test for getTreeStructuredTags when tagsList is empty", () => {
22
+ expect(getTreeStructuredTags({ tagsList: [] })).toEqual([]);
23
+ });
24
+
25
+ it("test for getTreeStructuredTags when incentive attached is BADGES", () => {
26
+ expect(getTreeStructuredTags({ tagsList: mockdata.badgesTags, offerDetails: mockdata.offer })).toEqual(mockdata.expectedOffer);
27
+ });
28
+ it("test for filterTags", () => {
29
+ expect(filterTags(mockdata.tagsToFilter, mockdata.tagsList)).toEqual([mockdata.tagsList[1]]);
30
+ });
31
+ it("test for filterTags when tagsToFilter and tagsList is empty", () => {
32
+ expect(filterTags([], [])).toEqual([]);
33
+ });
34
+ it("test for getTreeStructuredTags when incentive attached is offer", () => {
35
+ expect(getTreeStructuredTags({ tagsList: mockdata.OfferTag, offerDetails: [{ id: '12', couponName: 'mac' }] })).toEqual(mockdata.offerOutput);
36
+ });
37
+ });
38
+
39
+ describe("getUserNameById test", () => {
40
+ it("test for username is available or not", () => {
41
+ const data = [
42
+ {
43
+ userId: 1,
44
+ firstName: 'test1',
45
+ lastName: 'test2',
46
+
47
+ },
48
+ {
49
+ userId: 2,
50
+ firstName: 'test3',
51
+ lastName: 'test4',
52
+
53
+ },
54
+ ];
55
+ const expected = 'test1 test2';
56
+ expect(getUserNameById(1, data)).toEqual(expected);
57
+ });
58
+ });
59
+
60
+ describe("handleInjectedData", () => {
61
+ it("replaces name with intl key for top level tag", () => {
62
+ const data = {
63
+ tag1: {
64
+ name: "Registration Fields",
65
+ },
66
+ };
67
+
68
+ const result = handleInjectedData(data, "scope");
69
+ const intlKey = intlKeyGenerator("scope");
70
+ expect(intlKey).toEqual('scope');
71
+ expect(result.tag1.name).toEqual(<FormattedMessage defaultMessage="Registration Fields" id="scope.registration_fields" values={{}} />);
72
+ });
73
+
74
+ it("adds tagType for Registration custom fields", () => {
75
+ const data = {
76
+ tag1: {
77
+ name: "Registration custom fields",
78
+ },
79
+ };
80
+
81
+ const result = handleInjectedData(data, "scope");
82
+ const intlKey = intlKeyGenerator();
83
+ expect(intlKey).toEqual('');
84
+ expect(result.tag1.name).toEqual(
85
+ <FormattedMessage defaultMessage="Registration custom fields" id="scope.registration_custom_fields_name.CustomTagMessage" values={{}} />
86
+ );
87
+ });
88
+
89
+ it("adds tagType for Customer extended fields fields", () => {
90
+ const data = {
91
+ tag1: {
92
+ name: "Customer extended fields",
93
+ },
94
+ };
95
+
96
+ const result = handleInjectedData(data, "scope");
97
+
98
+ expect(result.tag1.name).toEqual(
99
+ <FormattedMessage defaultMessage="Customer extended fields" id="scope.customer_extended_fields_name.ExtendedTagMessage" values={{}} />
100
+ );
101
+ });
102
+ it("adds tagType for Customer extended fields fields", () => {
103
+ const data = {
104
+ tag1: {
105
+ },
106
+ };
107
+
108
+ const result = handleInjectedData(data, "scope");
109
+
110
+ expect(result.tag1.name).toEqual(undefined);
111
+ });
112
+
113
+ it("adds tagType for Customer with extended fields fields", () => {
114
+ const data = {
115
+ tag1: {
116
+ name: "mahaRaja",
117
+ subtag1: {
118
+ name: "First Name",
119
+ },
120
+ },
121
+ };
122
+
123
+ const result = handleInjectedData(data, "scope");
124
+
125
+ expect(result.tag1.subtag1.name).toEqual("First Name");
126
+ });
127
+ it("replaces subtag name with intl key", () => {
128
+ const data = {
129
+ tag1: {
130
+ subtags: {
131
+ subtag1: {
132
+ name: "First Name",
133
+ hasOwnProperty: jest.fn(),
134
+ },
135
+ hasOwnProperty: jest.fn(),
136
+ },
137
+ },
138
+ };
139
+
140
+ const result = handleInjectedData(data, "scope");
141
+
142
+ expect(result.tag1.subtags.subtag1.name).toEqual("First Name");
143
+ });
144
+
145
+ it("replaces subtag name with intl key test", () => {
146
+ const data = {
147
+ tag1: {
148
+ subtags: {
149
+ subtag1: {
150
+ name: "First Name",
151
+ hasOwnProperty: jest.fn(),
152
+ },
153
+ },
154
+ },
155
+ hasOwnProperty: jest.fn(),
156
+ };
157
+
158
+ const result = handleInjectedData(data, "scope");
159
+
160
+ expect(result.tag1.subtags.subtag1.name).toEqual("First Name");
161
+ });
162
+
163
+ it("replaces subtag desc with intl key", () => {
164
+ const data = {
165
+ tag1: {
166
+ subtags: {
167
+ subtag1: {
168
+ desc: "Enter your first name",
169
+ },
170
+ },
171
+ },
172
+ };
173
+
174
+ const result = handleInjectedData(data, "scope");
175
+
176
+ expect(result.tag1.subtags.subtag1.desc).toEqual(
177
+ <FormattedMessage defaultMessage="Enter your first name" id="scope.enter_your_first_name" values={{}} />
178
+ );
179
+ });
180
+ it("replaces subtag name desc with intl key", () => {
181
+ const data = {
182
+ tag1: {
183
+ subtags: {
184
+ subtag1: {
185
+ name: "mahaRaja",
186
+ desc: "Enter your first name",
187
+ },
188
+ },
189
+ },
190
+ };
191
+
192
+ const result = handleInjectedData(data, "scope");
193
+
194
+ expect(result.tag1.subtags.subtag1.desc).toEqual(
195
+ <FormattedMessage defaultMessage="Enter your first name" id="scope.enter_your_first_name" values={{}} />
196
+ );
197
+ });
198
+ });
199
+
200
+ describe('bytes2Size', () => {
201
+ it('should convert bytes to the correct size string', () => {
202
+ // Test cases with different byte values
203
+ expect(bytes2Size(0)).toBe('0 Bytes');
204
+ expect(bytes2Size(1023)).toBe('1023 Bytes');
205
+ expect(bytes2Size(1024)).toBe('1 KB');
206
+ expect(bytes2Size(1048576)).toBe('1 MB');
207
+ expect(bytes2Size(1099511627776)).toBe('1 TB');
208
+ expect(bytes2Size(1125899906842624)).toBe('1 PB');
209
+ expect(bytes2Size(1152921504606846976)).toBe('1 EB');
210
+ expect(bytes2Size(1180591620717411303424)).toBe('1 ZB');
211
+ expect(bytes2Size(Number.MAX_SAFE_INTEGER)).toBe('8 PB'); // Test with the maximum safe integer value
212
+ });
213
+
214
+ it('should handle negative decimals', () => {
215
+ // Test with negative decimal values
216
+ expect(bytes2Size(1024, -1)).toBe('1 KB'); // Decimals < 0 should round to 0
217
+ expect(bytes2Size(1024, -2)).toBe('1 KB');
218
+ expect(bytes2Size(1024, -3)).toBe('1 KB');
219
+ });
220
+ });
221
+
222
+ describe('iframeAdjustWidth', () => {
223
+ it("should Add the width in iframe image", () => {
224
+ const data = [
225
+ <head>
226
+ <meta httpEquiv="Content-Type" content="text/html; charset=utf-8">
227
+ <meta name="viewport" content="width=device-width">
228
+ </meta></meta></head>,
229
+
230
+ ];
231
+ expect(iframePreviewAdjustWidth(data)).toBe("<html><head></head><body>[object Object]</body></html>");
232
+ });
233
+ });
234
+
235
+ describe('getDecodedFileName function', () => {
236
+ it('Returns an empty string when templateName is undefined', () => {
237
+ expect(getDecodedFileName()).toEqual('');
238
+ });
239
+
240
+ it('Returns the decoded filename from encoded filename', () => {
241
+ expect(getDecodedFileName('%24Test.jpeg')).toEqual('$Test.jpeg');
242
+ expect(getDecodedFileName('cap%24.logo.%23.jpg')).toEqual('cap$.logo.#.jpg');
243
+ expect(getDecodedFileName("%24L_i%40n%26e__%60AL%60L%2BI'ma_g__e%2Bco_pyAI____Copy____Copy_wek1SeS0.jpg")).toEqual("$L_i@n&e__`AL`L+I'ma_g__e+co_pyAI____Copy____Copy_wek1SeS0.jpg");
244
+ expect(getDecodedFileName('test.jpeg')).toEqual('test.jpeg');
245
+ });
246
+
247
+ it('Returns the original filename when decoding fails due to URIError', () => {
248
+ const fileName = '@Test%ZZ.jpeg';
249
+ expect(getDecodedFileName(fileName)).toEqual(fileName);
250
+ });
251
+
252
+ it('Returns the original filename and notifies Bugsnag for other decoding errors', () => {
253
+ // Mocking Bugsnag methods for testing
254
+ const originalLeaveBreadcrumb = Bugsnag.leaveBreadcrumb;
255
+ const originalNotify = Bugsnag.notify;
256
+ Bugsnag.leaveBreadcrumb = jest.fn();
257
+ Bugsnag.notify = jest.fn((error, callback) => {
258
+ const event = {};
259
+ callback(event);
260
+ expect(event.severity).toEqual("error");
261
+ });
262
+ const fileName = '@Test%20ZZ.jpg';
263
+ const error = new Error('Some other decoding error');
264
+ // Mocking decodeURIComponent to throw the error
265
+ global.decodeURIComponent = jest.fn(() => { throw error; });
266
+
267
+ expect(getDecodedFileName(fileName)).toEqual(fileName);
268
+ expect(Bugsnag.notify).toHaveBeenCalled();
269
+ // Restoring original Bugsnag methods
270
+ Bugsnag.leaveBreadcrumb = originalLeaveBreadcrumb;
271
+ Bugsnag.notify = originalNotify;
272
+ });
273
+ });
@@ -0,0 +1,79 @@
1
+ import "@testing-library/jest-dom";
2
+ import { getTreeStructuredTags } from "../common";
3
+ import * as mockdata from "./common.mockdata";
4
+ import { addBaseToTemplate } from "../commonUtils";
5
+
6
+ jest.mock('@capillarytech/cap-ui-utils', () => ({
7
+ Auth: {
8
+ hasAccess: () => jest.fn(() => true),
9
+ hasFeatureAccess: () => jest.fn(() => true),
10
+ authHoc: jest.fn(),
11
+ initialize: jest.fn(),
12
+ },
13
+ }));
14
+
15
+ describe("common utils test", () => {
16
+ it("test for getTreeStructuredTags when tagsList is not empty", () => {
17
+ expect(getTreeStructuredTags({tagsList: mockdata.tagsList})).toEqual(mockdata.output2);
18
+ });
19
+ it("test for getTreeStructuredTags when tagsList is empty", () => {
20
+ expect(getTreeStructuredTags({tagsList: []})).toEqual([]);
21
+ });
22
+ });
23
+
24
+ describe('addBaseToTemplate', () => {
25
+ it('should add the first item in history as base if history exists', () => {
26
+ const template = {
27
+ versions: {
28
+ history: ['v1', 'v2', 'v3'],
29
+ },
30
+ };
31
+ const expected = {
32
+ versions: {
33
+ history: ['v1', 'v2', 'v3'],
34
+ base: 'v1',
35
+ },
36
+ };
37
+ expect(addBaseToTemplate(template)).toEqual(expected);
38
+ });
39
+
40
+ it('should return the original template if history is empty', () => {
41
+ const template = {
42
+ versions: {
43
+ history: [],
44
+ },
45
+ };
46
+ expect(addBaseToTemplate(template)).toEqual(template);
47
+ });
48
+
49
+ it('should return the original template if history is undefined', () => {
50
+ const template = {
51
+ versions: {},
52
+ };
53
+ expect(addBaseToTemplate(template)).toEqual(template);
54
+ });
55
+
56
+ it('should return the original template if versions is undefined', () => {
57
+ const template = {};
58
+ expect(addBaseToTemplate(template)).toEqual(template);
59
+ });
60
+
61
+ it('should handle null input gracefully', () => {
62
+ expect(addBaseToTemplate(null)).toBeNull();
63
+ });
64
+
65
+ it('should handle undefined input gracefully', () => {
66
+ expect(addBaseToTemplate(undefined)).toBeUndefined();
67
+ });
68
+
69
+ it('should not modify the original template object', () => {
70
+ const template = {
71
+ versions: {
72
+ history: ['v1', 'v2', 'v3'],
73
+ },
74
+ };
75
+ const originalTemplateCopy = JSON.parse(JSON.stringify(template));
76
+ addBaseToTemplate(template);
77
+ expect(template).toEqual(originalTemplateCopy);
78
+ });
79
+ });
@@ -0,0 +1,330 @@
1
+ import React, { useCallback } from "react";
2
+ import PropTypes from "prop-types";
3
+ import { injectIntl, intlShape } from "react-intl";
4
+ import cloneDeep from "lodash/cloneDeep";
5
+ import isEmpty from "lodash/isEmpty";
6
+ import CapHeading from "@capillarytech/cap-ui-library/CapHeading";
7
+ import CapHeader from "@capillarytech/cap-ui-library/CapHeader";
8
+ import CapInput from "@capillarytech/cap-ui-library/CapInput";
9
+ import CapRadioGroup from "@capillarytech/cap-ui-library/CapRadioGroup";
10
+ import CapRow from "@capillarytech/cap-ui-library/CapRow";
11
+ import CapColumn from "@capillarytech/cap-ui-library/CapColumn";
12
+ import CapLabel from "@capillarytech/cap-ui-library/CapLabel";
13
+ import CapLink from "@capillarytech/cap-ui-library/CapLink";
14
+ import CapError from "@capillarytech/cap-ui-library/CapError";
15
+ import CapCheckbox from "@capillarytech/cap-ui-library/CapCheckbox";
16
+ import CapSelect from "@capillarytech/cap-ui-library/CapSelect";
17
+ import TagList from "../../v2Containers/TagList";
18
+ import messages from "./messages";
19
+ import {
20
+ ANDROID,
21
+ INAPP_MEDIA_TYPES,
22
+ INAPP_BUTTON_TYPES,
23
+ ALLOWED_IMAGE_EXTENSIONS_REGEX,
24
+ INAPP_IMG_SIZE,
25
+ INITIAL_CTA_DATA,
26
+ MEDIA_RADIO_OPTIONS,
27
+ BUTTON_RADIO_OPTIONS,
28
+ } from "../../v2Containers/InApp/constants";
29
+ import { INAPP } from "../../v2Containers/CreativesContainer/constants";
30
+ import CapImageUpload from "../CapImageUpload";
31
+ import CapInAppCTA from "../CapInAppCTA";
32
+ import './index.scss';
33
+
34
+ const CapDeviceContent = (props) => {
35
+ const {
36
+ intl,
37
+ location,
38
+ injectedTags,
39
+ selectedOfferDetails,
40
+ panes,
41
+ actions,
42
+ editData,
43
+ isFullMode,
44
+ inAppImageSrc,
45
+ setInAppImageSrc,
46
+ isEditFlow,
47
+ ctaData,
48
+ setCtaData,
49
+ buttonType,
50
+ setButtonType,
51
+ templateMediaType,
52
+ setTemplateMediaType,
53
+ title,
54
+ setTitle,
55
+ templateMessageError,
56
+ templateMessage,
57
+ setTemplateMessage,
58
+ setTemplateMessageError,
59
+ addActionLink,
60
+ setAddActionLink,
61
+ deepLink,
62
+ deepLinkValue,
63
+ setDeepLinkValue,
64
+ onCopyTitleAndContent,
65
+ tags,
66
+ onTagSelect,
67
+ handleOnTagsContextChange,
68
+ templateDescErrorHandler,
69
+ templateTitleError,
70
+ setTemplateTitleError,
71
+ } = props || {};
72
+ const { TextArea } = CapInput;
73
+ const { formatMessage } = intl;
74
+
75
+ const isAndroid = panes === ANDROID;
76
+ const isMediaTypeImage = INAPP_MEDIA_TYPES.IMAGE === templateMediaType;
77
+ const isBtnTypeCta = buttonType === INAPP_BUTTON_TYPES.CTA;
78
+ const onTemplateMessageChange = ({ target: { value } }) => {
79
+ let error = templateDescErrorHandler(value);
80
+ if (value === '') {
81
+ error = formatMessage(messages.emptyTemplateMessageErrorMessage);
82
+ }
83
+ setTemplateMessage(value);
84
+ setTemplateMessageError(error);
85
+ };
86
+
87
+ const setUpdateInAppImageSrc = useCallback(
88
+ (filePath) => {
89
+ const templateType = 0;
90
+ setInAppImageSrc(filePath);
91
+ actions.clearInAppAsset(templateType);
92
+ },
93
+ [inAppImageSrc]
94
+ );
95
+ const updateOnInAppImageReUpload = useCallback(() => {
96
+ setInAppImageSrc("");
97
+ }, [inAppImageSrc]);
98
+
99
+ const updateHandler = (ctaDataParam, index) => {
100
+ setCtaData((prevState) => {
101
+ const clonedCta = cloneDeep(prevState);
102
+ clonedCta[index] = ctaDataParam;
103
+ return clonedCta;
104
+ });
105
+ };
106
+
107
+ // function to delete CTA button
108
+ const deleteHandler = (index) => {
109
+ setCtaData((prevState) => {
110
+ const clonedCta = cloneDeep(prevState);
111
+ const filteredCta = clonedCta.filter((cta) => cta.index !== index);
112
+ if (filteredCta.length === 1) {
113
+ // updates the index of the cta buttons present in case there's a cta button deleted
114
+ filteredCta[0].index = 0;
115
+ }
116
+ if (isEmpty(filteredCta)) {
117
+ onChangeButtonType({target: { value: INAPP_BUTTON_TYPES.NONE } });
118
+ }
119
+ return filteredCta;
120
+ });
121
+ };
122
+
123
+ const onTitleChange = ({ target: { value } }) => {
124
+ let error = templateDescErrorHandler(value);
125
+ if (value === '') {
126
+ error = formatMessage(messages.emptyTemplateMessageErrorMessage);
127
+ }
128
+ setTitle(value);
129
+ setTemplateTitleError(error);
130
+ };
131
+
132
+ const onTemplateMediaTypeChange = ({ target: { value } }) => {
133
+ setTemplateMediaType(value);
134
+ };
135
+
136
+ const onChangeButtonType = ({ target: { value } }) => {
137
+ setButtonType(value);
138
+ setCtaData(INITIAL_CTA_DATA);
139
+ };
140
+
141
+ const onActionLinkCheckBoxChange = () => {
142
+ setAddActionLink(!addActionLink);
143
+ setDeepLinkValue('');
144
+ };
145
+
146
+ const uploadInAppAsset = (file, type, fileParams) => {
147
+ actions.uploadInAppAsset(file, type, fileParams, 0);
148
+ };
149
+
150
+ const getTagList = (index) => (
151
+ <TagList
152
+ moduleFilterEnabled={
153
+ location && location?.query && location?.query?.type !== "embedded"
154
+ }
155
+ label={formatMessage(messages.addLabel)}
156
+ onTagSelect={(value) => onTagSelect(value, index)}
157
+ onContextChange={handleOnTagsContextChange}
158
+ location={location}
159
+ tags={tags || []}
160
+ injectedTags={injectedTags || {}}
161
+ selectedOfferDetails={selectedOfferDetails}
162
+ />
163
+ );
164
+
165
+ return (
166
+ <>
167
+ <CapRow className="creatives-device-content">
168
+ <CapLink
169
+ title={isAndroid
170
+ ? formatMessage(messages.copyContentFromIOS)
171
+ : formatMessage(messages.copyCotentFromAndroid)}
172
+ className="inapp-copy-content"
173
+ onClick={onCopyTitleAndContent}
174
+ />
175
+ <CapRow className="creatives-inapp-title">
176
+ <CapColumn
177
+ className="inapp-content-main"
178
+ >
179
+ <CapHeading type="h5" className="inapp-title">
180
+ {formatMessage(messages.title)}
181
+ </CapHeading>
182
+ {getTagList(0)} {/* here 0 signifies the tags for template title */}
183
+ </CapColumn>
184
+ <CapInput
185
+ id="inapp-title-name-input"
186
+ onChange={onTitleChange}
187
+ placeholder={formatMessage(messages.titlePlaceholder)}
188
+ value={title}
189
+ size="default"
190
+ isRequired
191
+ errorMessage={templateTitleError && (
192
+ <CapError className="inapp-template-message-error">
193
+ {templateTitleError}
194
+ </CapError>
195
+ )}
196
+ />
197
+ </CapRow>
198
+ <CapRow className="creatives-inapp-media">
199
+ <CapRow className="inapp-content-media">
200
+ <CapHeading type="h5" className="inapp-media-header">
201
+ {formatMessage(messages.mediaLabel)}
202
+ </CapHeading>
203
+ <CapRadioGroup
204
+ id="inapp-media-radio"
205
+ options={MEDIA_RADIO_OPTIONS}
206
+ value={templateMediaType}
207
+ onChange={onTemplateMediaTypeChange}
208
+ className="inapp-media-radio"
209
+ />
210
+ </CapRow>
211
+ </CapRow>
212
+ <CapRow className={`creatives-inapp-message ${!isMediaTypeImage && "message-bottom-margin"}`}>
213
+ <CapColumn
214
+ className="inapp-message-header"
215
+ >
216
+ <CapHeading type="h5" className="inapp-message-header-style">
217
+ {formatMessage(messages.message)}
218
+ </CapHeading>
219
+ {getTagList(1)} {/* here 1 signifies the tags for template message */}
220
+ </CapColumn>
221
+ <TextArea
222
+ id="inapp-create-template-message-input"
223
+ className="inapp-create-template-message-input"
224
+ placeholder={formatMessage(messages.textAreaInputPlaceholder)}
225
+ onChange={onTemplateMessageChange}
226
+ value={templateMessage || ''}
227
+ autosize={{ minRows: 5, maxRows: 5 }}
228
+ errorMessage={templateMessageError && (
229
+ <CapError className="inapp-template-message-error">
230
+ {templateMessageError}
231
+ </CapError>
232
+ )}
233
+ />
234
+ {isMediaTypeImage && (
235
+ <>
236
+ <CapHeading type="h4" className="cover-img">
237
+ {formatMessage(messages.coverImage)}
238
+ </CapHeading>
239
+ <CapImageUpload
240
+ allowedExtensionsRegex={ALLOWED_IMAGE_EXTENSIONS_REGEX}
241
+ imgSize={INAPP_IMG_SIZE}
242
+ uploadAsset={uploadInAppAsset}
243
+ isFullMode={isFullMode}
244
+ imageSrc={inAppImageSrc}
245
+ updateImageSrc={setUpdateInAppImageSrc}
246
+ updateOnReUpload={updateOnInAppImageReUpload}
247
+ index={0}
248
+ className="cap-custom-image-upload"
249
+ key="inapp-uploaded-image"
250
+ imageData={editData}
251
+ channel={INAPP}
252
+ channelSpecificStyle={!isFullMode}
253
+ />
254
+ </>
255
+ )}
256
+ </CapRow>
257
+ </CapRow>
258
+ <CapRow className="inapp-action-link">
259
+ <CapCheckbox onChange={onActionLinkCheckBoxChange} checked={addActionLink} />
260
+ <CapRow className="inapp-render-heading">
261
+ <CapHeader
262
+ title={<CapRow type="flex">
263
+ <CapHeading type="h4">
264
+ {formatMessage(messages.addActionLink)}
265
+ </CapHeading>
266
+ </CapRow>}
267
+ description={<CapLabel type="label3">{formatMessage(messages.addActionLinkDesc)}</CapLabel>}
268
+ />
269
+ {addActionLink && (
270
+ <CapRow className="inapp-action-deep-link">
271
+ <CapHeading type="h4">
272
+ {formatMessage(messages.actionDeepLink)}
273
+ </CapHeading>
274
+ <CapSelect
275
+ id="inapp-add-action-link-type"
276
+ placeholder={formatMessage(messages.deepLinkOptionsPlaceholder)}
277
+ options={deepLink || []}
278
+ value={deepLinkValue}
279
+ onChange={(value) => { setDeepLinkValue(value); }}
280
+ />
281
+ </CapRow>
282
+ )}
283
+ </CapRow>
284
+ </CapRow>
285
+ <CapRow className="inapp-cta-button">
286
+ <CapHeader
287
+ className="inapp-render-heading-cta-button"
288
+ title={<CapRow type="flex">
289
+ <CapHeading type="h4">
290
+ {formatMessage(messages.btnLabel)}
291
+ </CapHeading>
292
+ <CapHeading
293
+ type="h6"
294
+ className="inapp-optional-label"
295
+ >
296
+ {formatMessage(messages.optional)}
297
+ </CapHeading>
298
+ </CapRow>}
299
+ description={<CapLabel type="label3">{formatMessage(messages.btnDesc)}</CapLabel>}
300
+ />
301
+ <CapRadioGroup
302
+ options={BUTTON_RADIO_OPTIONS}
303
+ value={buttonType}
304
+ onChange={onChangeButtonType}
305
+ disabled={!isAndroid}
306
+ className="inapp-btn-radio-group"
307
+ />
308
+ {isBtnTypeCta && (
309
+ <CapInAppCTA
310
+ ctaData={ctaData}
311
+ updateHandler={updateHandler}
312
+ deleteHandler={deleteHandler}
313
+ isEditFlow={isEditFlow}
314
+ deepLink={deepLink || []}
315
+ />
316
+ )}
317
+ </CapRow>
318
+ </>
319
+ );
320
+ };
321
+
322
+ CapDeviceContent.propTypes = {
323
+ intl: intlShape.isRequierd,
324
+ location: PropTypes.string,
325
+ injectedTags: PropTypes.object,
326
+ selectedOfferDetails: PropTypes.array,
327
+ panes: PropTypes.string,
328
+ };
329
+
330
+ export default injectIntl(CapDeviceContent);