@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.
- package/assets/Android.png +0 -0
- package/assets/iOS.png +0 -0
- package/constants/unified.js +1 -2
- package/initialReducer.js +0 -2
- package/package.json +1 -1
- package/services/api.js +0 -10
- package/services/tests/api.test.js +0 -18
- package/utils/common.js +0 -5
- package/utils/commonUtils.js +5 -28
- package/utils/tests/commonUtil.test.js +0 -224
- package/utils/transformTemplateConfig.js +10 -0
- package/v2Components/CapDeviceContent/index.js +56 -61
- package/v2Components/CapTagList/index.js +1 -6
- package/v2Components/CapTagListWithInput/index.js +1 -5
- package/v2Components/CapTagListWithInput/messages.js +1 -1
- package/v2Components/CapWhatsappCTA/tests/index.test.js +0 -5
- package/v2Components/ErrorInfoNote/index.js +72 -447
- package/v2Components/ErrorInfoNote/messages.js +0 -22
- package/v2Components/ErrorInfoNote/style.scss +4 -280
- package/v2Components/FormBuilder/tests/index.test.js +4 -13
- package/v2Components/HtmlEditor/HTMLEditor.js +94 -642
- package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +133 -1135
- package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +16 -27
- package/v2Components/HtmlEditor/_htmlEditor.scss +45 -108
- package/v2Components/HtmlEditor/_index.lazy.scss +1 -1
- package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +101 -13
- package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +139 -148
- package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +1 -2
- package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
- package/v2Components/HtmlEditor/components/EditorToolbar/_editorToolbar.scss +0 -9
- package/v2Components/HtmlEditor/components/EditorToolbar/index.js +1 -1
- package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +0 -22
- package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +7 -4
- package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +45 -35
- package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +3 -1
- package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
- package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +6 -7
- package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +6 -3
- package/v2Components/HtmlEditor/components/PreviewPane/index.js +13 -11
- package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
- package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +152 -0
- package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +31 -49
- package/v2Components/HtmlEditor/constants.js +20 -29
- package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +16 -373
- package/v2Components/HtmlEditor/hooks/useEditorContent.js +2 -5
- package/v2Components/HtmlEditor/hooks/useInAppContent.js +146 -88
- package/v2Components/HtmlEditor/hooks/useValidation.js +45 -150
- package/v2Components/HtmlEditor/index.js +1 -1
- package/v2Components/HtmlEditor/messages.js +85 -95
- package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +102 -134
- package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +25 -23
- package/v2Components/HtmlEditor/utils/validationAdapter.js +41 -66
- package/v2Components/MobilePushPreviewV2/index.js +7 -32
- package/v2Components/TemplatePreview/_templatePreview.scss +24 -44
- package/v2Components/TemplatePreview/index.js +32 -47
- package/v2Components/TemplatePreview/messages.js +0 -4
- package/v2Components/TestAndPreviewSlidebox/_testAndPreviewSlidebox.scss +0 -1
- package/v2Components/TestAndPreviewSlidebox/index.js +25 -31
- package/v2Containers/BeeEditor/index.js +90 -172
- package/v2Containers/CreativesContainer/SlideBoxContent.js +51 -128
- package/v2Containers/CreativesContainer/SlideBoxFooter.js +12 -113
- package/v2Containers/CreativesContainer/SlideBoxHeader.js +1 -2
- package/v2Containers/CreativesContainer/constants.js +0 -1
- package/v2Containers/CreativesContainer/index.js +46 -238
- package/v2Containers/CreativesContainer/messages.js +0 -8
- package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +2 -11
- package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +50 -38
- package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +0 -91
- package/v2Containers/Email/actions.js +0 -7
- package/v2Containers/Email/constants.js +1 -5
- package/v2Containers/Email/index.js +30 -229
- package/v2Containers/Email/messages.js +0 -32
- package/v2Containers/Email/reducer.js +1 -12
- package/v2Containers/Email/sagas.js +7 -61
- package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +0 -2
- package/v2Containers/Email/tests/sagas.test.js +1 -1
- package/v2Containers/EmailWrapper/components/EmailWrapperView.js +15 -210
- package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +74 -40
- package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +67 -2
- package/v2Containers/EmailWrapper/constants.js +0 -2
- package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +77 -629
- package/v2Containers/EmailWrapper/index.js +23 -103
- package/v2Containers/EmailWrapper/messages.js +1 -61
- package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +214 -0
- package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +77 -509
- package/v2Containers/InApp/actions.js +0 -7
- package/v2Containers/InApp/constants.js +4 -20
- package/v2Containers/InApp/index.js +357 -801
- package/v2Containers/InApp/index.scss +3 -4
- package/v2Containers/InApp/messages.js +3 -7
- package/v2Containers/InApp/reducer.js +3 -21
- package/v2Containers/InApp/sagas.js +9 -29
- package/v2Containers/InApp/selectors.js +5 -25
- package/v2Containers/InApp/tests/index.test.js +50 -154
- package/v2Containers/InApp/tests/reducer.test.js +0 -34
- package/v2Containers/InApp/tests/sagas.test.js +9 -61
- package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +0 -3
- package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +0 -2
- package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +0 -2
- package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +0 -9
- package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +0 -12
- package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +0 -4
- package/v2Containers/TagList/index.js +19 -62
- package/v2Containers/Templates/_templates.scss +1 -60
- package/v2Containers/Templates/index.js +4 -89
- package/v2Containers/Templates/messages.js +0 -4
- package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +0 -35
- package/v2Components/HtmlEditor/__tests__/HTMLEditor.apiErrors.test.js +0 -874
- package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +0 -254
- package/v2Components/HtmlEditor/components/ValidationTabs/index.js +0 -363
- package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +0 -51
- package/v2Components/HtmlEditor/hooks/__tests__/useValidation.apiErrors.test.js +0 -630
- package/v2Containers/BeePopupEditor/constants.js +0 -10
- package/v2Containers/BeePopupEditor/index.js +0 -193
- package/v2Containers/BeePopupEditor/tests/index.test.js +0 -627
- package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +0 -1317
- package/v2Containers/EmailWrapper/components/__tests__/EmailHTMLEditor.test.js +0 -1605
- package/v2Containers/EmailWrapper/components/__tests__/EmailWrapperView.test.js +0 -520
- package/v2Containers/EmailWrapper/tests/useEmailWrapper.edgeCases.test.js +0 -643
- package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +0 -376
- package/v2Containers/InApp/__tests__/sagas.test.js +0 -363
- package/v2Containers/InApp/tests/selectors.test.js +0 -612
- package/v2Containers/InAppWrapper/components/InAppWrapperView.js +0 -162
- package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +0 -267
- package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +0 -9
- package/v2Containers/InAppWrapper/constants.js +0 -16
- package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +0 -473
- package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +0 -198
- package/v2Containers/InAppWrapper/index.js +0 -148
- package/v2Containers/InAppWrapper/messages.js +0 -49
- package/v2Containers/InappAdvance/index.js +0 -1099
- package/v2Containers/InappAdvance/index.scss +0 -10
- package/v2Containers/InappAdvance/tests/index.test.js +0 -448
|
@@ -92,12 +92,9 @@ const TestAndPreviewSlidebox = (props) => {
|
|
|
92
92
|
const activeTab = currentTabData?.activeTab;
|
|
93
93
|
const templateContent = currentTabData?.[activeTab]?.['template-content'];
|
|
94
94
|
|
|
95
|
-
|
|
96
|
-
const initialContent = templateContent || content;
|
|
97
|
-
|
|
98
|
-
if (initialContent) {
|
|
95
|
+
if (templateContent) {
|
|
99
96
|
return {
|
|
100
|
-
resolvedBody:
|
|
97
|
+
resolvedBody: templateContent,
|
|
101
98
|
resolvedTitle: formData['template-subject'] || ''
|
|
102
99
|
};
|
|
103
100
|
}
|
|
@@ -115,14 +112,14 @@ const TestAndPreviewSlidebox = (props) => {
|
|
|
115
112
|
const resolveTagsInText = (text, tagValues) => {
|
|
116
113
|
if (!text) return text;
|
|
117
114
|
let resolvedText = text;
|
|
118
|
-
|
|
115
|
+
|
|
119
116
|
// Replace each tag with its custom value
|
|
120
117
|
Object.keys(tagValues).forEach((tagPath) => {
|
|
121
118
|
const tagName = tagPath.split('.').pop(); // Get the actual tag name from the path
|
|
122
119
|
const tagRegex = new RegExp(`{{${tagName}}}`, 'g');
|
|
123
120
|
resolvedText = resolvedText.replace(tagRegex, tagValues[tagPath] || `{{${tagName}}}`);
|
|
124
121
|
});
|
|
125
|
-
|
|
122
|
+
|
|
126
123
|
return resolvedText;
|
|
127
124
|
};
|
|
128
125
|
|
|
@@ -131,7 +128,7 @@ const TestAndPreviewSlidebox = (props) => {
|
|
|
131
128
|
const currentTabData = formData[currentTab - 1];
|
|
132
129
|
const activeTab = currentTabData?.activeTab;
|
|
133
130
|
const isDragDrop = currentTabData?.[activeTab]?.is_drag_drop;
|
|
134
|
-
|
|
131
|
+
|
|
135
132
|
if (isDragDrop && beeContent) {
|
|
136
133
|
return beeContent; // Use BEE content if available
|
|
137
134
|
}
|
|
@@ -233,7 +230,7 @@ const TestAndPreviewSlidebox = (props) => {
|
|
|
233
230
|
actions.extractTagsRequested(formData['template-subject'] || '', payloadContent);
|
|
234
231
|
}
|
|
235
232
|
}
|
|
236
|
-
|
|
233
|
+
|
|
237
234
|
actions.fetchTestCustomersRequested();
|
|
238
235
|
actions.fetchTestGroupsRequested();
|
|
239
236
|
}
|
|
@@ -245,20 +242,17 @@ const TestAndPreviewSlidebox = (props) => {
|
|
|
245
242
|
const activeTab = currentTabData?.activeTab;
|
|
246
243
|
const isDragDrop = currentTabData?.[activeTab]?.is_drag_drop;
|
|
247
244
|
const templateContent = currentTabData?.[activeTab]?.['template-content'];
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
const contentToUse = templateContent || content;
|
|
251
|
-
|
|
252
|
-
if (contentToUse && (typeof contentToUse === 'string' && contentToUse.trim() !== '')) {
|
|
245
|
+
|
|
246
|
+
if (templateContent && templateContent.trim() !== '') {
|
|
253
247
|
// Common function to handle content update
|
|
254
|
-
const handleContentUpdate = (
|
|
248
|
+
const handleContentUpdate = (content) => {
|
|
255
249
|
setPreviewDataHtml({
|
|
256
|
-
resolvedBody:
|
|
250
|
+
resolvedBody: content,
|
|
257
251
|
resolvedTitle: formData['template-subject'] || ''
|
|
258
252
|
});
|
|
259
253
|
|
|
260
254
|
// Extract tags from content
|
|
261
|
-
const payloadContent = convert(
|
|
255
|
+
const payloadContent = convert(content, GLOBAL_CONVERT_OPTIONS);
|
|
262
256
|
actions.extractTagsRequested(formData['template-subject'] || '', payloadContent);
|
|
263
257
|
};
|
|
264
258
|
|
|
@@ -270,13 +264,13 @@ const TestAndPreviewSlidebox = (props) => {
|
|
|
270
264
|
handleContentUpdate(templateContent);
|
|
271
265
|
}
|
|
272
266
|
} else {
|
|
273
|
-
// For CKEditor
|
|
274
|
-
if (
|
|
275
|
-
handleContentUpdate(
|
|
267
|
+
// For CKEditor, only update if content changed
|
|
268
|
+
if (templateContent !== previewDataHtml?.resolvedBody) {
|
|
269
|
+
handleContentUpdate(templateContent);
|
|
276
270
|
}
|
|
277
271
|
}
|
|
278
272
|
}
|
|
279
|
-
}, [formData, currentTab
|
|
273
|
+
}, [formData, currentTab]);
|
|
280
274
|
|
|
281
275
|
// Cleanup effect to reset ref when slidebox closes
|
|
282
276
|
useEffect(() => {
|
|
@@ -372,10 +366,10 @@ const TestAndPreviewSlidebox = (props) => {
|
|
|
372
366
|
useEffect(() => {
|
|
373
367
|
if (selectedCustomer) {
|
|
374
368
|
setTagsExtracted(true); // Auto-open custom values editor
|
|
375
|
-
|
|
369
|
+
|
|
376
370
|
// Get all available tags
|
|
377
371
|
const allTags = [...requiredTags, ...optionalTags];
|
|
378
|
-
|
|
372
|
+
|
|
379
373
|
if (allTags.length > 0) {
|
|
380
374
|
const payload = {
|
|
381
375
|
channel: EMAIL,
|
|
@@ -397,7 +391,7 @@ const TestAndPreviewSlidebox = (props) => {
|
|
|
397
391
|
updatedValues[tag?.fullPath] = prefilledValues[tag?.fullPath] || '';
|
|
398
392
|
});
|
|
399
393
|
|
|
400
|
-
|
|
394
|
+
|
|
401
395
|
setCustomValues(updatedValues);
|
|
402
396
|
|
|
403
397
|
// Update preview with prefilled values
|
|
@@ -445,10 +439,10 @@ const TestAndPreviewSlidebox = (props) => {
|
|
|
445
439
|
setSelectedTestEntities([]);
|
|
446
440
|
setBeeContent('');
|
|
447
441
|
previousBeeContentRef.current = '';
|
|
448
|
-
|
|
442
|
+
|
|
449
443
|
// Clear any pending actions
|
|
450
444
|
actions.clearPrefilledValues();
|
|
451
|
-
|
|
445
|
+
|
|
452
446
|
// Call parent's onClose if provided
|
|
453
447
|
if (onClose) {
|
|
454
448
|
onClose();
|
|
@@ -463,7 +457,7 @@ const TestAndPreviewSlidebox = (props) => {
|
|
|
463
457
|
const handleCustomerSelect = (customer) => {
|
|
464
458
|
setSelectedCustomer(customer);
|
|
465
459
|
setTagsExtracted(true); // Auto-open custom values editor
|
|
466
|
-
|
|
460
|
+
|
|
467
461
|
// Clear any existing values while waiting for prefilled values
|
|
468
462
|
const emptyValues = {};
|
|
469
463
|
[...requiredTags, ...optionalTags].forEach((tag) => {
|
|
@@ -474,7 +468,7 @@ const TestAndPreviewSlidebox = (props) => {
|
|
|
474
468
|
|
|
475
469
|
const handleClearSelection = () => {
|
|
476
470
|
setSelectedCustomer(null);
|
|
477
|
-
|
|
471
|
+
|
|
478
472
|
// Initialize empty values for all tags
|
|
479
473
|
const emptyValues = {};
|
|
480
474
|
[...requiredTags, ...optionalTags].forEach((tag) => {
|
|
@@ -565,12 +559,12 @@ const TestAndPreviewSlidebox = (props) => {
|
|
|
565
559
|
const currentTabData = formData[currentTab - 1];
|
|
566
560
|
const activeTab = currentTabData?.activeTab;
|
|
567
561
|
const templateContent = currentTabData?.[activeTab]?.['template-content'];
|
|
568
|
-
|
|
562
|
+
|
|
569
563
|
// Check for personalization tags (excluding unsubscribe)
|
|
570
564
|
const content = templateContent || getCurrentContent;
|
|
571
565
|
const tags = content.match(/{{[^}]+}}/g) || [];
|
|
572
566
|
const hasPersonalizationTags = tags.some(tag => !tag.includes('unsubscribe'));
|
|
573
|
-
|
|
567
|
+
|
|
574
568
|
if (!hasPersonalizationTags && tags.length === 1 && tags[0].includes('unsubscribe')) {
|
|
575
569
|
// If only unsubscribe tag is present, show noTagsExtracted message
|
|
576
570
|
setTagsExtracted(false);
|
|
@@ -579,7 +573,7 @@ const TestAndPreviewSlidebox = (props) => {
|
|
|
579
573
|
setCustomValues({});
|
|
580
574
|
return;
|
|
581
575
|
}
|
|
582
|
-
|
|
576
|
+
|
|
583
577
|
// Extract tags
|
|
584
578
|
setTagsExtracted(true);
|
|
585
579
|
if (templateContent) {
|
|
@@ -3,14 +3,16 @@
|
|
|
3
3
|
* Beeeditor
|
|
4
4
|
*
|
|
5
5
|
*/
|
|
6
|
-
import React, {
|
|
7
|
-
useEffect, useState, useRef, useCallback,
|
|
8
|
-
} from 'react';
|
|
6
|
+
import React, { useEffect, useState, useRef, useCallback } from 'react';
|
|
9
7
|
import PropTypes from 'prop-types';
|
|
10
8
|
import { injectIntl, intlShape, FormattedMessage } from 'react-intl';
|
|
11
9
|
import { connect } from 'react-redux';
|
|
12
|
-
import
|
|
10
|
+
import TagList from '../TagList';
|
|
11
|
+
import { bindActionCreators } from 'redux';
|
|
13
12
|
import { createStructuredSelector } from 'reselect';
|
|
13
|
+
import makeSelectBEE from './selectors';
|
|
14
|
+
import { UserIsAuthenticated } from '../../utils/authWrapper';
|
|
15
|
+
import config from '../../config/app';
|
|
14
16
|
import { loadItem } from 'services/localStorageApi';
|
|
15
17
|
import './index.scss';
|
|
16
18
|
import CapModal from "@capillarytech/cap-ui-library/CapModal";
|
|
@@ -19,18 +21,18 @@ import CapInput from "@capillarytech/cap-ui-library/CapInput";
|
|
|
19
21
|
import CapSelect from "@capillarytech/cap-ui-library/CapSelect";
|
|
20
22
|
import CapSpin from "@capillarytech/cap-ui-library/CapSpin";
|
|
21
23
|
import CapNotification from "@capillarytech/cap-ui-library/CapNotification";
|
|
22
|
-
import
|
|
23
|
-
import
|
|
24
|
+
import CapAskAira from '@capillarytech/cap-ui-library/CapAskAira';
|
|
25
|
+
import { request,getAPICallObject } from '../../services/api';
|
|
24
26
|
import messages from './messages';
|
|
25
27
|
import * as beeActions from './actions';
|
|
28
|
+
import injectSaga from '../../utils/injectSaga';
|
|
26
29
|
import injectReducer from '../../utils/injectReducer';
|
|
27
30
|
import { v2BeeEditionSagas } from './sagas';
|
|
28
31
|
import v2BeeEditionReducer from './reducer';
|
|
29
|
-
|
|
30
|
-
import TagList from '../TagList';
|
|
31
|
-
import injectSaga from '../../utils/injectSaga';
|
|
32
|
+
import { compose } from 'redux';
|
|
32
33
|
|
|
33
34
|
import { selectCurrentOrgDetails } from '../Cap/selectors';
|
|
35
|
+
import { ENABLE_AI_SUGGESTIONS } from './constants';
|
|
34
36
|
function BeeEditor(props) {
|
|
35
37
|
const {
|
|
36
38
|
uid,
|
|
@@ -59,10 +61,10 @@ function BeeEditor(props) {
|
|
|
59
61
|
const UNSUBSCRIBE = 'unsubscribe';
|
|
60
62
|
let beePluginInstance = null;
|
|
61
63
|
const categoryOptions = [{key: 'cta', value: 'cta', label: formatMessage(messages.cta)},
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
{key: 'footer', value: 'footer', label: formatMessage(messages.footer)},
|
|
65
|
+
{key: 'header', value: 'header', label: formatMessage(messages.header)},
|
|
66
|
+
{key: 'sp', value: 'sp', label: formatMessage(messages.socialPlatform)},
|
|
67
|
+
{key: 'others', value: 'others', label: formatMessage(messages.others)},
|
|
66
68
|
];
|
|
67
69
|
const [visibleTaglist, setVisibleTaglist] = useState(false);
|
|
68
70
|
const [showRowMetaModal, setRowMetaModal] = useState(false);
|
|
@@ -70,10 +72,6 @@ function BeeEditor(props) {
|
|
|
70
72
|
const [rowMetaInfo, setRowMetaInfo] = useState({});
|
|
71
73
|
const [rowName, setRowName] = useState('');
|
|
72
74
|
const [rowCategory, setRowCategory] = useState('');
|
|
73
|
-
const beePluginInstanceRef = useRef(null);
|
|
74
|
-
const initializedBeeJsonRef = useRef(null); // Track which beeJson we've initialized for
|
|
75
|
-
const isInitializingRef = useRef(false); // Track if initialization is in progress
|
|
76
|
-
const tokenDataRef = useRef(tokenData); // Store latest tokenData in ref
|
|
77
75
|
let API_ENDPOINT = config.development.api_endpoint;
|
|
78
76
|
if (process.env.NODE_ENV === 'production') {
|
|
79
77
|
API_ENDPOINT = `${window.location.origin}${config.production.api_endpoint}`;
|
|
@@ -96,8 +94,8 @@ function BeeEditor(props) {
|
|
|
96
94
|
locale = JSON.parse(user).lang;
|
|
97
95
|
}
|
|
98
96
|
const defaultFormattedUrl = locale !== DEFAULT_LOCALE && ['zh-cn', 'zh', 'jp', 'ja-JP'].includes(locale)
|
|
99
|
-
|
|
100
|
-
|
|
97
|
+
? `${API_ENDPOINT}/common/getBEECustomLangunage?langid=${MAPPED_LOCALE[locale]}`
|
|
98
|
+
: "";
|
|
101
99
|
useEffect(() => {
|
|
102
100
|
savedCallback.current = Object.keys(selectedTag).length > 0 ? selectedTag : rowMetaInfo;
|
|
103
101
|
}, [selectedTag, rowMetaInfo]);
|
|
@@ -106,44 +104,7 @@ function BeeEditor(props) {
|
|
|
106
104
|
const externalContentURLs = categoryOptions.map((obj) => ({name: obj.label, value: `${API_ENDPOINT}/common/getCustomRows?category=${obj.value}&orgid=${loadItem('orgID')}`}));
|
|
107
105
|
return externalContentURLs;
|
|
108
106
|
};
|
|
109
|
-
// Keep tokenDataRef updated with latest tokenData
|
|
110
|
-
useEffect(() => {
|
|
111
|
-
tokenDataRef.current = tokenData;
|
|
112
|
-
}, [tokenData]);
|
|
113
|
-
|
|
114
107
|
useEffect(() => {
|
|
115
|
-
// Only initialize if we have both tokenData and beeJson
|
|
116
|
-
const currentTokenData = tokenDataRef.current;
|
|
117
|
-
if (!currentTokenData || !beeJson) {
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// Normalize beeJson for comparison (handle both string and object)
|
|
122
|
-
// Use a stable key that includes uid to uniquely identify this instance
|
|
123
|
-
let normalizedBeeJson;
|
|
124
|
-
try {
|
|
125
|
-
normalizedBeeJson = typeof beeJson === 'string' ? beeJson : JSON.stringify(beeJson);
|
|
126
|
-
} catch (e) {
|
|
127
|
-
console.warn('[BeeEditor] Error stringifying beeJson:', e);
|
|
128
|
-
normalizedBeeJson = String(beeJson);
|
|
129
|
-
}
|
|
130
|
-
const initializationKey = `${uid}-${normalizedBeeJson}`;
|
|
131
|
-
|
|
132
|
-
// Only initialize if:
|
|
133
|
-
// 1. We haven't initialized yet, OR
|
|
134
|
-
// 2. The beeJson has changed (different template)
|
|
135
|
-
// This prevents re-initialization when only tokenData changes
|
|
136
|
-
// Also check if initialization is already in progress to prevent concurrent calls
|
|
137
|
-
if (
|
|
138
|
-
(initializedBeeJsonRef.current === initializationKey && beePluginInstanceRef.current) ||
|
|
139
|
-
isInitializingRef.current
|
|
140
|
-
) {
|
|
141
|
-
return; // Already initialized for this beeJson or initialization in progress, skip
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
// Mark that we're starting initialization
|
|
145
|
-
isInitializingRef.current = true;
|
|
146
|
-
|
|
147
108
|
const beeConfig = {
|
|
148
109
|
uid,
|
|
149
110
|
container: 'bee-plugin-container',
|
|
@@ -226,53 +187,14 @@ function BeeEditor(props) {
|
|
|
226
187
|
actions.createCustomRow(JSON.parse(rowJSON), callbackSaveRow);
|
|
227
188
|
},
|
|
228
189
|
};
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
beePluginInstanceRef.current = null;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
try {
|
|
241
|
-
window.BeePlugin.create(currentTokenData, beeConfig, (instance) => {
|
|
242
|
-
beePluginInstance = instance;
|
|
243
|
-
beePluginInstanceRef.current = instance;
|
|
244
|
-
const parseJson = typeof beeJson === 'string' ? JSON.parse(beeJson) : beeJson;
|
|
245
|
-
beePluginInstance.start(parseJson);
|
|
246
|
-
saveBeeInstance(beePluginInstance);
|
|
247
|
-
// Mark this beeJson as initialized and clear initialization flag
|
|
248
|
-
initializedBeeJsonRef.current = initializationKey;
|
|
249
|
-
isInitializingRef.current = false;
|
|
250
|
-
});
|
|
251
|
-
} catch (error) {
|
|
252
|
-
// Reset flag on error
|
|
253
|
-
console.error('[BeeEditor] Error creating BEE plugin:', error);
|
|
254
|
-
isInitializingRef.current = false;
|
|
255
|
-
}
|
|
256
|
-
return () => {
|
|
257
|
-
clearInterval(intervalTimer);
|
|
258
|
-
// Reset initialization flag on cleanup
|
|
259
|
-
isInitializingRef.current = false;
|
|
260
|
-
// Clean up BEE plugin instance if it exists
|
|
261
|
-
if (beePluginInstanceRef.current) {
|
|
262
|
-
try {
|
|
263
|
-
beePluginInstanceRef.current.destroy();
|
|
264
|
-
} catch (e) {
|
|
265
|
-
console.warn('[BeeEditor] useEffect cleanup - Error destroying BEE plugin:', e);
|
|
266
|
-
}
|
|
267
|
-
beePluginInstanceRef.current = null;
|
|
268
|
-
}
|
|
269
|
-
// Note: We don't reset initializedBeeJsonRef here because:
|
|
270
|
-
// 1. If beeJson changes, the effect will run again and the check will allow re-initialization
|
|
271
|
-
// 2. If component unmounts, the ref will be garbage collected anyway
|
|
272
|
-
};
|
|
273
|
-
// Only depend on beeJson, uid, and id - not tokenData
|
|
274
|
-
// tokenData is accessed via ref to prevent re-initialization when it changes
|
|
275
|
-
}, [beeJson, uid, id]);
|
|
190
|
+
window.BeePlugin.create(tokenData, beeConfig, (instance) => {
|
|
191
|
+
beePluginInstance = instance;
|
|
192
|
+
const parseJson = JSON.parse(beeJson);
|
|
193
|
+
beePluginInstance.start(parseJson);
|
|
194
|
+
saveBeeInstance(beePluginInstance);
|
|
195
|
+
});
|
|
196
|
+
return () => clearInterval(intervalTimer);
|
|
197
|
+
}, []);
|
|
276
198
|
const callbackSaveRow = (status, errorMsg) => {
|
|
277
199
|
if (status === 'success') {
|
|
278
200
|
CapNotification.success({message: formatMessage(messages.rowCreationSuccessMgs), key: 'create-custom-row-success'});
|
|
@@ -324,80 +246,76 @@ function BeeEditor(props) {
|
|
|
324
246
|
const onChangeCategoy = (e) => {
|
|
325
247
|
setRowCategory(e);
|
|
326
248
|
};
|
|
327
|
-
const contentSection =
|
|
328
|
-
|
|
329
|
-
<
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
/>
|
|
249
|
+
const contentSection = <>
|
|
250
|
+
<CapInput
|
|
251
|
+
label={<FormattedMessage {...messages.rowName} />}
|
|
252
|
+
placeholder={formatMessage(messages.rowPlaceHolder)}
|
|
253
|
+
onChange={onRowChange}
|
|
254
|
+
value={rowName}
|
|
255
|
+
maxLength={50}
|
|
256
|
+
style={{ width: 324, paddingBottom: 21 }}
|
|
257
|
+
/>
|
|
258
|
+
<CapSelect
|
|
259
|
+
label="Category"
|
|
260
|
+
style={{ width: 324, paddingBottom: 24}}
|
|
261
|
+
options={categoryOptions}
|
|
262
|
+
value={rowCategory || undefined}
|
|
263
|
+
placeholder={<FormattedMessage {...messages.selectCategoyPlaceholder} />}
|
|
264
|
+
onChange={onChangeCategoy}
|
|
265
|
+
/>
|
|
345
266
|
|
|
346
|
-
|
|
347
|
-
);
|
|
267
|
+
</>;
|
|
348
268
|
return (
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
</CapModal>
|
|
394
|
-
</CapSpin>
|
|
269
|
+
<CapSpin spinning={saveRowRequest || false}>
|
|
270
|
+
<div id="bee-plugin-container" style={{ height: "650px" }}></div>
|
|
271
|
+
<TagList
|
|
272
|
+
moduleFilterEnabled={moduleFilterEnabled}
|
|
273
|
+
label={label}
|
|
274
|
+
onTagSelect={onTagSelect}
|
|
275
|
+
location={location}
|
|
276
|
+
tags={filteredTags}
|
|
277
|
+
injectedTags={injectedTags}
|
|
278
|
+
className={className}
|
|
279
|
+
id={id}
|
|
280
|
+
userLocale={userLocale}
|
|
281
|
+
selectedOfferDetails={selectedOfferDetails}
|
|
282
|
+
visibleTaglist={visibleTaglist}
|
|
283
|
+
hidePopover
|
|
284
|
+
modalProps={{
|
|
285
|
+
onCancel: onCancelTagList,
|
|
286
|
+
style: { left: 135, top: 250 },
|
|
287
|
+
className: "bee-editor-tag-list",
|
|
288
|
+
}}
|
|
289
|
+
onContextChange={onContextChange}
|
|
290
|
+
eventContextTags={eventContextTags}
|
|
291
|
+
/>
|
|
292
|
+
<CapModal
|
|
293
|
+
className="custom-row-modal"
|
|
294
|
+
visible={showRowMetaModal}
|
|
295
|
+
onCancel={onCustomRowCancel}
|
|
296
|
+
title={formatMessage(messages.customRows)}
|
|
297
|
+
style={{ width: 372, height: 296, left: 135, top: 300 }}
|
|
298
|
+
footer={[
|
|
299
|
+
<CapButton
|
|
300
|
+
key="submit"
|
|
301
|
+
type="primary"
|
|
302
|
+
id="delete-version"
|
|
303
|
+
onClick={onCustomRowSave}
|
|
304
|
+
disabled={isDisableSave()}
|
|
305
|
+
>
|
|
306
|
+
{formatMessage(messages.done)}
|
|
307
|
+
</CapButton>,
|
|
308
|
+
]}
|
|
309
|
+
>
|
|
310
|
+
{contentSection}
|
|
311
|
+
</CapModal>
|
|
312
|
+
</CapSpin>
|
|
395
313
|
);
|
|
396
314
|
}
|
|
397
315
|
|
|
398
316
|
BeeEditor.propTypes = {
|
|
399
|
-
beeJson: PropTypes.
|
|
400
|
-
tokenData: PropTypes.
|
|
317
|
+
beeJson: PropTypes.object.isRequired,
|
|
318
|
+
tokenData: PropTypes.object.isRequired,
|
|
401
319
|
uid: PropTypes.string.isRequired,
|
|
402
320
|
intl: intlShape.isRequired,
|
|
403
321
|
actions: PropTypes.object.isRequired,
|
|
@@ -418,7 +336,7 @@ BeeEditor.propTypes = {
|
|
|
418
336
|
|
|
419
337
|
const mapStateToProps = () => createStructuredSelector({
|
|
420
338
|
BEESelect: makeSelectBEE(),
|
|
421
|
-
currentOrgDetails: selectCurrentOrgDetails()
|
|
339
|
+
currentOrgDetails: selectCurrentOrgDetails()
|
|
422
340
|
});
|
|
423
341
|
|
|
424
342
|
function mapDispatchToProps(dispatch) {
|