@capillarytech/creatives-library 8.0.259 → 8.0.260-alpha.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 (157) hide show
  1. package/assets/Android.png +0 -0
  2. package/assets/iOS.png +0 -0
  3. package/constants/unified.js +1 -2
  4. package/initialReducer.js +0 -2
  5. package/package.json +1 -1
  6. package/services/api.js +0 -10
  7. package/services/tests/api.test.js +0 -34
  8. package/translations/en.json +3 -4
  9. package/utils/common.js +0 -12
  10. package/utils/commonUtils.js +5 -28
  11. package/utils/tests/commonUtil.test.js +0 -224
  12. package/utils/transformTemplateConfig.js +10 -0
  13. package/v2Components/CapDeviceContent/index.js +56 -61
  14. package/v2Components/CapTagList/index.js +1 -6
  15. package/v2Components/CapTagListWithInput/index.js +1 -5
  16. package/v2Components/CapTagListWithInput/messages.js +1 -1
  17. package/v2Components/CapWhatsappCTA/tests/index.test.js +0 -5
  18. package/v2Components/ErrorInfoNote/index.js +72 -457
  19. package/v2Components/ErrorInfoNote/messages.js +6 -36
  20. package/v2Components/ErrorInfoNote/style.scss +6 -282
  21. package/v2Components/FormBuilder/index.js +4 -4
  22. package/v2Components/FormBuilder/tests/index.test.js +4 -13
  23. package/v2Components/HtmlEditor/HTMLEditor.js +94 -547
  24. package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +133 -1441
  25. package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +16 -27
  26. package/v2Components/HtmlEditor/_htmlEditor.scss +45 -108
  27. package/v2Components/HtmlEditor/_index.lazy.scss +1 -0
  28. package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +102 -23
  29. package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +140 -148
  30. package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +1 -2
  31. package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
  32. package/v2Components/HtmlEditor/components/EditorToolbar/_editorToolbar.scss +0 -9
  33. package/v2Components/HtmlEditor/components/EditorToolbar/index.js +4 -4
  34. package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +0 -22
  35. package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +7 -4
  36. package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +45 -35
  37. package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +3 -1
  38. package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
  39. package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +6 -7
  40. package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +6 -3
  41. package/v2Components/HtmlEditor/components/PreviewPane/index.js +43 -22
  42. package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
  43. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +152 -0
  44. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/_validationErrorDisplay.scss +0 -1
  45. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +31 -49
  46. package/v2Components/HtmlEditor/components/ValidationPanel/_validationPanel.scss +34 -50
  47. package/v2Components/HtmlEditor/components/ValidationPanel/index.js +41 -70
  48. package/v2Components/HtmlEditor/constants.js +20 -42
  49. package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +16 -373
  50. package/v2Components/HtmlEditor/hooks/__tests__/useValidation.test.js +16 -120
  51. package/v2Components/HtmlEditor/hooks/useEditorContent.js +2 -5
  52. package/v2Components/HtmlEditor/hooks/useInAppContent.js +146 -88
  53. package/v2Components/HtmlEditor/hooks/useValidation.js +53 -189
  54. package/v2Components/HtmlEditor/index.js +1 -1
  55. package/v2Components/HtmlEditor/messages.js +94 -92
  56. package/v2Components/HtmlEditor/utils/__tests__/htmlValidator.enhanced.test.js +45 -94
  57. package/v2Components/HtmlEditor/utils/__tests__/validationAdapter.test.js +0 -134
  58. package/v2Components/HtmlEditor/utils/contentSanitizer.js +41 -40
  59. package/v2Components/HtmlEditor/utils/htmlValidator.js +72 -71
  60. package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +102 -134
  61. package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +25 -23
  62. package/v2Components/HtmlEditor/utils/validationAdapter.js +41 -66
  63. package/v2Components/MobilePushPreviewV2/index.js +7 -32
  64. package/v2Components/TemplatePreview/_templatePreview.scss +24 -55
  65. package/v2Components/TemplatePreview/index.js +32 -47
  66. package/v2Components/TemplatePreview/messages.js +0 -4
  67. package/v2Components/TestAndPreviewSlidebox/_testAndPreviewSlidebox.scss +0 -1
  68. package/v2Containers/BeeEditor/index.js +90 -172
  69. package/v2Containers/Cap/tests/__snapshots__/index.test.js.snap +3 -4
  70. package/v2Containers/CreativesContainer/SlideBoxContent.js +52 -128
  71. package/v2Containers/CreativesContainer/SlideBoxFooter.js +13 -163
  72. package/v2Containers/CreativesContainer/SlideBoxHeader.js +1 -2
  73. package/v2Containers/CreativesContainer/constants.js +0 -1
  74. package/v2Containers/CreativesContainer/index.js +46 -240
  75. package/v2Containers/CreativesContainer/messages.js +0 -8
  76. package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +2 -11
  77. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +50 -38
  78. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +0 -106
  79. package/v2Containers/Email/actions.js +0 -7
  80. package/v2Containers/Email/constants.js +1 -5
  81. package/v2Containers/Email/index.js +30 -239
  82. package/v2Containers/Email/messages.js +0 -32
  83. package/v2Containers/Email/reducer.js +1 -12
  84. package/v2Containers/Email/sagas.js +7 -61
  85. package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +0 -2
  86. package/v2Containers/Email/tests/reducer.test.js +0 -46
  87. package/v2Containers/Email/tests/sagas.test.js +29 -320
  88. package/v2Containers/EmailWrapper/components/EmailWrapperView.js +21 -211
  89. package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +74 -40
  90. package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +67 -2
  91. package/v2Containers/EmailWrapper/constants.js +0 -2
  92. package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +77 -629
  93. package/v2Containers/EmailWrapper/index.js +23 -103
  94. package/v2Containers/EmailWrapper/messages.js +1 -65
  95. package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +214 -0
  96. package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +77 -594
  97. package/v2Containers/InApp/actions.js +0 -7
  98. package/v2Containers/InApp/constants.js +4 -20
  99. package/v2Containers/InApp/index.js +360 -804
  100. package/v2Containers/InApp/index.scss +3 -4
  101. package/v2Containers/InApp/messages.js +3 -7
  102. package/v2Containers/InApp/reducer.js +3 -21
  103. package/v2Containers/InApp/sagas.js +9 -29
  104. package/v2Containers/InApp/selectors.js +5 -25
  105. package/v2Containers/InApp/tests/index.test.js +71 -152
  106. package/v2Containers/InApp/tests/reducer.test.js +0 -34
  107. package/v2Containers/InApp/tests/sagas.test.js +9 -61
  108. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +12 -39
  109. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +6 -10
  110. package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +75 -102
  111. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +54 -81
  112. package/v2Containers/MobilePushNew/index.js +2 -3
  113. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +178 -262
  114. package/v2Containers/SmsTrai/Create/tests/__snapshots__/index.test.js.snap +12 -16
  115. package/v2Containers/SmsTrai/Edit/index.js +1 -2
  116. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +111 -468
  117. package/v2Containers/TagList/index.js +19 -62
  118. package/v2Containers/Templates/_templates.scss +1 -60
  119. package/v2Containers/Templates/index.js +4 -89
  120. package/v2Containers/Templates/messages.js +0 -4
  121. package/v2Containers/WebPush/Create/messages.js +8 -0
  122. package/v2Containers/WebPush/Create/preview/PreviewControls.js +2 -2
  123. package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +3 -1
  124. package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +5 -1
  125. package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +5 -1
  126. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +5 -1
  127. package/v2Containers/WebPush/Create/preview/preview.scss +7 -0
  128. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +734 -1306
  129. package/v2Components/ErrorInfoNote/constants.js +0 -1
  130. package/v2Components/HtmlEditor/__tests__/HTMLEditor.apiErrors.test.js +0 -874
  131. package/v2Components/HtmlEditor/components/ValidationPanel/constants.js +0 -6
  132. package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +0 -255
  133. package/v2Components/HtmlEditor/components/ValidationTabs/index.js +0 -364
  134. package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +0 -51
  135. package/v2Components/HtmlEditor/utils/validationConstants.js +0 -40
  136. package/v2Containers/BeePopupEditor/_beePopupEditor.scss +0 -14
  137. package/v2Containers/BeePopupEditor/constants.js +0 -10
  138. package/v2Containers/BeePopupEditor/index.js +0 -194
  139. package/v2Containers/BeePopupEditor/tests/index.test.js +0 -627
  140. package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +0 -1285
  141. package/v2Containers/EmailWrapper/components/__tests__/EmailHTMLEditor.test.js +0 -1880
  142. package/v2Containers/EmailWrapper/components/__tests__/EmailWrapperView.test.js +0 -520
  143. package/v2Containers/EmailWrapper/tests/useEmailWrapper.edgeCases.test.js +0 -643
  144. package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +0 -376
  145. package/v2Containers/InApp/__tests__/sagas.test.js +0 -363
  146. package/v2Containers/InApp/tests/selectors.test.js +0 -612
  147. package/v2Containers/InAppWrapper/components/InAppWrapperView.js +0 -151
  148. package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +0 -267
  149. package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +0 -23
  150. package/v2Containers/InAppWrapper/constants.js +0 -16
  151. package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +0 -473
  152. package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +0 -198
  153. package/v2Containers/InAppWrapper/index.js +0 -148
  154. package/v2Containers/InAppWrapper/messages.js +0 -49
  155. package/v2Containers/InappAdvance/index.js +0 -1099
  156. package/v2Containers/InappAdvance/index.scss +0 -10
  157. package/v2Containers/InappAdvance/tests/index.test.js +0 -448
@@ -26,7 +26,7 @@ import * as globalActions from '../Cap/actions';
26
26
  import './_email.scss';
27
27
  import {getMessageObject} from '../../utils/messageUtils';
28
28
  import EmailPreview from '../../v2Components/EmailPreview';
29
- import { getDecodedFileName ,hasLiquidSupportFeature} from '../../utils/common';
29
+ import { getDecodedFileName } from '../../utils/common';
30
30
  import Pagination from '../../v2Components/Pagination';
31
31
  import * as creativesContainerActions from '../CreativesContainer/actions';
32
32
  import withCreatives from '../../hoc/withCreatives';
@@ -167,7 +167,6 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
167
167
  deleteLanguage: this.deleteLanguage,
168
168
  },
169
169
  };
170
- this.liquidFlow = hasLiquidSupportFeature();
171
170
  }
172
171
  componentWillMount() {
173
172
  const formData = this.initFormData(this.props, true); //_.cloneDeep(this.state.formData);
@@ -207,31 +206,13 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
207
206
  const isBEESupport = (this.props.location.query.isBEESupport !== "false") || false;
208
207
  const isBEEAppEnable = this.checkBeeEditorAllowedForLibrary();
209
208
  if (!_.isEmpty(this.props.Templates.BEETemplate)) {
210
- const isDragDrop = this.props.Templates.BEETemplate.versions?.base?.is_drag_drop;
211
-
212
- if (isDragDrop && isBEEAppEnable ) {
209
+ if (this.props.Templates.BEETemplate.versions.base.is_drag_drop && isBEEAppEnable ) {
213
210
  this.setState({isDragDrop: true});
214
211
  }
215
212
  if (this.props.params.id) {
216
- // Extract drag_drop_id - check multiple possible paths
217
- const activeTab = this.props.Templates.BEETemplate.versions?.base?.activeTab || 'en';
218
- const activeTabData = this.props.Templates.BEETemplate.versions?.base?.[activeTab] || {};
219
- const dragDropId = activeTabData.drag_drop_id
220
- || activeTabData.id
221
- || _.get(this.props.Templates.BEETemplate, 'versions.base.drag_drop_id')
222
- || _.get(this.props.Templates.BEETemplate, 'versions.base.id')
223
- || this.props.Templates.BEETemplate?._id;
224
- this.props.actions.getCmsSetting(BEE_PLUGIN, dragDropId, 'open', undefined, isBEESupport, isBEEAppEnable);
213
+ this.props.actions.getCmsSetting(BEE_PLUGIN, _.get(this.props.Templates.BEETemplate, 'versions.base.drag_drop_id', this.props.Templates.BEETemplate?._id), 'open', undefined, isBEESupport, isBEEAppEnable);
225
214
  } else if (this.props.location.query.module !== "library" || (this.props.location.query.module === "library" && !this.props.templateData)) {
226
- // Extract drag_drop_id - check multiple possible paths
227
- const activeTab = this.props.Templates.BEETemplate.versions?.base?.activeTab || 'en';
228
- const activeTabData = this.props.Templates.BEETemplate.versions?.base?.[activeTab] || {};
229
- const dragDropId = activeTabData.drag_drop_id
230
- || activeTabData.id
231
- || _.get(this.props.Templates.BEETemplate, 'versions.base.drag_drop_id')
232
- || _.get(this.props.Templates.BEETemplate, 'versions.base.id')
233
- || this.props.Templates.BEETemplate?._id;
234
- this.props.actions.getCmsSetting(BEE_PLUGIN, dragDropId, 'create', undefined, isBEESupport, isBEEAppEnable);
215
+ this.props.actions.getCmsSetting(BEE_PLUGIN, _.get(this.props.Templates.BEETemplate, 'versions.base.drag_drop_id', this.props.Templates.BEETemplate?._id), 'create', undefined, isBEESupport, isBEEAppEnable);
235
216
  }
236
217
  }
237
218
  this.setState({ content: (this.props.Templates.selectedEmailLayout ? this.props.Templates.selectedEmailLayout : ''), formData});
@@ -247,59 +228,17 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
247
228
  layout: 'EMAIL',
248
229
  type: 'LAYOUT',
249
230
  version: 'v2',
250
- liquidFlow:this.liquidFlow,
251
231
  };
252
232
  this.props.globalActions.fetchSchemaForEntity(query);
253
233
  window.addEventListener("message", this.handleFrameTasks);
254
234
  if (this.props.location.query.type === 'embedded') {
255
235
  this.showNext();
256
236
  }
257
-
258
- // Check if BEETemplate was set after componentWillMount but before componentDidMount
259
- // This can happen if BEETemplate is set asynchronously
260
- if (!_.isEmpty(this.props.Templates.BEETemplate) && !this.state.isDragDrop) {
261
- const isBEESupport = (this.props.location.query.isBEESupport !== "false") || false;
262
- const isBEEAppEnable = this.checkBeeEditorAllowedForLibrary();
263
- const beeTemplate = this.props.Templates.BEETemplate;
264
- const activeTab = beeTemplate.versions?.base?.activeTab || 'en';
265
- const activeTabData = beeTemplate.versions?.base?.[activeTab] || {};
266
- const isDragDrop = activeTabData.is_drag_drop
267
- || beeTemplate.versions?.base?.is_drag_drop
268
- || beeTemplate.base?.is_drag_drop
269
- || beeTemplate.is_drag_drop;
270
-
271
- if (isDragDrop && isBEEAppEnable) {
272
- this.setState({isDragDrop: true});
273
-
274
- const dragDropId = activeTabData.drag_drop_id
275
- || activeTabData.id
276
- || _.get(beeTemplate, 'versions.base.drag_drop_id')
277
- || _.get(beeTemplate, 'versions.base.id')
278
- || beeTemplate._id;
279
-
280
- if (this.props.params.id) {
281
- const activeTabForLang = beeTemplate.versions?.base?.activeTab || 'en';
282
- this.props.actions.getCmsSetting(BEE_PLUGIN, dragDropId, 'open', activeTabForLang, isBEESupport, isBEEAppEnable);
283
- } else {
284
- this.props.actions.getCmsSetting(BEE_PLUGIN, dragDropId, 'create', undefined, isBEESupport, isBEEAppEnable);
285
- }
286
- }
287
- }
288
237
  }
289
238
 
290
239
 
291
- checkBeeEditorAllowedForLibrary = (props = null) => {
292
- // Allow passing props for use in componentWillReceiveProps (to use nextProps)
293
- const componentProps = props || this.props;
294
- const { isFullMode = false, editor, Email } = componentProps || {};
295
- // IMPORTANT: For isBEEAppEnable API parameter, use API response if available
296
- // This ensures consistent behavior across full mode and library mode
297
- // The API response (Email.isBeeEnabled) represents the actual org setting
298
- if (Email?.isBeeEnabled !== undefined && Email?.isBeeEnabled !== null) {
299
- return Email.isBeeEnabled;
300
- }
301
- // Fallback to mode-based logic for UI purposes (editor selection, etc.)
302
- // But for API calls, this should ideally use the API response
240
+ checkBeeEditorAllowedForLibrary = () => {
241
+ const { isFullMode = false, editor } = this.props || {};
303
242
  if ((editor === "BEE" && !isFullMode) || isFullMode) {
304
243
  return true;
305
244
  }
@@ -332,7 +271,6 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
332
271
  type: 'TAG',
333
272
  context: this.props.location.query.type === 'embedded' ? this.props.location.query.module : 'default',
334
273
  embedded: this.props.location.query.type === 'embedded' ? this.props.location.query.type : 'full',
335
- liquidFlow:this.liquidFlow
336
274
  };
337
275
  if (this.props.getDefaultTags) {
338
276
  query.context = this.props.getDefaultTags;
@@ -400,61 +338,9 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
400
338
  // this.props.globalActions.fetchSchemaForEntity(query);
401
339
  // }
402
340
 
403
- // Check if BEETemplate was just set (for new flow when template details load)
404
- // This handles the case where BEETemplate is set after componentWillMount
405
- const wasBEETemplateEmpty = _.isEmpty(this.props.Templates.BEETemplate);
406
- const isBEETemplateNowSet = !_.isEmpty(nextProps.Templates.BEETemplate);
407
- const isBEEAppEnable = this.checkBeeEditorAllowedForLibrary(nextProps);
408
- const isBEESupport = (nextProps.location.query.isBEESupport !== "false") || false;
409
-
410
- if (wasBEETemplateEmpty && isBEETemplateNowSet && isBEEAppEnable) {
411
- const beeTemplate = nextProps.Templates.BEETemplate;
412
- const isDragDrop = beeTemplate.versions?.base?.is_drag_drop
413
- || beeTemplate.versions?.base?.[beeTemplate.versions?.base?.activeTab || 'en']?.is_drag_drop
414
- || beeTemplate.base?.is_drag_drop
415
- || beeTemplate.is_drag_drop;
416
-
417
- // Check if we're in edit mode - check multiple sources for id
418
- const hasParamsId = nextProps.params?.id
419
- || nextProps.location?.query?.id
420
- || nextProps.location?.params?.id
421
- || (nextProps.location?.pathname && nextProps.location.pathname.includes('/edit/'));
422
-
423
- if (isDragDrop) {
424
- this.setState({isDragDrop: true});
425
-
426
- // Extract drag_drop_id - check multiple possible paths
427
- // Priority: versions.base[activeTab].drag_drop_id > versions.base[activeTab].id > versions.base.drag_drop_id > _id
428
- const activeTab = beeTemplate.versions?.base?.activeTab || 'en';
429
- const activeTabData = beeTemplate.versions?.base?.[activeTab] || {};
430
- let dragDropId = activeTabData.drag_drop_id
431
- || activeTabData.id
432
- || beeTemplate.versions?.base?.drag_drop_id
433
- || beeTemplate.versions?.base?.id
434
- || beeTemplate.base?.drag_drop_id
435
- || beeTemplate.base?.id
436
- || beeTemplate._id;
437
-
438
- // Call getCmsSetting for BEE template - use 'open' mode if in edit mode
439
- // Extract langId from active tab
440
- const activeTabForLang = beeTemplate.versions?.base?.activeTab || 'en';
441
- if (hasParamsId) {
442
- this.props.actions.getCmsSetting(BEE_PLUGIN, dragDropId, 'open', activeTabForLang, isBEESupport, isBEEAppEnable);
443
- } else if (nextProps.location.query.module !== "library" || (nextProps.location.query.module === "library" && !nextProps.templateData)) {
444
- this.props.actions.getCmsSetting(BEE_PLUGIN, dragDropId, 'create', undefined, isBEESupport, isBEEAppEnable);
445
- }
446
- }
447
- }
448
-
449
341
  if (this.state.isEdit && !this.state.editDataSet && !_.isEmpty(nextProps.Email.templateDetails) && !_.isEmpty(this.state.schema)) {
450
342
  this.setState({editDataSet: true}, () => {
451
343
  this.setEditData(nextProps.Email.templateDetails);
452
- // Update template name in parent if available
453
- if (this.props.isFullMode && this.props.showTemplateName && nextProps.Email.templateDetails.name) {
454
- const formData = this.state.formData;
455
- formData['template-name'] = nextProps.Email.templateDetails.name;
456
- this.props.showTemplateName({formData, onFormDataChange: this.onFormDataChange});
457
- }
458
344
  });
459
345
  }
460
346
  if (this.state.isEdit && nextProps.location.query.module === "library" && !_.isEmpty(nextProps.templateData) && !this.props.params.id && !nextProps.isGetFormData && _.isEmpty(_.get(this, `state.formData['template-subject']`))) {
@@ -493,7 +379,7 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
493
379
  const formData = _.cloneDeep(this.state.formData);
494
380
 
495
381
  const schema = _.cloneDeep(this.state.schema);
496
- const langIndex = formData[this.state.currentTab - 1]?.selectedLanguages?.indexOf(langId);
382
+ const langIndex = formData[this.state.currentTab - 1].selectedLanguages.indexOf(langId);
497
383
 
498
384
  const temp = (schema.containers || {})[this.state.currentTab - 1];
499
385
 
@@ -501,91 +387,32 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
501
387
  if (nextProps.Email.CmsSettings.isDragDrop && this.checkBeeEditorAllowedForLibrary()) {
502
388
  const beeJson = `BEEeditor${currentTab > 1 ? currentTab : ''}json`;
503
389
  const beeToken = `BEEeditor${currentTab > 1 ? currentTab : ''}token`;
504
- let beeJsonValue = '';
390
+ let beeJsonValue = _.get(nextProps, 'Templates.BEETemplate.versions.base.json-content', '');
505
391
  const selectedId = _.get(this.props, 'Email.templateDetails._id', '') || _.get(this.props, 'Templates.BEETemplate.versions.base.drag_drop_id', '');
506
-
507
- // Get beeJsonValue from template data - check multiple sources
508
- // First check if it's already in formData (from setEditData)
509
- beeJsonValue = _.get(this.state, `formData[${currentTab - 1}][${langId}].json-content`, '');
510
-
511
- // Also check formData.base
512
- if (!beeJsonValue) {
513
- beeJsonValue = _.get(this.state, `formData.base[${langId}].json-content`, '');
514
- }
515
-
516
- // Always check templateDetails and BEETemplate regardless of mode
517
- if (!beeJsonValue) {
518
- // Check Email.templateDetails first
519
- const templateDetails = nextProps.Email.templateDetails;
520
- if (templateDetails && templateDetails.versions && templateDetails.versions.base) {
521
- const baseVersion = templateDetails.versions.base;
522
- // Try language-specific path first (e.g., base.en.json-content)
523
- if (baseVersion[langId] && baseVersion[langId]['json-content']) {
524
- beeJsonValue = baseVersion[langId]['json-content'];
525
- } else if (baseVersion['json-content']) {
526
- // Fallback to base-level json-content
527
- beeJsonValue = baseVersion['json-content'];
528
- }
529
- }
530
-
531
- // If still not found, check BEETemplate
532
- if (!beeJsonValue) {
533
- const beeTemplate = nextProps.Templates.BEETemplate;
534
- if (beeTemplate && beeTemplate.versions && beeTemplate.versions.base) {
535
- const beeBase = beeTemplate.versions.base;
536
- if (beeBase[langId] && beeBase[langId]['json-content']) {
537
- beeJsonValue = beeBase[langId]['json-content'];
538
- } else if (beeBase['json-content']) {
539
- beeJsonValue = beeBase['json-content'];
540
- }
541
- }
542
- }
543
- }
544
- // Ensure we have a valid beeJsonValue - if it's a string, try to parse it to verify it's valid JSON
545
- let finalBeeJsonValue = beeJsonValue;
546
- if (beeJsonValue && typeof beeJsonValue === 'string') {
547
- try {
548
- // Try to parse to verify it's valid JSON
549
- JSON.parse(beeJsonValue);
550
- } catch (e) {
551
- console.warn('[Email] componentWillReceiveProps - beeJsonValue is not valid JSON, using as-is:', e);
392
+ if (this.state.isEdit) {
393
+ if (this.props.location.query.module === "library") {
394
+ beeJsonValue = _.get(this.state, `formData[${currentTab - 1}][${langId}].json-content`, '');
395
+ } else {
396
+ beeJsonValue = _.get(nextProps, `Email.templateDetails.versions.base[${langId}].json-content`, '');
552
397
  }
553
398
  }
554
-
555
- // Preserve existing formData values, especially template-subject
556
- const existingFormData = formData[`${currentTab - 1}`][langId] || {};
557
399
  formData[`${currentTab - 1}`][langId] = {
558
- ...existingFormData,
400
+ ...formData[`${currentTab - 1}`][langId],
559
401
  is_drag_drop: true,
560
- [beeJson]: finalBeeJsonValue,
402
+ [beeJson]: beeJsonValue,
561
403
  [beeToken]: nextProps.Email.CmsSettings.tokenData,
562
404
  id: selectedId,
563
- // Also store json-content for reference
564
- 'json-content': finalBeeJsonValue,
565
405
  };
566
-
567
- // Ensure template-subject is preserved at the top level
568
- if (formData['template-subject'] === undefined || formData['template-subject'] === '') {
569
- const subjectFromEditData = _.get(nextProps, 'Email.templateDetails.versions.base.subject', '');
570
- if (subjectFromEditData) {
571
- formData['template-subject'] = subjectFromEditData;
572
- }
573
- }
574
-
575
- if (langIndex !== undefined && langIndex !== -1 && temp && temp.panes) {
576
- _.forEach(temp.panes, (pane, index) => {
577
- const tempPane = pane;
406
+ _.forEach(temp.panes, (pane, index) => {
407
+ const tempPane = pane;
408
+ //
409
+ if (parseInt(index, 10) === parseInt(langIndex, 10)) {
578
410
  //
579
- if (parseInt(index, 10) === parseInt(langIndex, 10)) {
580
- //
581
- if (tempPane.sections && tempPane.sections[0] && tempPane.sections[0].inputFields && tempPane.sections[0].inputFields[0] && tempPane.sections[0].inputFields[0].cols) {
582
- tempPane.sections[0].inputFields[0].cols[1].colStyle = {display: ""};
583
- tempPane.sections[0].inputFields[0].cols[0].colStyle = {display: "none"};
584
- }
585
- }
586
- });
587
- }
588
- this.setState({schema, isSchemaChanged: true, loadingStatus: this.state.loadingStatus + 1, formData});
411
+ tempPane.sections[0].inputFields[0].cols[1].colStyle = {display: ""};
412
+ tempPane.sections[0].inputFields[0].cols[0].colStyle = {display: "none"};
413
+ }
414
+ });
415
+ this.setState({schema, isSchemaChanged: true, loadingStatus: this.state.loadingStatus + 1});
589
416
  } else {
590
417
  _.forEach(temp.panes, (pane, index) => {
591
418
  const tempPane = pane;
@@ -882,18 +709,8 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
882
709
  const msgString = JSON.stringify(msg);
883
710
  const langId = formData[this.state.currentTab - 1].activeTab;
884
711
  const langIndex = formData[this.state.currentTab - 1].selectedLanguages.indexOf(langId);
885
- const elementToSelect = document.getElementById(`edmeditor${(langIndex + 1) > 1 ? (langIndex + 1) : ''}`);
886
- if (elementToSelect) {
887
- try {
888
- const win = elementToSelect.contentWindow;
889
- if (win) {
890
- win.postMessage(msgString, '*');
891
- }
892
- } catch (error) {
893
- // Handle cross-origin frame access errors
894
- console.warn('Failed to access iframe contentWindow (cross-origin restriction):', error);
895
- }
896
- }
712
+ const win = document.getElementById(`edmeditor${(langIndex + 1) > 1 ? (langIndex + 1) : ''}`).contentWindow;
713
+ win.postMessage(msgString, '*');
897
714
  } else if (data === "unsubscribe" && this.state.editorInstanse) {
898
715
  const anchor = `<a href='{{${data}}}'>${data}</a>`;
899
716
  this.state.editorInstanse.insertHtml(`${anchor}`);
@@ -1074,11 +891,6 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
1074
891
  const isBEESupport = (this.props.location.query.isBEESupport !== "false") || false;
1075
892
  const formData = _.cloneDeep(this.state.formData);
1076
893
 
1077
- // Set template name from editData if available
1078
- if (editData.name) {
1079
- formData['template-name'] = editData.name;
1080
- }
1081
-
1082
894
  const schema = (this.props.location.query.type === 'embedded') ? this.removeStandAlone(this.state.schema) : _.cloneDeep(this.state.schema);
1083
895
  const containers = _.cloneDeep(schema.containers.slice());
1084
896
  let tabKey = "";
@@ -1087,8 +899,7 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
1087
899
  const type = this.props.location.query.type;
1088
900
 
1089
901
  formData['template-name'] = editData.name;
1090
- const subject = _.get(editData, 'versions.base.subject', '');
1091
- formData['template-subject'] = subject;
902
+ formData['template-subject'] = _.get(editData, 'versions.base.subject');
1092
903
  formData.base = editData.versions.base;
1093
904
 
1094
905
  _.forEach(editData.versions.history, (data1, index) => {
@@ -1169,13 +980,8 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
1169
980
 
1170
981
 
1171
982
  this.setState({ formData, schema, tabKey, currentTab, tabCount: editData.versions.history.length, loadingStatus: this.state.loadingStatus + 1 }, () => {
1172
- if (this.props.isFullMode && this.props.showTemplateName) {
1173
- // Ensure template name is set before showing it
1174
- const updatedFormData = _.cloneDeep(formData);
1175
- if (editData.name && !updatedFormData['template-name']) {
1176
- updatedFormData['template-name'] = editData.name;
1177
- }
1178
- this.props.showTemplateName({formData: updatedFormData, onFormDataChange: this.onFormDataChange});
983
+ if (this.props.isFullMode) {
984
+ this.props.showTemplateName({formData, onFormDataChange: this.onFormDataChange});
1179
985
  }
1180
986
  const isBEEAppEnable = this.checkBeeEditorAllowedForLibrary();
1181
987
  _.forEach((editData.versions.base.selectedLanguages), (language) => {
@@ -2314,7 +2120,6 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
2314
2120
  type: 'TAG',
2315
2121
  context: (data || '').toLowerCase() === 'all' ? 'default' : (data || '').toLowerCase(),
2316
2122
  embedded: 'full',
2317
- liquidFlow:this.liquidFlow
2318
2123
  };
2319
2124
  this.props.globalActions.fetchSchemaForEntity(query);
2320
2125
  }
@@ -2850,7 +2655,6 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
2850
2655
  getTemplateDetailsInProgress,
2851
2656
  assetUploading,
2852
2657
  createTemplateInProgress,
2853
- fetchingCmsSettings,
2854
2658
  } = this.props.Email;
2855
2659
  let isLoading =
2856
2660
  isLoadingMetaEntities ||
@@ -2859,7 +2663,7 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
2859
2663
  ) || (
2860
2664
  assetUploading !== undefined && assetUploading
2861
2665
  ) || (
2862
- Email && (fetchingCmsData || getTemplateDetailsInProgress || fetchingCmsSettings)
2666
+ Email && (fetchingCmsData || getTemplateDetailsInProgress)
2863
2667
  );
2864
2668
 
2865
2669
  if (!isLoading) {
@@ -3181,19 +2985,6 @@ function mapDispatchToProps(dispatch) {
3181
2985
  const withReducer = injectReducer({ key: 'email', reducer: v2EmailReducer });
3182
2986
  const withEmailSaga = injectSaga({ key: 'email', saga: v2EmailSagas });
3183
2987
 
3184
- // Base Email component without saga registration (for use from EmailWrapper)
3185
- // EmailWrapper already registers the saga, so we don't need to register it here
3186
- export const EmailWithoutSaga = withCreatives({
3187
- WrappedComponent: Email,
3188
- mapStateToProps,
3189
- mapDispatchToProps,
3190
- userAuth: true,
3191
- sagas: [], // No saga - EmailWrapper registers it
3192
- reducers: [withReducer],
3193
- });
3194
-
3195
- // Email component with saga registration (for direct use from SlideBoxContent in Edit mode)
3196
- // When Email is used directly (not as child of EmailWrapper), it needs to register the saga
3197
2988
  export default withCreatives({
3198
2989
  WrappedComponent: Email,
3199
2990
  mapStateToProps,
@@ -302,36 +302,4 @@ export default defineMessages({
302
302
  id: 'creatives.containersV2.Email.base64ImageError',
303
303
  defaultMessage: 'Base64 images are not allowed. Please upload your image to a gallery and use it, or add the image URL instead.',
304
304
  },
305
- "editorTypeTitle": {
306
- id: 'creatives.containersV2.Email.editorTypeTitle',
307
- defaultMessage: 'Editor type',
308
- },
309
- "htmlEditorTitle": {
310
- id: 'creatives.containersV2.Email.htmlEditorTitle',
311
- defaultMessage: 'HTML editor',
312
- },
313
- "htmlEditorDescription": {
314
- id: 'creatives.containersV2.Email.htmlEditorDescription',
315
- defaultMessage: 'Use a basic HTML editor to write and format your content. Suitable if you are familiar with HTML.',
316
- },
317
- "dragDropEditorTitle": {
318
- id: 'creatives.containersV2.Email.dragDropEditorTitle',
319
- defaultMessage: 'Drag & drop editor',
320
- },
321
- "dragDropEditorDescription": {
322
- id: 'creatives.containersV2.Email.dragDropEditorDescription',
323
- defaultMessage: 'Create your content visually by dragging blocks — no coding needed. Great for quick, easy designs.',
324
- },
325
- "uploadZipTitle": {
326
- id: 'creatives.containersV2.Email.uploadZipTitle',
327
- defaultMessage: 'Upload zip file',
328
- },
329
- "uploadZipDescription": {
330
- id: 'creatives.containersV2.Email.uploadZipDescription',
331
- defaultMessage: 'Upload a ZIP containing your custom HTML, images, and assets. Ideal if your content is already built.',
332
- },
333
- "nextButton": {
334
- id: 'creatives.containersV2.Email.nextButton',
335
- defaultMessage: 'Next',
336
- },
337
305
  });
@@ -11,7 +11,6 @@ import * as types from './constants';
11
11
  const initialState = fromJS({
12
12
  createTemplateInProgress: false,
13
13
  createResponse: {},
14
- isBeeEnabled: false,
15
14
  });
16
15
 
17
16
  function emailReducer(state = initialState, action) {
@@ -108,15 +107,6 @@ function emailReducer(state = initialState, action) {
108
107
  return state
109
108
  .set('fetchingCmsData', false)
110
109
  .set('fetchingCmsDataFailed', true);
111
- case types.GET_CMS_ACCOUNTS_REQUEST:
112
- return state
113
- .set('isBeeEnabled', false); // default to false
114
- case types.GET_CMS_ACCOUNTS_SUCCESS:
115
- return state
116
- .set('isBeeEnabled', action.isBeeEnabled);
117
- case types.GET_CMS_ACCOUNTS_FAILURE:
118
- return state
119
- .set('isBeeEnabled', false);
120
110
  case types.CLEAR_EMAIL_CRUD_RESPONSE_REQUEST:
121
111
  return state
122
112
  .set('createResponse', fromJS({}));
@@ -149,8 +139,7 @@ function emailReducer(state = initialState, action) {
149
139
  .set('CmsSettings', fromJS({}))
150
140
  .set('fetchingCmsData', false)
151
141
  .set('duplicateResponse', fromJS({}))
152
- .set('cmsData', '')
153
- .set('isBeeEnabled', false);
142
+ .set('cmsData', '');
154
143
  case types.TRANSFORM_EMAIL_TEMPLATE_REQUEST:
155
144
  return state.set("createTemplateInProgress", true);
156
145
  default:
@@ -1,7 +1,6 @@
1
1
  import {
2
2
  call, put, takeLatest, takeEvery, all,
3
3
  } from 'redux-saga/effects';
4
- import CapNotification from '@capillarytech/cap-ui-library/CapNotification';
5
4
  import * as Api from '../../services/api';
6
5
  import * as types from './constants';
7
6
  import { transformEmailTemplates, storeS3FileSizeDetails } from '../../utils/cdnTransformation';
@@ -10,47 +9,15 @@ export function* createTemplate(template) {
10
9
  let errorMsg;
11
10
  try {
12
11
  const result = yield call(Api.createEmailTemplate, template);
13
- // Check if the API call failed (non-2xx status codes or explicit failure)
14
- const statusCode = result.status?.code || result.status;
15
- const isError = !result.success || statusCode >= 400;
16
-
17
- if (isError) {
18
- // Extract error message from various possible locations in the response
19
- errorMsg = result.message
20
- || result.errorMessage
21
- || result.error?.message
22
- || (result.response && result.response.message)
23
- || (result.status && result.status.message)
24
- || (result.data && result.data.message)
25
- || `API Error: ${statusCode || 'Unknown error'}`;
26
- // Show error notification directly from saga
27
- CapNotification.error({
28
- key: 'createTemplateError',
29
- message: errorMsg,
30
- });
12
+ if (!result.success || result.status.code === 500) {
13
+ errorMsg = result.message;
31
14
  yield put({ type: types.CREATE_TEMPLATE_FAILURE, errorMsg });
32
- // Call callback with error so component can handle it (if needed)
33
- if (template.onCreateTemplateComplete) {
34
- try {
35
- // Call the callback directly (it's a regular function, not a generator)
36
- template.onCreateTemplateComplete({ error: true, message: errorMsg, statusCode });
37
- } catch (callbackError) {
38
- console.error('[Email Saga] Error executing callback:', callbackError);
39
- }
40
- }
41
15
  } else {
42
- yield put({
43
- type: types.CREATE_TEMPLATE_SUCCESS, data: result.response, statusCode: result.status ? result.status.code : '', errorMsg,
44
- });
16
+ yield put({ type: types.CREATE_TEMPLATE_SUCCESS, data: result.response, statusCode: result.status ? result.status.code : '', errorMsg });
45
17
  yield template.onCreateTemplateComplete(result.response);
46
18
  }
47
19
  } catch (error) {
48
- errorMsg = error.message || error.toString() || 'An unexpected error occurred';
49
20
  yield put({ type: types.CREATE_TEMPLATE_FAILURE, error, errorMsg });
50
- // Call callback with error so component can handle it
51
- if (template.onCreateTemplateComplete) {
52
- yield template.onCreateTemplateComplete({ error: true, message: errorMsg });
53
- }
54
21
  }
55
22
  }
56
23
 
@@ -59,14 +26,14 @@ export function* transformEmailTemplate({template, callback}) {
59
26
  const result = yield call(transformEmailTemplates, template);
60
27
  yield callback(result);
61
28
  } catch (error) {
62
- yield callback(template);
29
+ yield callback(template);
63
30
  }
64
31
  }
65
32
 
66
33
  export function* duplicateTemplate(payload) {
67
34
  let errorMsg;
68
35
  let result;
69
- const { id, channel, callback } = payload;
36
+ let { id, channel, callback } = payload;
70
37
  try {
71
38
  result = yield call(Api.duplicateTemplate, {id, channel} );
72
39
  if (result.status.code === 500) {
@@ -75,9 +42,7 @@ export function* duplicateTemplate(payload) {
75
42
  if (callback) {
76
43
  callback(result?.response);
77
44
  }
78
- yield put({
79
- type: types.DUPLICATE_TEMPLATE_SUCCESS, data: result?.response, statusCode: result?.status?.code, errorMsg,
80
- });
45
+ yield put({ type: types.DUPLICATE_TEMPLATE_SUCCESS, data: result?.response, statusCode: result?.status?.code, errorMsg });
81
46
  } catch (error) {
82
47
  yield put({ type: types.DUPLICATE_TEMPLATE_FAILURE, error, errorMsg });
83
48
  }
@@ -102,9 +67,7 @@ export function* getAllAssets(assetType, queryParams) {
102
67
  }
103
68
  }
104
69
 
105
- export function* getCmsSetting({
106
- cmsType, projectId, cmsMode, langId, isEdmSupport, isBEEAppEnable,
107
- }) {
70
+ export function* getCmsSetting({cmsType, projectId, cmsMode, langId, isEdmSupport, isBEEAppEnable}) {
108
71
  try {
109
72
  const result = yield call(Api.getCmsTemplateSettingsV2, cmsType, projectId, cmsMode, langId, isEdmSupport, isBEEAppEnable);
110
73
 
@@ -124,17 +87,6 @@ export function* getCmsData({cmsType, projectId, langId}) {
124
87
  }
125
88
  }
126
89
 
127
- export function* getCmsAccounts({cmsType}) {
128
- try {
129
- const result = yield call(Api.getCmsAccounts, cmsType);
130
- const { cmsAccounts } = result.data?.response || {};
131
- const isBeeEnabled = cmsAccounts?.type === cmsType;
132
- yield put({ type: types.GET_CMS_ACCOUNTS_SUCCESS, isBeeEnabled });
133
- } catch (error) {
134
- yield put({ type: types.GET_CMS_ACCOUNTS_FAILURE, error });
135
- }
136
- }
137
-
138
90
  export function* uploadAsset(file, assetType, fileParams) {
139
91
  try {
140
92
  const result = yield call(Api.uploadFile, file, assetType, fileParams);
@@ -171,10 +123,6 @@ function* watchGetCmsData() {
171
123
  yield takeEvery(types.GET_CMS_EDITOR_DATA_REQUEST, getCmsData);
172
124
  }
173
125
 
174
- function* watchGetCmsAccounts() {
175
- yield takeEvery(types.GET_CMS_ACCOUNTS_REQUEST, getCmsAccounts);
176
- }
177
-
178
126
  function* watchUploadAsset() {
179
127
  yield takeLatest(types.UPLOAD_ASSET_REQUEST, uploadAsset);
180
128
  }
@@ -191,7 +139,6 @@ export default [
191
139
  watchGetAllAssets,
192
140
  watchGetCmsSetting,
193
141
  watchGetCmsData,
194
- watchGetCmsAccounts,
195
142
  watchUploadAsset,
196
143
  watchDuplicateTemplate,
197
144
  ];
@@ -204,7 +151,6 @@ export function* v2EmailSagas() {
204
151
  watchGetAllAssets(),
205
152
  watchGetCmsSetting(),
206
153
  watchGetCmsData(),
207
- watchGetCmsAccounts(),
208
154
  watchUploadAsset(),
209
155
  ]);
210
156
  }
@@ -4,7 +4,6 @@ exports[` 1`] = `
4
4
  Immutable.Map {
5
5
  "createTemplateInProgress": false,
6
6
  "createResponse": Immutable.Map {},
7
- "isBeeEnabled": false,
8
7
  }
9
8
  `;
10
9
 
@@ -12,6 +11,5 @@ exports[` 2`] = `
12
11
  Immutable.Map {
13
12
  "createTemplateInProgress": true,
14
13
  "createResponse": Immutable.Map {},
15
- "isBeeEnabled": false,
16
14
  }
17
15
  `;