@capillarytech/creatives-library 8.0.242-alpha.10 → 8.0.242-alpha.11
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/config/app.js +1 -1
- package/constants/unified.js +2 -2
- package/initialReducer.js +0 -2
- package/package.json +1 -1
- package/services/api.js +5 -10
- package/services/tests/api.test.js +0 -18
- package/translations/en.json +4 -3
- package/utils/common.js +6 -5
- package/utils/commonUtils.js +1 -14
- package/utils/imageUrlUpload.js +141 -0
- package/utils/tests/commonUtil.test.js +0 -224
- package/utils/transformTemplateConfig.js +10 -0
- package/v2Components/CapDeviceContent/index.js +56 -61
- package/v2Components/CapImageUpload/constants.js +2 -0
- package/v2Components/CapImageUpload/index.js +65 -16
- package/v2Components/CapImageUpload/index.scss +4 -1
- package/v2Components/CapImageUpload/messages.js +5 -1
- package/v2Components/CapImageUrlUpload/constants.js +26 -0
- package/v2Components/CapImageUrlUpload/index.js +365 -0
- package/v2Components/CapImageUrlUpload/index.scss +35 -0
- package/v2Components/CapImageUrlUpload/messages.js +47 -0
- 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 -412
- package/v2Components/ErrorInfoNote/messages.js +0 -22
- package/v2Components/ErrorInfoNote/style.scss +2 -279
- package/v2Components/HtmlEditor/HTMLEditor.js +91 -220
- package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +133 -1132
- package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +12 -17
- package/v2Components/HtmlEditor/_htmlEditor.scss +45 -107
- 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 +11 -10
- package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
- package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +72 -70
- 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/index.js +1 -1
- package/v2Components/HtmlEditor/messages.js +85 -95
- package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +101 -99
- package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +25 -23
- package/v2Components/HtmlEditor/utils/validationAdapter.js +41 -34
- 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/index.js +25 -31
- package/v2Containers/App/constants.js +5 -0
- package/v2Containers/BeeEditor/index.js +80 -82
- package/v2Containers/Cap/tests/__snapshots__/index.test.js.snap +4 -3
- package/v2Containers/CreativesContainer/SlideBoxContent.js +118 -148
- package/v2Containers/CreativesContainer/SlideBoxFooter.js +3 -9
- package/v2Containers/CreativesContainer/SlideBoxHeader.js +2 -2
- package/v2Containers/CreativesContainer/constants.js +2 -1
- package/v2Containers/CreativesContainer/index.js +41 -173
- package/v2Containers/CreativesContainer/messages.js +4 -4
- package/v2Containers/CreativesContainer/tests/SlideBoxContent.test.js +210 -0
- package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +354 -38
- package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +0 -36
- package/v2Containers/Email/actions.js +0 -7
- package/v2Containers/Email/constants.js +1 -5
- package/v2Containers/Email/index.js +0 -13
- package/v2Containers/Email/messages.js +0 -32
- package/v2Containers/Email/reducer.js +1 -12
- package/v2Containers/Email/sagas.js +6 -41
- package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +0 -2
- package/v2Containers/EmailWrapper/components/EmailWrapperView.js +7 -193
- 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 +67 -436
- package/v2Containers/EmailWrapper/index.js +23 -99
- package/v2Containers/EmailWrapper/messages.js +1 -61
- package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +214 -0
- package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +77 -111
- 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 +12 -12
- package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +8 -8
- package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +100 -77
- package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +72 -63
- package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +184 -150
- package/v2Containers/SmsTrai/Create/tests/__snapshots__/index.test.js.snap +16 -12
- package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +32 -28
- package/v2Containers/TagList/index.js +1 -67
- package/v2Containers/Templates/ChannelTypeIllustration.js +13 -1
- package/v2Containers/Templates/_templates.scss +202 -56
- package/v2Containers/Templates/actions.js +2 -1
- package/v2Containers/Templates/constants.js +1 -0
- package/v2Containers/Templates/index.js +278 -128
- package/v2Containers/Templates/messages.js +24 -4
- package/v2Containers/Templates/reducer.js +2 -0
- package/v2Containers/Templates/tests/index.test.js +10 -0
- package/v2Containers/TemplatesV2/index.js +8 -1
- package/v2Containers/TemplatesV2/messages.js +4 -0
- package/v2Containers/WebPush/Create/components/BrandIconSection.js +108 -0
- package/v2Containers/WebPush/Create/components/ButtonForm.js +172 -0
- package/v2Containers/WebPush/Create/components/ButtonItem.js +101 -0
- package/v2Containers/WebPush/Create/components/ButtonList.js +145 -0
- package/v2Containers/WebPush/Create/components/ButtonsLinksSection.js +164 -0
- package/v2Containers/WebPush/Create/components/ButtonsLinksSection.test.js +463 -0
- package/v2Containers/WebPush/Create/components/FormActions.js +54 -0
- package/v2Containers/WebPush/Create/components/FormActions.test.js +163 -0
- package/v2Containers/WebPush/Create/components/MediaSection.js +142 -0
- package/v2Containers/WebPush/Create/components/MediaSection.test.js +341 -0
- package/v2Containers/WebPush/Create/components/MessageSection.js +103 -0
- package/v2Containers/WebPush/Create/components/MessageSection.test.js +268 -0
- package/v2Containers/WebPush/Create/components/NotificationTitleSection.js +87 -0
- package/v2Containers/WebPush/Create/components/NotificationTitleSection.test.js +210 -0
- package/v2Containers/WebPush/Create/components/TemplateNameSection.js +54 -0
- package/v2Containers/WebPush/Create/components/TemplateNameSection.test.js +143 -0
- package/v2Containers/WebPush/Create/components/__snapshots__/ButtonsLinksSection.test.js.snap +86 -0
- package/v2Containers/WebPush/Create/components/__snapshots__/FormActions.test.js.snap +16 -0
- package/v2Containers/WebPush/Create/components/__snapshots__/MediaSection.test.js.snap +41 -0
- package/v2Containers/WebPush/Create/components/__snapshots__/MessageSection.test.js.snap +54 -0
- package/v2Containers/WebPush/Create/components/__snapshots__/NotificationTitleSection.test.js.snap +37 -0
- package/v2Containers/WebPush/Create/components/__snapshots__/TemplateNameSection.test.js.snap +21 -0
- package/v2Containers/WebPush/Create/components/_buttons.scss +246 -0
- package/v2Containers/WebPush/Create/components/tests/ButtonForm.test.js +554 -0
- package/v2Containers/WebPush/Create/components/tests/ButtonItem.test.js +607 -0
- package/v2Containers/WebPush/Create/components/tests/ButtonList.test.js +633 -0
- package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonForm.test.js.snap +666 -0
- package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonItem.test.js.snap +74 -0
- package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonList.test.js.snap +78 -0
- package/v2Containers/WebPush/Create/hooks/useButtonManagement.js +138 -0
- package/v2Containers/WebPush/Create/hooks/useButtonManagement.test.js +406 -0
- package/v2Containers/WebPush/Create/hooks/useCharacterCount.js +30 -0
- package/v2Containers/WebPush/Create/hooks/useCharacterCount.test.js +151 -0
- package/v2Containers/WebPush/Create/hooks/useImageUpload.js +104 -0
- package/v2Containers/WebPush/Create/hooks/useImageUpload.test.js +538 -0
- package/v2Containers/WebPush/Create/hooks/useTagManagement.js +122 -0
- package/v2Containers/WebPush/Create/hooks/useTagManagement.test.js +633 -0
- package/v2Containers/WebPush/Create/index.js +1056 -0
- package/v2Containers/WebPush/Create/index.scss +134 -0
- package/v2Containers/WebPush/Create/messages.js +203 -0
- package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +228 -0
- package/v2Containers/WebPush/Create/preview/NotificationContainer.js +294 -0
- package/v2Containers/WebPush/Create/preview/PreviewContent.js +90 -0
- package/v2Containers/WebPush/Create/preview/PreviewControls.js +305 -0
- package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +23 -0
- package/v2Containers/WebPush/Create/preview/WebPushPreview.js +150 -0
- package/v2Containers/WebPush/Create/preview/assets/Light.svg +53 -0
- package/v2Containers/WebPush/Create/preview/assets/Top.svg +5 -0
- package/v2Containers/WebPush/Create/preview/assets/android-arrow-down.svg +9 -0
- package/v2Containers/WebPush/Create/preview/assets/android-arrow-up.svg +9 -0
- package/v2Containers/WebPush/Create/preview/assets/chrome-icon.png +0 -0
- package/v2Containers/WebPush/Create/preview/assets/edge-icon.png +0 -0
- package/v2Containers/WebPush/Create/preview/assets/firefox-icon.svg +106 -0
- package/v2Containers/WebPush/Create/preview/assets/iOS.svg +26 -0
- package/v2Containers/WebPush/Create/preview/assets/macos-arrow-down-icon.svg +9 -0
- package/v2Containers/WebPush/Create/preview/assets/macos-triple-dot-icon.svg +9 -0
- package/v2Containers/WebPush/Create/preview/assets/opera-icon.svg +18 -0
- package/v2Containers/WebPush/Create/preview/assets/safari-icon.svg +29 -0
- package/v2Containers/WebPush/Create/preview/assets/windows-close-icon.svg +9 -0
- package/v2Containers/WebPush/Create/preview/assets/windows-triple-dot-icon.svg +9 -0
- package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +47 -0
- package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +141 -0
- package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +45 -0
- package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +68 -0
- package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +61 -0
- package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +99 -0
- package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +733 -0
- package/v2Containers/WebPush/Create/preview/components/tests/WindowsChromeExpanded.test.js +571 -0
- package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +81 -0
- package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/WindowsChromeExpanded.test.js.snap +81 -0
- package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +50 -0
- package/v2Containers/WebPush/Create/preview/constants.js +637 -0
- package/v2Containers/WebPush/Create/preview/notification-container.scss +79 -0
- package/v2Containers/WebPush/Create/preview/preview.scss +351 -0
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +370 -0
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-edge.scss +12 -0
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-firefox.scss +12 -0
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-opera.scss +12 -0
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-chrome.scss +47 -0
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-edge.scss +11 -0
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-firefox.scss +11 -0
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-opera.scss +11 -0
- package/v2Containers/WebPush/Create/preview/styles/_base.scss +207 -0
- package/v2Containers/WebPush/Create/preview/styles/_ios.scss +153 -0
- package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +107 -0
- package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +101 -0
- package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +229 -0
- package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +909 -0
- package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +1081 -0
- package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +723 -0
- package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +943 -0
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +131 -0
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +112 -0
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/PreviewControls.test.js.snap +144 -0
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/WebPushPreview.test.js.snap +129 -0
- package/v2Containers/WebPush/Create/utils/payloadBuilder.js +94 -0
- package/v2Containers/WebPush/Create/utils/payloadBuilder.test.js +390 -0
- package/v2Containers/WebPush/Create/utils/previewUtils.js +89 -0
- package/v2Containers/WebPush/Create/utils/urlValidation.js +115 -0
- package/v2Containers/WebPush/Create/utils/urlValidation.test.js +449 -0
- package/v2Containers/WebPush/Create/utils/validation.js +75 -0
- package/v2Containers/WebPush/Create/utils/validation.test.js +283 -0
- package/v2Containers/WebPush/actions.js +60 -0
- package/v2Containers/WebPush/constants.js +128 -0
- package/v2Containers/WebPush/index.js +2 -0
- package/v2Containers/WebPush/reducer.js +104 -0
- package/v2Containers/WebPush/sagas.js +119 -0
- package/v2Containers/WebPush/selectors.js +65 -0
- package/v2Containers/WebPush/tests/reducer.test.js +863 -0
- package/v2Containers/WebPush/tests/sagas.test.js +566 -0
- package/v2Containers/WebPush/tests/selectors.test.js +843 -0
- package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +528 -431
- package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +0 -254
- package/v2Components/HtmlEditor/components/ValidationTabs/index.js +0 -362
- package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +0 -51
- 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 -1046
- 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
|
@@ -8,43 +8,33 @@
|
|
|
8
8
|
* - Theme support with proper styling
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import React, {
|
|
12
|
-
forwardRef, useImperativeHandle, useRef, useEffect, useCallback,
|
|
13
|
-
} from 'react';
|
|
11
|
+
import React, { forwardRef, useImperativeHandle, useRef, useEffect, useState } from 'react';
|
|
14
12
|
import PropTypes from 'prop-types';
|
|
15
13
|
|
|
16
14
|
// CodeMirror 6 imports
|
|
17
15
|
import { EditorState } from '@codemirror/state';
|
|
18
|
-
import {
|
|
19
|
-
EditorView, lineNumbers, highlightActiveLine, placeholder,
|
|
20
|
-
} from '@codemirror/view';
|
|
16
|
+
import { EditorView, lineNumbers, highlightActiveLine } from '@codemirror/view';
|
|
21
17
|
|
|
22
|
-
//
|
|
18
|
+
// Import our comprehensive syntax highlighting solution
|
|
19
|
+
import { createRobustExtensions } from '../../utils/properSyntaxHighlighting';
|
|
23
20
|
|
|
24
21
|
|
|
25
22
|
import { injectIntl, intlShape } from 'react-intl';
|
|
26
23
|
|
|
27
24
|
// Messages
|
|
28
|
-
import CapRow from '@capillarytech/cap-ui-library/CapRow';
|
|
29
25
|
import messages from '../../messages';
|
|
30
26
|
|
|
31
27
|
// Cap UI Components
|
|
28
|
+
import CapRow from '@capillarytech/cap-ui-library/CapRow';
|
|
32
29
|
|
|
33
30
|
// Components
|
|
34
31
|
import TagList from '../../../../v2Containers/TagList';
|
|
35
|
-
import ValidationErrorDisplay from '../ValidationErrorDisplay';
|
|
36
|
-
|
|
37
|
-
// Constants - removed unused imports since tag fetching is handled by parent
|
|
38
32
|
|
|
39
33
|
// Context
|
|
40
34
|
import { useEditorContext } from '../common/EditorContext';
|
|
41
35
|
|
|
42
36
|
// Styles
|
|
43
37
|
import './_codeEditorPane.scss';
|
|
44
|
-
import { INAPP } from '../../../../constants/unified';
|
|
45
|
-
|
|
46
|
-
// Define Theme and Highlighting inline to avoid "multiple instances of @codemirror/state" error
|
|
47
|
-
|
|
48
38
|
|
|
49
39
|
// Legacy CodeMirrorEditor removed - using enhanced implementation only
|
|
50
40
|
|
|
@@ -52,25 +42,12 @@ const CodeEditorPaneComponent = ({
|
|
|
52
42
|
intl,
|
|
53
43
|
readOnly = false,
|
|
54
44
|
className = '',
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
injectedTags = {},
|
|
59
|
-
location,
|
|
60
|
-
eventContextTags = [],
|
|
61
|
-
selectedOfferDetails = [],
|
|
62
|
-
channel,
|
|
63
|
-
userLocale = 'en',
|
|
64
|
-
moduleFilterEnabled = true,
|
|
65
|
-
onTagContextChange,
|
|
66
|
-
// Validation props
|
|
67
|
-
onErrorClick,
|
|
45
|
+
isFullscreenMode = false,
|
|
46
|
+
onLabelInsert,
|
|
47
|
+
forwardedRef
|
|
68
48
|
}) => {
|
|
69
|
-
const
|
|
70
|
-
const {
|
|
71
|
-
content, validation, variant, isLiquidEnabled,
|
|
72
|
-
} = context || {};
|
|
73
|
-
const { content: contentValue, updateContent } = content || {};
|
|
49
|
+
const { content, validation } = useEditorContext();
|
|
50
|
+
const { content: contentValue, updateContent } = content;
|
|
74
51
|
const editorRef = useRef(null);
|
|
75
52
|
const viewRef = useRef(null);
|
|
76
53
|
|
|
@@ -84,7 +61,7 @@ const CodeEditorPaneComponent = ({
|
|
|
84
61
|
get view() {
|
|
85
62
|
return viewRef.current;
|
|
86
63
|
},
|
|
87
|
-
viewRef, // For compatibility with existing code
|
|
64
|
+
viewRef: viewRef, // For compatibility with existing code
|
|
88
65
|
|
|
89
66
|
focus: () => {
|
|
90
67
|
if (viewRef.current) {
|
|
@@ -98,7 +75,7 @@ const CodeEditorPaneComponent = ({
|
|
|
98
75
|
const pos = position !== undefined ? position : head;
|
|
99
76
|
view.dispatch({
|
|
100
77
|
changes: { from: pos, insert: text },
|
|
101
|
-
selection: { anchor: pos + text.length }
|
|
78
|
+
selection: { anchor: pos + text.length }
|
|
102
79
|
});
|
|
103
80
|
} else {
|
|
104
81
|
throw new Error('CodeMirror view not initialized');
|
|
@@ -111,7 +88,9 @@ const CodeEditorPaneComponent = ({
|
|
|
111
88
|
}
|
|
112
89
|
return 0;
|
|
113
90
|
},
|
|
114
|
-
getValue: () =>
|
|
91
|
+
getValue: () => {
|
|
92
|
+
return contentValue || '';
|
|
93
|
+
},
|
|
115
94
|
setValue: (value) => {
|
|
116
95
|
updateContent(value);
|
|
117
96
|
},
|
|
@@ -128,7 +107,7 @@ const CodeEditorPaneComponent = ({
|
|
|
128
107
|
|
|
129
108
|
view.dispatch({
|
|
130
109
|
selection: { anchor: pos },
|
|
131
|
-
effects: EditorView.scrollIntoView(pos, { y: 'center' })
|
|
110
|
+
effects: EditorView.scrollIntoView(pos, { y: 'center' })
|
|
132
111
|
});
|
|
133
112
|
view.focus();
|
|
134
113
|
} catch (error) {
|
|
@@ -138,7 +117,7 @@ const CodeEditorPaneComponent = ({
|
|
|
138
117
|
}
|
|
139
118
|
}
|
|
140
119
|
}
|
|
141
|
-
}
|
|
120
|
+
}
|
|
142
121
|
}), [contentValue]);
|
|
143
122
|
|
|
144
123
|
// Note: handleContentChange removed - using updateContentRef directly in CodeMirror
|
|
@@ -154,9 +133,7 @@ const CodeEditorPaneComponent = ({
|
|
|
154
133
|
if (typeof tagData === 'string') {
|
|
155
134
|
tagText = tagData;
|
|
156
135
|
} else if (tagData) {
|
|
157
|
-
const {
|
|
158
|
-
text, name, label, value,
|
|
159
|
-
} = tagData;
|
|
136
|
+
const { text, name, label, value } = tagData;
|
|
160
137
|
tagText = text || name || label || value;
|
|
161
138
|
if (!tagText) {
|
|
162
139
|
console.warn('Invalid tag data:', tagData);
|
|
@@ -170,67 +147,49 @@ const CodeEditorPaneComponent = ({
|
|
|
170
147
|
// For unified HTML editor, insert as template variable
|
|
171
148
|
const formattedTag = `{{${tagText}}}`;
|
|
172
149
|
|
|
173
|
-
// Insert the tag at cursor position
|
|
150
|
+
// Insert the tag at cursor position
|
|
174
151
|
view.dispatch({
|
|
175
152
|
changes: { from: pos, insert: formattedTag },
|
|
176
|
-
selection: { anchor: pos + formattedTag.length }
|
|
153
|
+
selection: { anchor: pos + formattedTag.length }
|
|
177
154
|
});
|
|
178
155
|
|
|
179
156
|
// Focus back to editor
|
|
180
157
|
view.focus();
|
|
181
158
|
|
|
182
|
-
//
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
// The direct insertion via view.dispatch is sufficient
|
|
159
|
+
// Call the parent's handleLabelInsert if available
|
|
160
|
+
if (onLabelInsert) {
|
|
161
|
+
onLabelInsert(formattedTag, pos);
|
|
162
|
+
}
|
|
187
163
|
}
|
|
188
164
|
};
|
|
189
165
|
|
|
190
|
-
// Handle tag context change - delegate to parent component
|
|
191
|
-
// Tags are fetched in parent components (EmailHTMLEditor, INAPP, etc.)
|
|
192
|
-
// This component just passes the context change event up
|
|
193
|
-
const handleTagContextChange = useCallback((data) => {
|
|
194
|
-
if (onTagContextChange) {
|
|
195
|
-
// Parent component handles tag fetching and updates
|
|
196
|
-
onTagContextChange(data);
|
|
197
|
-
}
|
|
198
|
-
// No fallback - tags must be managed by parent component
|
|
199
|
-
}, [onTagContextChange]);
|
|
200
|
-
|
|
201
166
|
// Initialize CodeMirror effect
|
|
202
167
|
useEffect(() => {
|
|
203
168
|
if (editorRef.current && !viewRef.current) {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
EditorView.updateListener.of((update) => {
|
|
220
|
-
if (update.docChanged) {
|
|
221
|
-
updateContentRef.current(update.state.doc.toString());
|
|
222
|
-
}
|
|
223
|
-
}),
|
|
224
|
-
];
|
|
169
|
+
// Use the comprehensive extensions from properSyntaxHighlighting.js
|
|
170
|
+
// This includes: html(), syntaxHighlighting(comprehensiveVSCodeTheme), cleanEditorTheme
|
|
171
|
+
const robustExtensions = createRobustExtensions();
|
|
172
|
+
|
|
173
|
+
// Add additional extensions for line numbers, active line, and update listener
|
|
174
|
+
const extensions = [
|
|
175
|
+
lineNumbers(),
|
|
176
|
+
highlightActiveLine(),
|
|
177
|
+
...robustExtensions, // Spread the robust extensions (html, syntax highlighting, theme)
|
|
178
|
+
EditorView.updateListener.of((update) => {
|
|
179
|
+
if (update.docChanged) {
|
|
180
|
+
updateContentRef.current(update.state.doc.toString());
|
|
181
|
+
}
|
|
182
|
+
})
|
|
183
|
+
];
|
|
225
184
|
|
|
226
185
|
const state = EditorState.create({
|
|
227
186
|
doc: contentValue || '',
|
|
228
|
-
extensions
|
|
187
|
+
extensions
|
|
229
188
|
});
|
|
230
189
|
|
|
231
190
|
viewRef.current = new EditorView({
|
|
232
191
|
state,
|
|
233
|
-
parent: editorRef.current
|
|
192
|
+
parent: editorRef.current
|
|
234
193
|
});
|
|
235
194
|
}
|
|
236
195
|
|
|
@@ -245,74 +204,116 @@ const CodeEditorPaneComponent = ({
|
|
|
245
204
|
viewRef.current = null;
|
|
246
205
|
}
|
|
247
206
|
};
|
|
248
|
-
}, [
|
|
207
|
+
}, []);
|
|
249
208
|
|
|
250
209
|
// Update editor content when content changes
|
|
251
210
|
useEffect(() => {
|
|
252
|
-
if (viewRef.current && contentValue
|
|
211
|
+
if (viewRef.current && contentValue !== viewRef.current.state.doc.toString()) {
|
|
253
212
|
const { current: view } = viewRef;
|
|
254
213
|
const { state: { doc: { length } } } = view;
|
|
255
214
|
view.dispatch({
|
|
256
215
|
changes: {
|
|
257
216
|
from: 0,
|
|
258
217
|
to: length,
|
|
259
|
-
insert: contentValue || ''
|
|
260
|
-
}
|
|
218
|
+
insert: contentValue || ''
|
|
219
|
+
}
|
|
261
220
|
});
|
|
262
221
|
}
|
|
263
222
|
}, [contentValue]);
|
|
264
223
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
224
|
+
return (
|
|
225
|
+
<CapRow className={`code-editor-pane ${className}`}>
|
|
226
|
+
{/* Unified Code Editor with Floating Add Label Button */}
|
|
227
|
+
<CapRow className="code-editor-pane__content">
|
|
228
|
+
<div className="codemirror-wrapper">
|
|
229
|
+
<div ref={editorRef} className="codemirror-editor" />
|
|
230
|
+
{/* Floating Add Label Button */}
|
|
231
|
+
<CapRow className="code-editor-pane__actions">
|
|
232
|
+
<TagList
|
|
233
|
+
key="html-editor-taglist"
|
|
234
|
+
label={intl.formatMessage(messages.addLabel)}
|
|
235
|
+
onTagSelect={handleTagSelect}
|
|
236
|
+
onContextChange={(context) => {
|
|
237
|
+
}}
|
|
238
|
+
className="tag-list-trigger"
|
|
239
|
+
tags={[]} // Empty initially - TagList will fetch from API
|
|
240
|
+
injectedTags={{
|
|
241
|
+
// Add common HTML/Email specific tags as fallback
|
|
242
|
+
'Customer Info': {
|
|
243
|
+
name: 'Customer Info',
|
|
244
|
+
desc: 'Customer information tags',
|
|
245
|
+
resolved: true,
|
|
246
|
+
'tag-header': true,
|
|
247
|
+
subtags: {
|
|
248
|
+
'customer.firstName': {
|
|
249
|
+
name: 'First Name',
|
|
250
|
+
desc: 'Customer first name',
|
|
251
|
+
resolved: true
|
|
252
|
+
},
|
|
253
|
+
'customer.lastName': {
|
|
254
|
+
name: 'Last Name',
|
|
255
|
+
desc: 'Customer last name',
|
|
256
|
+
resolved: true
|
|
257
|
+
},
|
|
258
|
+
'customer.email': {
|
|
259
|
+
name: 'Email',
|
|
260
|
+
desc: 'Customer email address',
|
|
261
|
+
resolved: true
|
|
262
|
+
},
|
|
263
|
+
'customer.phone': {
|
|
264
|
+
name: 'Phone',
|
|
265
|
+
desc: 'Customer phone number',
|
|
266
|
+
resolved: true
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
},
|
|
270
|
+
'Common Tags': {
|
|
271
|
+
name: 'Common Tags',
|
|
272
|
+
desc: 'Commonly used template tags',
|
|
273
|
+
resolved: true,
|
|
274
|
+
'tag-header': true,
|
|
275
|
+
subtags: {
|
|
276
|
+
'organization.name': {
|
|
277
|
+
name: 'Organization Name',
|
|
278
|
+
desc: 'Organization name',
|
|
279
|
+
resolved: true
|
|
280
|
+
},
|
|
281
|
+
'currentDate': {
|
|
282
|
+
name: 'Current Date',
|
|
283
|
+
desc: 'Current date',
|
|
284
|
+
resolved: true
|
|
285
|
+
},
|
|
286
|
+
'unsubscribeLink': {
|
|
287
|
+
name: 'Unsubscribe Link',
|
|
288
|
+
desc: 'Unsubscribe link',
|
|
289
|
+
resolved: true
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}}
|
|
294
|
+
moduleFilterEnabled={true}
|
|
295
|
+
userLocale="en"
|
|
296
|
+
channel="email"
|
|
297
|
+
disabled={readOnly}
|
|
298
|
+
location={{
|
|
299
|
+
query: {
|
|
300
|
+
type: 'html-editor' // Identify the context
|
|
301
|
+
}
|
|
302
|
+
}}
|
|
303
|
+
selectedOfferDetails={[]}
|
|
304
|
+
eventContextTags={[]}
|
|
305
|
+
/>
|
|
306
|
+
</CapRow>
|
|
307
|
+
</div>
|
|
308
|
+
</CapRow>
|
|
309
|
+
|
|
310
|
+
</CapRow>
|
|
311
|
+
);
|
|
308
312
|
};
|
|
309
313
|
|
|
310
|
-
//
|
|
311
|
-
const CodeEditorPaneWithIntl = injectIntl(CodeEditorPaneComponent);
|
|
312
|
-
|
|
313
|
-
// Create the forwardRef wrapper that forwards ref to the intl-wrapped component
|
|
314
|
+
// Create the forwardRef wrapper
|
|
314
315
|
const CodeEditorPane = forwardRef((props, ref) => (
|
|
315
|
-
<
|
|
316
|
+
<CodeEditorPaneComponent {...props} forwardedRef={ref} />
|
|
316
317
|
));
|
|
317
318
|
|
|
318
319
|
CodeEditorPane.displayName = 'CodeEditorPane';
|
|
@@ -322,19 +323,9 @@ CodeEditorPane.propTypes = {
|
|
|
322
323
|
readOnly: PropTypes.bool,
|
|
323
324
|
className: PropTypes.string,
|
|
324
325
|
isFullscreenMode: PropTypes.bool,
|
|
325
|
-
onLabelInsert: PropTypes.func
|
|
326
|
-
onErrorClick: PropTypes.func,
|
|
327
|
-
// Tag-related props - tags are fetched and managed by parent component
|
|
328
|
-
tags: PropTypes.array,
|
|
329
|
-
injectedTags: PropTypes.object,
|
|
330
|
-
location: PropTypes.object,
|
|
331
|
-
eventContextTags: PropTypes.array,
|
|
332
|
-
selectedOfferDetails: PropTypes.array,
|
|
333
|
-
channel: PropTypes.string,
|
|
334
|
-
userLocale: PropTypes.string,
|
|
335
|
-
moduleFilterEnabled: PropTypes.bool,
|
|
336
|
-
onTagContextChange: PropTypes.func, // Required - parent must handle tag fetching
|
|
326
|
+
onLabelInsert: PropTypes.func
|
|
337
327
|
};
|
|
338
328
|
|
|
339
|
-
// Export
|
|
340
|
-
export default CodeEditorPane;
|
|
329
|
+
// Export with injectIntl - ref forwarding is handled by forwardRef wrapper
|
|
330
|
+
export default injectIntl(CodeEditorPane);
|
|
331
|
+
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
.html-editor .device-toggle {
|
|
10
10
|
display: flex;
|
|
11
11
|
align-items: center;
|
|
12
|
-
|
|
12
|
+
gap: 1rem;
|
|
13
13
|
padding: 0;
|
|
14
14
|
background-color: $CAP_G10;
|
|
15
15
|
border-radius: 0.25rem 0.25rem 0 0;
|
|
@@ -220,7 +220,6 @@
|
|
|
220
220
|
|
|
221
221
|
// Integration with editor toolbar
|
|
222
222
|
.html-editor.html-editor--inapp {
|
|
223
|
-
margin-top: 4%;
|
|
224
223
|
.editor-toolbar {
|
|
225
224
|
padding: 0 1rem 0 0; // Remove left padding to align with device toggle
|
|
226
225
|
background-color: $CAP_G10;
|
|
@@ -32,7 +32,7 @@ const DeviceToggle = ({
|
|
|
32
32
|
onDeviceChange,
|
|
33
33
|
keepContentSame = false,
|
|
34
34
|
onKeepContentSameChange,
|
|
35
|
-
className = ''
|
|
35
|
+
className = ''
|
|
36
36
|
}) => {
|
|
37
37
|
const handleDeviceClick = (device) => {
|
|
38
38
|
if (onDeviceChange && device !== activeDevice) {
|
|
@@ -97,7 +97,7 @@ DeviceToggle.propTypes = {
|
|
|
97
97
|
onDeviceChange: PropTypes.func,
|
|
98
98
|
keepContentSame: PropTypes.bool,
|
|
99
99
|
onKeepContentSameChange: PropTypes.func,
|
|
100
|
-
className: PropTypes.string
|
|
100
|
+
className: PropTypes.string
|
|
101
101
|
};
|
|
102
102
|
|
|
103
103
|
DeviceToggle.defaultProps = {
|
|
@@ -105,7 +105,7 @@ DeviceToggle.defaultProps = {
|
|
|
105
105
|
onDeviceChange: null,
|
|
106
106
|
keepContentSame: false,
|
|
107
107
|
onKeepContentSameChange: null,
|
|
108
|
-
className: ''
|
|
108
|
+
className: ''
|
|
109
109
|
};
|
|
110
110
|
|
|
111
111
|
export default injectIntl(DeviceToggle);
|
|
@@ -15,7 +15,6 @@
|
|
|
15
15
|
border-radius: 0.25rem 0.25rem 0 0;
|
|
16
16
|
box-sizing: border-box;
|
|
17
17
|
flex-shrink: 0;
|
|
18
|
-
position: relative;
|
|
19
18
|
|
|
20
19
|
&__left {
|
|
21
20
|
display: flex;
|
|
@@ -111,12 +110,4 @@
|
|
|
111
110
|
display: none;
|
|
112
111
|
}
|
|
113
112
|
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// Library mode override for InApp variant - Position absolute for toolbar
|
|
117
|
-
// These selectors target the toolbar when inside library mode InApp variant
|
|
118
|
-
.html-editor--inapp.html-editor--library-mode .html-editor__header .editor-toolbar,
|
|
119
|
-
.html-editor--inapp.html-editor--library-mode .html-editor__header .editor-toolbar.editor-toolbar,
|
|
120
|
-
.html-editor--inapp.html-editor--library-mode .html-editor__header .ant-layout-header.editor-toolbar {
|
|
121
|
-
position: absolute;
|
|
122
113
|
}
|
|
@@ -49,31 +49,9 @@ body .ant-modal-mask+.ant-modal-wrap .ant-modal.html-editor-fullscreen-modal .an
|
|
|
49
49
|
padding: 0;
|
|
50
50
|
min-height: 3.25rem;
|
|
51
51
|
height: 3.25rem;
|
|
52
|
-
position: relative;
|
|
53
52
|
|
|
54
53
|
&__right {
|
|
55
54
|
margin-left: auto;
|
|
56
55
|
}
|
|
57
56
|
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Library mode overrides for INAPP variant - Position absolute for toolbar
|
|
61
|
-
// These selectors match the high-specificity patterns above but include library-mode class
|
|
62
|
-
.html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .html-editor__header--fullscreen .editor-toolbar,
|
|
63
|
-
.html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .html-editor__header--fullscreen .editor-toolbar.editor-toolbar,
|
|
64
|
-
.html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .html-editor__header--fullscreen .ant-layout-header.editor-toolbar,
|
|
65
|
-
.html-editor.html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .html-editor__header--fullscreen .editor-toolbar,
|
|
66
|
-
.html-editor.html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .html-editor__header--fullscreen .editor-toolbar.editor-toolbar,
|
|
67
|
-
.html-editor.html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .html-editor__header--fullscreen .ant-layout-header.editor-toolbar,
|
|
68
|
-
.html-editor__header--fullscreen.html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .editor-toolbar,
|
|
69
|
-
.html-editor__header.html-editor__header--fullscreen.html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .editor-toolbar,
|
|
70
|
-
.html-editor__header.html-editor__header--fullscreen.html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .editor-toolbar.editor-toolbar,
|
|
71
|
-
.html-editor__header.html-editor__header--fullscreen.html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .ant-layout-header.editor-toolbar,
|
|
72
|
-
.ant-modal .html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .html-editor__header--fullscreen .editor-toolbar,
|
|
73
|
-
.ant-modal .html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .html-editor__header--fullscreen .editor-toolbar.editor-toolbar,
|
|
74
|
-
.ant-modal .html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .html-editor__header--fullscreen .ant-layout-header.editor-toolbar,
|
|
75
|
-
.ant-modal-content .html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .html-editor__header--fullscreen .editor-toolbar,
|
|
76
|
-
.ant-modal-content .html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .html-editor__header--fullscreen .editor-toolbar.editor-toolbar,
|
|
77
|
-
.ant-modal-content .html-editor-fullscreen--inapp.html-editor-fullscreen--library-mode .html-editor__header--fullscreen .ant-layout-header.editor-toolbar {
|
|
78
|
-
position: absolute;
|
|
79
57
|
}
|
|
@@ -14,7 +14,9 @@ const DeviceFrame = ({
|
|
|
14
14
|
className = '',
|
|
15
15
|
...props
|
|
16
16
|
}) => {
|
|
17
|
-
const getFrameAsset = () =>
|
|
17
|
+
const getFrameAsset = () => {
|
|
18
|
+
return device === DEVICE_TYPES.IOS ? iosFrame : androidFrame;
|
|
19
|
+
};
|
|
18
20
|
|
|
19
21
|
const getFrameStyles = () => {
|
|
20
22
|
const baseStyles = {
|
|
@@ -24,13 +26,14 @@ const DeviceFrame = ({
|
|
|
24
26
|
backgroundRepeat: 'no-repeat',
|
|
25
27
|
backgroundPosition: 'center',
|
|
26
28
|
backgroundSize: 'contain',
|
|
29
|
+
filter: 'drop-shadow(0 12px 48px rgba(0, 0, 0, 0.25)) brightness(1.05) contrast(1.1)'
|
|
27
30
|
};
|
|
28
31
|
|
|
29
32
|
// Unified dimensions - both devices use the same size since assets are identical
|
|
30
33
|
return {
|
|
31
34
|
...baseStyles,
|
|
32
35
|
width: '450px',
|
|
33
|
-
height: '920px'
|
|
36
|
+
height: '920px'
|
|
34
37
|
};
|
|
35
38
|
};
|
|
36
39
|
|
|
@@ -42,7 +45,7 @@ const DeviceFrame = ({
|
|
|
42
45
|
{...props}
|
|
43
46
|
>
|
|
44
47
|
|
|
45
|
-
|
|
48
|
+
{children}
|
|
46
49
|
|
|
47
50
|
</div>
|
|
48
51
|
);
|
|
@@ -51,7 +54,7 @@ const DeviceFrame = ({
|
|
|
51
54
|
DeviceFrame.propTypes = {
|
|
52
55
|
device: PropTypes.oneOf(Object.values(DEVICE_TYPES)),
|
|
53
56
|
children: PropTypes.node,
|
|
54
|
-
className: PropTypes.string
|
|
57
|
+
className: PropTypes.string
|
|
55
58
|
};
|
|
56
59
|
|
|
57
60
|
export default DeviceFrame;
|