@capillarytech/creatives-library 8.0.246-alpha.0 → 8.0.246

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 (133) 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 -18
  8. package/utils/common.js +0 -5
  9. package/utils/commonUtils.js +5 -28
  10. package/utils/tests/commonUtil.test.js +0 -224
  11. package/utils/transformTemplateConfig.js +10 -0
  12. package/v2Components/CapDeviceContent/index.js +56 -61
  13. package/v2Components/CapTagList/index.js +1 -6
  14. package/v2Components/CapTagListWithInput/index.js +1 -5
  15. package/v2Components/CapTagListWithInput/messages.js +1 -1
  16. package/v2Components/CapWhatsappCTA/tests/index.test.js +0 -5
  17. package/v2Components/ErrorInfoNote/index.js +72 -447
  18. package/v2Components/ErrorInfoNote/messages.js +0 -22
  19. package/v2Components/ErrorInfoNote/style.scss +4 -280
  20. package/v2Components/FormBuilder/tests/index.test.js +4 -13
  21. package/v2Components/HtmlEditor/HTMLEditor.js +94 -642
  22. package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +133 -1135
  23. package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +16 -27
  24. package/v2Components/HtmlEditor/_htmlEditor.scss +45 -108
  25. package/v2Components/HtmlEditor/_index.lazy.scss +1 -1
  26. package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +101 -13
  27. package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +139 -148
  28. package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +1 -2
  29. package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
  30. package/v2Components/HtmlEditor/components/EditorToolbar/_editorToolbar.scss +0 -9
  31. package/v2Components/HtmlEditor/components/EditorToolbar/index.js +1 -1
  32. package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +0 -22
  33. package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +7 -4
  34. package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +45 -35
  35. package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +3 -1
  36. package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
  37. package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +6 -7
  38. package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +6 -3
  39. package/v2Components/HtmlEditor/components/PreviewPane/index.js +13 -11
  40. package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
  41. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +152 -0
  42. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +31 -49
  43. package/v2Components/HtmlEditor/constants.js +20 -29
  44. package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +16 -373
  45. package/v2Components/HtmlEditor/hooks/useEditorContent.js +2 -5
  46. package/v2Components/HtmlEditor/hooks/useInAppContent.js +146 -88
  47. package/v2Components/HtmlEditor/hooks/useValidation.js +45 -150
  48. package/v2Components/HtmlEditor/index.js +1 -1
  49. package/v2Components/HtmlEditor/messages.js +85 -95
  50. package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +102 -134
  51. package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +25 -23
  52. package/v2Components/HtmlEditor/utils/validationAdapter.js +41 -66
  53. package/v2Components/MobilePushPreviewV2/index.js +7 -32
  54. package/v2Components/TemplatePreview/_templatePreview.scss +24 -44
  55. package/v2Components/TemplatePreview/index.js +32 -47
  56. package/v2Components/TemplatePreview/messages.js +0 -4
  57. package/v2Components/TestAndPreviewSlidebox/_testAndPreviewSlidebox.scss +0 -1
  58. package/v2Components/TestAndPreviewSlidebox/index.js +25 -31
  59. package/v2Containers/BeeEditor/index.js +90 -172
  60. package/v2Containers/CreativesContainer/SlideBoxContent.js +51 -128
  61. package/v2Containers/CreativesContainer/SlideBoxFooter.js +12 -113
  62. package/v2Containers/CreativesContainer/SlideBoxHeader.js +1 -2
  63. package/v2Containers/CreativesContainer/constants.js +0 -1
  64. package/v2Containers/CreativesContainer/index.js +46 -238
  65. package/v2Containers/CreativesContainer/messages.js +0 -8
  66. package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +2 -11
  67. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +50 -38
  68. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +0 -91
  69. package/v2Containers/Email/actions.js +0 -7
  70. package/v2Containers/Email/constants.js +1 -5
  71. package/v2Containers/Email/index.js +30 -229
  72. package/v2Containers/Email/messages.js +0 -32
  73. package/v2Containers/Email/reducer.js +1 -12
  74. package/v2Containers/Email/sagas.js +7 -61
  75. package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +0 -2
  76. package/v2Containers/Email/tests/sagas.test.js +1 -1
  77. package/v2Containers/EmailWrapper/components/EmailWrapperView.js +15 -210
  78. package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +74 -40
  79. package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +67 -2
  80. package/v2Containers/EmailWrapper/constants.js +0 -2
  81. package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +77 -629
  82. package/v2Containers/EmailWrapper/index.js +23 -103
  83. package/v2Containers/EmailWrapper/messages.js +1 -61
  84. package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +214 -0
  85. package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +77 -509
  86. package/v2Containers/InApp/actions.js +0 -7
  87. package/v2Containers/InApp/constants.js +4 -20
  88. package/v2Containers/InApp/index.js +357 -801
  89. package/v2Containers/InApp/index.scss +3 -4
  90. package/v2Containers/InApp/messages.js +3 -7
  91. package/v2Containers/InApp/reducer.js +3 -21
  92. package/v2Containers/InApp/sagas.js +9 -29
  93. package/v2Containers/InApp/selectors.js +5 -25
  94. package/v2Containers/InApp/tests/index.test.js +50 -154
  95. package/v2Containers/InApp/tests/reducer.test.js +0 -34
  96. package/v2Containers/InApp/tests/sagas.test.js +9 -61
  97. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +0 -3
  98. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +0 -2
  99. package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +0 -2
  100. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +0 -9
  101. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +0 -12
  102. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +0 -4
  103. package/v2Containers/TagList/index.js +19 -62
  104. package/v2Containers/Templates/_templates.scss +1 -60
  105. package/v2Containers/Templates/index.js +4 -89
  106. package/v2Containers/Templates/messages.js +0 -4
  107. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +0 -35
  108. package/v2Components/HtmlEditor/__tests__/HTMLEditor.apiErrors.test.js +0 -874
  109. package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +0 -254
  110. package/v2Components/HtmlEditor/components/ValidationTabs/index.js +0 -363
  111. package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +0 -51
  112. package/v2Components/HtmlEditor/hooks/__tests__/useValidation.apiErrors.test.js +0 -630
  113. package/v2Containers/BeePopupEditor/constants.js +0 -10
  114. package/v2Containers/BeePopupEditor/index.js +0 -193
  115. package/v2Containers/BeePopupEditor/tests/index.test.js +0 -627
  116. package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +0 -1317
  117. package/v2Containers/EmailWrapper/components/__tests__/EmailHTMLEditor.test.js +0 -1605
  118. package/v2Containers/EmailWrapper/components/__tests__/EmailWrapperView.test.js +0 -520
  119. package/v2Containers/EmailWrapper/tests/useEmailWrapper.edgeCases.test.js +0 -643
  120. package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +0 -376
  121. package/v2Containers/InApp/__tests__/sagas.test.js +0 -363
  122. package/v2Containers/InApp/tests/selectors.test.js +0 -612
  123. package/v2Containers/InAppWrapper/components/InAppWrapperView.js +0 -162
  124. package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +0 -267
  125. package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +0 -9
  126. package/v2Containers/InAppWrapper/constants.js +0 -16
  127. package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +0 -473
  128. package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +0 -198
  129. package/v2Containers/InAppWrapper/index.js +0 -148
  130. package/v2Containers/InAppWrapper/messages.js +0 -49
  131. package/v2Containers/InappAdvance/index.js +0 -1099
  132. package/v2Containers/InappAdvance/index.scss +0 -10
  133. package/v2Containers/InappAdvance/tests/index.test.js +0 -448
@@ -1,4 +1,4 @@
1
- import React, { useRef, useCallback } from 'react';
1
+ import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { FormattedMessage } from 'react-intl';
4
4
  import styled from 'styled-components';
@@ -11,15 +11,10 @@ import CapSpin from '@capillarytech/cap-ui-library/CapSpin';
11
11
  import CapButton from '@capillarytech/cap-ui-library/CapButton';
12
12
  import CapError from '@capillarytech/cap-ui-library/CapError';
13
13
  import ComponentWithLabelHOC from '@capillarytech/cap-ui-library/assets/HOCs/ComponentWithLabelHOC';
14
- import { CAP_COLOR_06, CAP_WHITE } from '@capillarytech/cap-ui-library/styled/variables';
15
- import { EmailWithoutSaga } from '../../Email';
14
+ import Email from '../../Email';
16
15
  import CmsTemplatesComponent from '../../../v2Components/CmsTemplatesComponent';
17
- import EmailHTMLEditor from './EmailHTMLEditor';
18
- import TestAndPreviewSlidebox from '../../../v2Components/TestAndPreviewSlidebox';
19
- import { EMAIL } from '../../CreativesContainer/constants';
20
16
  import messages from '../messages';
21
17
  import { EMAIL_CREATE_MODES, STEPS } from '../constants';
22
- import { hasSupportCKEditor } from '../../../utils/common';
23
18
 
24
19
  const CapRadioCardWithLabel = ComponentWithLabelHOC(CapRadioCard);
25
20
 
@@ -32,23 +27,9 @@ const CardContainer = styled.div`
32
27
  }
33
28
  }
34
29
  }
35
-
36
- .ant-radio-group.cap-radioCard-v2 {
37
- .ant-radio-button-wrapper {
38
- &.ant-radio-button-wrapper-checked {
39
- .icon-container {
40
- background-color: ${CAP_COLOR_06};
41
- .anticon,
42
- .cap-icon {
43
- color: ${CAP_WHITE};
44
- }
45
- }
46
- }
47
- }
48
- }
49
30
  `;
50
31
 
51
- // Mode selection component
32
+ // Mode selection component that handles the creation mode selection UI
52
33
  const ModeSelectionUI = ({
53
34
  isFullMode,
54
35
  templateName,
@@ -70,7 +51,7 @@ const ModeSelectionUI = ({
70
51
  value={templateName}
71
52
  labelPosition="top"
72
53
  size="default"
73
- style={{ width: '68%' }}
54
+ style={{ width: '68%'}}
74
55
  />
75
56
  )}
76
57
  <CardContainer>
@@ -117,36 +98,25 @@ ModeSelectionUI.propTypes = {
117
98
  uploadButtonLabel: PropTypes.node.isRequired,
118
99
  };
119
100
 
120
- // Content creation component
101
+ // Content creation component that handles the email or template selection UI
121
102
  const ContentCreationUI = ({
122
103
  isShowEmailCreate,
123
104
  emailProps,
124
105
  cmsTemplatesProps,
125
- isHTMLEditorMode,
126
- htmlEditorProps,
127
- }) => {
128
-
129
- return (
130
- <>
131
- {isShowEmailCreate ? (
132
- isHTMLEditorMode ? (
133
- <EmailHTMLEditor {...htmlEditorProps} />
134
- ) : (
135
- <EmailWithoutSaga {...emailProps} />
136
- )
137
- ) : (
138
- <CmsTemplatesComponent {...cmsTemplatesProps} />
139
- )}
140
- </>
141
- );
142
- };
106
+ }) => (
107
+ <>
108
+ {isShowEmailCreate ? (
109
+ <Email {...emailProps} />
110
+ ) : (
111
+ <CmsTemplatesComponent {...cmsTemplatesProps} />
112
+ )}
113
+ </>
114
+ );
143
115
 
144
116
  ContentCreationUI.propTypes = {
145
117
  isShowEmailCreate: PropTypes.bool.isRequired,
146
118
  emailProps: PropTypes.object.isRequired,
147
119
  cmsTemplatesProps: PropTypes.object.isRequired,
148
- isHTMLEditorMode: PropTypes.bool,
149
- htmlEditorProps: PropTypes.object,
150
120
  };
151
121
 
152
122
  // Main EmailWrapper presentational component
@@ -167,136 +137,9 @@ const EmailWrapperView = ({
167
137
  isShowEmailCreate,
168
138
  emailProps,
169
139
  cmsTemplatesProps,
170
- metaEntities,
171
- loadingTags,
172
- injectedTags,
173
- globalActions,
174
- supportedTags,
175
- getDefaultTags,
176
- location,
177
- currentOrgDetails,
178
- forwardedTags,
179
- selectedOfferDetails,
180
- eventContextTags,
181
- getFormdata,
182
- isGetFormData,
183
- getLiquidTags,
184
- showLiquidErrorInFooter,
185
- onValidationFail,
186
- emailActions,
187
- Email,
188
- templateData: templateDataProp,
189
- params,
190
- fetchingLiquidTags,
191
- createTemplateInProgress,
192
- fetchingCmsData,
193
- setIsLoadingContent,
194
- showTestAndPreviewSlidebox,
195
- handleCloseTestAndPreview,
196
- showTemplateName,
197
- onHtmlEditorValidationStateChange,
198
- moduleType,
199
140
  }) => {
200
- const htmlEditorRef = useRef(null);
201
- const supportCKEditor = hasSupportCKEditor();
202
- const hasParamsIdForEditor = params?.id || location?.query?.id || location?.params?.id || location?.pathname?.includes('/edit/');
203
- const isEditModeForEditor = hasParamsIdForEditor;
204
- const isBEEFromProps = emailProps?.editor === 'BEE' && emailProps?.selectedEditorMode === null;
205
- const isDragDropFromCreateMode = emailCreateMode === EMAIL_CREATE_MODES.DRAG_DROP;
206
- const isExplicitlyBEEEditor = isBEEFromProps || isDragDropFromCreateMode;
207
- let isHTMLEditorMode = false;
208
-
209
- if (supportCKEditor) {
210
- isHTMLEditorMode = false; // Legacy flow: use Email component
211
- } else if (isEditModeForEditor) {
212
- isHTMLEditorMode = !isExplicitlyBEEEditor;
213
- } else {
214
- if (isExplicitlyBEEEditor || isBEEFromProps || isDragDropFromCreateMode) {
215
- isHTMLEditorMode = false;
216
- } else {
217
- isHTMLEditorMode = emailProps?.selectedEditorMode === EMAIL_CREATE_MODES.HTML_EDITOR ||
218
- emailCreateMode === EMAIL_CREATE_MODES.HTML_EDITOR;
219
- }
220
- }
221
-
222
- const isShowTemplateSelection = step === STEPS.MODE_SELECTION;
223
141
 
224
- // Create onFormDataChange callback for template name updates (similar to Email component)
225
- // This allows CreativesContainer to update the template name when user clicks "Edit name"
226
- // When user edits the name in CreativesContainer header, it calls this callback
227
- // which updates the template name in EmailWrapper, and then CreativesContainer
228
- // will call showTemplateName again with the updated formData
229
- const handleFormDataChange = useCallback((updatedFormData) => {
230
- const newTemplateName = updatedFormData?.['template-name'] || templateName;
231
- if (newTemplateName !== templateName && onTemplateNameChange) {
232
- // Update template name in parent (useEmailWrapper hook)
233
- onTemplateNameChange({ target: { value: newTemplateName } });
234
- }
235
- // Note: CreativesContainer will call showTemplateName again after this callback
236
- // (it stores the callback in templateContainerDetails and calls it after state updates)
237
- }, [templateName, onTemplateNameChange]);
238
-
239
- const htmlEditorProps = isHTMLEditorMode ? {
240
- // Location and params
241
- location,
242
- params,
243
- // Tag-related props
244
- getDefaultTags,
245
- supportedTags,
246
- metaEntities,
247
- injectedTags,
248
- globalActions,
249
- loadingTags,
250
- eventContextTags,
251
- forwardedTags,
252
- selectedOfferDetails,
253
- currentOrgDetails,
254
- // Email Redux state and actions
255
- Email,
256
- emailActions,
257
- // Full mode props
258
- isFullMode,
259
- templateName,
260
- isGetFormData,
261
- getFormdata,
262
- // Library mode props
263
- templateData: templateDataProp,
264
- // Uploaded content from zip file
265
- EmailLayout,
266
- // Liquid validation
267
- getLiquidTags,
268
- showLiquidErrorInFooter,
269
- // Validation state callback
270
- onHtmlEditorValidationStateChange,
271
- onValidationFail,
272
- // Template name
273
- showTemplateName,
274
- onFormDataChange: handleFormDataChange,
275
- // Module type for unsubscribe tag validation
276
- moduleType,
277
- // Loading states
278
- fetchingLiquidTags: fetchingLiquidTags || false,
279
- createTemplateInProgress: createTemplateInProgress || false,
280
- fetchingCmsData: fetchingCmsData || false,
281
- // Parent loading control
282
- setIsLoadingContent,
283
- ref: htmlEditorRef,
284
- } : {};
285
-
286
- // Get formData for TestAndPreviewSlidebox when needed
287
- const getFormDataForPreview = () => {
288
- if (htmlEditorRef.current && htmlEditorRef.current.getFormDataForPreview) {
289
- return htmlEditorRef.current.getFormDataForPreview();
290
- }
291
- return {};
292
- };
293
-
294
- const getContentForPreview = () => {
295
- if (htmlEditorRef.current && htmlEditorRef.current.getContentForPreview) {
296
- return htmlEditorRef.current.getContentForPreview();
297
- }
298
- return '';
299
- };
142
+ const isShowTemplateSelection = step === STEPS.MODE_SELECTION || (step === STEPS.TEMPLATE_SELECTION && emailCreateMode === EMAIL_CREATE_MODES.UPLOAD);
300
143
 
301
144
  return (
302
145
  <>
@@ -320,22 +163,9 @@ const EmailWrapperView = ({
320
163
  isShowEmailCreate={isShowEmailCreate}
321
164
  emailProps={emailProps}
322
165
  cmsTemplatesProps={cmsTemplatesProps}
323
- isHTMLEditorMode={isHTMLEditorMode}
324
- htmlEditorProps={htmlEditorProps}
325
166
  />
326
167
  )}
327
168
  </CapSpin>
328
- {/* Render TestAndPreviewSlidebox for HTML Editor (similar to legacy Email component) */}
329
- {isHTMLEditorMode && showTestAndPreviewSlidebox && (
330
- <TestAndPreviewSlidebox
331
- show={showTestAndPreviewSlidebox}
332
- onClose={handleCloseTestAndPreview}
333
- formData={getFormDataForPreview()}
334
- content={getContentForPreview()}
335
- currentChannel={EMAIL}
336
- currentTab={1}
337
- />
338
- )}
339
169
  </>
340
170
  );
341
171
  };
@@ -345,10 +175,6 @@ EmailWrapperView.propTypes = {
345
175
  emailCreateMode: PropTypes.string,
346
176
  step: PropTypes.string,
347
177
  isFullMode: PropTypes.bool,
348
- getFormdata: PropTypes.func,
349
- isGetFormData: PropTypes.bool,
350
- getLiquidTags: PropTypes.func,
351
- showLiquidErrorInFooter: PropTypes.func,
352
178
  templateName: PropTypes.string,
353
179
  onTemplateNameChange: PropTypes.func.isRequired,
354
180
  isTemplateNameEmpty: PropTypes.bool,
@@ -361,27 +187,6 @@ EmailWrapperView.propTypes = {
361
187
  isShowEmailCreate: PropTypes.bool.isRequired,
362
188
  emailProps: PropTypes.object.isRequired,
363
189
  cmsTemplatesProps: PropTypes.object.isRequired,
364
- metaEntities: PropTypes.object,
365
- loadingTags: PropTypes.bool,
366
- injectedTags: PropTypes.object,
367
- globalActions: PropTypes.object,
368
- supportedTags: PropTypes.array,
369
- getDefaultTags: PropTypes.string,
370
- location: PropTypes.object,
371
- currentOrgDetails: PropTypes.object,
372
- forwardedTags: PropTypes.object,
373
- selectedOfferDetails: PropTypes.array,
374
- eventContextTags: PropTypes.array,
375
- emailActions: PropTypes.object,
376
- Email: PropTypes.object,
377
- templateData: PropTypes.object,
378
- params: PropTypes.object,
379
- fetchingLiquidTags: PropTypes.bool,
380
- createTemplateInProgress: PropTypes.bool,
381
- fetchingCmsData: PropTypes.bool,
382
- setIsLoadingContent: PropTypes.func,
383
- showTestAndPreviewSlidebox: PropTypes.bool,
384
- handleCloseTestAndPreview: PropTypes.func,
385
190
  };
386
191
 
387
192
  export default EmailWrapperView;
@@ -24,20 +24,24 @@ const HTMLEditorTesting = () => {
24
24
  // Show/Hide editor
25
25
  show: () => {
26
26
  setIsVisible(true);
27
+ console.log('✅ HTMLEditor test mode activated');
27
28
  },
28
29
 
29
30
  hide: () => {
30
31
  setIsVisible(false);
32
+ console.log('✅ HTMLEditor test mode deactivated');
31
33
  },
32
34
 
33
35
  toggle: () => {
34
- setIsVisible((prev) => !prev);
36
+ setIsVisible(prev => !prev);
37
+ console.log(`✅ HTMLEditor test mode ${!isVisible ? 'activated' : 'deactivated'}`);
35
38
  },
36
39
 
37
40
  // Variant control
38
41
  setVariant: (newVariant) => {
39
42
  if (['email', 'inapp'].includes(newVariant)) {
40
43
  setVariant(newVariant);
44
+ console.log(`✅ Variant set to: ${newVariant}`);
41
45
  } else {
42
46
  console.error('❌ Invalid variant. Use: "email" or "inapp"');
43
47
  }
@@ -48,6 +52,7 @@ const HTMLEditorTesting = () => {
48
52
  const validLayouts = Object.values(LAYOUT_TYPES);
49
53
  if (validLayouts.includes(layout)) {
50
54
  setLayoutType(layout);
55
+ console.log(`✅ Layout set to: ${layout}`);
51
56
  } else {
52
57
  console.error(`❌ Invalid layout. Use: ${validLayouts.join(', ')}`);
53
58
  }
@@ -56,22 +61,58 @@ const HTMLEditorTesting = () => {
56
61
  // Content control
57
62
  setContent: (newContent) => {
58
63
  setContent(newContent);
64
+ console.log('✅ Content updated');
59
65
  },
60
66
 
61
67
  getContent: () => {
68
+ console.log('Current content:', content);
62
69
  return content;
63
70
  },
64
71
 
65
72
  // Status
66
73
  status: () => {
74
+ console.log('📊 HTMLEditor Test Status:');
75
+ console.log(` Visible: ${isVisible}`);
76
+ console.log(` Variant: ${variant}`);
77
+ console.log(` Layout: ${layoutType}`);
78
+ console.log(` Content size: ${content.length} chars`);
67
79
  },
68
80
 
69
81
  // Help
70
82
  help: () => {
71
- },
83
+ console.log(`
84
+ 🚀 HTMLEditor Testing Console Commands:
85
+
86
+ 📱 Basic Controls:
87
+ htmlEditorTest.show() - Show the editor
88
+ htmlEditorTest.hide() - Hide the editor
89
+ htmlEditorTest.toggle() - Toggle editor visibility
90
+
91
+ ⚙️ Configuration:
92
+ htmlEditorTest.setVariant('email') - Set to email variant
93
+ htmlEditorTest.setVariant('inapp') - Set to inapp variant
94
+ htmlEditorTest.setLayout('POPUP') - Set layout (inapp only)
95
+ - Valid: POPUP, HEADER, FOOTER, FULLSCREEN
96
+
97
+ 📝 Content:
98
+ htmlEditorTest.setContent('<h1>Test</h1>') - Set editor content
99
+ htmlEditorTest.getContent() - Get current content
100
+
101
+ 📊 Status:
102
+ htmlEditorTest.status() - Show current status
103
+ htmlEditorTest.help() - Show this help
104
+
105
+ 💡 Example Usage:
106
+ htmlEditorTest.show()
107
+ htmlEditorTest.setVariant('inapp')
108
+ htmlEditorTest.setLayout('HEADER') // Top banner
109
+ htmlEditorTest.setLayout('FOOTER') // Bottom banner
110
+ `);
111
+ }
72
112
  };
73
113
 
74
114
  // Show help on first load
115
+ console.log('🚀 HTMLEditor Testing Ready! Type htmlEditorTest.help() for commands');
75
116
 
76
117
  // Cleanup on unmount
77
118
  return () => {
@@ -87,40 +128,32 @@ const HTMLEditorTesting = () => {
87
128
  }
88
129
 
89
130
  return (
90
- <div
91
- style={{
92
- position: 'fixed',
93
- top: 0,
94
- left: 0,
95
- right: 0,
96
- bottom: 0,
97
- backgroundColor: 'rgba(0, 0, 0, 0.8)',
98
- zIndex: 9999,
131
+ <div style={{
132
+ position: 'fixed',
133
+ top: 0,
134
+ left: 0,
135
+ right: 0,
136
+ bottom: 0,
137
+ backgroundColor: 'rgba(0, 0, 0, 0.8)',
138
+ zIndex: 9999,
139
+ display: 'flex',
140
+ flexDirection: 'column',
141
+ padding: '20px'
142
+ }}>
143
+ {/* Header */}
144
+ <div style={{
145
+ backgroundColor: '#fff',
146
+ padding: '10px 20px',
147
+ borderRadius: '8px 8px 0 0',
99
148
  display: 'flex',
100
- flexDirection: 'column',
101
- padding: '20px',
149
+ justifyContent: 'space-between',
150
+ alignItems: 'center',
151
+ borderBottom: '1px solid #ddd'
102
152
  }}>
103
- {/* Header */}
104
- <div
105
- style={{
106
- backgroundColor: '#fff',
107
- padding: '10px 20px',
108
- borderRadius: '8px 8px 0 0',
109
- display: 'flex',
110
- justifyContent: 'space-between',
111
- alignItems: 'center',
112
- borderBottom: '1px solid #ddd',
113
- }}>
114
153
  <div>
115
154
  <strong>HTMLEditor Testing Mode</strong>
116
155
  <span style={{ marginLeft: '20px', color: '#666' }}>
117
- Variant:
118
- {' '}
119
- {variant}
120
- {' '}
121
- | Layout:
122
- {' '}
123
- {layoutType}
156
+ Variant: {variant} | Layout: {layoutType}
124
157
  </span>
125
158
  </div>
126
159
  <button
@@ -131,7 +164,7 @@ const HTMLEditorTesting = () => {
131
164
  border: 'none',
132
165
  padding: '5px 15px',
133
166
  borderRadius: '4px',
134
- cursor: 'pointer',
167
+ cursor: 'pointer'
135
168
  }}
136
169
  >
137
170
  Close
@@ -139,13 +172,12 @@ const HTMLEditorTesting = () => {
139
172
  </div>
140
173
 
141
174
  {/* Editor Container */}
142
- <div
143
- style={{
144
- flex: 1,
145
- backgroundColor: '#fff',
146
- borderRadius: '0 0 8px 8px',
147
- overflow: 'hidden',
148
- }}>
175
+ <div style={{
176
+ flex: 1,
177
+ backgroundColor: '#fff',
178
+ borderRadius: '0 0 8px 8px',
179
+ overflow: 'hidden'
180
+ }}>
149
181
  <IntlProvider locale="en" messages={{}}>
150
182
  <HTMLEditor
151
183
  variant={variant}
@@ -153,8 +185,10 @@ const HTMLEditorTesting = () => {
153
185
  initialContent={content}
154
186
  onContentChange={(newContent) => {
155
187
  setContent(newContent);
188
+ console.log('📝 Content changed:', newContent.substring(0, 100) + '...');
156
189
  }}
157
- onSave={() => {
190
+ onSave={(savedContent) => {
191
+ console.log('💾 Content saved:', savedContent);
158
192
  }}
159
193
  />
160
194
  </IntlProvider>
@@ -47,8 +47,8 @@ describe('HTMLEditorTesting', () => {
47
47
  beforeEach(() => {
48
48
  // Mock console methods
49
49
  consoleSpy = {
50
- log: jest.spyOn(console, 'log').mockImplementation(() => { }),
51
- error: jest.spyOn(console, 'error').mockImplementation(() => { })
50
+ log: jest.spyOn(console, 'log').mockImplementation(() => {}),
51
+ error: jest.spyOn(console, 'error').mockImplementation(() => {})
52
52
  };
53
53
 
54
54
  // Clear any existing window.htmlEditorTest
@@ -88,6 +88,14 @@ describe('HTMLEditorTesting', () => {
88
88
  expect(typeof window.htmlEditorTest.status).toBe('function');
89
89
  expect(typeof window.htmlEditorTest.help).toBe('function');
90
90
  });
91
+
92
+ it('logs help message on initial load', () => {
93
+ render(<HTMLEditorTesting />);
94
+
95
+ expect(consoleSpy.log).toHaveBeenCalledWith(
96
+ '🚀 HTMLEditor Testing Ready! Type htmlEditorTest.help() for commands'
97
+ );
98
+ });
91
99
  });
92
100
 
93
101
  describe('Visibility Control', () => {
@@ -99,6 +107,7 @@ describe('HTMLEditorTesting', () => {
99
107
  });
100
108
 
101
109
  expect(screen.getByTestId('mock-html-editor')).toBeInTheDocument();
110
+ expect(consoleSpy.log).toHaveBeenCalledWith('✅ HTMLEditor test mode activated');
102
111
  });
103
112
 
104
113
  it('hides editor when hide() is called', () => {
@@ -115,6 +124,7 @@ describe('HTMLEditorTesting', () => {
115
124
  window.htmlEditorTest.hide();
116
125
  });
117
126
  expect(screen.queryByTestId('mock-html-editor')).not.toBeInTheDocument();
127
+ expect(consoleSpy.log).toHaveBeenCalledWith('✅ HTMLEditor test mode deactivated');
118
128
  });
119
129
 
120
130
  it('toggles editor visibility with toggle()', () => {
@@ -125,11 +135,14 @@ describe('HTMLEditorTesting', () => {
125
135
  window.htmlEditorTest.toggle();
126
136
  });
127
137
  expect(screen.getByTestId('mock-html-editor')).toBeInTheDocument();
138
+ expect(consoleSpy.log).toHaveBeenCalledWith('✅ HTMLEditor test mode activated');
139
+
128
140
  // Toggle to hide
129
141
  act(() => {
130
142
  window.htmlEditorTest.toggle();
131
143
  });
132
144
  expect(screen.queryByTestId('mock-html-editor')).not.toBeInTheDocument();
145
+ expect(consoleSpy.log).toHaveBeenCalledWith('✅ HTMLEditor test mode deactivated');
133
146
  });
134
147
 
135
148
  it('closes editor when close button is clicked', () => {
@@ -156,6 +169,7 @@ describe('HTMLEditorTesting', () => {
156
169
  });
157
170
 
158
171
  expect(screen.getByTestId('editor-variant')).toHaveTextContent('email');
172
+ expect(consoleSpy.log).toHaveBeenCalledWith('✅ Variant set to: email');
159
173
  });
160
174
 
161
175
  it('sets variant to inapp', () => {
@@ -167,6 +181,7 @@ describe('HTMLEditorTesting', () => {
167
181
  });
168
182
 
169
183
  expect(screen.getByTestId('editor-variant')).toHaveTextContent('inapp');
184
+ expect(consoleSpy.log).toHaveBeenCalledWith('✅ Variant set to: inapp');
170
185
  });
171
186
 
172
187
  it('rejects invalid variant', () => {
@@ -200,6 +215,7 @@ describe('HTMLEditorTesting', () => {
200
215
  });
201
216
 
202
217
  expect(screen.getByTestId('editor-layout')).toHaveTextContent(LAYOUT_TYPES.MODAL);
218
+ expect(consoleSpy.log).toHaveBeenCalledWith(`✅ Layout set to: ${LAYOUT_TYPES.MODAL}`);
203
219
  });
204
220
 
205
221
  it('sets layout to HEADER', () => {
@@ -211,6 +227,7 @@ describe('HTMLEditorTesting', () => {
211
227
  });
212
228
 
213
229
  expect(screen.getByTestId('editor-layout')).toHaveTextContent(LAYOUT_TYPES.HEADER);
230
+ expect(consoleSpy.log).toHaveBeenCalledWith(`✅ Layout set to: ${LAYOUT_TYPES.HEADER}`);
214
231
  });
215
232
 
216
233
  it('sets layout to FOOTER', () => {
@@ -222,6 +239,7 @@ describe('HTMLEditorTesting', () => {
222
239
  });
223
240
 
224
241
  expect(screen.getByTestId('editor-layout')).toHaveTextContent(LAYOUT_TYPES.FOOTER);
242
+ expect(consoleSpy.log).toHaveBeenCalledWith(`✅ Layout set to: ${LAYOUT_TYPES.FOOTER}`);
225
243
  });
226
244
 
227
245
  it('sets layout to FULLSCREEN', () => {
@@ -233,6 +251,7 @@ describe('HTMLEditorTesting', () => {
233
251
  });
234
252
 
235
253
  expect(screen.getByTestId('editor-layout')).toHaveTextContent(LAYOUT_TYPES.FULLSCREEN);
254
+ expect(consoleSpy.log).toHaveBeenCalledWith(`✅ Layout set to: ${LAYOUT_TYPES.FULLSCREEN}`);
236
255
  });
237
256
 
238
257
  it('rejects invalid layout', () => {
@@ -270,6 +289,7 @@ describe('HTMLEditorTesting', () => {
270
289
  });
271
290
 
272
291
  expect(screen.getByTestId('editor-content')).toHaveTextContent(newContent);
292
+ expect(consoleSpy.log).toHaveBeenCalledWith('✅ Content updated');
273
293
  });
274
294
 
275
295
  it('gets current content', () => {
@@ -278,6 +298,7 @@ describe('HTMLEditorTesting', () => {
278
298
  const result = window.htmlEditorTest.getContent();
279
299
 
280
300
  expect(result).toBe('<h1>Test HTML Editor</h1><p>This is a test integration.</p>');
301
+ expect(consoleSpy.log).toHaveBeenCalledWith('Current content:', result);
281
302
  });
282
303
 
283
304
  it('starts with default content', () => {
@@ -301,6 +322,8 @@ describe('HTMLEditorTesting', () => {
301
322
 
302
323
  const changeButton = screen.getByTestId('trigger-content-change');
303
324
  fireEvent.click(changeButton);
325
+
326
+ expect(consoleSpy.log).toHaveBeenCalledWith('📝 Content changed:', '<p>Changed content</p>...');
304
327
  });
305
328
 
306
329
  it('handles save callback', () => {
@@ -312,6 +335,46 @@ describe('HTMLEditorTesting', () => {
312
335
 
313
336
  const saveButton = screen.getByTestId('trigger-save');
314
337
  fireEvent.click(saveButton);
338
+
339
+ expect(consoleSpy.log).toHaveBeenCalledWith('💾 Content saved:', '<p>Saved content</p>');
340
+ });
341
+ });
342
+
343
+ describe('Status and Help', () => {
344
+ it('shows status information', () => {
345
+ render(<HTMLEditorTesting />);
346
+
347
+ act(() => {
348
+ window.htmlEditorTest.show();
349
+ window.htmlEditorTest.setVariant('inapp');
350
+ window.htmlEditorTest.setLayout(LAYOUT_TYPES.HEADER);
351
+ });
352
+
353
+ // Clear previous console calls
354
+ consoleSpy.log.mockClear();
355
+
356
+ act(() => {
357
+ window.htmlEditorTest.status();
358
+ });
359
+
360
+ expect(consoleSpy.log).toHaveBeenCalledWith('📊 HTMLEditor Test Status:');
361
+ expect(consoleSpy.log).toHaveBeenCalledWith(' Visible: true');
362
+ expect(consoleSpy.log).toHaveBeenCalledWith(' Variant: inapp');
363
+ expect(consoleSpy.log).toHaveBeenCalledWith(' Layout: HEADER');
364
+ expect(consoleSpy.log).toHaveBeenCalledWith(' Content size: 59 chars');
365
+ });
366
+
367
+ it('shows help information', () => {
368
+ render(<HTMLEditorTesting />);
369
+
370
+ act(() => {
371
+ window.htmlEditorTest.help();
372
+ });
373
+
374
+ expect(consoleSpy.log).toHaveBeenCalledWith(expect.stringContaining('🚀 HTMLEditor Testing Console Commands:'));
375
+ expect(consoleSpy.log).toHaveBeenCalledWith(expect.stringContaining('htmlEditorTest.show()'));
376
+ expect(consoleSpy.log).toHaveBeenCalledWith(expect.stringContaining('htmlEditorTest.setVariant(\'email\')'));
377
+ expect(consoleSpy.log).toHaveBeenCalledWith(expect.stringContaining('htmlEditorTest.setLayout(\'POPUP\')'));
315
378
  });
316
379
  });
317
380
 
@@ -407,6 +470,8 @@ describe('HTMLEditorTesting', () => {
407
470
  act(() => {
408
471
  window.htmlEditorTest.status();
409
472
  });
473
+
474
+ expect(consoleSpy.log).toHaveBeenCalledWith(` Content size: ${customContent.length} chars`);
410
475
  });
411
476
 
412
477
  it('handles multiple rapid operations', () => {
@@ -8,8 +8,6 @@ export const DEFAULT_ACTION = "app/EmailWrapper/DEFAULT_ACTION";
8
8
  export const EMAIL_CREATE_MODES = {
9
9
  UPLOAD: "upload",
10
10
  EDITOR: "editor",
11
- HTML_EDITOR: "html_editor",
12
- DRAG_DROP: "drag_drop",
13
11
  };
14
12
 
15
13
  export const STEPS = {