@capillarytech/creatives-library 8.0.309 → 8.0.310

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 (79) hide show
  1. package/constants/unified.js +1 -5
  2. package/initialState.js +2 -0
  3. package/package.json +1 -1
  4. package/services/api.js +0 -17
  5. package/services/tests/api.test.js +0 -85
  6. package/utils/common.js +8 -5
  7. package/utils/commonUtils.js +93 -46
  8. package/utils/tagValidations.js +223 -83
  9. package/utils/tests/commonUtil.test.js +124 -316
  10. package/utils/tests/tagValidations.test.js +358 -441
  11. package/v2Components/CommonTestAndPreview/SendTestMessage.js +49 -78
  12. package/v2Components/CommonTestAndPreview/_commonTestAndPreview.scss +34 -134
  13. package/v2Components/CommonTestAndPreview/actions.js +0 -10
  14. package/v2Components/CommonTestAndPreview/constants.js +1 -15
  15. package/v2Components/CommonTestAndPreview/index.js +19 -80
  16. package/v2Components/CommonTestAndPreview/messages.js +0 -94
  17. package/v2Components/CommonTestAndPreview/reducer.js +0 -10
  18. package/v2Components/CommonTestAndPreview/tests/SendTestMessage.test.js +0 -53
  19. package/v2Components/CommonTestAndPreview/tests/constants.test.js +1 -31
  20. package/v2Components/CommonTestAndPreview/tests/index.test.js +0 -36
  21. package/v2Components/CommonTestAndPreview/tests/reducer.test.js +0 -71
  22. package/v2Components/CommonTestAndPreview/tests/sagas.test.js +0 -377
  23. package/v2Components/CommonTestAndPreview/tests/selectors.test.js +0 -17
  24. package/v2Components/ErrorInfoNote/index.js +5 -2
  25. package/v2Components/FormBuilder/index.js +203 -137
  26. package/v2Components/FormBuilder/messages.js +8 -0
  27. package/v2Components/HtmlEditor/HTMLEditor.js +5 -0
  28. package/v2Components/HtmlEditor/__tests__/HTMLEditor.apiErrors.test.js +1 -0
  29. package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +15 -0
  30. package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +2 -1
  31. package/v2Containers/Cap/mockData.js +14 -0
  32. package/v2Containers/Cap/reducer.js +55 -3
  33. package/v2Containers/Cap/tests/reducer.test.js +102 -0
  34. package/v2Containers/CreativesContainer/SlideBoxContent.js +1 -5
  35. package/v2Containers/CreativesContainer/SlideBoxFooter.js +5 -13
  36. package/v2Containers/CreativesContainer/constants.js +0 -6
  37. package/v2Containers/CreativesContainer/index.js +7 -47
  38. package/v2Containers/Email/index.js +5 -1
  39. package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +70 -23
  40. package/v2Containers/EmailWrapper/components/__tests__/EmailHTMLEditor.test.js +120 -20
  41. package/v2Containers/FTP/index.js +51 -2
  42. package/v2Containers/FTP/messages.js +4 -0
  43. package/v2Containers/InApp/index.js +107 -35
  44. package/v2Containers/InApp/tests/index.test.js +6 -17
  45. package/v2Containers/InappAdvance/index.js +112 -4
  46. package/v2Containers/InappAdvance/tests/index.test.js +0 -2
  47. package/v2Containers/Line/Container/Text/index.js +1 -0
  48. package/v2Containers/MobilePush/Create/index.js +19 -59
  49. package/v2Containers/MobilePush/Edit/index.js +20 -48
  50. package/v2Containers/MobilePushNew/index.js +32 -12
  51. package/v2Containers/MobilepushWrapper/index.js +1 -3
  52. package/v2Containers/Rcs/index.js +37 -12
  53. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +1276 -1408
  54. package/v2Containers/Sms/Create/index.js +3 -39
  55. package/v2Containers/Sms/Create/messages.js +0 -4
  56. package/v2Containers/Sms/Edit/index.js +3 -35
  57. package/v2Containers/Sms/commonMethods.js +6 -3
  58. package/v2Containers/SmsTrai/Edit/index.js +47 -11
  59. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +294 -327
  60. package/v2Containers/SmsWrapper/index.js +0 -2
  61. package/v2Containers/TemplatesV2/index.js +13 -28
  62. package/v2Containers/Viber/index.js +1 -0
  63. package/v2Containers/WebPush/Create/hooks/useTagManagement.js +3 -1
  64. package/v2Containers/WebPush/Create/hooks/useTagManagement.test.js +7 -0
  65. package/v2Containers/WebPush/Create/index.js +2 -2
  66. package/v2Containers/WebPush/Create/utils/validation.js +8 -17
  67. package/v2Containers/WebPush/Create/utils/validation.test.js +24 -44
  68. package/v2Containers/Whatsapp/index.js +17 -9
  69. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +4872 -5246
  70. package/v2Containers/Zalo/index.js +11 -3
  71. package/v2Components/CommonTestAndPreview/AddTestCustomer.js +0 -42
  72. package/v2Components/CommonTestAndPreview/CustomerCreationModal.js +0 -284
  73. package/v2Components/CommonTestAndPreview/ExistingCustomerModal.js +0 -72
  74. package/v2Components/CommonTestAndPreview/tests/AddTestCustomer.test.js +0 -66
  75. package/v2Components/CommonTestAndPreview/tests/CommonTestAndPreview.addTestCustomer.test.js +0 -657
  76. package/v2Components/CommonTestAndPreview/tests/CustomValuesEditor.test.js +0 -172
  77. package/v2Components/CommonTestAndPreview/tests/CustomerCreationModal.test.js +0 -466
  78. package/v2Components/CommonTestAndPreview/tests/ExistingCustomerModal.test.js +0 -114
  79. package/v2Containers/Sms/tests/commonMethods.test.js +0 -122
@@ -24,9 +24,6 @@ const SendTestMessage = ({
24
24
  channel,
25
25
  isSendingTestMessage,
26
26
  formatMessage,
27
- renderAddTestCustomerButton,
28
- searchValue,
29
- setSearchValue,
30
27
  deliverySettings,
31
28
  senderDetailsOptions,
32
29
  wecrmAccounts,
@@ -34,77 +31,57 @@ const SendTestMessage = ({
34
31
  isLoadingSenderDetails,
35
32
  smsTraiDltEnabled,
36
33
  registeredSenderIds,
37
- }) => {
38
- const addCustomerContent = renderAddTestCustomerButton ? renderAddTestCustomerButton() : null;
39
- return (
40
- <CapStepsAccordian
41
- showNumberSteps={false}
42
- isChevronIcon
43
- expandIconPosition="right"
44
- items={[
45
- {
46
- header: (
47
- <CapHeader
48
- size="regular"
49
- description={<FormattedMessage {...messages.testMessageDescription} />}
50
- title={<FormattedMessage {...messages.sendTestMessage} />}
34
+ }) => (
35
+ <CapStepsAccordian
36
+ showNumberSteps={false}
37
+ isChevronIcon
38
+ expandIconPosition="right"
39
+ items={[
40
+ {
41
+ header: <CapHeader
42
+ size="regular"
43
+ description={<FormattedMessage {...messages.testMessageDescription} />}
44
+ title={<FormattedMessage {...messages.sendTestMessage} />}
45
+ />,
46
+ content: (
47
+ <CapRow className="send-test-content">
48
+ <CapHeader size="label1" title={<FormattedMessage {...messages.testCustomers} />} />
49
+ <CapTreeSelect
50
+ className="test-customers-tree-select"
51
+ loading={isFetchingTestCustomers || isFetchingTestGroups}
52
+ treeData={testEntitiesTreeData}
53
+ onChange={handleTestEntitiesChange}
54
+ value={selectedTestEntities}
55
+ multiple
56
+ placeholder={formatMessage(messages.testCustomersPlaceholder)}
51
57
  />
52
- ),
53
- content: (
54
- <CapRow className="send-test-content">
55
- <CapHeader size="label1" title={<FormattedMessage {...messages.testCustomers} />} />
56
- <CapTreeSelect
57
- className="test-customers-tree-select"
58
- dropdownMatchSelectWidth
59
- dropdownClassName="test-customers-tree-select-dropdown"
60
- listHeight={280}
61
- loading={isFetchingTestCustomers || isFetchingTestGroups}
62
- treeData={testEntitiesTreeData}
63
- onChange={handleTestEntitiesChange}
64
- value={selectedTestEntities}
65
- showSearch
66
- searchValue={searchValue}
67
- onSearch={setSearchValue}
68
- treeNodeFilterProp="title"
69
- {...(addCustomerContent ? { notFoundContent: addCustomerContent } : {})}
70
- multiple
71
- placeholder={formatMessage(messages.testCustomersPlaceholder)}
72
- dropdownStyle={{ zIndex: 900, maxHeight: 320 }}
73
- placement="bottomLeft"
74
- getPopupContainer={(node) => node.closest('.send-test-section') || document.body}
58
+ {CHANNELS_WITH_DELIVERY_SETTINGS.includes(channel) && (
59
+ <DeliverySettings
60
+ channel={channel}
61
+ deliverySettings={deliverySettings || {}}
62
+ senderDetailsOptions={senderDetailsOptions || []}
63
+ wecrmAccounts={wecrmAccounts || []}
64
+ onSaveDeliverySettings={onSaveDeliverySettings}
65
+ isLoadingSenderDetails={isLoadingSenderDetails}
66
+ formatMessage={formatMessage}
67
+ smsTraiDltEnabled={smsTraiDltEnabled}
68
+ registeredSenderIds={registeredSenderIds}
69
+ whatsappAccountFromForm={
70
+ channel === CHANNELS.WHATSAPP && formData?.accountName
71
+ ? { accountName: formData.accountName }
72
+ : undefined
73
+ }
75
74
  />
76
- {CHANNELS_WITH_DELIVERY_SETTINGS.includes(channel) && (
77
- <DeliverySettings
78
- channel={channel}
79
- deliverySettings={deliverySettings || {}}
80
- senderDetailsOptions={senderDetailsOptions || []}
81
- wecrmAccounts={wecrmAccounts || []}
82
- onSaveDeliverySettings={onSaveDeliverySettings}
83
- isLoadingSenderDetails={isLoadingSenderDetails}
84
- formatMessage={formatMessage}
85
- smsTraiDltEnabled={smsTraiDltEnabled}
86
- registeredSenderIds={registeredSenderIds}
87
- whatsappAccountFromForm={
88
- channel === CHANNELS.WHATSAPP && formData?.accountName
89
- ? { accountName: formData.accountName }
90
- : undefined
91
- }
92
- />
93
- )}
94
- <CapButton
95
- onClick={handleSendTestMessage}
96
- disabled={isEmpty(selectedTestEntities) || isSendingTestMessage}
97
- >
98
- <FormattedMessage {...messages.sendTestButton} />
99
- </CapButton>
100
- </CapRow>
101
- ),
102
- key: 1,
103
- },
104
- ]}
105
- />
106
- );
107
- };
75
+ )}
76
+ <CapButton onClick={handleSendTestMessage} disabled={isEmpty(selectedTestEntities) || isSendingTestMessage}>
77
+ <FormattedMessage {...messages.sendTestButton} />
78
+ </CapButton>
79
+ </CapRow>),
80
+ key: 1,
81
+ },
82
+ ]}
83
+ />
84
+ );
108
85
 
109
86
  SendTestMessage.propTypes = {
110
87
  isFetchingTestCustomers: PropTypes.bool.isRequired,
@@ -117,9 +94,6 @@ SendTestMessage.propTypes = {
117
94
  channel: PropTypes.string,
118
95
  isSendingTestMessage: PropTypes.bool.isRequired,
119
96
  formatMessage: PropTypes.func.isRequired,
120
- renderAddTestCustomerButton: PropTypes.func,
121
- searchValue: PropTypes.string,
122
- setSearchValue: PropTypes.func,
123
97
  deliverySettings: PropTypes.object,
124
98
  senderDetailsOptions: PropTypes.array,
125
99
  wecrmAccounts: PropTypes.array,
@@ -132,9 +106,6 @@ SendTestMessage.propTypes = {
132
106
  SendTestMessage.defaultProps = {
133
107
  formData: undefined,
134
108
  channel: undefined,
135
- renderAddTestCustomerButton: undefined,
136
- searchValue: '',
137
- setSearchValue: () => {}, // no-op when not provided; required by TreeSelect when showSearch is true
138
109
  deliverySettings: {},
139
110
  senderDetailsOptions: [],
140
111
  wecrmAccounts: [],
@@ -5,12 +5,9 @@
5
5
  */
6
6
  @import '~@capillarytech/cap-ui-library/styles/_variables.scss';
7
7
 
8
- /* All ant overrides scoped under wrapper to avoid affecting other modals. */
8
+ /* All ant overrides scoped under wrapper to avoid affecting other modals. */
9
9
  .common-test-preview-modal-wrap {
10
- z-index: 10000;
11
- display: flex;
12
- justify-content: center;
13
- align-items: center;
10
+ z-index: 10000 !important;
14
11
  }
15
12
 
16
13
  /* Lookup spinner overlay above test-customers dropdown. */
@@ -25,23 +22,19 @@
25
22
 
26
23
  /* When customer lookup is loading, dropdown renders inside .send-test-section; lower it so spinner is on top. */
27
24
  .common-test-preview-customer-loading .test-customers-tree-select-dropdown {
28
- z-index: 0;
25
+ z-index: 0 !important;
29
26
  }
30
27
 
31
28
  /* Customer creation modal content – avoid inline styles */
32
- .common-test-preview-modal.common-test-preview-modal {
33
- color: $CAP_G01;
34
- width: 32.571em;
35
- margin-left: auto;
36
- margin-right: auto;
37
- max-width: 32.571em;
38
-
29
+ .common-test-preview-modal {
30
+ color: $CAP_G01 !important;
31
+ .ant-modal-content {
32
+ width: 28.5rem; /* 456px at 16px root */
33
+ }
39
34
  .ant-modal-footer {
40
35
  text-align: left;
41
- margin-left: 0.625rem;
42
- /* 10px at 16px root */
43
- margin-top: 0.9375rem;
44
- /* 15px at 16px root */
36
+ margin-left: 0.625rem; /* 10px at 16px root */
37
+ margin-top: 0.9375rem; /* 15px at 16px root */
45
38
  }
46
39
 
47
40
  .customer-creation-modal-row {
@@ -70,72 +63,22 @@
70
63
  font-weight: normal;
71
64
  }
72
65
 
73
- /* Input text color and font to match standalone (lib mode can lose host styles) */
74
66
  .customer-creation-modal-input {
75
- /* Sizes in em for 14px base: same px as .5rem 2.5rem 1.5rem .875rem at 16px (8px, 40px, 24px, 14px) */
76
- .ant-input {
77
- color: $CAP_G01;
78
- font-size: $FONT_SIZE_M;
79
- font-weight: normal;
80
- padding: 0.571em;
81
- /* 8px */
82
- height: 2.857em;
83
- /* 40px */
84
- line-height: 1.714em;
85
- /* 24px */
86
- }
87
-
88
- .ant-input:hover,
89
- .ant-input:focus {
90
- border: 1px solid $CAP_G01;
91
- }
92
-
93
- .ant-input::placeholder {
94
- color: $CAP_G06;
95
- }
96
-
97
- /* Error state: single clean red border, no double line or focus ring */
98
- &.has-input-error {
99
- .ant-input-affix-wrapper {
100
- border: 1px solid $CAP_COLOR_03;
101
- border-radius: $CAP_SPACE_04;
102
- }
103
-
104
- .ant-input-affix-wrapper:hover,
105
- .ant-input-affix-wrapper:focus,
106
- .ant-input-affix-wrapper-focused {
107
- border: 1px solid $CAP_COLOR_03;
108
- }
67
+ width: 100%;
68
+ color: $CAP_G01;
109
69
 
110
- .ant-input-affix-wrapper .ant-input {
111
- border: none !important;
70
+ &.has-error {
71
+ color: $CAP_COLOR_03 !important;
72
+ .ant-input {
73
+ border-color: $CAP_COLOR_03 !important;
112
74
  }
113
75
  }
114
76
  }
115
77
 
116
- /* Error message only – no extra border/line below the input */
117
78
  .customer-creation-modal-validation-error {
118
79
  color: $CAP_COLOR_03;
119
80
  font-size: $FONT_SIZE_S;
120
81
  margin-top: $CAP_SPACE_04;
121
- border: none;
122
- border-top: none;
123
- box-shadow: none;
124
-
125
- &::before,
126
- &::after {
127
- display: none;
128
- content: none;
129
- border: none;
130
- }
131
- }
132
-
133
- /* Lookup loading: make Email and Mobile fields look disabled (wrapper-only) */
134
- .customer-creation-modal--lookup-loading .customer-creation-modal-row--email .customer-creation-modal-input,
135
- .customer-creation-modal--lookup-loading .customer-creation-modal-row--last .customer-creation-modal-input {
136
- opacity: 0.65;
137
- cursor: not-allowed;
138
- background-color: $CAP_G09;
139
82
  }
140
83
 
141
84
  /* Existing customer modal content */
@@ -144,17 +87,13 @@
144
87
  margin-bottom: $CAP_SPACE_16;
145
88
  }
146
89
 
147
- .ant-card.cap-card-v2 {
148
- border: none
149
- }
150
-
151
90
  .ant-card-body {
152
91
  padding: 1rem;
153
- border-radius: $CAP_SPACE_08;
154
- border: $CAP_SPACE_01 solid $CAP_G06;
155
92
  }
156
93
 
157
94
  &-card {
95
+ border-radius: $CAP_SPACE_08;
96
+ border: $CAP_SPACE_01 solid $CAP_G06;
158
97
  padding: 0;
159
98
  }
160
99
 
@@ -165,11 +104,9 @@
165
104
  }
166
105
 
167
106
  &-avatar {
168
- width: 3rem;
169
- /* 48px at 16px root */
107
+ width: 3rem; /* 48px at 16px root */
170
108
  height: 3rem;
171
- border-radius: 1.25rem;
172
- /* 20px at 16px root */
109
+ border-radius: 1.25rem; /* 20px at 16px root */
173
110
  background-color: $CAP_G07;
174
111
  display: flex;
175
112
  align-items: center;
@@ -214,6 +151,9 @@
214
151
  }
215
152
 
216
153
  .common-test-and-preview-slidebox {
154
+ .common-test-preview-modal-wrap {
155
+ z-index: 10003;
156
+ }
217
157
 
218
158
  .ant-modal-mask,
219
159
  .ant-modal-wrap {
@@ -256,7 +196,6 @@
256
196
 
257
197
  .tag-input-field {
258
198
  width: 14.714rem;
259
-
260
199
  .input {
261
200
  height: $CAP_SPACE_40;
262
201
  }
@@ -269,16 +208,12 @@
269
208
 
270
209
  .left-panel {
271
210
  width: 40%;
272
- min-width: 20rem;
273
- /* Consistent width in campaigns/library mode so test customer dropdown matches creatives */
274
211
  padding-right: 1rem;
275
212
  border-right: $CAP_SPACE_01 solid $CAP_G12;
276
213
  overflow-y: auto;
277
-
278
214
  .panel-divider {
279
215
  margin: 0;
280
216
  }
281
-
282
217
  .no-tags-extracted-info-note {
283
218
  .note-text {
284
219
  white-space: unset;
@@ -327,7 +262,6 @@
327
262
  .values-missing-message {
328
263
  margin: $CAP_SPACE_16 0;
329
264
  }
330
-
331
265
  .editor-header {
332
266
  display: flex;
333
267
  justify-content: flex-end;
@@ -411,7 +345,7 @@
411
345
  align-items: center;
412
346
  min-height: $CAP_SPACE_20;
413
347
  padding-left: $CAP_SPACE_08;
414
-
348
+
415
349
  &:hover {
416
350
  background-color: #f5f5f5;
417
351
  }
@@ -477,7 +411,6 @@
477
411
  color: #bfbfbf;
478
412
  font-style: italic;
479
413
  }
480
-
481
414
  .ant-input {
482
415
  margin: $CAP_SPACE_06 0;
483
416
  height: $CAP_SPACE_36;
@@ -538,11 +471,10 @@
538
471
  justify-content: space-between;
539
472
  margin-bottom: $CAP_SPACE_16;
540
473
  }
541
-
542
474
  .editor-actions::before,
543
475
  .editor-actions::after {
544
- content: none;
545
- display: none;
476
+ content: none;
477
+ display: none;
546
478
  }
547
479
 
548
480
  .optional-tags-section {
@@ -551,10 +483,9 @@
551
483
  color: #666;
552
484
  }
553
485
 
554
- z-index: -1;
555
-
486
+ z-index: -1;
556
487
  .optional-tags-content {
557
- padding: $CAP_SPACE_16;
488
+ padding: $CAP_SPACE_16;
558
489
  background: #f5f5f5;
559
490
  border-radius: $CAP_SPACE_04;
560
491
  }
@@ -580,40 +511,31 @@
580
511
  margin-bottom: $CAP_SPACE_16;
581
512
  color: #666;
582
513
  }
583
-
584
514
  .ant-collapse-header {
585
515
  padding-left: 0;
586
516
  }
587
-
588
517
  .ant-collapse-content-box {
589
518
  padding-left: 0 !important;
590
519
  }
591
-
592
520
  .send-test-content {
593
521
  flex-direction: column;
594
522
  align-items: stretch;
595
523
  gap: 0;
596
524
  }
597
-
598
525
  .test-customers-tree-select {
599
526
  width: 100%;
600
- min-width: 18rem;
601
- /* Consistent dropdown width in campaigns and creatives */
602
527
  min-height: $CAP_SPACE_40;
603
528
  margin: $CAP_SPACE_12 0 $CAP_SPACE_08;
604
-
605
529
  .ant-select-selection,
606
530
  .ant-select-selector {
607
531
  min-height: $CAP_SPACE_40;
608
532
  height: auto !important;
609
533
  }
610
534
  }
611
-
612
535
  .send-test-content .ant-btn {
613
536
  margin-top: $CAP_SPACE_04;
614
537
  flex-shrink: 0;
615
538
  }
616
-
617
539
  .ant-select-selection__choice {
618
540
  background-color: $CAP_G08;
619
541
  border-radius: $CAP_SPACE_04;
@@ -623,11 +545,8 @@
623
545
 
624
546
  // Test customers TreeSelect dropdown: limit height and make scrollable (dropdown renders in portal)
625
547
  .test-customers-tree-select-dropdown {
626
- min-width: 18rem;
627
- max-height: 20rem;
628
- /* 320px */
629
- overflow-y: auto;
630
-
548
+ max-height: 20rem !important; /* 320px */
549
+ overflow-y: auto !important;
631
550
  .ant-select-tree-list-holder-inner {
632
551
  overflow: visible;
633
552
  }
@@ -635,10 +554,8 @@
635
554
 
636
555
  .test-customer-add-btn {
637
556
  width: 100%;
638
- &.ant-btn.cap-button-v2.flat-btn {
639
- background-color: transparent;
640
- color: $FONT_COLOR_05;
641
- }
557
+ background-color: transparent !important;
558
+ color: $FONT_COLOR_05 !important;
642
559
  white-space: normal;
643
560
  word-break: normal;
644
561
  overflow-wrap: break-word;
@@ -666,7 +583,7 @@
666
583
  padding-bottom: $CAP_SPACE_16;
667
584
  margin-bottom: $CAP_SPACE_16;
668
585
  }
669
-
586
+
670
587
  .right-panel {
671
588
  padding-left: 0;
672
589
  padding-top: $CAP_SPACE_16;
@@ -682,7 +599,6 @@
682
599
  .preview-divider {
683
600
  margin: 0;
684
601
  }
685
-
686
602
  .preview-header {
687
603
  display: flex;
688
604
  justify-content: space-between;
@@ -694,7 +610,6 @@
694
610
  font-size: $FONT_SIZE_M;
695
611
  color: #595959;
696
612
  gap: $CAP_SPACE_04;
697
-
698
613
  b {
699
614
  color: #262626;
700
615
  margin-left: $CAP_SPACE_04;
@@ -725,12 +640,10 @@
725
640
 
726
641
  .preview-body {
727
642
  border-radius: $CAP_SPACE_08;
728
- box-shadow: 0 $CAP_SPACE_04 $CAP_SPACE_12 rgba(0, 0, 0, 0.1);
729
-
643
+ box-shadow: 0 $CAP_SPACE_04 $CAP_SPACE_12 rgba(0,0,0,0.1);
730
644
  &.mobile {
731
645
  width: 26.786rem;
732
646
  margin: 0 auto;
733
-
734
647
  .browser-bar {
735
648
  background: $CAP_G08;
736
649
  }
@@ -746,16 +659,13 @@
746
659
  display: flex;
747
660
  gap: $CAP_SPACE_08;
748
661
  color: $CAP_G06;
749
-
750
662
  .refresh-icon {
751
663
  margin-top: $CAP_SPACE_04;
752
-
753
664
  svg path {
754
665
  fill: $CAP_G06;
755
666
  }
756
667
  }
757
668
  }
758
-
759
669
  .address-bar {
760
670
  flex-grow: 1;
761
671
  background: $CAP_WHITE;
@@ -765,16 +675,13 @@
765
675
  color: #595959;
766
676
  text-align: center;
767
677
  border: $CAP_SPACE_01 solid $CAP_G07;
768
-
769
678
  .address-bar-label {
770
679
  float: left;
771
680
  }
772
-
773
681
  .browser-address-bar-icon {
774
682
  float: right;
775
683
  }
776
684
  }
777
-
778
685
  .browser-actions {
779
686
  color: #8c8c8c;
780
687
  }
@@ -785,11 +692,9 @@
785
692
  align-items: center;
786
693
  padding: $CAP_SPACE_16;
787
694
  gap: $CAP_SPACE_16;
788
-
789
695
  .back-arrow {
790
696
  font-size: $CAP_SPACE_16;
791
697
  }
792
-
793
698
  .email-meta {
794
699
  margin-left: auto;
795
700
  display: flex;
@@ -797,7 +702,6 @@
797
702
  gap: $CAP_SPACE_08;
798
703
  font-size: $FONT_SIZE_S;
799
704
  color: #8c8c8c;
800
-
801
705
  .dots {
802
706
  width: $CAP_SPACE_06;
803
707
  height: $CAP_SPACE_06;
@@ -812,19 +716,16 @@
812
716
  align-items: center;
813
717
  padding: 0 $CAP_SPACE_16 $CAP_SPACE_16;
814
718
  gap: $CAP_SPACE_12;
815
-
816
719
  .sender-avatar {
817
720
  width: $CAP_SPACE_40;
818
721
  height: $CAP_SPACE_40;
819
722
  border-radius: 50%;
820
723
  background: $CAP_G12;
821
724
  }
822
-
823
725
  .sender-info {
824
726
  .sender-name {
825
727
  font-weight: 500;
826
728
  }
827
-
828
729
  .recipient-info {
829
730
  font-size: $FONT_SIZE_S;
830
731
  color: #8c8c8c;
@@ -835,7 +736,6 @@
835
736
  .email-content {
836
737
  border-top: $CAP_SPACE_01 solid $CAP_G12;
837
738
  padding: 0 $CAP_SPACE_16;
838
-
839
739
  iframe {
840
740
  border: none;
841
741
  }
@@ -20,7 +20,6 @@ import {
20
20
  CLEAR_PREVIEW_ERRORS,
21
21
  GET_SENDER_DETAILS_REQUESTED,
22
22
  GET_WECRM_ACCOUNTS_REQUESTED,
23
- ADD_TEST_CUSTOMER,
24
23
  } from './constants';
25
24
 
26
25
  // ============================================
@@ -93,15 +92,6 @@ export const getTestGroupsRequested = () => ({
93
92
  type: GET_TEST_GROUPS_REQUESTED,
94
93
  });
95
94
 
96
- /**
97
- * Add a test customer to the list (e.g. after adding existing customer so tree shows name)
98
- * @param {Object} customer - { userId, customerId, name, email, mobile }
99
- */
100
- export const addTestCustomer = (customer) => ({
101
- type: ADD_TEST_CUSTOMER,
102
- payload: { customer },
103
- });
104
-
105
95
  /**
106
96
  * Create or update message meta configuration
107
97
  * @param {Object} payload - Message meta payload
@@ -33,7 +33,6 @@ export const SEND_TEST_MESSAGE_FAILURE = 'app/CommonTestAndPreview/SEND_TEST_MES
33
33
  export const GET_TEST_CUSTOMERS_REQUESTED = 'app/CommonTestAndPreview/GET_TEST_CUSTOMERS_REQUESTED';
34
34
  export const GET_TEST_CUSTOMERS_SUCCESS = 'app/CommonTestAndPreview/GET_TEST_CUSTOMERS_SUCCESS';
35
35
  export const GET_TEST_CUSTOMERS_FAILURE = 'app/CommonTestAndPreview/GET_TEST_CUSTOMERS_FAILURE';
36
- export const ADD_TEST_CUSTOMER = 'app/CommonTestAndPreview/ADD_TEST_CUSTOMER';
37
36
 
38
37
  // Test Groups
39
38
  export const GET_TEST_GROUPS_REQUESTED = 'app/CommonTestAndPreview/GET_TEST_GROUPS_REQUESTED';
@@ -66,12 +65,6 @@ export const GET_WECRM_ACCOUNTS_REQUESTED = 'app/CommonTestAndPreview/GET_WECRM_
66
65
  export const GET_WECRM_ACCOUNTS_SUCCESS = 'app/CommonTestAndPreview/GET_WECRM_ACCOUNTS_SUCCESS';
67
66
  export const GET_WECRM_ACCOUNTS_FAILURE = 'app/CommonTestAndPreview/GET_WECRM_ACCOUNTS_FAILURE';
68
67
 
69
- // ============================================
70
- // CUSTOMER MODAL TYPE (test customer addition)
71
- // ============================================
72
- export const CUSTOMER_MODAL_NEW = 'new';
73
- export const CUSTOMER_MODAL_EXISTING = 'existing';
74
-
75
68
  // ============================================
76
69
  // CHANNEL CONSTANTS
77
70
  // ============================================
@@ -107,21 +100,14 @@ export const CLIENT_NAME_CREATIVES = 'CREATIVES';
107
100
  // Note: API uses "PUSH" instead of "MOBILEPUSH" for MobilePush channel
108
101
  export const API_CHANNEL_PUSH = 'PUSH';
109
102
 
110
- // ============================================
111
- // VALIDATION REGEX (shared with commonUtils for email/mobile validation)
112
- // ============================================
113
- export const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
114
- export const PHONE_REGEX = /^[1-9]\d{7,14}$/;
115
-
116
103
  // ============================================
117
104
  // IDENTIFIER TYPE CONSTANTS
118
105
  // ============================================
119
- export const IDENTIFIER_TYPE_EMAIL = 'email';
120
106
  export const IDENTIFIER_TYPE_MOBILE = 'mobile';
121
107
  export const IDENTIFIER_TYPE_PHONE = 'phone';
122
108
 
123
109
  // Customer creation modal – input error state class suffix (used with customer-creation-modal-input)
124
- export const INPUT_HAS_ERROR_CLASS = ' has-input-error';
110
+ export const INPUT_HAS_ERROR_CLASS = ' has-error';
125
111
 
126
112
  // ============================================
127
113
  // CHANNEL NAME CONSTANTS (for CDN and other utilities)