@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,50 @@
1
+ @import '~@capillarytech/cap-ui-library/styles/_variables.scss';
2
+
3
+ .cap-inapp-creatives {
4
+ .inapp-template-name-input {
5
+ width: 23.286rem;
6
+ margin-top: $CAP_SPACE_04;
7
+ }
8
+ .inapp-creative-layout {
9
+ margin-top: $CAP_SPACE_24;
10
+ }
11
+
12
+ .inapp-creative-layout-desc {
13
+ font-size: $CAP_SPACE_12;
14
+ color: $CAP_G04;
15
+ }
16
+
17
+ .inapp-layout-radio {
18
+ margin-top: $CAP_SPACE_16;
19
+ font-weight: 500;
20
+ }
21
+
22
+ .inapp-template-device-tab {
23
+ margin-top: $CAP_SPACE_24;
24
+ }
25
+ }
26
+ #inapp-template-name-input {
27
+ height: $CAP_SPACE_40;
28
+ width: 23.286rem;
29
+ margin-top: $CAP_SPACE_04;
30
+ }
31
+ #inapp-title-name-input {
32
+ height: $CAP_SPACE_40;
33
+ }
34
+ .inapp-media-radio .ant-radio-wrapper {
35
+ margin-right: $CAP_SPACE_24;
36
+ }
37
+ .inapp-footer {
38
+ background-color: $CAP_WHITE;
39
+ bottom: 0;
40
+ width: 100%;
41
+ padding: $CAP_SPACE_20 0;
42
+ z-index: 1;
43
+ margin-top: $CAP_SPACE_12;
44
+ .ant-btn {
45
+ margin-right: $CAP_SPACE_16;
46
+ }
47
+ }
48
+ .inapp-footer-lib {
49
+ position: fixed;
50
+ }
@@ -0,0 +1,114 @@
1
+ import { defineMessages } from "react-intl";
2
+
3
+ const prefix = "app.v2Container.InApp";
4
+
5
+ export default defineMessages({
6
+ creativeName: {
7
+ id: `${prefix}.creativeName`,
8
+ defaultMessage: "Creative Name",
9
+ },
10
+ creativeLayout: {
11
+ id: `${prefix}.creativeLayout`,
12
+ defaultMessage: "Creative layout",
13
+ },
14
+ creativeLayoutDesc: {
15
+ id: `${prefix}.creativeLayoutDesc`,
16
+ defaultMessage: "Select how the creative will be displayed on the screen",
17
+ },
18
+ layoutModal: {
19
+ id: `${prefix}.layoutModal`,
20
+ defaultMessage: "Modal",
21
+ },
22
+ layoutTopBanner: {
23
+ id: `${prefix}.layoutTopBanner`,
24
+ defaultMessage: "Top banner",
25
+ },
26
+ layoutBottomBanner: {
27
+ id: `${prefix}.layoutBottomBanner`,
28
+ defaultMessage: "Bottom banner",
29
+ },
30
+ layoutFullScreen: {
31
+ id: `${prefix}.layoutFullScreen`,
32
+ defaultMessage: "Full screen",
33
+ },
34
+ Android: {
35
+ id: `${prefix}.Android`,
36
+ defaultMessage: 'Android',
37
+ },
38
+ Ios: {
39
+ id: `${prefix}.Ios`,
40
+ defaultMessage: 'IOS',
41
+ },
42
+ select: {
43
+ id: `${prefix}.select`,
44
+ defaultMessage: "Select",
45
+ },
46
+ inAppCreateNotification: {
47
+ id: `${prefix}.inAppCreateNotification`,
48
+ defaultMessage: "{name} template created successfully",
49
+ },
50
+ inAppEditNotification: {
51
+ id: `${prefix}.inAppCreateNotification`,
52
+ defaultMessage: "{name} template edited successfully",
53
+ },
54
+ templateNameMinCharacters: {
55
+ id: `${prefix}.templateNameMinCharacters`,
56
+ defaultMessage: 'Template name should contain atleast 3 characters',
57
+ },
58
+ btnDisabledTooltip: {
59
+ id: `${prefix}.btnDisabledTooltip`,
60
+ defaultMessage: 'Please add all mandatory fields to proceed further',
61
+ },
62
+ create: {
63
+ id: `${prefix}.create`,
64
+ defaultMessage: 'Create',
65
+ },
66
+ update: {
67
+ id: `${prefix}.update`,
68
+ defaultMessage: 'Update',
69
+ },
70
+ mediaText: {
71
+ id: `${prefix}.mediaText`,
72
+ defaultMessage: "Text",
73
+ },
74
+ mediaImage: {
75
+ id: `${prefix}.mediaImage`,
76
+ defaultMessage: "Image",
77
+ },
78
+ templateMessageLength: {
79
+ id: `${prefix}.templateMessageLength`,
80
+ defaultMessage: 'Characters count: {currentLength}/{maxLength}',
81
+ },
82
+ templateNameRegexErrorMessage: {
83
+ id: `${prefix}.templateNameRegexErrorMessage`,
84
+ defaultMessage: 'Template name can only contain lowercase alphanumeric characters and underscores',
85
+ },
86
+ btnTypeNone: {
87
+ id: `${prefix}.btnTypeNone`,
88
+ defaultMessage: "None",
89
+ },
90
+ btnTypeCTA: {
91
+ id: `${prefix}.btnTypeCTA`,
92
+ defaultMessage: "Call to action",
93
+ },
94
+ ctaDescription: {
95
+ id: `${prefix}.ctaDescription`,
96
+ defaultMessage:
97
+ "Create a button that lets customers take an action",
98
+ },
99
+ popup: {
100
+ id: `${prefix}.popup`,
101
+ defaultMessage:
102
+ "Pop-up",
103
+ },
104
+ header: {
105
+ id: `${prefix}.header`,
106
+ defaultMessage:
107
+ "Header",
108
+ },
109
+ footer: {
110
+ id: `${prefix}.footer`,
111
+ defaultMessage:
112
+ "Footer",
113
+ },
114
+ });
@@ -0,0 +1,109 @@
1
+ import { fromJS } from 'immutable';
2
+ import {
3
+ INAPP_TEMPLATE_CREATE_REQUEST,
4
+ INAPP_TEMPLATE_CREATE_SUCCESS,
5
+ INAPP_TEMPLATE_CREATE_FAILURE,
6
+ CLEAR_CREATE_RESPONSE_REQUEST,
7
+ GET_INAPP_TEMPLATE_DETAILS_REQUEST,
8
+ GET_INAPP_TEMPLATE_DETAILS_SUCCESS,
9
+ GET_INAPP_TEMPLATE_DETAILS_FAILURE,
10
+ RESET_EDIT_TEMPLATE,
11
+ UPLOAD_INAPP_ASSET_REQUEST,
12
+ UPLOAD_INAPP_ASSET_SUCCESS,
13
+ UPLOAD_INAPP_ASSET_FAILURE,
14
+ CLEAR_INAPP_ASSET,
15
+ INAPP_EDIT_TEMPLATE_REQUEST,
16
+ INAPP_EDIT_TEMPLATE_SUCCESS,
17
+ INAPP_EDIT_TEMPLATE_FAILURE,
18
+ } from './constants';
19
+
20
+ const initialState = fromJS({
21
+ uploadedAssetData: {},
22
+ createTemplateInProgress: false,
23
+ editTemplateInProgress: false,
24
+ });
25
+
26
+ function inAppReducer(state = initialState, action) {
27
+ switch (action.type) {
28
+ case INAPP_TEMPLATE_CREATE_REQUEST:
29
+ return state
30
+ .set('createTemplateInProgress', true)
31
+ .set('createTemplateError', false)
32
+ .set('createTemplateErrorMessage', fromJS(''));
33
+ case INAPP_TEMPLATE_CREATE_SUCCESS:
34
+ return state
35
+ .set('createTemplateInProgress', false)
36
+ .set('response', action.data)
37
+ .set(
38
+ 'createTemplateError',
39
+ action.statusCode !== undefined && action.statusCode > 300,
40
+ )
41
+ .set('createTemplateErrorMessage', fromJS(action.errorMsg));
42
+ case INAPP_TEMPLATE_CREATE_FAILURE:
43
+ return state
44
+ .set('createTemplateInProgress', false)
45
+ .set('createTemplateError', true)
46
+ .set('createTemplateErrorMessage', fromJS(action.errorMsg));
47
+ // FOR EDIT
48
+ case INAPP_EDIT_TEMPLATE_REQUEST:
49
+ return state
50
+ .set('editTemplateInProgress', true)
51
+ .set('editTemplateError', false)
52
+ .set('editTemplateErrorMessage', fromJS(''));
53
+ case INAPP_EDIT_TEMPLATE_SUCCESS:
54
+ return state
55
+ .set('editTemplateInProgress', false)
56
+ .set('editResponse', action.data)
57
+ .set('editTemplateError', action.statusCode !== undefined && action.statusCode > 300)
58
+ .set('editTemplateErrorMessage', fromJS(action.errorMsg));
59
+ case INAPP_EDIT_TEMPLATE_FAILURE:
60
+ return state
61
+ .set('editTemplateInProgress', false)
62
+ .set('editTemplateError', true)
63
+ .set('editTemplateErrorMessage', fromJS(action.errorMsg));
64
+ case CLEAR_CREATE_RESPONSE_REQUEST:
65
+ return state.set('response', {});
66
+ // FOR EDIT
67
+ case GET_INAPP_TEMPLATE_DETAILS_REQUEST:
68
+ return state.set('getTemplateDetailsInProgress', true);
69
+ case GET_INAPP_TEMPLATE_DETAILS_SUCCESS:
70
+ return state
71
+ .set('getTemplateDetailsInProgress', false)
72
+ .set('templateDetails', action.data);
73
+ case GET_INAPP_TEMPLATE_DETAILS_FAILURE:
74
+ return state.set('getTemplateDetailsInProgress', false);
75
+ case RESET_EDIT_TEMPLATE:
76
+ return state.set('templateDetails', {});
77
+ case UPLOAD_INAPP_ASSET_REQUEST:
78
+ return state.set('uploadAssetSuccess', false).set('assetUploading', true);
79
+ case UPLOAD_INAPP_ASSET_SUCCESS:
80
+ return state
81
+ .set(
82
+ 'uploadAssetSuccess',
83
+ action.statusCode !== undefined &&
84
+ action.statusCode !== '' &&
85
+ action.statusCode < 300,
86
+ )
87
+ .set('assetUploading', false)
88
+ .set(
89
+ action.templateType !== undefined
90
+ ? `uploadedAssetData${action.templateType}`
91
+ : 'uploadedAssetData',
92
+ action.data,
93
+ );
94
+ case UPLOAD_INAPP_ASSET_FAILURE:
95
+ return state
96
+ .set('uploadAssetSuccess', false)
97
+ .set('assetUploading', false);
98
+ case CLEAR_INAPP_ASSET:
99
+ return state.delete(
100
+ action.templateType !== undefined
101
+ ? `uploadedAssetData${action.templateType}`
102
+ : 'uploadedAssetData',
103
+ );
104
+ default:
105
+ return state;
106
+ }
107
+ }
108
+
109
+ export default inAppReducer;
@@ -0,0 +1,151 @@
1
+ import { take, cancel, call, put, takeLatest, all } from 'redux-saga/effects';
2
+ import * as Api from '../../services/api';
3
+ import {
4
+ INAPP_TEMPLATE_CREATE_REQUEST,
5
+ INAPP_TEMPLATE_CREATE_SUCCESS,
6
+ INAPP_TEMPLATE_CREATE_FAILURE,
7
+ UPLOAD_INAPP_ASSET_REQUEST,
8
+ UPLOAD_INAPP_ASSET_SUCCESS,
9
+ UPLOAD_INAPP_ASSET_FAILURE,
10
+ INAPP_EDIT_TEMPLATE_SUCCESS,
11
+ INAPP_EDIT_TEMPLATE_FAILURE,
12
+ INAPP_EDIT_TEMPLATE_REQUEST,
13
+ GET_INAPP_TEMPLATE_DETAILS_SUCCESS,
14
+ GET_INAPP_TEMPLATE_DETAILS_FAILURE,
15
+ GET_INAPP_TEMPLATE_DETAILS_REQUEST,
16
+ } from './constants';
17
+ import { INAPP } from '../CreativesContainer/constants';
18
+
19
+ export function* uploadInAppAsset(params) {
20
+ try {
21
+ const result = yield call(Api.uploadFile, params);
22
+ yield put({
23
+ type: UPLOAD_INAPP_ASSET_SUCCESS,
24
+ data: result?.response?.asset,
25
+ statusCode: result?.status?.code || '',
26
+ templateType: params.templateType,
27
+ });
28
+ } catch (error) {
29
+ yield put({ type: UPLOAD_INAPP_ASSET_FAILURE, error });
30
+ }
31
+ }
32
+ export function* watchUploadInAppAsset() {
33
+ yield takeLatest(
34
+ UPLOAD_INAPP_ASSET_REQUEST,
35
+ uploadInAppAsset,
36
+ );
37
+
38
+
39
+ }
40
+
41
+ export function* inAppTemplateCreate({ payload, callback }) {
42
+ let errorMsg;
43
+ try {
44
+ const result = yield call(Api.createChannelWiseTemplate, { channel: INAPP, template: payload });
45
+ if (result?.status?.code && result.status.code >= 400) {
46
+ errorMsg = result?.message || result.status.code;
47
+ throw errorMsg;
48
+ }
49
+ yield put({
50
+ type: INAPP_TEMPLATE_CREATE_SUCCESS,
51
+ data: result.response,
52
+ statusCode: result.status ? result.status.code : '',
53
+ errorMsg,
54
+ });
55
+ if (callback) {
56
+ callback(result.response);
57
+ }
58
+ } catch (error) {
59
+ yield put({
60
+ type: INAPP_TEMPLATE_CREATE_FAILURE,
61
+ error,
62
+ errorMsg,
63
+ });
64
+ if (callback) {
65
+ callback(null, errorMsg);
66
+ }
67
+ }
68
+ }
69
+
70
+ export function* watchCreateTemplate() {
71
+ yield takeLatest(
72
+ INAPP_TEMPLATE_CREATE_REQUEST,
73
+ inAppTemplateCreate,
74
+ );
75
+
76
+
77
+ }
78
+
79
+ // FOR EDIT
80
+ export function* editTemplate({ payload, callback }) {
81
+ let errorMsg;
82
+ try {
83
+ const result = yield call(Api.createChannelWiseTemplate, { channel: INAPP, template: payload });
84
+ if (result.status.code >= 400) {
85
+ errorMsg = result.message || result.status.code;
86
+ throw errorMsg;
87
+ }
88
+ yield put({
89
+ type: INAPP_EDIT_TEMPLATE_SUCCESS,
90
+ data: result.response,
91
+ statusCode: result?.status?.code || '',
92
+ errorMsg,
93
+ });
94
+ if (callback) {
95
+ callback(result.response);
96
+ }
97
+ } catch (error) {
98
+ yield put({ type: INAPP_EDIT_TEMPLATE_FAILURE, error, errorMsg });
99
+ if (callback) {
100
+ callback(null, errorMsg);
101
+ }
102
+ }
103
+ }
104
+ export function* watchEditTemplate() {
105
+ yield takeLatest(INAPP_EDIT_TEMPLATE_REQUEST, editTemplate);
106
+
107
+
108
+ }
109
+
110
+ export function* getTemplateDetails({ id, callback }) {
111
+ try {
112
+ const result = yield call(Api.getTemplateDetails, {
113
+ id,
114
+ channel: INAPP,
115
+ });
116
+ yield put({
117
+ type: GET_INAPP_TEMPLATE_DETAILS_SUCCESS,
118
+ data: result.response,
119
+ });
120
+ if (callback) {
121
+ callback(false);
122
+ }
123
+ } catch (error) {
124
+ yield put({ type: GET_INAPP_TEMPLATE_DETAILS_FAILURE, error });
125
+ }
126
+ }
127
+
128
+ export function* watchGetTemplateDetails() {
129
+ yield takeLatest(
130
+ GET_INAPP_TEMPLATE_DETAILS_REQUEST,
131
+ getTemplateDetails,
132
+ );
133
+
134
+
135
+ }
136
+
137
+ export default [
138
+ watchCreateTemplate,
139
+ watchGetTemplateDetails,
140
+ watchUploadInAppAsset,
141
+ watchEditTemplate,
142
+ ];
143
+
144
+ export function* v2InAppSagas() {
145
+ yield all([
146
+ watchCreateTemplate(),
147
+ watchGetTemplateDetails(),
148
+ watchUploadInAppAsset(),
149
+ watchEditTemplate(),
150
+ ]);
151
+ }
@@ -0,0 +1,12 @@
1
+ import { createSelector } from 'reselect';
2
+
3
+ const selectInAppDomain = () => (state) => state.get('inapp');
4
+ const selectAccountDomain = () => (state) => state.get('templates');
5
+
6
+ const makeSelectInApp = () =>
7
+ createSelector(selectInAppDomain(), (substate) => substate?.toJS());
8
+
9
+ const makeSelectAccount = () =>
10
+ createSelector(selectAccountDomain(), (substate) => substate.toJS());
11
+
12
+ export { makeSelectInApp, makeSelectAccount };
@@ -0,0 +1,53 @@
1
+ import * as types from "../constants";
2
+ import * as actions from "../actions";
3
+
4
+ describe("Test inapp actions", () => {
5
+ it("has a type of INAPP_TEMPLATE_CREATE_REQUEST action", () => {
6
+ const payload = {};
7
+ const expected = {
8
+ type: types.INAPP_TEMPLATE_CREATE_REQUEST,
9
+ payload,
10
+ };
11
+ expect(actions.createInAppTemplate(payload)).toEqual(expected);
12
+ });
13
+
14
+ it("has a type of CLEAR_CREATE_RESPONSE_REQUEST action", () => {
15
+ const expected = {
16
+ type: types.CLEAR_CREATE_RESPONSE_REQUEST,
17
+ };
18
+ expect(actions.clearCreateResponse()).toEqual(expected);
19
+ });
20
+ it("has a type of INAPP_EDIT_TEMPLATE_REQUEST action", () => {
21
+ const expected = {
22
+ type: types.INAPP_EDIT_TEMPLATE_REQUEST,
23
+ };
24
+ expect(actions.editTemplate()).toEqual(expected);
25
+ });
26
+ it("has a type of RESET_EDIT_TEMPLATE action", () => {
27
+ const expected = {
28
+ type: types.RESET_EDIT_TEMPLATE,
29
+ };
30
+ expect(actions.resetEditTemplate()).toEqual(expected);
31
+ });
32
+ it("has a type of GET_INAPP_TEMPLATE_DETAILS_REQUEST action", () => {
33
+ const expected = {
34
+ type: types.GET_INAPP_TEMPLATE_DETAILS_REQUEST,
35
+ callback: undefined,
36
+ channel: "INAPP",
37
+ id: undefined,
38
+ };
39
+ expect(actions.getTemplateDetails()).toEqual(expected);
40
+ });
41
+ it("has a type of UPLOAD_INAPP_ASSET_REQUEST action", () => {
42
+ const expected = {
43
+ type: types.UPLOAD_INAPP_ASSET_REQUEST,
44
+ };
45
+ expect(actions.uploadInAppAsset()).toEqual(expected);
46
+ });
47
+ it("has a type of CLEAR_INAPP_ASSET action", () => {
48
+ const expected = {
49
+ type: types.CLEAR_INAPP_ASSET,
50
+ };
51
+ expect(actions.clearInAppAsset()).toEqual(expected);
52
+ });
53
+ });
@@ -0,0 +1,165 @@
1
+ import React from 'react';
2
+ import { injectIntl } from 'react-intl';
3
+ import '@testing-library/jest-dom';
4
+ import { Provider } from 'react-redux';
5
+ import { configureStore } from '@capillarytech/vulcan-react-sdk/utils';
6
+ import { createBrowserHistory } from 'history';
7
+ import { initialReducer } from '../../../initialReducer';
8
+ import { InApp } from '../index';
9
+ import { render, screen, fireEvent, within } from '../../../utils/test-utils';
10
+ import {
11
+ editData,
12
+ accountData,
13
+ location,
14
+ editData1,
15
+ location1,
16
+ } from './mockData';
17
+ import { metaEntities, getDefaultTags, injectedTags } from '../../Zalo/tests/mockData';
18
+ import { getCtaObject } from '../utils';
19
+
20
+ const mockActions = {
21
+ getTemplateInfoById: jest.fn(),
22
+ resetEditTemplate: jest.fn(),
23
+ getTemplateDetails: jest.fn(),
24
+ editTemplate: jest.fn(),
25
+ };
26
+ const mockGlobalActions = {
27
+ fetchSchemaForEntity: jest.fn(),
28
+ };
29
+
30
+ let store;
31
+ let browserHistory = createBrowserHistory();
32
+ beforeAll(() => {
33
+ store = configureStore({}, initialReducer, browserHistory);
34
+ });
35
+
36
+ const ComponentToRender = injectIntl(InApp);
37
+ const renderComponent = (props) =>
38
+ render(
39
+ <Provider store={store}>
40
+ <ComponentToRender {...props} />
41
+ </Provider>,
42
+ );
43
+
44
+ describe('Test activity inApp container', () => {
45
+ it('test case for inApp template update flow', async () => {
46
+ renderComponent({
47
+ actions: mockActions,
48
+ globalActions: mockGlobalActions,
49
+ location,
50
+ editData,
51
+ accountData,
52
+ isFullMode: true,
53
+ params: { id: 'test'},
54
+ });
55
+ const inputBox = await screen.findAllByPlaceholderText(
56
+ 'Enter template name',
57
+ );
58
+ fireEvent.change(inputBox[0], { target: { value: 'Hello, welcome' } });
59
+ inputBox[0].focus();
60
+ const iosTab = screen.getByRole('tab', {
61
+ name: /ios/i,
62
+ });
63
+ fireEvent.click(within(iosTab).getByText(/ios/i));
64
+ const androidTab = screen.getByRole('tab', {
65
+ name: /android/i,
66
+ });
67
+ fireEvent.click(within(androidTab).getByText(/android/i));
68
+ const inputNameBox = await screen.findAllByPlaceholderText(
69
+ 'Enter template name',
70
+ );
71
+ fireEvent.change(inputNameBox[0], { target: { value: 'Hello, welcome' } });
72
+ const msgBox = screen.getAllByPlaceholderText(/Please input in-app notification message content/i);
73
+ msgBox[0].focus();
74
+ fireEvent.change(msgBox[0], { target: { value: 'val' }});
75
+ const updateBtn = screen.getByRole('button', {
76
+ name: /update/i,
77
+ });
78
+ expect(updateBtn).toBeEnabled();
79
+ fireEvent.click(updateBtn);
80
+ expect(mockActions.editTemplate).toBeCalled();
81
+ });
82
+ it('test case for inApp template configuration', async () => {
83
+ renderComponent({
84
+ actions: mockActions,
85
+ globalActions: mockGlobalActions,
86
+ location: location1,
87
+ templateData: editData1?.templateDetails,
88
+ accountData,
89
+ isFullMode: false,
90
+ params: { id: 'test'},
91
+ getFormData: jest.fn(),
92
+ });
93
+ const iosTab = screen.getByRole('tab', {
94
+ name: /ios/i,
95
+ });
96
+ fireEvent.click(within(iosTab).getByText(/ios/i));
97
+ const androidTab = screen.getByRole('tab', {
98
+ name: /android/i,
99
+ });
100
+ fireEvent.click(within(androidTab).getByText(/android/i));
101
+ const msgBox = screen.getAllByPlaceholderText(/Please input in-app notification message content/i);
102
+ msgBox[0].focus();
103
+ fireEvent.change(msgBox[0], { target: { value: 'val' }});
104
+ const doneBtn = screen.getByRole('button', {
105
+ name: /done/i,
106
+ });
107
+ expect(doneBtn).toBeEnabled();
108
+ });
109
+ it('test case for inApp template copy content flow', async () => {
110
+ renderComponent({
111
+ actions: mockActions,
112
+ globalActions: mockGlobalActions,
113
+ location: {
114
+ pathname: '/inapp/edit',
115
+ query: {
116
+ type: false,
117
+ module: 'default',
118
+ },
119
+ search: '',
120
+ },
121
+ editData: editData1,
122
+ metaEntities,
123
+ getDefaultTags,
124
+ injectedTags,
125
+ accountData,
126
+ isFullMode: true,
127
+ params: { id: 'test'},
128
+ });
129
+ const layoutOption = screen.getByText(/top banner/i);
130
+ fireEvent.click(layoutOption);
131
+ const copyLink = screen.getByRole('link', {
132
+ name: /copy title and content from ios/i,
133
+ });
134
+ fireEvent.click(copyLink);
135
+ const iosTab = screen.getByRole('tab', {
136
+ name: /ios/i,
137
+ });
138
+ fireEvent.click(within(iosTab).getByText(/ios/i));
139
+ const copyLinkIos = screen.getByRole('link', {
140
+ name: /copy title and content from android/i,
141
+ });
142
+ fireEvent.click(copyLinkIos);
143
+ expect(copyLink).toBeInTheDocument();
144
+ });
145
+ });
146
+ describe('test for getCtaObject function', () => {
147
+ it('getCtaObject function', () => {
148
+ const response = getCtaObject([{ type: "DEEP_LINK", actionText: "btn", actionLink: "url" }]);
149
+ expect(response).toEqual([{
150
+ index: 0,
151
+ text: "btn",
152
+ url: "url",
153
+ urlType: "DEEP_LINK",
154
+ isSaved: true,
155
+ }]);
156
+ const responseDefault = getCtaObject([{}]);
157
+ expect(responseDefault).toEqual([{
158
+ index: 0,
159
+ text: "",
160
+ url: "",
161
+ urlType: "",
162
+ isSaved: true,
163
+ }]);
164
+ });
165
+ });