@servicetitan/dte-unlayer 0.90.0 → 0.91.0

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/editor.d.ts CHANGED
@@ -14,6 +14,7 @@ export interface UnlayerEditorProps {
14
14
  onImage?(file: File): Promise<{
15
15
  url: string;
16
16
  }>;
17
+ onError?(title: string, description?: string): void;
17
18
  onMessage?(type: string, data: any): void;
18
19
  }
19
20
  export declare const useUnlayerRef: () => import("react").MutableRefObject<UnlayerRef | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../src/editor.tsx"],"names":[],"mappings":"AAAA,OAAO,EACH,aAAa,EAOhB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAgB,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAE3E,MAAM,WAAW,kBAAkB;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,IAAI,EAAE,wBAAwB,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IAEtB,OAAO,CAAC,IAAI,IAAI,CAAC;IAEjB,QAAQ,CAAC,CAAC,IAAI,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAE/C,cAAc,CAAC,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAE/C,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE/C,SAAS,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC;CAC7C;AAED,eAAO,MAAM,aAAa,2DAAwC,CAAC;AAEnE,eAAO,MAAM,aAAa,2GAuExB,CAAC"}
1
+ {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../src/editor.tsx"],"names":[],"mappings":"AAAA,OAAO,EACH,aAAa,EAOhB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAgB,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAE3E,MAAM,WAAW,kBAAkB;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,IAAI,EAAE,wBAAwB,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IAEtB,OAAO,CAAC,IAAI,IAAI,CAAC;IAEjB,QAAQ,CAAC,CAAC,IAAI,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAE/C,cAAc,CAAC,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAE/C,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE/C,OAAO,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpD,SAAS,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC;CAC7C;AAED,eAAO,MAAM,aAAa,2DAAwC,CAAC;AAEnE,eAAO,MAAM,aAAa,2GA6ExB,CAAC"}
package/dist/editor.js CHANGED
@@ -63,6 +63,13 @@ export const UnlayerEditor = /*#__PURE__*/ forwardRef((props, ref)=>{
63
63
  props.onImage,
64
64
  store
65
65
  ]);
66
+ useEffect(()=>{
67
+ store.setOnError(props.onError);
68
+ return ()=>store.setOnError();
69
+ }, [
70
+ props.onError,
71
+ store
72
+ ]);
66
73
  useEffect(()=>{
67
74
  store.setOnMessage(props.onMessage);
68
75
  return ()=>store.setOnMessage();
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/editor.tsx"],"sourcesContent":["import {\n CSSProperties,\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { UnlayerEditorTwin } from './shared/const';\nimport { UnlayerStore, UnlayerDesignChangeInfo } from './store';\nimport { UnlayerRef, CreateUnlayerEditorProps } from './unlayer-interface';\n\nexport interface UnlayerEditorProps {\n id?: string;\n design?: any;\n opts: CreateUnlayerEditorProps;\n minHeight?: number;\n style?: CSSProperties;\n\n onReady?(): void;\n\n onChange?(info: UnlayerDesignChangeInfo): void;\n\n onSnapshotSave?(tool: UnlayerEditorTwin): void;\n\n onImage?(file: File): Promise<{ url: string }>;\n\n onMessage?(type: string, data: any): void;\n}\n\nexport const useUnlayerRef = () => useRef<UnlayerRef | null>(null);\n\nexport const UnlayerEditor = forwardRef<UnlayerRef, UnlayerEditorProps>((props, ref) => {\n const [isReady, setIsReady] = useState(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const store = useMemo(\n () => new UnlayerStore(props.opts),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n useEffect(() => {\n if (containerRef.current) {\n store\n .init(containerRef.current)\n .then(() => setIsReady(true))\n .catch(() => setIsReady(false));\n }\n\n return () => store.destroy();\n }, [store]);\n useImperativeHandle(ref, () => store.unlayerRef, [store]);\n\n useEffect(() => {\n if (isReady) {\n store.setDesign(props.design);\n }\n }, [isReady, props.design, store]);\n\n useEffect(() => {\n store.setOnChange(props.onChange);\n\n return () => store.setOnChange();\n }, [props.onChange, store]);\n\n useEffect(() => {\n store.setOnSnapshotSave(props.onSnapshotSave);\n\n return () => store.setOnSnapshotSave();\n }, [props.onSnapshotSave, store]);\n\n useEffect(() => {\n if (props.opts.newSnapshot) {\n store.addTwin(props.opts.newSnapshot);\n }\n }, [props.opts.newSnapshot, store]);\n\n useEffect(() => {\n store.setOnReady(props.onReady);\n\n return () => store.setOnReady();\n }, [props.onReady, store]);\n\n useEffect(() => {\n store.setOnImage(props.onImage);\n\n return () => store.setOnImage();\n }, [props.onImage, store]);\n\n useEffect(() => {\n store.setOnMessage(props.onMessage);\n\n return () => store.setOnMessage();\n }, [props.onMessage, store]);\n\n const { minHeight = 800, style = {} } = props;\n\n return (\n <div style={{ minHeight, display: 'flex' }}>\n {!isReady && <p className=\"c-red-500\">error loading editor</p>}\n <div id={props.id ?? 'editor'} style={style} ref={containerRef} />\n </div>\n );\n});\n"],"names":["forwardRef","useEffect","useImperativeHandle","useMemo","useRef","useState","UnlayerStore","useUnlayerRef","UnlayerEditor","props","ref","isReady","setIsReady","containerRef","store","opts","current","init","then","catch","destroy","unlayerRef","setDesign","design","setOnChange","onChange","setOnSnapshotSave","onSnapshotSave","newSnapshot","addTwin","setOnReady","onReady","setOnImage","onImage","setOnMessage","onMessage","minHeight","style","div","display","p","className","id"],"mappings":";AAAA,SAEIA,UAAU,EACVC,SAAS,EACTC,mBAAmB,EACnBC,OAAO,EACPC,MAAM,EACNC,QAAQ,QACL,QAAQ;AAEf,SAASC,YAAY,QAAiC,UAAU;AAqBhE,OAAO,MAAMC,gBAAgB,IAAMH,OAA0B,MAAM;AAEnE,OAAO,MAAMI,8BAAgBR,WAA2C,CAACS,OAAOC;IAC5E,MAAM,CAACC,SAASC,WAAW,GAAGP,SAAS;IACvC,MAAMQ,eAAeT,OAA8B;IACnD,MAAMU,QAAQX,QACV,IAAM,IAAIG,aAAaG,MAAMM,IAAI,GACjC,uDAAuD;IACvD,EAAE;IAGNd,UAAU;QACN,IAAIY,aAAaG,OAAO,EAAE;YACtBF,MACKG,IAAI,CAACJ,aAAaG,OAAO,EACzBE,IAAI,CAAC,IAAMN,WAAW,OACtBO,KAAK,CAAC,IAAMP,WAAW;QAChC;QAEA,OAAO,IAAME,MAAMM,OAAO;IAC9B,GAAG;QAACN;KAAM;IACVZ,oBAAoBQ,KAAK,IAAMI,MAAMO,UAAU,EAAE;QAACP;KAAM;IAExDb,UAAU;QACN,IAAIU,SAAS;YACTG,MAAMQ,SAAS,CAACb,MAAMc,MAAM;QAChC;IACJ,GAAG;QAACZ;QAASF,MAAMc,MAAM;QAAET;KAAM;IAEjCb,UAAU;QACNa,MAAMU,WAAW,CAACf,MAAMgB,QAAQ;QAEhC,OAAO,IAAMX,MAAMU,WAAW;IAClC,GAAG;QAACf,MAAMgB,QAAQ;QAAEX;KAAM;IAE1Bb,UAAU;QACNa,MAAMY,iBAAiB,CAACjB,MAAMkB,cAAc;QAE5C,OAAO,IAAMb,MAAMY,iBAAiB;IACxC,GAAG;QAACjB,MAAMkB,cAAc;QAAEb;KAAM;IAEhCb,UAAU;QACN,IAAIQ,MAAMM,IAAI,CAACa,WAAW,EAAE;YACxBd,MAAMe,OAAO,CAACpB,MAAMM,IAAI,CAACa,WAAW;QACxC;IACJ,GAAG;QAACnB,MAAMM,IAAI,CAACa,WAAW;QAAEd;KAAM;IAElCb,UAAU;QACNa,MAAMgB,UAAU,CAACrB,MAAMsB,OAAO;QAE9B,OAAO,IAAMjB,MAAMgB,UAAU;IACjC,GAAG;QAACrB,MAAMsB,OAAO;QAAEjB;KAAM;IAEzBb,UAAU;QACNa,MAAMkB,UAAU,CAACvB,MAAMwB,OAAO;QAE9B,OAAO,IAAMnB,MAAMkB,UAAU;IACjC,GAAG;QAACvB,MAAMwB,OAAO;QAAEnB;KAAM;IAEzBb,UAAU;QACNa,MAAMoB,YAAY,CAACzB,MAAM0B,SAAS;QAElC,OAAO,IAAMrB,MAAMoB,YAAY;IACnC,GAAG;QAACzB,MAAM0B,SAAS;QAAErB;KAAM;IAE3B,MAAM,EAAEsB,YAAY,GAAG,EAAEC,QAAQ,CAAC,CAAC,EAAE,GAAG5B;QAKvBA;IAHjB,qBACI,MAAC6B;QAAID,OAAO;YAAED;YAAWG,SAAS;QAAO;;YACpC,CAAC5B,yBAAW,KAAC6B;gBAAEC,WAAU;0BAAY;;0BACtC,KAACH;gBAAII,IAAIjC,CAAAA,YAAAA,MAAMiC,EAAE,cAARjC,uBAAAA,YAAY;gBAAU4B,OAAOA;gBAAO3B,KAAKG;;;;AAG9D,GAAG"}
1
+ {"version":3,"sources":["../src/editor.tsx"],"sourcesContent":["import {\n CSSProperties,\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { UnlayerEditorTwin } from './shared/const';\nimport { UnlayerStore, UnlayerDesignChangeInfo } from './store';\nimport { UnlayerRef, CreateUnlayerEditorProps } from './unlayer-interface';\n\nexport interface UnlayerEditorProps {\n id?: string;\n design?: any;\n opts: CreateUnlayerEditorProps;\n minHeight?: number;\n style?: CSSProperties;\n\n onReady?(): void;\n\n onChange?(info: UnlayerDesignChangeInfo): void;\n\n onSnapshotSave?(tool: UnlayerEditorTwin): void;\n\n onImage?(file: File): Promise<{ url: string }>;\n\n onError?(title: string, description?: string): void;\n\n onMessage?(type: string, data: any): void;\n}\n\nexport const useUnlayerRef = () => useRef<UnlayerRef | null>(null);\n\nexport const UnlayerEditor = forwardRef<UnlayerRef, UnlayerEditorProps>((props, ref) => {\n const [isReady, setIsReady] = useState(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const store = useMemo(\n () => new UnlayerStore(props.opts),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n useEffect(() => {\n if (containerRef.current) {\n store\n .init(containerRef.current)\n .then(() => setIsReady(true))\n .catch(() => setIsReady(false));\n }\n\n return () => store.destroy();\n }, [store]);\n useImperativeHandle(ref, () => store.unlayerRef, [store]);\n\n useEffect(() => {\n if (isReady) {\n store.setDesign(props.design);\n }\n }, [isReady, props.design, store]);\n\n useEffect(() => {\n store.setOnChange(props.onChange);\n\n return () => store.setOnChange();\n }, [props.onChange, store]);\n\n useEffect(() => {\n store.setOnSnapshotSave(props.onSnapshotSave);\n\n return () => store.setOnSnapshotSave();\n }, [props.onSnapshotSave, store]);\n\n useEffect(() => {\n if (props.opts.newSnapshot) {\n store.addTwin(props.opts.newSnapshot);\n }\n }, [props.opts.newSnapshot, store]);\n\n useEffect(() => {\n store.setOnReady(props.onReady);\n\n return () => store.setOnReady();\n }, [props.onReady, store]);\n\n useEffect(() => {\n store.setOnImage(props.onImage);\n\n return () => store.setOnImage();\n }, [props.onImage, store]);\n\n useEffect(() => {\n store.setOnError(props.onError);\n\n return () => store.setOnError();\n }, [props.onError, store]);\n\n useEffect(() => {\n store.setOnMessage(props.onMessage);\n\n return () => store.setOnMessage();\n }, [props.onMessage, store]);\n\n const { minHeight = 800, style = {} } = props;\n\n return (\n <div style={{ minHeight, display: 'flex' }}>\n {!isReady && <p className=\"c-red-500\">error loading editor</p>}\n <div id={props.id ?? 'editor'} style={style} ref={containerRef} />\n </div>\n );\n});\n"],"names":["forwardRef","useEffect","useImperativeHandle","useMemo","useRef","useState","UnlayerStore","useUnlayerRef","UnlayerEditor","props","ref","isReady","setIsReady","containerRef","store","opts","current","init","then","catch","destroy","unlayerRef","setDesign","design","setOnChange","onChange","setOnSnapshotSave","onSnapshotSave","newSnapshot","addTwin","setOnReady","onReady","setOnImage","onImage","setOnError","onError","setOnMessage","onMessage","minHeight","style","div","display","p","className","id"],"mappings":";AAAA,SAEIA,UAAU,EACVC,SAAS,EACTC,mBAAmB,EACnBC,OAAO,EACPC,MAAM,EACNC,QAAQ,QACL,QAAQ;AAEf,SAASC,YAAY,QAAiC,UAAU;AAuBhE,OAAO,MAAMC,gBAAgB,IAAMH,OAA0B,MAAM;AAEnE,OAAO,MAAMI,8BAAgBR,WAA2C,CAACS,OAAOC;IAC5E,MAAM,CAACC,SAASC,WAAW,GAAGP,SAAS;IACvC,MAAMQ,eAAeT,OAA8B;IACnD,MAAMU,QAAQX,QACV,IAAM,IAAIG,aAAaG,MAAMM,IAAI,GACjC,uDAAuD;IACvD,EAAE;IAGNd,UAAU;QACN,IAAIY,aAAaG,OAAO,EAAE;YACtBF,MACKG,IAAI,CAACJ,aAAaG,OAAO,EACzBE,IAAI,CAAC,IAAMN,WAAW,OACtBO,KAAK,CAAC,IAAMP,WAAW;QAChC;QAEA,OAAO,IAAME,MAAMM,OAAO;IAC9B,GAAG;QAACN;KAAM;IACVZ,oBAAoBQ,KAAK,IAAMI,MAAMO,UAAU,EAAE;QAACP;KAAM;IAExDb,UAAU;QACN,IAAIU,SAAS;YACTG,MAAMQ,SAAS,CAACb,MAAMc,MAAM;QAChC;IACJ,GAAG;QAACZ;QAASF,MAAMc,MAAM;QAAET;KAAM;IAEjCb,UAAU;QACNa,MAAMU,WAAW,CAACf,MAAMgB,QAAQ;QAEhC,OAAO,IAAMX,MAAMU,WAAW;IAClC,GAAG;QAACf,MAAMgB,QAAQ;QAAEX;KAAM;IAE1Bb,UAAU;QACNa,MAAMY,iBAAiB,CAACjB,MAAMkB,cAAc;QAE5C,OAAO,IAAMb,MAAMY,iBAAiB;IACxC,GAAG;QAACjB,MAAMkB,cAAc;QAAEb;KAAM;IAEhCb,UAAU;QACN,IAAIQ,MAAMM,IAAI,CAACa,WAAW,EAAE;YACxBd,MAAMe,OAAO,CAACpB,MAAMM,IAAI,CAACa,WAAW;QACxC;IACJ,GAAG;QAACnB,MAAMM,IAAI,CAACa,WAAW;QAAEd;KAAM;IAElCb,UAAU;QACNa,MAAMgB,UAAU,CAACrB,MAAMsB,OAAO;QAE9B,OAAO,IAAMjB,MAAMgB,UAAU;IACjC,GAAG;QAACrB,MAAMsB,OAAO;QAAEjB;KAAM;IAEzBb,UAAU;QACNa,MAAMkB,UAAU,CAACvB,MAAMwB,OAAO;QAE9B,OAAO,IAAMnB,MAAMkB,UAAU;IACjC,GAAG;QAACvB,MAAMwB,OAAO;QAAEnB;KAAM;IAEzBb,UAAU;QACNa,MAAMoB,UAAU,CAACzB,MAAM0B,OAAO;QAE9B,OAAO,IAAMrB,MAAMoB,UAAU;IACjC,GAAG;QAACzB,MAAM0B,OAAO;QAAErB;KAAM;IAEzBb,UAAU;QACNa,MAAMsB,YAAY,CAAC3B,MAAM4B,SAAS;QAElC,OAAO,IAAMvB,MAAMsB,YAAY;IACnC,GAAG;QAAC3B,MAAM4B,SAAS;QAAEvB;KAAM;IAE3B,MAAM,EAAEwB,YAAY,GAAG,EAAEC,QAAQ,CAAC,CAAC,EAAE,GAAG9B;QAKvBA;IAHjB,qBACI,MAAC+B;QAAID,OAAO;YAAED;YAAWG,SAAS;QAAO;;YACpC,CAAC9B,yBAAW,KAAC+B;gBAAEC,WAAU;0BAAY;;0BACtC,KAACH;gBAAII,IAAInC,CAAAA,YAAAA,MAAMmC,EAAE,cAARnC,uBAAAA,YAAY;gBAAU8B,OAAOA;gBAAO7B,KAAKG;;;;AAG9D,GAAG"}
@@ -0,0 +1,6 @@
1
+ export declare const defaultImageValidation: {
2
+ maxWidth: number;
3
+ maxHeight: number;
4
+ maxFileSize: number;
5
+ };
6
+ //# sourceMappingURL=configs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configs.d.ts","sourceRoot":"","sources":["../../src/shared/configs.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB;;;;CAIlC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export const defaultImageValidation = {
2
+ maxWidth: 5000,
3
+ maxHeight: 5000,
4
+ maxFileSize: 10 * 1024 * 1024
5
+ };
6
+
7
+ //# sourceMappingURL=configs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/shared/configs.ts"],"sourcesContent":["export const defaultImageValidation = {\n maxWidth: 5000,\n maxHeight: 5000,\n maxFileSize: 10 * 1024 * 1024, // 10mb\n};\n"],"names":["defaultImageValidation","maxWidth","maxHeight","maxFileSize"],"mappings":"AAAA,OAAO,MAAMA,yBAAyB;IAClCC,UAAU;IACVC,WAAW;IACXC,aAAa,KAAK,OAAO;AAC7B,EAAE"}
package/dist/store.d.ts CHANGED
@@ -15,6 +15,7 @@ export declare class UnlayerStore {
15
15
  private onSnapshotSaveCB?;
16
16
  private onReadyCB?;
17
17
  private onImageCB?;
18
+ private onErrorCB?;
18
19
  constructor(props: CreateUnlayerEditorProps);
19
20
  init: (container: HTMLDivElement) => Promise<void>;
20
21
  destroy: () => void;
@@ -24,11 +25,13 @@ export declare class UnlayerStore {
24
25
  setOnSnapshotSave: (onSnapshotSave?: UnlayerStore["onSnapshotSaveCB"]) => void;
25
26
  setOnReady: (onReady?: UnlayerStore["onReadyCB"]) => void;
26
27
  setOnImage: (onImage?: UnlayerStore["onImageCB"]) => void;
28
+ setOnError: (onError?: UnlayerStore["onErrorCB"]) => void;
27
29
  setOnMessage: (onMessage?: UnlayerStore["onMessageCB"]) => void;
28
30
  private onDesignLoaded;
29
31
  private onDesignUpdated;
30
32
  private onPostMessage;
31
33
  private sendMessage;
32
34
  private uploadImage;
35
+ private validateImage;
33
36
  }
34
37
  //# sourceMappingURL=store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAA4C,MAAM,gBAAgB,CAAC;AAS7F,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAIhG,MAAM,WAAW,uBAAuB;IACpC,kBAAkB,EAAE,OAAO,CAAC;CAC/B;AAmBD,qBAAa,YAAY;IAcT,QAAQ,CAAC,KAAK,EAAE,wBAAwB;IAbpD,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAEhC,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAC,CAAoB;IACnC,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO,CAAC,WAAW,CAAC,CAAoC;IACxD,OAAO,CAAC,UAAU,CAAC,CAA0C;IAC7D,OAAO,CAAC,gBAAgB,CAAC,CAAwC;IACjE,OAAO,CAAC,SAAS,CAAC,CAAa;IAC/B,OAAO,CAAC,SAAS,CAAC,CAA2C;gBAExC,KAAK,EAAE,wBAAwB;IAkBpD,IAAI,GAAU,WAAW,cAAc,mBAiBrC;IAEF,OAAO,aAUL;IAEF,OAAO,GAAI,MAAM,iBAAiB,UAGhC;IAEF,SAAS,GAAI,SAAS,mBAAmB,UAUvC;IAEF,WAAW,GAAI,WAAW,YAAY,CAAC,YAAY,CAAC,UAElD;IAEF,iBAAiB,GAAI,iBAAiB,YAAY,CAAC,kBAAkB,CAAC,UAEpE;IAEF,UAAU,GAAI,UAAU,YAAY,CAAC,WAAW,CAAC,UAE/C;IAEF,UAAU,GAAI,UAAU,YAAY,CAAC,WAAW,CAAC,UAE/C;IAEF,YAAY,GAAI,YAAY,YAAY,CAAC,aAAa,CAAC,UAErD;IAEF,OAAO,CAAC,cAAc,CAQpB;IAEF,OAAO,CAAC,eAAe,CAmCrB;IAEF,OAAO,CAAC,aAAa,CA4DnB;IAEF,OAAO,CAAC,WAAW,CAUjB;IAEF,OAAO,CAAC,WAAW,CAajB;CACL"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAA4C,MAAM,gBAAgB,CAAC;AAS7F,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAIhG,MAAM,WAAW,uBAAuB;IACpC,kBAAkB,EAAE,OAAO,CAAC;CAC/B;AAmBD,qBAAa,YAAY;IAeT,QAAQ,CAAC,KAAK,EAAE,wBAAwB;IAdpD,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAEhC,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAC,CAAoB;IACnC,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO,CAAC,WAAW,CAAC,CAAoC;IACxD,OAAO,CAAC,UAAU,CAAC,CAA0C;IAC7D,OAAO,CAAC,gBAAgB,CAAC,CAAwC;IACjE,OAAO,CAAC,SAAS,CAAC,CAAa;IAC/B,OAAO,CAAC,SAAS,CAAC,CAA2C;IAC7D,OAAO,CAAC,SAAS,CAAC,CAAgD;gBAE7C,KAAK,EAAE,wBAAwB;IAkBpD,IAAI,GAAU,WAAW,cAAc,mBAiBrC;IAEF,OAAO,aAUL;IAEF,OAAO,GAAI,MAAM,iBAAiB,UAGhC;IAEF,SAAS,GAAI,SAAS,mBAAmB,UAUvC;IAEF,WAAW,GAAI,WAAW,YAAY,CAAC,YAAY,CAAC,UAElD;IAEF,iBAAiB,GAAI,iBAAiB,YAAY,CAAC,kBAAkB,CAAC,UAEpE;IAEF,UAAU,GAAI,UAAU,YAAY,CAAC,WAAW,CAAC,UAE/C;IAEF,UAAU,GAAI,UAAU,YAAY,CAAC,WAAW,CAAC,UAE/C;IAEF,UAAU,GAAI,UAAU,YAAY,CAAC,WAAW,CAAC,UAE/C;IAEF,YAAY,GAAI,YAAY,YAAY,CAAC,aAAa,CAAC,UAErD;IAEF,OAAO,CAAC,cAAc,CAQpB;IAEF,OAAO,CAAC,eAAe,CAmCrB;IAEF,OAAO,CAAC,aAAa,CA4DnB;IAEF,OAAO,CAAC,WAAW,CAUjB;IAEF,OAAO,CAAC,WAAW,CAqCjB;IAEF,OAAO,CAAC,aAAa,CA+CnB;CACL"}
package/dist/store.js CHANGED
@@ -12,6 +12,7 @@ function _define_property(obj, key, value) {
12
12
  return obj;
13
13
  }
14
14
  import { loadScript } from './loadScript';
15
+ import { defaultImageValidation } from './shared/configs';
15
16
  import { unlayerToolsParseTwinKey } from './shared/tools';
16
17
  import { unlayerToolsIterate } from './tools';
17
18
  import { createUnlayerEditor, DesignUpdatedEventType } from './unlayer';
@@ -44,6 +45,7 @@ export class UnlayerStore {
44
45
  _define_property(this, "onSnapshotSaveCB", void 0);
45
46
  _define_property(this, "onReadyCB", void 0);
46
47
  _define_property(this, "onImageCB", void 0);
48
+ _define_property(this, "onErrorCB", void 0);
47
49
  _define_property(this, "init", void 0);
48
50
  _define_property(this, "destroy", void 0);
49
51
  _define_property(this, "addTwin", void 0);
@@ -52,12 +54,14 @@ export class UnlayerStore {
52
54
  _define_property(this, "setOnSnapshotSave", void 0);
53
55
  _define_property(this, "setOnReady", void 0);
54
56
  _define_property(this, "setOnImage", void 0);
57
+ _define_property(this, "setOnError", void 0);
55
58
  _define_property(this, "setOnMessage", void 0);
56
59
  _define_property(this, "onDesignLoaded", void 0);
57
60
  _define_property(this, "onDesignUpdated", void 0);
58
61
  _define_property(this, "onPostMessage", void 0);
59
62
  _define_property(this, "sendMessage", void 0);
60
63
  _define_property(this, "uploadImage", void 0);
64
+ _define_property(this, "validateImage", void 0);
61
65
  this.props = props;
62
66
  this.isInit = false;
63
67
  this.hasDesign = false;
@@ -110,6 +114,9 @@ export class UnlayerStore {
110
114
  this.setOnImage = (onImage)=>{
111
115
  this.onImageCB = onImage;
112
116
  };
117
+ this.setOnError = (onError)=>{
118
+ this.onErrorCB = onError;
119
+ };
113
120
  this.setOnMessage = (onMessage)=>{
114
121
  this.onMessageCB = onMessage;
115
122
  };
@@ -229,7 +236,7 @@ export class UnlayerStore {
229
236
  }
230
237
  }, '*');
231
238
  };
232
- this.uploadImage = (data, done)=>{
239
+ this.uploadImage = async (data, done)=>{
233
240
  var _data_attachments;
234
241
  if (!this.onImageCB) {
235
242
  done({
@@ -237,18 +244,79 @@ export class UnlayerStore {
237
244
  });
238
245
  throw new Error('image upload is not implemented');
239
246
  }
247
+ if (!((_data_attachments = data.attachments) === null || _data_attachments === void 0 ? void 0 : _data_attachments.length)) {
248
+ return;
249
+ }
250
+ const file = data.attachments[0];
251
+ var _this_props_imageValidation;
252
+ const res = await this.validateImage(file, {
253
+ ...defaultImageValidation,
254
+ ...(_this_props_imageValidation = this.props.imageValidation) !== null && _this_props_imageValidation !== void 0 ? _this_props_imageValidation : {}
255
+ });
256
+ if (!res.isValid) {
257
+ var _this_onErrorCB, _this;
258
+ (_this_onErrorCB = (_this = this).onErrorCB) === null || _this_onErrorCB === void 0 ? void 0 : _this_onErrorCB.call(_this, res.title, res.description);
259
+ return;
260
+ }
240
261
  done({
241
262
  progress: 0
242
263
  });
243
- if ((_data_attachments = data.attachments) === null || _data_attachments === void 0 ? void 0 : _data_attachments.length) {
244
- this.onImageCB(data.attachments[0]).catch(()=>({
245
- url: ''
246
- })).then(({ url })=>done({
247
- progress: 100,
248
- url
249
- }));
264
+ try {
265
+ const { url } = await this.onImageCB(file);
266
+ done({
267
+ progress: 100,
268
+ url
269
+ });
270
+ } catch (e) {
271
+ var _this_onErrorCB1, _this1;
272
+ (_this_onErrorCB1 = (_this1 = this).onErrorCB) === null || _this_onErrorCB1 === void 0 ? void 0 : _this_onErrorCB1.call(_this1, 'Image upload failed', 'Something went wrong while uploading the image. Please try again or select another image.');
273
+ done({
274
+ progress: 100
275
+ });
250
276
  }
251
277
  };
278
+ this.validateImage = async (file, imageValidation)=>{
279
+ const { maxFileSize, maxHeight, maxWidth } = imageValidation;
280
+ if (file.size > maxFileSize) {
281
+ const maxSizeMB = (maxFileSize / 1024 / 1024).toFixed(2);
282
+ const fileSizeMB = (file.size / 1024 / 1024).toFixed(2);
283
+ return {
284
+ isValid: false,
285
+ title: 'Image size limit reached',
286
+ description: `This image is ${fileSizeMB}MB, which is above the ${maxSizeMB}MB limit. Please upload a smaller file to continue.`
287
+ };
288
+ }
289
+ return new Promise((resolve)=>{
290
+ const img = new Image();
291
+ const objectUrl = URL.createObjectURL(file);
292
+ img.onload = ()=>{
293
+ URL.revokeObjectURL(objectUrl);
294
+ const { height, width } = img;
295
+ if (width > maxWidth || height > maxHeight) {
296
+ resolve({
297
+ isValid: false,
298
+ title: 'Dimension limit reached',
299
+ description: `These image dimensions (${width}x${height}px) exceed the ${maxWidth}x${maxHeight}px limit. Please resize the image and try again.`
300
+ });
301
+ } else {
302
+ resolve({
303
+ isValid: true,
304
+ title: '',
305
+ description: ''
306
+ });
307
+ }
308
+ };
309
+ img.onerror = ()=>{
310
+ URL.revokeObjectURL(objectUrl);
311
+ resolve({
312
+ isValid: false,
313
+ title: 'The image is broken',
314
+ description: 'Looks like this image isn’t valid. Please choose another image and try again.'
315
+ });
316
+ };
317
+ img.src = objectUrl;
318
+ });
319
+ };
252
320
  this.props.eSignFieldTypes = [
253
321
  'Signature',
254
322
  'Initials',
package/dist/store.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/store.ts"],"sourcesContent":["import { loadScript } from './loadScript';\nimport { UnlayerEditorTwin, UnlayerEventConfig, UnlayerEventRegister } from './shared/const';\nimport { unlayerToolsParseTwinKey } from './shared/tools';\nimport { unlayerToolsIterate } from './tools';\nimport {\n createUnlayerEditor,\n DesignUpdatedEventType,\n EventDesignUpdated,\n Unlayer,\n} from './unlayer';\nimport { CreateUnlayerEditorProps, UnlayerDesignFormat, UnlayerRef } from './unlayer-interface';\n\nconst defaultScriptUrl = 'https://editor.unlayer.com/embed.js?2';\n\nexport interface UnlayerDesignChangeInfo {\n isToolsListChanged: boolean;\n}\n\n// We are using exclusive lists here, because we can't be sure that we know all unlayer event types\nconst eventsNotChangingToolsList: DesignUpdatedEventType[] = [\n DesignUpdatedEventType.ContentMoved,\n DesignUpdatedEventType.ContentModified,\n DesignUpdatedEventType.ColumnModified,\n DesignUpdatedEventType.RowMoved,\n DesignUpdatedEventType.RowModified,\n DesignUpdatedEventType.BodyModified,\n];\n\nconst eventsNotAddingTools: DesignUpdatedEventType[] = [\n ...eventsNotChangingToolsList,\n DesignUpdatedEventType.ContentRemoved,\n DesignUpdatedEventType.ColumnRemoved,\n DesignUpdatedEventType.RowRemoved,\n];\n\nexport class UnlayerStore {\n readonly unlayerRef: UnlayerRef;\n\n private editor: Unlayer | undefined;\n private isInit = false;\n private iframe?: HTMLIFrameElement;\n private hasDesign = false;\n\n private onMessageCB?: (type: string, data: any) => void;\n private onChangeCB?: (info: UnlayerDesignChangeInfo) => void;\n private onSnapshotSaveCB?: (snapshot: UnlayerEditorTwin) => void;\n private onReadyCB?: () => void;\n private onImageCB?: (file: File) => Promise<{ url: string }>;\n\n constructor(readonly props: CreateUnlayerEditorProps) {\n this.props.eSignFieldTypes = ['Signature', 'Initials', 'Date Signed', 'Full Name'];\n\n this.unlayerRef = {\n loadDesign: design => {\n this.editor?.loadDesign(design);\n },\n saveDesign: cb => {\n this.editor?.saveDesign(cb);\n },\n exportHtml: cb => {\n this.editor?.exportHtml(data => {\n cb(data);\n });\n },\n };\n }\n\n init = async (container: HTMLDivElement) => {\n if (this.isInit) {\n return;\n }\n\n this.isInit = true;\n\n setTimeout(() => window.addEventListener('message', this.onPostMessage));\n\n await loadScript(defaultScriptUrl);\n\n this.editor = createUnlayerEditor(container, this.props);\n this.editor.addEventListener('design:loaded', this.onDesignLoaded);\n this.editor.addEventListener('design:updated', this.onDesignUpdated);\n this.editor.registerCallback('image', this.uploadImage);\n\n this.iframe = container.querySelector(`iframe`) ?? undefined;\n };\n\n destroy = () => {\n window.removeEventListener('message', this.onPostMessage);\n\n if (this.editor) {\n this.editor.removeEventListener('design:loaded', this.onDesignLoaded);\n this.editor.removeEventListener('design:updated', this.onDesignUpdated);\n this.editor.unregisterCallback('image', this.uploadImage);\n\n this.editor = undefined;\n }\n };\n\n addTwin = (twin: UnlayerEditorTwin) => {\n this.props.toolTwins?.push(twin);\n this.sendMessage('--add-twin', JSON.parse(JSON.stringify(twin)));\n };\n\n setDesign = (design?: UnlayerDesignFormat) => {\n if (!this.editor) {\n return;\n }\n\n this.hasDesign = !!design;\n\n if (design) {\n this.editor.loadDesign(design);\n }\n };\n\n setOnChange = (onChange?: UnlayerStore['onChangeCB']) => {\n this.onChangeCB = onChange;\n };\n\n setOnSnapshotSave = (onSnapshotSave?: UnlayerStore['onSnapshotSaveCB']) => {\n this.onSnapshotSaveCB = onSnapshotSave;\n };\n\n setOnReady = (onReady?: UnlayerStore['onReadyCB']) => {\n this.onReadyCB = onReady;\n };\n\n setOnImage = (onImage?: UnlayerStore['onImageCB']) => {\n this.onImageCB = onImage;\n };\n\n setOnMessage = (onMessage?: UnlayerStore['onMessageCB']) => {\n this.onMessageCB = onMessage;\n };\n\n private onDesignLoaded = () => {\n if (!this.hasDesign) {\n this.hasDesign = true;\n this.editor?.setBodyValues({\n backgroundColor: 'rgba(0,0,0,0)',\n contentWidth: '100%',\n });\n }\n };\n\n private onDesignUpdated = (event: EventDesignUpdated) => {\n const isToolAdded = !eventsNotAddingTools.includes(event.type);\n const isToolsListChanged = !eventsNotChangingToolsList.includes(event.type);\n\n if (isToolAdded) {\n this.editor?.exportHtml(data => {\n let hasChanges = false;\n\n unlayerToolsIterate(data.design, tool => {\n const realTool = tool.slug\n ? unlayerToolsParseTwinKey(tool.slug ?? '')\n : undefined;\n\n if (realTool) {\n hasChanges = true;\n\n if (tool.slug) {\n delete data.design.counters[`u_content_custom_${tool.slug}`];\n delete tool.values._meta.htmlID;\n }\n\n tool.type = realTool.type;\n tool.slug = realTool.slug;\n }\n });\n\n if (hasChanges) {\n this.setDesign(data.design);\n }\n\n this.onChangeCB?.({ isToolsListChanged });\n });\n } else {\n this.onChangeCB?.({ isToolsListChanged });\n }\n };\n\n private onPostMessage = (e: MessageEvent) => {\n if (!e.data?.['-dte-message-from']) {\n return;\n }\n\n const type = e.data?.['-dte-message-from']?.type;\n const data = e.data?.['-dte-message-from']?.data;\n\n if (!type) {\n return;\n }\n\n if (type === '--ready' || type === '--registered') {\n this.onReadyCB?.();\n } else if (type === '--core-loaded') {\n const data: UnlayerEventConfig = {\n dummyData: this.props.dummyData,\n schema: this.props.schema,\n generics: this.props.generics,\n genericConfigMode: this.props.genericConfigMode,\n isSnapshotMode: this.props.isSnapshotMode,\n };\n\n this.sendMessage('--config', JSON.parse(JSON.stringify(data)));\n } else if (type === '--data-loaded') {\n const data: UnlayerEventRegister = {\n customTools: this.props.tools.map(tool => ({ key: tool.key })),\n toolTwins: this.props.toolTwins,\n eSignRecipients: this.props.eSignRecipients,\n eSignFieldTypes: this.props.eSignFieldTypes,\n units: this.props.units?.map(unit => ({\n ...unit,\n values: {\n ...unit.values,\n adminConfig: undefined,\n },\n })),\n };\n\n this.sendMessage('--register', JSON.parse(JSON.stringify(data)));\n } else if (type === '--save-snapshot') {\n this.editor?.exportHtml(template => {\n unlayerToolsIterate(template.design, tool => {\n if (tool.values?.twin?.id === data.id) {\n if (!tool.slug) {\n return;\n }\n\n this.onSnapshotSaveCB?.({\n title: '',\n tool: tool.slug,\n values: tool.values,\n });\n return false;\n }\n });\n });\n }\n\n this.onMessageCB?.(type, data);\n };\n\n private sendMessage = (type: string, data?: any) => {\n this.iframe?.contentWindow?.postMessage(\n {\n '-dte-message-to': {\n type,\n data,\n },\n },\n '*'\n );\n };\n\n private uploadImage = (data: any, done: (result: any) => void) => {\n if (!this.onImageCB) {\n done({ progress: 100 });\n throw new Error('image upload is not implemented');\n }\n\n done({ progress: 0 });\n\n if (data.attachments?.length) {\n this.onImageCB(data.attachments[0])\n .catch(() => ({ url: '' }))\n .then(({ url }) => done({ progress: 100, url }));\n }\n };\n}\n"],"names":["loadScript","unlayerToolsParseTwinKey","unlayerToolsIterate","createUnlayerEditor","DesignUpdatedEventType","defaultScriptUrl","eventsNotChangingToolsList","ContentMoved","ContentModified","ColumnModified","RowMoved","RowModified","BodyModified","eventsNotAddingTools","ContentRemoved","ColumnRemoved","RowRemoved","UnlayerStore","props","unlayerRef","editor","isInit","iframe","hasDesign","onMessageCB","onChangeCB","onSnapshotSaveCB","onReadyCB","onImageCB","init","destroy","addTwin","setDesign","setOnChange","setOnSnapshotSave","setOnReady","setOnImage","setOnMessage","onDesignLoaded","onDesignUpdated","onPostMessage","sendMessage","uploadImage","container","setTimeout","window","addEventListener","registerCallback","querySelector","undefined","removeEventListener","unregisterCallback","twin","toolTwins","push","JSON","parse","stringify","design","loadDesign","onChange","onSnapshotSave","onReady","onImage","onMessage","setBodyValues","backgroundColor","contentWidth","event","isToolAdded","includes","type","isToolsListChanged","exportHtml","data","hasChanges","tool","realTool","slug","counters","values","_meta","htmlID","e","dummyData","schema","generics","genericConfigMode","isSnapshotMode","customTools","tools","map","key","eSignRecipients","eSignFieldTypes","units","unit","adminConfig","template","id","title","contentWindow","postMessage","done","progress","Error","attachments","length","catch","url","then","saveDesign","cb"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/store.ts"],"sourcesContent":["import { loadScript } from './loadScript';\nimport { defaultImageValidation } from './shared/configs';\nimport { UnlayerEditorTwin, UnlayerEventConfig, UnlayerEventRegister } from './shared/const';\nimport { unlayerToolsParseTwinKey } from './shared/tools';\nimport { unlayerToolsIterate } from './tools';\nimport {\n createUnlayerEditor,\n DesignUpdatedEventType,\n EventDesignUpdated,\n Unlayer,\n} from './unlayer';\nimport { CreateUnlayerEditorProps, UnlayerDesignFormat, UnlayerRef } from './unlayer-interface';\n\nconst defaultScriptUrl = 'https://editor.unlayer.com/embed.js?2';\n\nexport interface UnlayerDesignChangeInfo {\n isToolsListChanged: boolean;\n}\n\n// We are using exclusive lists here, because we can't be sure that we know all unlayer event types\nconst eventsNotChangingToolsList: DesignUpdatedEventType[] = [\n DesignUpdatedEventType.ContentMoved,\n DesignUpdatedEventType.ContentModified,\n DesignUpdatedEventType.ColumnModified,\n DesignUpdatedEventType.RowMoved,\n DesignUpdatedEventType.RowModified,\n DesignUpdatedEventType.BodyModified,\n];\n\nconst eventsNotAddingTools: DesignUpdatedEventType[] = [\n ...eventsNotChangingToolsList,\n DesignUpdatedEventType.ContentRemoved,\n DesignUpdatedEventType.ColumnRemoved,\n DesignUpdatedEventType.RowRemoved,\n];\n\nexport class UnlayerStore {\n readonly unlayerRef: UnlayerRef;\n\n private editor: Unlayer | undefined;\n private isInit = false;\n private iframe?: HTMLIFrameElement;\n private hasDesign = false;\n\n private onMessageCB?: (type: string, data: any) => void;\n private onChangeCB?: (info: UnlayerDesignChangeInfo) => void;\n private onSnapshotSaveCB?: (snapshot: UnlayerEditorTwin) => void;\n private onReadyCB?: () => void;\n private onImageCB?: (file: File) => Promise<{ url: string }>;\n private onErrorCB?: (title: string, description?: string) => void;\n\n constructor(readonly props: CreateUnlayerEditorProps) {\n this.props.eSignFieldTypes = ['Signature', 'Initials', 'Date Signed', 'Full Name'];\n\n this.unlayerRef = {\n loadDesign: design => {\n this.editor?.loadDesign(design);\n },\n saveDesign: cb => {\n this.editor?.saveDesign(cb);\n },\n exportHtml: cb => {\n this.editor?.exportHtml(data => {\n cb(data);\n });\n },\n };\n }\n\n init = async (container: HTMLDivElement) => {\n if (this.isInit) {\n return;\n }\n\n this.isInit = true;\n\n setTimeout(() => window.addEventListener('message', this.onPostMessage));\n\n await loadScript(defaultScriptUrl);\n\n this.editor = createUnlayerEditor(container, this.props);\n this.editor.addEventListener('design:loaded', this.onDesignLoaded);\n this.editor.addEventListener('design:updated', this.onDesignUpdated);\n this.editor.registerCallback('image', this.uploadImage);\n\n this.iframe = container.querySelector(`iframe`) ?? undefined;\n };\n\n destroy = () => {\n window.removeEventListener('message', this.onPostMessage);\n\n if (this.editor) {\n this.editor.removeEventListener('design:loaded', this.onDesignLoaded);\n this.editor.removeEventListener('design:updated', this.onDesignUpdated);\n this.editor.unregisterCallback('image', this.uploadImage);\n\n this.editor = undefined;\n }\n };\n\n addTwin = (twin: UnlayerEditorTwin) => {\n this.props.toolTwins?.push(twin);\n this.sendMessage('--add-twin', JSON.parse(JSON.stringify(twin)));\n };\n\n setDesign = (design?: UnlayerDesignFormat) => {\n if (!this.editor) {\n return;\n }\n\n this.hasDesign = !!design;\n\n if (design) {\n this.editor.loadDesign(design);\n }\n };\n\n setOnChange = (onChange?: UnlayerStore['onChangeCB']) => {\n this.onChangeCB = onChange;\n };\n\n setOnSnapshotSave = (onSnapshotSave?: UnlayerStore['onSnapshotSaveCB']) => {\n this.onSnapshotSaveCB = onSnapshotSave;\n };\n\n setOnReady = (onReady?: UnlayerStore['onReadyCB']) => {\n this.onReadyCB = onReady;\n };\n\n setOnImage = (onImage?: UnlayerStore['onImageCB']) => {\n this.onImageCB = onImage;\n };\n\n setOnError = (onError?: UnlayerStore['onErrorCB']) => {\n this.onErrorCB = onError;\n };\n\n setOnMessage = (onMessage?: UnlayerStore['onMessageCB']) => {\n this.onMessageCB = onMessage;\n };\n\n private onDesignLoaded = () => {\n if (!this.hasDesign) {\n this.hasDesign = true;\n this.editor?.setBodyValues({\n backgroundColor: 'rgba(0,0,0,0)',\n contentWidth: '100%',\n });\n }\n };\n\n private onDesignUpdated = (event: EventDesignUpdated) => {\n const isToolAdded = !eventsNotAddingTools.includes(event.type);\n const isToolsListChanged = !eventsNotChangingToolsList.includes(event.type);\n\n if (isToolAdded) {\n this.editor?.exportHtml(data => {\n let hasChanges = false;\n\n unlayerToolsIterate(data.design, tool => {\n const realTool = tool.slug\n ? unlayerToolsParseTwinKey(tool.slug ?? '')\n : undefined;\n\n if (realTool) {\n hasChanges = true;\n\n if (tool.slug) {\n delete data.design.counters[`u_content_custom_${tool.slug}`];\n delete tool.values._meta.htmlID;\n }\n\n tool.type = realTool.type;\n tool.slug = realTool.slug;\n }\n });\n\n if (hasChanges) {\n this.setDesign(data.design);\n }\n\n this.onChangeCB?.({ isToolsListChanged });\n });\n } else {\n this.onChangeCB?.({ isToolsListChanged });\n }\n };\n\n private onPostMessage = (e: MessageEvent) => {\n if (!e.data?.['-dte-message-from']) {\n return;\n }\n\n const type = e.data?.['-dte-message-from']?.type;\n const data = e.data?.['-dte-message-from']?.data;\n\n if (!type) {\n return;\n }\n\n if (type === '--ready' || type === '--registered') {\n this.onReadyCB?.();\n } else if (type === '--core-loaded') {\n const data: UnlayerEventConfig = {\n dummyData: this.props.dummyData,\n schema: this.props.schema,\n generics: this.props.generics,\n genericConfigMode: this.props.genericConfigMode,\n isSnapshotMode: this.props.isSnapshotMode,\n };\n\n this.sendMessage('--config', JSON.parse(JSON.stringify(data)));\n } else if (type === '--data-loaded') {\n const data: UnlayerEventRegister = {\n customTools: this.props.tools.map(tool => ({ key: tool.key })),\n toolTwins: this.props.toolTwins,\n eSignRecipients: this.props.eSignRecipients,\n eSignFieldTypes: this.props.eSignFieldTypes,\n units: this.props.units?.map(unit => ({\n ...unit,\n values: {\n ...unit.values,\n adminConfig: undefined,\n },\n })),\n };\n\n this.sendMessage('--register', JSON.parse(JSON.stringify(data)));\n } else if (type === '--save-snapshot') {\n this.editor?.exportHtml(template => {\n unlayerToolsIterate(template.design, tool => {\n if (tool.values?.twin?.id === data.id) {\n if (!tool.slug) {\n return;\n }\n\n this.onSnapshotSaveCB?.({\n title: '',\n tool: tool.slug,\n values: tool.values,\n });\n return false;\n }\n });\n });\n }\n\n this.onMessageCB?.(type, data);\n };\n\n private sendMessage = (type: string, data?: any) => {\n this.iframe?.contentWindow?.postMessage(\n {\n '-dte-message-to': {\n type,\n data,\n },\n },\n '*',\n );\n };\n\n private uploadImage = async (\n data: { attachments: File[] },\n done: (result: { progress: number; url?: string }) => void,\n ) => {\n if (!this.onImageCB) {\n done({ progress: 100 });\n throw new Error('image upload is not implemented');\n }\n\n if (!data.attachments?.length) {\n return;\n }\n\n const file = data.attachments[0];\n\n const res = await this.validateImage(file, {\n ...defaultImageValidation,\n ...(this.props.imageValidation ?? {}),\n });\n\n if (!res.isValid) {\n this.onErrorCB?.(res.title, res.description);\n return;\n }\n\n done({ progress: 0 });\n\n try {\n const { url } = await this.onImageCB(file);\n done({ progress: 100, url });\n } catch {\n this.onErrorCB?.(\n 'Image upload failed',\n 'Something went wrong while uploading the image. Please try again or select another image.',\n );\n done({ progress: 100 });\n }\n };\n\n private validateImage = async (\n file: File,\n imageValidation: { maxFileSize: number; maxWidth: number; maxHeight: number },\n ): Promise<{ isValid: boolean; title: string; description: string }> => {\n const { maxFileSize, maxHeight, maxWidth } = imageValidation;\n\n if (file.size > maxFileSize) {\n const maxSizeMB = (maxFileSize / 1024 / 1024).toFixed(2);\n const fileSizeMB = (file.size / 1024 / 1024).toFixed(2);\n return {\n isValid: false,\n title: 'Image size limit reached',\n description: `This image is ${fileSizeMB}MB, which is above the ${maxSizeMB}MB limit. Please upload a smaller file to continue.`,\n };\n }\n\n return new Promise(resolve => {\n const img = new Image();\n const objectUrl = URL.createObjectURL(file);\n\n img.onload = () => {\n URL.revokeObjectURL(objectUrl);\n const { height, width } = img;\n\n if (width > maxWidth || height > maxHeight) {\n resolve({\n isValid: false,\n title: 'Dimension limit reached',\n description: `These image dimensions (${width}x${height}px) exceed the ${maxWidth}x${maxHeight}px limit. Please resize the image and try again.`,\n });\n } else {\n resolve({ isValid: true, title: '', description: '' });\n }\n };\n\n img.onerror = () => {\n URL.revokeObjectURL(objectUrl);\n resolve({\n isValid: false,\n title: 'The image is broken',\n description:\n 'Looks like this image isn’t valid. Please choose another image and try again.',\n });\n };\n\n img.src = objectUrl;\n });\n };\n}\n"],"names":["loadScript","defaultImageValidation","unlayerToolsParseTwinKey","unlayerToolsIterate","createUnlayerEditor","DesignUpdatedEventType","defaultScriptUrl","eventsNotChangingToolsList","ContentMoved","ContentModified","ColumnModified","RowMoved","RowModified","BodyModified","eventsNotAddingTools","ContentRemoved","ColumnRemoved","RowRemoved","UnlayerStore","props","unlayerRef","editor","isInit","iframe","hasDesign","onMessageCB","onChangeCB","onSnapshotSaveCB","onReadyCB","onImageCB","onErrorCB","init","destroy","addTwin","setDesign","setOnChange","setOnSnapshotSave","setOnReady","setOnImage","setOnError","setOnMessage","onDesignLoaded","onDesignUpdated","onPostMessage","sendMessage","uploadImage","validateImage","container","setTimeout","window","addEventListener","registerCallback","querySelector","undefined","removeEventListener","unregisterCallback","twin","toolTwins","push","JSON","parse","stringify","design","loadDesign","onChange","onSnapshotSave","onReady","onImage","onError","onMessage","setBodyValues","backgroundColor","contentWidth","event","isToolAdded","includes","type","isToolsListChanged","exportHtml","data","hasChanges","tool","realTool","slug","counters","values","_meta","htmlID","e","dummyData","schema","generics","genericConfigMode","isSnapshotMode","customTools","tools","map","key","eSignRecipients","eSignFieldTypes","units","unit","adminConfig","template","id","title","contentWindow","postMessage","done","progress","Error","attachments","length","file","res","imageValidation","isValid","description","url","maxFileSize","maxHeight","maxWidth","size","maxSizeMB","toFixed","fileSizeMB","Promise","resolve","img","Image","objectUrl","URL","createObjectURL","onload","revokeObjectURL","height","width","onerror","src","saveDesign","cb"],"mappings":"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"}
@@ -68,5 +68,10 @@ export interface CreateUnlayerEditorProps {
68
68
  hideBodyMenuItem?: boolean;
69
69
  enableHTMLEditing?: boolean;
70
70
  enableHTMLEditingReadonly?: boolean;
71
+ imageValidation?: {
72
+ maxWidth?: number;
73
+ maxHeight?: number;
74
+ maxFileSize?: number;
75
+ };
71
76
  }
72
77
  //# sourceMappingURL=unlayer-interface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"unlayer-interface.d.ts","sourceRoot":"","sources":["../src/unlayer-interface.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"unlayer-interface.d.ts","sourceRoot":"","sources":["../src/unlayer-interface.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/unlayer-interface.tsx"],"sourcesContent":["import {\n UnlayerEditorESignRecipientInfo,\n UnlayerEditorTwin,\n UnlayerEditorUnit,\n} from './shared/const';\nimport { SchemaObject } from './shared/schema';\n\nexport interface UnlayerDesignTool {\n type: string;\n slug?: string;\n values: any;\n}\nexport interface UnlayerDesignCustomTool extends UnlayerDesignTool {\n slug: string;\n}\n\nexport interface UnlayerDesignFormat {\n body: {\n rows: {\n cells: number[];\n columns: {\n contents: UnlayerDesignTool[];\n values?: any;\n }[];\n values?: any;\n }[];\n values?: any;\n };\n counters: Record<string, number>;\n schemaVersion: number;\n}\n\nexport interface UnlayerExport {\n html: string;\n chunks: any;\n design: UnlayerDesignFormat;\n}\n\nexport interface UnlayerRef {\n loadDesign(design: any): void;\n saveDesign(cb: (design: any) => void): void;\n exportHtml(cb: (data: UnlayerExport) => void): void;\n}\n\nexport interface UnlayerEditorMergeTagInfo {\n id: string;\n name: string;\n propertyPath: string;\n}\n\nexport interface UnlayerEditorCustomTool {\n key: string;\n title: string;\n description?: string;\n url: string;\n groupUrl?: string;\n}\n\nexport interface CreateUnlayerEditorProps {\n tools: UnlayerEditorCustomTool[];\n newSnapshot?: UnlayerEditorTwin;\n toolTwins?: UnlayerEditorTwin[];\n isSnapshotMode?: boolean;\n dummyData?: any;\n schema?: SchemaObject;\n customCSS?: string | string[] | undefined;\n customJS?: string | string[] | undefined;\n mergeTags?: UnlayerEditorMergeTagInfo[] | undefined;\n eSignRecipients?: UnlayerEditorESignRecipientInfo[] | undefined;\n eSignFieldTypes?: string[] | undefined;\n genericConfigMode?: boolean;\n generics?: true | string[];\n units?: UnlayerEditorUnit[];\n noCoreTools?: boolean;\n latest?: boolean;\n blocks?: boolean;\n hideAllTools?: boolean;\n hideContentControls?: boolean;\n hideBodyMenuItem?: boolean;\n enableHTMLEditing?: boolean;\n enableHTMLEditingReadonly?: boolean;\n}\n"],"names":[],"mappings":"AA0DA,WAuBC"}
1
+ {"version":3,"sources":["../src/unlayer-interface.tsx"],"sourcesContent":["import {\n UnlayerEditorESignRecipientInfo,\n UnlayerEditorTwin,\n UnlayerEditorUnit,\n} from './shared/const';\nimport { SchemaObject } from './shared/schema';\n\nexport interface UnlayerDesignTool {\n type: string;\n slug?: string;\n values: any;\n}\nexport interface UnlayerDesignCustomTool extends UnlayerDesignTool {\n slug: string;\n}\n\nexport interface UnlayerDesignFormat {\n body: {\n rows: {\n cells: number[];\n columns: {\n contents: UnlayerDesignTool[];\n values?: any;\n }[];\n values?: any;\n }[];\n values?: any;\n };\n counters: Record<string, number>;\n schemaVersion: number;\n}\n\nexport interface UnlayerExport {\n html: string;\n chunks: any;\n design: UnlayerDesignFormat;\n}\n\nexport interface UnlayerRef {\n loadDesign(design: any): void;\n saveDesign(cb: (design: any) => void): void;\n exportHtml(cb: (data: UnlayerExport) => void): void;\n}\n\nexport interface UnlayerEditorMergeTagInfo {\n id: string;\n name: string;\n propertyPath: string;\n}\n\nexport interface UnlayerEditorCustomTool {\n key: string;\n title: string;\n description?: string;\n url: string;\n groupUrl?: string;\n}\n\nexport interface CreateUnlayerEditorProps {\n tools: UnlayerEditorCustomTool[];\n newSnapshot?: UnlayerEditorTwin;\n toolTwins?: UnlayerEditorTwin[];\n isSnapshotMode?: boolean;\n dummyData?: any;\n schema?: SchemaObject;\n customCSS?: string | string[] | undefined;\n customJS?: string | string[] | undefined;\n mergeTags?: UnlayerEditorMergeTagInfo[] | undefined;\n eSignRecipients?: UnlayerEditorESignRecipientInfo[] | undefined;\n eSignFieldTypes?: string[] | undefined;\n genericConfigMode?: boolean;\n generics?: true | string[];\n units?: UnlayerEditorUnit[];\n noCoreTools?: boolean;\n latest?: boolean;\n blocks?: boolean;\n hideAllTools?: boolean;\n hideContentControls?: boolean;\n hideBodyMenuItem?: boolean;\n enableHTMLEditing?: boolean;\n enableHTMLEditingReadonly?: boolean;\n imageValidation?: {\n maxWidth?: number;\n maxHeight?: number;\n maxFileSize?: number;\n }\n}\n"],"names":[],"mappings":"AA0DA,WA4BC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/dte-unlayer",
3
- "version": "0.90.0",
3
+ "version": "0.91.0",
4
4
  "description": "",
5
5
  "main": "./dist/index.js",
6
6
  "typings": "./dist/index.d.ts",
package/src/editor.tsx CHANGED
@@ -26,6 +26,8 @@ export interface UnlayerEditorProps {
26
26
 
27
27
  onImage?(file: File): Promise<{ url: string }>;
28
28
 
29
+ onError?(title: string, description?: string): void;
30
+
29
31
  onMessage?(type: string, data: any): void;
30
32
  }
31
33
 
@@ -88,6 +90,12 @@ export const UnlayerEditor = forwardRef<UnlayerRef, UnlayerEditorProps>((props,
88
90
  return () => store.setOnImage();
89
91
  }, [props.onImage, store]);
90
92
 
93
+ useEffect(() => {
94
+ store.setOnError(props.onError);
95
+
96
+ return () => store.setOnError();
97
+ }, [props.onError, store]);
98
+
91
99
  useEffect(() => {
92
100
  store.setOnMessage(props.onMessage);
93
101
 
@@ -0,0 +1,5 @@
1
+ export const defaultImageValidation = {
2
+ maxWidth: 5000,
3
+ maxHeight: 5000,
4
+ maxFileSize: 10 * 1024 * 1024, // 10mb
5
+ };
package/src/store.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { loadScript } from './loadScript';
2
+ import { defaultImageValidation } from './shared/configs';
2
3
  import { UnlayerEditorTwin, UnlayerEventConfig, UnlayerEventRegister } from './shared/const';
3
4
  import { unlayerToolsParseTwinKey } from './shared/tools';
4
5
  import { unlayerToolsIterate } from './tools';
@@ -46,6 +47,7 @@ export class UnlayerStore {
46
47
  private onSnapshotSaveCB?: (snapshot: UnlayerEditorTwin) => void;
47
48
  private onReadyCB?: () => void;
48
49
  private onImageCB?: (file: File) => Promise<{ url: string }>;
50
+ private onErrorCB?: (title: string, description?: string) => void;
49
51
 
50
52
  constructor(readonly props: CreateUnlayerEditorProps) {
51
53
  this.props.eSignFieldTypes = ['Signature', 'Initials', 'Date Signed', 'Full Name'];
@@ -129,6 +131,10 @@ export class UnlayerStore {
129
131
  this.onImageCB = onImage;
130
132
  };
131
133
 
134
+ setOnError = (onError?: UnlayerStore['onErrorCB']) => {
135
+ this.onErrorCB = onError;
136
+ };
137
+
132
138
  setOnMessage = (onMessage?: UnlayerStore['onMessageCB']) => {
133
139
  this.onMessageCB = onMessage;
134
140
  };
@@ -250,22 +256,95 @@ export class UnlayerStore {
250
256
  data,
251
257
  },
252
258
  },
253
- '*'
259
+ '*',
254
260
  );
255
261
  };
256
262
 
257
- private uploadImage = (data: any, done: (result: any) => void) => {
263
+ private uploadImage = async (
264
+ data: { attachments: File[] },
265
+ done: (result: { progress: number; url?: string }) => void,
266
+ ) => {
258
267
  if (!this.onImageCB) {
259
268
  done({ progress: 100 });
260
269
  throw new Error('image upload is not implemented');
261
270
  }
262
271
 
272
+ if (!data.attachments?.length) {
273
+ return;
274
+ }
275
+
276
+ const file = data.attachments[0];
277
+
278
+ const res = await this.validateImage(file, {
279
+ ...defaultImageValidation,
280
+ ...(this.props.imageValidation ?? {}),
281
+ });
282
+
283
+ if (!res.isValid) {
284
+ this.onErrorCB?.(res.title, res.description);
285
+ return;
286
+ }
287
+
263
288
  done({ progress: 0 });
264
289
 
265
- if (data.attachments?.length) {
266
- this.onImageCB(data.attachments[0])
267
- .catch(() => ({ url: '' }))
268
- .then(({ url }) => done({ progress: 100, url }));
290
+ try {
291
+ const { url } = await this.onImageCB(file);
292
+ done({ progress: 100, url });
293
+ } catch {
294
+ this.onErrorCB?.(
295
+ 'Image upload failed',
296
+ 'Something went wrong while uploading the image. Please try again or select another image.',
297
+ );
298
+ done({ progress: 100 });
299
+ }
300
+ };
301
+
302
+ private validateImage = async (
303
+ file: File,
304
+ imageValidation: { maxFileSize: number; maxWidth: number; maxHeight: number },
305
+ ): Promise<{ isValid: boolean; title: string; description: string }> => {
306
+ const { maxFileSize, maxHeight, maxWidth } = imageValidation;
307
+
308
+ if (file.size > maxFileSize) {
309
+ const maxSizeMB = (maxFileSize / 1024 / 1024).toFixed(2);
310
+ const fileSizeMB = (file.size / 1024 / 1024).toFixed(2);
311
+ return {
312
+ isValid: false,
313
+ title: 'Image size limit reached',
314
+ description: `This image is ${fileSizeMB}MB, which is above the ${maxSizeMB}MB limit. Please upload a smaller file to continue.`,
315
+ };
269
316
  }
317
+
318
+ return new Promise(resolve => {
319
+ const img = new Image();
320
+ const objectUrl = URL.createObjectURL(file);
321
+
322
+ img.onload = () => {
323
+ URL.revokeObjectURL(objectUrl);
324
+ const { height, width } = img;
325
+
326
+ if (width > maxWidth || height > maxHeight) {
327
+ resolve({
328
+ isValid: false,
329
+ title: 'Dimension limit reached',
330
+ description: `These image dimensions (${width}x${height}px) exceed the ${maxWidth}x${maxHeight}px limit. Please resize the image and try again.`,
331
+ });
332
+ } else {
333
+ resolve({ isValid: true, title: '', description: '' });
334
+ }
335
+ };
336
+
337
+ img.onerror = () => {
338
+ URL.revokeObjectURL(objectUrl);
339
+ resolve({
340
+ isValid: false,
341
+ title: 'The image is broken',
342
+ description:
343
+ 'Looks like this image isn’t valid. Please choose another image and try again.',
344
+ });
345
+ };
346
+
347
+ img.src = objectUrl;
348
+ });
270
349
  };
271
350
  }
@@ -79,4 +79,9 @@ export interface CreateUnlayerEditorProps {
79
79
  hideBodyMenuItem?: boolean;
80
80
  enableHTMLEditing?: boolean;
81
81
  enableHTMLEditingReadonly?: boolean;
82
+ imageValidation?: {
83
+ maxWidth?: number;
84
+ maxHeight?: number;
85
+ maxFileSize?: number;
86
+ }
82
87
  }