monto-email-builder 1.1.0 → 1.1.2
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/dist/EmailBuilder/index.d.ts +3 -2
- package/dist/EmailBuilder/index.d.ts.map +1 -1
- package/dist/documents/editor/EditorContext.d.ts +1 -1
- package/dist/documents/editor/EditorContext.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +51 -34
- package/package.json +2 -2
|
@@ -26,9 +26,9 @@ export interface EmailBuilderProps {
|
|
|
26
26
|
videoUploadHandler?: (file: File) => Promise<string>;
|
|
27
27
|
/**
|
|
28
28
|
* 文档变化时的回调函数
|
|
29
|
-
*
|
|
29
|
+
* 当用户编辑邮件模板时,会调用此函数并传入最新的配置与对应渲染出的 HTML(一一对应,无需再调 getData)
|
|
30
30
|
*/
|
|
31
|
-
onChange?: (document: TEditorConfiguration) => void;
|
|
31
|
+
onChange?: (document: TEditorConfiguration, html: string) => void;
|
|
32
32
|
/**
|
|
33
33
|
* 模板名称
|
|
34
34
|
* 当此值变化时,编辑器会自动更新名称输入框
|
|
@@ -101,4 +101,5 @@ export interface EmailBuilderRef {
|
|
|
101
101
|
*/
|
|
102
102
|
declare const EmailBuilder: React.ForwardRefExoticComponent<EmailBuilderProps & React.RefAttributes<EmailBuilderRef>>;
|
|
103
103
|
export default EmailBuilder;
|
|
104
|
+
export { EmailBuilder };
|
|
104
105
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/EmailBuilder/index.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/EmailBuilder/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6D,MAAM,OAAO,CAAC;AAkBlF,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,MAAM,UAAU,CAAC;AAI7B,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,eAAe,CAAC,EAAE,oBAAoB,CAAC;IAEvC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAErD;;;OAGG;IACH,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAErD;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAElE;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAEtC;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAErB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,KAAK,IAAI,CAAC;CACjF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,QAAA,MAAM,YAAY,2FA6GhB,CAAC;AAIH,eAAe,YAAY,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -11,7 +11,7 @@ type TValue = {
|
|
|
11
11
|
imageUploadHandler?: (file: File) => Promise<string>;
|
|
12
12
|
videoUploadHandler?: (file: File) => Promise<string>;
|
|
13
13
|
language: Language;
|
|
14
|
-
onChange?: (document: TEditorConfiguration) => void;
|
|
14
|
+
onChange?: (document: TEditorConfiguration, html: string) => void;
|
|
15
15
|
saveHandler?: (document: TEditorConfiguration) => void | Promise<void>;
|
|
16
16
|
saveAndExitHandler?: (document: TEditorConfiguration) => void | Promise<void>;
|
|
17
17
|
name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditorContext.d.ts","sourceRoot":"","sources":["../../../src/documents/editor/EditorContext.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EditorContext.d.ts","sourceRoot":"","sources":["../../../src/documents/editor/EditorContext.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
export { default as EmailBuilder } from './EmailBuilder';
|
|
7
7
|
export type { EmailBuilderProps, EmailBuilderRef } from './EmailBuilder';
|
|
8
|
+
export { default } from './EmailBuilder';
|
|
8
9
|
export { default as HtmlEditor } from './HtmlEditor';
|
|
9
10
|
export type { HtmlEditorProps, HtmlEditorMode, HtmlEditorDevice } from './HtmlEditor';
|
|
10
11
|
export type { TEditorConfiguration, TEditorBlock } from './documents/editor/core';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGzE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAGzC,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGtF,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAClF,YAAY,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAGvC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -637,34 +637,33 @@ let initialShowJsonFeatures = true;
|
|
|
637
637
|
let initialShowSamplesDrawerTitle = true;
|
|
638
638
|
let historyManager = null;
|
|
639
639
|
function initializeStore(config) {
|
|
640
|
-
if (config == null ? void 0 : config.document)
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
if (config == null ? void 0 : config.
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
const doc = initialDocument || EMPTY_EMAIL_MESSAGE;
|
|
653
|
-
historyManager = new HistoryManager(doc);
|
|
654
|
-
const updates = {};
|
|
655
|
-
if ((config == null ? void 0 : config.showJsonFeatures) !== void 0) {
|
|
656
|
-
updates.showJsonFeatures = config.showJsonFeatures;
|
|
657
|
-
}
|
|
658
|
-
if ((config == null ? void 0 : config.showSamplesDrawerTitle) !== void 0) {
|
|
659
|
-
updates.showSamplesDrawerTitle = config.showSamplesDrawerTitle;
|
|
660
|
-
}
|
|
661
|
-
if ((config == null ? void 0 : config.language) !== void 0) {
|
|
662
|
-
updates.language = config.language;
|
|
663
|
-
setLanguage$1(config.language);
|
|
664
|
-
}
|
|
665
|
-
if (Object.keys(updates).length > 0) {
|
|
666
|
-
editorStateStore.setState(updates);
|
|
640
|
+
if (config == null ? void 0 : config.document) initialDocument = config.document;
|
|
641
|
+
if (config == null ? void 0 : config.language) initialLanguage = config.language;
|
|
642
|
+
if ((config == null ? void 0 : config.showJsonFeatures) !== void 0) initialShowJsonFeatures = config.showJsonFeatures;
|
|
643
|
+
if ((config == null ? void 0 : config.showSamplesDrawerTitle) !== void 0) initialShowSamplesDrawerTitle = config.showSamplesDrawerTitle;
|
|
644
|
+
const doc = (config == null ? void 0 : config.document) ?? initialDocument ?? EMPTY_EMAIL_MESSAGE;
|
|
645
|
+
const lang = (config == null ? void 0 : config.language) ?? initialLanguage ?? getLanguage();
|
|
646
|
+
const showJson = (config == null ? void 0 : config.showJsonFeatures) ?? initialShowJsonFeatures;
|
|
647
|
+
const showTitle = (config == null ? void 0 : config.showSamplesDrawerTitle) ?? initialShowSamplesDrawerTitle;
|
|
648
|
+
if (historyManager) {
|
|
649
|
+
historyManager.reset(doc);
|
|
650
|
+
} else {
|
|
651
|
+
historyManager = new HistoryManager(doc);
|
|
667
652
|
}
|
|
653
|
+
editorStateStore.setState({
|
|
654
|
+
document: doc,
|
|
655
|
+
language: lang,
|
|
656
|
+
showJsonFeatures: showJson,
|
|
657
|
+
showSamplesDrawerTitle: showTitle,
|
|
658
|
+
// 这些是 UI 初始态:按经典设计,初始化时应可预测、可复现
|
|
659
|
+
selectedBlockId: null,
|
|
660
|
+
selectedSidebarTab: "styles",
|
|
661
|
+
selectedMainTab: "editor",
|
|
662
|
+
selectedScreenSize: "desktop",
|
|
663
|
+
inspectorDrawerOpen: true,
|
|
664
|
+
samplesDrawerOpen: true
|
|
665
|
+
});
|
|
666
|
+
setLanguage$1(lang);
|
|
668
667
|
}
|
|
669
668
|
if (!historyManager) {
|
|
670
669
|
const doc = initialDocument || EMPTY_EMAIL_MESSAGE;
|
|
@@ -726,6 +725,15 @@ function setSelectedBlockId(selectedBlockId) {
|
|
|
726
725
|
function setSidebarTab(selectedSidebarTab) {
|
|
727
726
|
return editorStateStore.setState({ selectedSidebarTab });
|
|
728
727
|
}
|
|
728
|
+
function computeHtmlAndNotify(document2, onChange) {
|
|
729
|
+
let html2;
|
|
730
|
+
try {
|
|
731
|
+
html2 = renderToStaticMarkup(document2, { rootBlockId: "root" });
|
|
732
|
+
} catch {
|
|
733
|
+
html2 = "<!-- Error rendering HTML -->";
|
|
734
|
+
}
|
|
735
|
+
onChange(document2, html2);
|
|
736
|
+
}
|
|
729
737
|
function resetDocument(document2) {
|
|
730
738
|
if (historyManager) {
|
|
731
739
|
historyManager.reset(document2);
|
|
@@ -737,7 +745,9 @@ function resetDocument(document2) {
|
|
|
737
745
|
});
|
|
738
746
|
const onChange = editorStateStore.getState().onChange;
|
|
739
747
|
if (onChange) {
|
|
740
|
-
|
|
748
|
+
queueMicrotask(() => {
|
|
749
|
+
computeHtmlAndNotify(document2, onChange);
|
|
750
|
+
});
|
|
741
751
|
}
|
|
742
752
|
}
|
|
743
753
|
function setDocument(document2, options) {
|
|
@@ -753,7 +763,9 @@ function setDocument(document2, options) {
|
|
|
753
763
|
});
|
|
754
764
|
const onChange = editorStateStore.getState().onChange;
|
|
755
765
|
if (onChange) {
|
|
756
|
-
|
|
766
|
+
queueMicrotask(() => {
|
|
767
|
+
computeHtmlAndNotify(recordedDocument, onChange);
|
|
768
|
+
});
|
|
757
769
|
}
|
|
758
770
|
} else {
|
|
759
771
|
editorStateStore.setState({
|
|
@@ -761,7 +773,9 @@ function setDocument(document2, options) {
|
|
|
761
773
|
});
|
|
762
774
|
const onChange = editorStateStore.getState().onChange;
|
|
763
775
|
if (onChange) {
|
|
764
|
-
|
|
776
|
+
queueMicrotask(() => {
|
|
777
|
+
computeHtmlAndNotify(newDocument, onChange);
|
|
778
|
+
});
|
|
765
779
|
}
|
|
766
780
|
}
|
|
767
781
|
}
|
|
@@ -838,7 +852,7 @@ function undo() {
|
|
|
838
852
|
});
|
|
839
853
|
const onChange = editorStateStore.getState().onChange;
|
|
840
854
|
if (onChange) {
|
|
841
|
-
|
|
855
|
+
queueMicrotask(() => computeHtmlAndNotify(previousDocument, onChange));
|
|
842
856
|
}
|
|
843
857
|
return true;
|
|
844
858
|
}
|
|
@@ -851,7 +865,7 @@ function redo() {
|
|
|
851
865
|
});
|
|
852
866
|
const onChange = editorStateStore.getState().onChange;
|
|
853
867
|
if (onChange) {
|
|
854
|
-
|
|
868
|
+
queueMicrotask(() => computeHtmlAndNotify(nextDocument, onChange));
|
|
855
869
|
}
|
|
856
870
|
return true;
|
|
857
871
|
}
|
|
@@ -8090,14 +8104,16 @@ const EmailBuilder = forwardRef(({
|
|
|
8090
8104
|
showJsonFeatures = true,
|
|
8091
8105
|
showSamplesDrawerTitle = true
|
|
8092
8106
|
}, ref) => {
|
|
8093
|
-
|
|
8107
|
+
const initializedRef = useRef(false);
|
|
8108
|
+
if (!initializedRef.current) {
|
|
8094
8109
|
initializeStore({
|
|
8095
8110
|
document: initialDocument2,
|
|
8096
8111
|
language,
|
|
8097
8112
|
showJsonFeatures,
|
|
8098
8113
|
showSamplesDrawerTitle
|
|
8099
8114
|
});
|
|
8100
|
-
|
|
8115
|
+
initializedRef.current = true;
|
|
8116
|
+
}
|
|
8101
8117
|
useEffect(() => {
|
|
8102
8118
|
if (initialDocument2 !== void 0) {
|
|
8103
8119
|
resetDocument(initialDocument2);
|
|
@@ -8473,6 +8489,7 @@ function HtmlEditor({
|
|
|
8473
8489
|
export {
|
|
8474
8490
|
EmailBuilder,
|
|
8475
8491
|
HtmlEditor,
|
|
8492
|
+
EmailBuilder as default,
|
|
8476
8493
|
useDocument,
|
|
8477
8494
|
useLanguage
|
|
8478
8495
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "monto-email-builder",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.2",
|
|
4
4
|
"description": "A powerful and customizable email template builder React component library with visual editing, internationalization, and image upload support",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"email",
|
|
@@ -94,4 +94,4 @@
|
|
|
94
94
|
"typescript": "^5.2.2",
|
|
95
95
|
"vite": "^5.1.0"
|
|
96
96
|
}
|
|
97
|
-
}
|
|
97
|
+
}
|