@pexelize/react-editor 1.0.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/README.md +206 -0
- package/dist/index.d.ts +264 -0
- package/dist/index.esm.js +311 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +318 -0
- package/dist/index.js.map +1 -0
- package/package.json +85 -0
package/README.md
ADDED
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
# @pexelize/react-editor
|
|
2
|
+
|
|
3
|
+
React wrapper component for the **Pexelize Email Editor**. The SDK is automatically loaded from jsDelivr CDN - no npm SDK dependency required.
|
|
4
|
+
|
|
5
|
+
## 🚀 Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @pexelize/react-editor
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 📖 Usage
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
import { PexelizeEditor, PexelizeEditorRef } from '@pexelize/react-editor';
|
|
15
|
+
import { useRef } from 'react';
|
|
16
|
+
|
|
17
|
+
function EmailBuilder() {
|
|
18
|
+
const editorRef = useRef<PexelizeEditorRef>(null);
|
|
19
|
+
|
|
20
|
+
const handleSave = () => {
|
|
21
|
+
editorRef.current?.saveDesign((design) => {
|
|
22
|
+
console.log('Saved:', design);
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const handleExport = () => {
|
|
27
|
+
editorRef.current?.exportHtml((data) => {
|
|
28
|
+
console.log('HTML:', data.html);
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<div>
|
|
34
|
+
<div style={{ marginBottom: '10px' }}>
|
|
35
|
+
<button onClick={handleSave}>Save</button>
|
|
36
|
+
<button onClick={handleExport}>Export HTML</button>
|
|
37
|
+
</div>
|
|
38
|
+
|
|
39
|
+
<PexelizeEditor
|
|
40
|
+
ref={editorRef}
|
|
41
|
+
editorMode="email"
|
|
42
|
+
height="600px"
|
|
43
|
+
onReady={() => console.log('Editor ready!')}
|
|
44
|
+
onChange={({ design }) => console.log('Changed:', design)}
|
|
45
|
+
/>
|
|
46
|
+
</div>
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## 🔧 Props
|
|
52
|
+
|
|
53
|
+
| Prop | Type | Default | Description |
|
|
54
|
+
|------|------|---------|-------------|
|
|
55
|
+
| `editorMode` | `'email' \| 'web' \| 'popup'` | `'email'` | Editor mode |
|
|
56
|
+
| `height` | `string \| number` | `'600px'` | Editor height |
|
|
57
|
+
| `design` | `DesignJson` | - | Initial design to load |
|
|
58
|
+
| `mergeTags` | `MergeTag[]` | - | Merge tags for personalization |
|
|
59
|
+
| `appearance` | `AppearanceConfig` | - | Visual customization |
|
|
60
|
+
| `onReady` | `() => void` | - | Called when editor is ready |
|
|
61
|
+
| `onChange` | `(data) => void` | - | Called when design changes |
|
|
62
|
+
| `onLoad` | `(data) => void` | - | Called when design is loaded |
|
|
63
|
+
| `onImage` | `ImageUploadCallback` | - | Image upload handler |
|
|
64
|
+
| `onSave` | `SaveCallback` | - | Save handler |
|
|
65
|
+
|
|
66
|
+
## 📚 Ref Methods
|
|
67
|
+
|
|
68
|
+
Access editor methods via ref:
|
|
69
|
+
|
|
70
|
+
```tsx
|
|
71
|
+
const editorRef = useRef<PexelizeEditorRef>(null);
|
|
72
|
+
|
|
73
|
+
// Load a design
|
|
74
|
+
editorRef.current?.loadDesign(myDesign);
|
|
75
|
+
|
|
76
|
+
// Load blank
|
|
77
|
+
editorRef.current?.loadBlank();
|
|
78
|
+
|
|
79
|
+
// Get design
|
|
80
|
+
const design = await editorRef.current?.getDesign();
|
|
81
|
+
|
|
82
|
+
// Save design (callback)
|
|
83
|
+
editorRef.current?.saveDesign((design) => console.log(design));
|
|
84
|
+
|
|
85
|
+
// Export HTML
|
|
86
|
+
editorRef.current?.exportHtml((data) => console.log(data.html));
|
|
87
|
+
|
|
88
|
+
// Export HTML (async)
|
|
89
|
+
const { html, design } = await editorRef.current?.exportHtmlAsync();
|
|
90
|
+
|
|
91
|
+
// Undo/Redo
|
|
92
|
+
editorRef.current?.undo();
|
|
93
|
+
editorRef.current?.redo();
|
|
94
|
+
|
|
95
|
+
// Check if ready
|
|
96
|
+
const ready = editorRef.current?.isReady();
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## 🪝 Hook: usePexelizeSDK
|
|
100
|
+
|
|
101
|
+
For more control, use the hook directly:
|
|
102
|
+
|
|
103
|
+
```tsx
|
|
104
|
+
import { usePexelizeSDK } from '@pexelize/react-editor';
|
|
105
|
+
|
|
106
|
+
function MyComponent() {
|
|
107
|
+
const { sdk, isReady, isLoading, error } = usePexelizeSDK({
|
|
108
|
+
containerId: 'my-editor',
|
|
109
|
+
editorMode: 'email',
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
if (isLoading) return <div>Loading...</div>;
|
|
113
|
+
if (error) return <div>Error: {error}</div>;
|
|
114
|
+
|
|
115
|
+
return (
|
|
116
|
+
<div>
|
|
117
|
+
<div id="my-editor" style={{ height: '600px' }} />
|
|
118
|
+
<button
|
|
119
|
+
disabled={!isReady}
|
|
120
|
+
onClick={() => sdk?.exportHtml((d) => console.log(d.html))}
|
|
121
|
+
>
|
|
122
|
+
Export
|
|
123
|
+
</button>
|
|
124
|
+
</div>
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## 🌐 CDN Architecture
|
|
130
|
+
|
|
131
|
+
This package automatically loads the Pexelize SDK from jsDelivr CDN:
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
https://cdn.jsdelivr.net/gh/Zaman-Meer/pexelize-sdk@dev/dist/pexelize-sdk.min.js
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**Benefits:**
|
|
138
|
+
- ✅ Smaller bundle size (SDK loaded separately)
|
|
139
|
+
- ✅ SDK cached by browser across sites
|
|
140
|
+
- ✅ Always get latest SDK updates
|
|
141
|
+
- ✅ No npm dependency conflicts
|
|
142
|
+
|
|
143
|
+
## 📦 Publishing to npm
|
|
144
|
+
|
|
145
|
+
### 1. Setup npm account
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
# Login to npm (create account at npmjs.com if needed)
|
|
149
|
+
npm login
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### 2. Build the package
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
cd pexelize-react
|
|
156
|
+
npm install
|
|
157
|
+
npm run build
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### 3. Publish
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
# For scoped package (@pexelize/react-editor)
|
|
164
|
+
npm publish --access public
|
|
165
|
+
|
|
166
|
+
# For unscoped package
|
|
167
|
+
npm publish
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### 4. Update version for future releases
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
# Patch version (1.0.0 -> 1.0.1)
|
|
174
|
+
npm version patch
|
|
175
|
+
|
|
176
|
+
# Minor version (1.0.0 -> 1.1.0)
|
|
177
|
+
npm version minor
|
|
178
|
+
|
|
179
|
+
# Major version (1.0.0 -> 2.0.0)
|
|
180
|
+
npm version major
|
|
181
|
+
|
|
182
|
+
# Then publish
|
|
183
|
+
npm publish --access public
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## ❓ FAQ
|
|
187
|
+
|
|
188
|
+
### Is the CDN publicly available?
|
|
189
|
+
|
|
190
|
+
**Yes!** The SDK is hosted on jsDelivr which serves files directly from our public GitHub repository. Anyone can access it:
|
|
191
|
+
|
|
192
|
+
```html
|
|
193
|
+
<script src="https://cdn.jsdelivr.net/gh/Zaman-Meer/pexelize-sdk@dev/dist/pexelize-sdk.min.js"></script>
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Can I use a different SDK version?
|
|
197
|
+
|
|
198
|
+
Yes, change the CDN URL by forking and modifying `SDK_CDN_URL` in the source, or use the hook to initialize manually.
|
|
199
|
+
|
|
200
|
+
### Does this work with SSR (Next.js)?
|
|
201
|
+
|
|
202
|
+
Yes! The SDK is loaded client-side only using `useEffect`. The component shows a loading state until the SDK is ready.
|
|
203
|
+
|
|
204
|
+
## 📄 License
|
|
205
|
+
|
|
206
|
+
MIT
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Pexelize Editor React Component
|
|
5
|
+
*
|
|
6
|
+
* A React wrapper for the Pexelize Editor SDK.
|
|
7
|
+
* SDK is loaded from jsDelivr CDN automatically.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
interface DesignJson {
|
|
11
|
+
body: {
|
|
12
|
+
rows: any[];
|
|
13
|
+
values: Record<string, any>;
|
|
14
|
+
};
|
|
15
|
+
schemaVersion?: number;
|
|
16
|
+
}
|
|
17
|
+
interface ExportHtmlData {
|
|
18
|
+
html: string;
|
|
19
|
+
design: DesignJson;
|
|
20
|
+
chunks?: {
|
|
21
|
+
css: string;
|
|
22
|
+
js: string;
|
|
23
|
+
body: string;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
interface MergeTag {
|
|
27
|
+
name: string;
|
|
28
|
+
value: string;
|
|
29
|
+
sample?: string;
|
|
30
|
+
}
|
|
31
|
+
interface DisplayCondition {
|
|
32
|
+
id: string;
|
|
33
|
+
label: string;
|
|
34
|
+
description?: string;
|
|
35
|
+
condition: Record<string, any>;
|
|
36
|
+
}
|
|
37
|
+
interface AppearanceConfig {
|
|
38
|
+
theme?: 'light' | 'dark' | 'pexelize-light' | 'pexelize-dark';
|
|
39
|
+
panels?: {
|
|
40
|
+
tools?: {
|
|
41
|
+
dock?: 'left' | 'right';
|
|
42
|
+
collapsible?: boolean;
|
|
43
|
+
};
|
|
44
|
+
properties?: {
|
|
45
|
+
dock?: 'left' | 'right';
|
|
46
|
+
collapsible?: boolean;
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
features?: Record<string, boolean>;
|
|
50
|
+
}
|
|
51
|
+
interface ToolsConfig {
|
|
52
|
+
enabled?: string[];
|
|
53
|
+
disabled?: string[];
|
|
54
|
+
}
|
|
55
|
+
interface FeaturesConfig {
|
|
56
|
+
preview?: boolean;
|
|
57
|
+
undoRedo?: boolean;
|
|
58
|
+
imageEditor?: boolean;
|
|
59
|
+
userUploads?: boolean;
|
|
60
|
+
stockImages?: boolean;
|
|
61
|
+
}
|
|
62
|
+
interface UserInfo {
|
|
63
|
+
id?: string;
|
|
64
|
+
name?: string;
|
|
65
|
+
email?: string;
|
|
66
|
+
}
|
|
67
|
+
interface SecurityConfig {
|
|
68
|
+
allowedOrigins?: string[];
|
|
69
|
+
}
|
|
70
|
+
interface EditorState {
|
|
71
|
+
isReady: boolean;
|
|
72
|
+
isDirty: boolean;
|
|
73
|
+
canUndo: boolean;
|
|
74
|
+
canRedo: boolean;
|
|
75
|
+
}
|
|
76
|
+
type DisplayMode = 'email' | 'web' | 'popup' | 'document';
|
|
77
|
+
type ThemeMode = 'light' | 'dark' | 'pexelize-light' | 'pexelize-dark';
|
|
78
|
+
type ImageUploadCallback = (file: File, done: (result: {
|
|
79
|
+
progress: number;
|
|
80
|
+
url?: string;
|
|
81
|
+
}) => void) => void;
|
|
82
|
+
type LinkClickCallback = (data: {
|
|
83
|
+
link: string;
|
|
84
|
+
type: string;
|
|
85
|
+
}, done: (result: {
|
|
86
|
+
link: string;
|
|
87
|
+
}) => void) => void;
|
|
88
|
+
type SaveCallback = (design: DesignJson, done: (result: {
|
|
89
|
+
success: boolean;
|
|
90
|
+
}) => void) => void;
|
|
91
|
+
/**
|
|
92
|
+
* Props for the PexelizeEditor component
|
|
93
|
+
*/
|
|
94
|
+
interface PexelizeEditorProps {
|
|
95
|
+
/** Editor display mode */
|
|
96
|
+
displayMode?: DisplayMode;
|
|
97
|
+
/** Also accepts editorMode for compatibility */
|
|
98
|
+
editorMode?: DisplayMode;
|
|
99
|
+
/** Project identifier */
|
|
100
|
+
projectId?: number | string;
|
|
101
|
+
/** UI language */
|
|
102
|
+
locale?: string;
|
|
103
|
+
/** Visual customization */
|
|
104
|
+
appearance?: AppearanceConfig;
|
|
105
|
+
/** Enable/disable tools */
|
|
106
|
+
tools?: ToolsConfig;
|
|
107
|
+
/** Feature toggles */
|
|
108
|
+
features?: FeaturesConfig;
|
|
109
|
+
/** User information */
|
|
110
|
+
user?: UserInfo;
|
|
111
|
+
/** Security settings */
|
|
112
|
+
security?: SecurityConfig;
|
|
113
|
+
/** Editor source URL (overrides CDN default) */
|
|
114
|
+
editorUrl?: string;
|
|
115
|
+
/** SDK CDN URL (overrides default) */
|
|
116
|
+
sdkUrl?: string;
|
|
117
|
+
/** Minimum height for the editor */
|
|
118
|
+
minHeight?: string | number;
|
|
119
|
+
/** Initial design to load */
|
|
120
|
+
design?: DesignJson;
|
|
121
|
+
/** Merge tags for personalization */
|
|
122
|
+
mergeTags?: MergeTag[];
|
|
123
|
+
/** Display conditions for dynamic content */
|
|
124
|
+
displayConditions?: DisplayCondition[];
|
|
125
|
+
/** Custom CSS class name */
|
|
126
|
+
className?: string;
|
|
127
|
+
/** Inline styles */
|
|
128
|
+
style?: React.CSSProperties;
|
|
129
|
+
/** Height of the editor */
|
|
130
|
+
height?: string | number;
|
|
131
|
+
/** Called when the editor is ready */
|
|
132
|
+
onReady?: () => void;
|
|
133
|
+
/** Called when the design is loaded */
|
|
134
|
+
onLoad?: (data: {
|
|
135
|
+
design: DesignJson;
|
|
136
|
+
}) => void;
|
|
137
|
+
/** Called when the design changes */
|
|
138
|
+
onChange?: (data: {
|
|
139
|
+
design: DesignJson;
|
|
140
|
+
changes?: unknown;
|
|
141
|
+
}) => void;
|
|
142
|
+
/** Called when content is modified */
|
|
143
|
+
onContentModified?: (data: {
|
|
144
|
+
type: string;
|
|
145
|
+
value: unknown;
|
|
146
|
+
element: unknown;
|
|
147
|
+
}) => void;
|
|
148
|
+
/** Called when an element is selected */
|
|
149
|
+
onSelect?: (data: {
|
|
150
|
+
element: unknown;
|
|
151
|
+
type: string;
|
|
152
|
+
}) => void;
|
|
153
|
+
/** Called when an element is deselected */
|
|
154
|
+
onDeselect?: () => void;
|
|
155
|
+
/** Image upload handler */
|
|
156
|
+
onImage?: ImageUploadCallback;
|
|
157
|
+
/** Link click handler */
|
|
158
|
+
onLinkClick?: LinkClickCallback;
|
|
159
|
+
/** Save handler */
|
|
160
|
+
onSave?: SaveCallback;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Ref handle for the PexelizeEditor component
|
|
164
|
+
*/
|
|
165
|
+
interface PexelizeEditorRef {
|
|
166
|
+
/** Load a design */
|
|
167
|
+
loadDesign: (design: DesignJson) => void;
|
|
168
|
+
/** Load a blank design */
|
|
169
|
+
loadBlank: () => void;
|
|
170
|
+
/** Save/get the current design */
|
|
171
|
+
saveDesign: (callback: (design: DesignJson) => void) => void;
|
|
172
|
+
/** Get the current design (Promise-based) */
|
|
173
|
+
getDesign: () => Promise<DesignJson>;
|
|
174
|
+
/** Export as HTML */
|
|
175
|
+
exportHtml: (callback: (data: ExportHtmlData) => void) => void;
|
|
176
|
+
/** Export as HTML (Promise-based) */
|
|
177
|
+
exportHtmlAsync: () => Promise<ExportHtmlData>;
|
|
178
|
+
/** Trigger save */
|
|
179
|
+
save: () => void;
|
|
180
|
+
/** Perform undo */
|
|
181
|
+
undo: () => void;
|
|
182
|
+
/** Perform redo */
|
|
183
|
+
redo: () => void;
|
|
184
|
+
/** Get editor state */
|
|
185
|
+
getState: () => Promise<EditorState>;
|
|
186
|
+
/** Check if editor is ready */
|
|
187
|
+
isReady: () => boolean;
|
|
188
|
+
/** Access the raw SDK instance */
|
|
189
|
+
getSdk: () => any;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* PexelizeEditor React Component
|
|
193
|
+
*
|
|
194
|
+
* @example
|
|
195
|
+
* ```tsx
|
|
196
|
+
* import { PexelizeEditor, PexelizeEditorRef } from '@pexelize/react-editor';
|
|
197
|
+
*
|
|
198
|
+
* function MyEditor() {
|
|
199
|
+
* const editorRef = useRef<PexelizeEditorRef>(null);
|
|
200
|
+
*
|
|
201
|
+
* const handleSave = () => {
|
|
202
|
+
* editorRef.current?.saveDesign((design) => {
|
|
203
|
+
* console.log('Design:', design);
|
|
204
|
+
* });
|
|
205
|
+
* };
|
|
206
|
+
*
|
|
207
|
+
* return (
|
|
208
|
+
* <div>
|
|
209
|
+
* <button onClick={handleSave}>Save</button>
|
|
210
|
+
* <PexelizeEditor
|
|
211
|
+
* ref={editorRef}
|
|
212
|
+
* editorMode="email"
|
|
213
|
+
* onReady={() => console.log('Ready!')}
|
|
214
|
+
* onChange={({ design }) => console.log('Changed:', design)}
|
|
215
|
+
* />
|
|
216
|
+
* </div>
|
|
217
|
+
* );
|
|
218
|
+
* }
|
|
219
|
+
* ```
|
|
220
|
+
*/
|
|
221
|
+
declare const PexelizeEditor: React.ForwardRefExoticComponent<PexelizeEditorProps & React.RefAttributes<PexelizeEditorRef>>;
|
|
222
|
+
interface UsePexelizeSDKConfig {
|
|
223
|
+
containerId: string;
|
|
224
|
+
editorMode?: DisplayMode;
|
|
225
|
+
displayMode?: DisplayMode;
|
|
226
|
+
[key: string]: any;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Hook to use the Pexelize SDK directly
|
|
230
|
+
*
|
|
231
|
+
* @example
|
|
232
|
+
* ```tsx
|
|
233
|
+
* function MyComponent() {
|
|
234
|
+
* const { sdk, isReady, error } = usePexelizeSDK({
|
|
235
|
+
* containerId: 'my-editor',
|
|
236
|
+
* editorMode: 'email',
|
|
237
|
+
* });
|
|
238
|
+
*
|
|
239
|
+
* const handleExport = () => {
|
|
240
|
+
* if (isReady && sdk) {
|
|
241
|
+
* sdk.exportHtml((data) => console.log(data.html));
|
|
242
|
+
* }
|
|
243
|
+
* };
|
|
244
|
+
*
|
|
245
|
+
* return (
|
|
246
|
+
* <div>
|
|
247
|
+
* <div id="my-editor" style={{ height: '600px' }} />
|
|
248
|
+
* <button onClick={handleExport} disabled={!isReady}>Export</button>
|
|
249
|
+
* </div>
|
|
250
|
+
* );
|
|
251
|
+
* }
|
|
252
|
+
* ```
|
|
253
|
+
*/
|
|
254
|
+
declare function usePexelizeSDK(config: UsePexelizeSDKConfig): {
|
|
255
|
+
sdk: any;
|
|
256
|
+
isReady: boolean;
|
|
257
|
+
isLoading: boolean;
|
|
258
|
+
error: string | null;
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
declare const PEXELIZE_SDK_CDN = "https://cdn.jsdelivr.net/gh/Zaman-Meer/pexelize-sdk@dev/dist/pexelize-sdk.min.js";
|
|
262
|
+
|
|
263
|
+
export { PEXELIZE_SDK_CDN, PexelizeEditor, PexelizeEditor as default, usePexelizeSDK };
|
|
264
|
+
export type { AppearanceConfig, DesignJson, DisplayCondition, DisplayMode, EditorState, ExportHtmlData, FeaturesConfig, ImageUploadCallback, LinkClickCallback, MergeTag, PexelizeEditorProps, PexelizeEditorRef, SaveCallback, SecurityConfig, ThemeMode, ToolsConfig, UsePexelizeSDKConfig, UserInfo };
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { forwardRef, useRef, useState, useEffect, useImperativeHandle } from 'react';
|
|
3
|
+
|
|
4
|
+
// ============================================================================
|
|
5
|
+
// SDK CDN Configuration
|
|
6
|
+
// ============================================================================
|
|
7
|
+
const SDK_CDN_URL = 'https://cdn.jsdelivr.net/gh/Zaman-Meer/pexelize-sdk@dev/dist/pexelize-sdk.min.js';
|
|
8
|
+
// Global SDK reference (loaded from CDN)
|
|
9
|
+
let sdkLoadPromise = null;
|
|
10
|
+
/**
|
|
11
|
+
* Load SDK from CDN (singleton pattern - loads only once)
|
|
12
|
+
*/
|
|
13
|
+
function loadSDKFromCDN() {
|
|
14
|
+
if (sdkLoadPromise) {
|
|
15
|
+
return sdkLoadPromise;
|
|
16
|
+
}
|
|
17
|
+
// Check if already loaded
|
|
18
|
+
if (window.pexelize) {
|
|
19
|
+
return Promise.resolve();
|
|
20
|
+
}
|
|
21
|
+
sdkLoadPromise = new Promise((resolve, reject) => {
|
|
22
|
+
const script = document.createElement('script');
|
|
23
|
+
script.src = SDK_CDN_URL;
|
|
24
|
+
script.async = true;
|
|
25
|
+
script.onload = () => {
|
|
26
|
+
if (window.pexelize) {
|
|
27
|
+
console.log('[Pexelize React] SDK loaded from CDN');
|
|
28
|
+
resolve();
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
reject(new Error('SDK loaded but pexelize global not found'));
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
script.onerror = () => {
|
|
35
|
+
sdkLoadPromise = null;
|
|
36
|
+
reject(new Error(`Failed to load Pexelize SDK from ${SDK_CDN_URL}`));
|
|
37
|
+
};
|
|
38
|
+
document.head.appendChild(script);
|
|
39
|
+
});
|
|
40
|
+
return sdkLoadPromise;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get SDK instance from global
|
|
44
|
+
*/
|
|
45
|
+
function getSDK() {
|
|
46
|
+
return window.pexelize;
|
|
47
|
+
}
|
|
48
|
+
// ============================================================================
|
|
49
|
+
// Component
|
|
50
|
+
// ============================================================================
|
|
51
|
+
/**
|
|
52
|
+
* PexelizeEditor React Component
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```tsx
|
|
56
|
+
* import { PexelizeEditor, PexelizeEditorRef } from '@pexelize/react-editor';
|
|
57
|
+
*
|
|
58
|
+
* function MyEditor() {
|
|
59
|
+
* const editorRef = useRef<PexelizeEditorRef>(null);
|
|
60
|
+
*
|
|
61
|
+
* const handleSave = () => {
|
|
62
|
+
* editorRef.current?.saveDesign((design) => {
|
|
63
|
+
* console.log('Design:', design);
|
|
64
|
+
* });
|
|
65
|
+
* };
|
|
66
|
+
*
|
|
67
|
+
* return (
|
|
68
|
+
* <div>
|
|
69
|
+
* <button onClick={handleSave}>Save</button>
|
|
70
|
+
* <PexelizeEditor
|
|
71
|
+
* ref={editorRef}
|
|
72
|
+
* editorMode="email"
|
|
73
|
+
* onReady={() => console.log('Ready!')}
|
|
74
|
+
* onChange={({ design }) => console.log('Changed:', design)}
|
|
75
|
+
* />
|
|
76
|
+
* </div>
|
|
77
|
+
* );
|
|
78
|
+
* }
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
const PexelizeEditor = forwardRef((props, ref) => {
|
|
82
|
+
const { design, mergeTags, displayConditions, className, style, height = '600px', displayMode, editorMode, onReady, onLoad, onChange, onContentModified, onSelect, onDeselect, onImage, onLinkClick, onSave, ...config } = props;
|
|
83
|
+
const containerRef = useRef(null);
|
|
84
|
+
const sdkRef = useRef(null);
|
|
85
|
+
const containerId = useRef(`pexelize-editor-${Math.random().toString(36).substr(2, 9)}`);
|
|
86
|
+
const [isEditorReady, setIsEditorReady] = useState(false);
|
|
87
|
+
const [sdkLoaded, setSdkLoaded] = useState(false);
|
|
88
|
+
const [error, setError] = useState(null);
|
|
89
|
+
// Load SDK from CDN
|
|
90
|
+
useEffect(() => {
|
|
91
|
+
loadSDKFromCDN()
|
|
92
|
+
.then(() => setSdkLoaded(true))
|
|
93
|
+
.catch((err) => setError(err.message));
|
|
94
|
+
}, []);
|
|
95
|
+
// Initialize SDK once loaded
|
|
96
|
+
useEffect(() => {
|
|
97
|
+
if (!sdkLoaded || !containerRef.current)
|
|
98
|
+
return;
|
|
99
|
+
const pexelize = getSDK();
|
|
100
|
+
if (!pexelize) {
|
|
101
|
+
setError('Pexelize SDK not found after loading');
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
// Store SDK reference
|
|
105
|
+
sdkRef.current = pexelize;
|
|
106
|
+
// Initialize
|
|
107
|
+
pexelize.init({
|
|
108
|
+
id: containerId.current,
|
|
109
|
+
editorMode: editorMode || displayMode || 'email',
|
|
110
|
+
...config,
|
|
111
|
+
});
|
|
112
|
+
// Clean up on unmount
|
|
113
|
+
return () => {
|
|
114
|
+
pexelize.destroy();
|
|
115
|
+
sdkRef.current = null;
|
|
116
|
+
setIsEditorReady(false);
|
|
117
|
+
};
|
|
118
|
+
}, [sdkLoaded]);
|
|
119
|
+
// Handle ready event
|
|
120
|
+
useEffect(() => {
|
|
121
|
+
const sdk = sdkRef.current;
|
|
122
|
+
if (!sdk)
|
|
123
|
+
return;
|
|
124
|
+
const handleReady = () => {
|
|
125
|
+
setIsEditorReady(true);
|
|
126
|
+
// Set merge tags if provided
|
|
127
|
+
if (mergeTags) {
|
|
128
|
+
sdk.setMergeTags(mergeTags);
|
|
129
|
+
}
|
|
130
|
+
// Set display conditions if provided
|
|
131
|
+
if (displayConditions) {
|
|
132
|
+
sdk.setDisplayConditions(displayConditions);
|
|
133
|
+
}
|
|
134
|
+
// Load initial design if provided
|
|
135
|
+
if (design) {
|
|
136
|
+
sdk.loadDesign(design);
|
|
137
|
+
}
|
|
138
|
+
// Call onReady callback
|
|
139
|
+
onReady?.();
|
|
140
|
+
};
|
|
141
|
+
const unsubscribe = sdk.addEventListener('editor:ready', handleReady);
|
|
142
|
+
return unsubscribe;
|
|
143
|
+
}, [sdkLoaded, design, mergeTags, displayConditions, onReady]);
|
|
144
|
+
// Handle design loaded event
|
|
145
|
+
useEffect(() => {
|
|
146
|
+
const sdk = sdkRef.current;
|
|
147
|
+
if (!sdk || !onLoad)
|
|
148
|
+
return;
|
|
149
|
+
const unsubscribe = sdk.addEventListener('design:loaded', onLoad);
|
|
150
|
+
return unsubscribe;
|
|
151
|
+
}, [sdkLoaded, onLoad]);
|
|
152
|
+
// Handle design updated event
|
|
153
|
+
useEffect(() => {
|
|
154
|
+
const sdk = sdkRef.current;
|
|
155
|
+
if (!sdk || !onChange)
|
|
156
|
+
return;
|
|
157
|
+
const unsubscribe = sdk.addEventListener('design:updated', onChange);
|
|
158
|
+
return unsubscribe;
|
|
159
|
+
}, [sdkLoaded, onChange]);
|
|
160
|
+
// Handle content modified event
|
|
161
|
+
useEffect(() => {
|
|
162
|
+
const sdk = sdkRef.current;
|
|
163
|
+
if (!sdk || !onContentModified)
|
|
164
|
+
return;
|
|
165
|
+
const unsubscribe = sdk.addEventListener('content:modified', onContentModified);
|
|
166
|
+
return unsubscribe;
|
|
167
|
+
}, [sdkLoaded, onContentModified]);
|
|
168
|
+
// Handle element selected event
|
|
169
|
+
useEffect(() => {
|
|
170
|
+
const sdk = sdkRef.current;
|
|
171
|
+
if (!sdk || !onSelect)
|
|
172
|
+
return;
|
|
173
|
+
const unsubscribe = sdk.addEventListener('element:selected', onSelect);
|
|
174
|
+
return unsubscribe;
|
|
175
|
+
}, [sdkLoaded, onSelect]);
|
|
176
|
+
// Handle element deselected event
|
|
177
|
+
useEffect(() => {
|
|
178
|
+
const sdk = sdkRef.current;
|
|
179
|
+
if (!sdk || !onDeselect)
|
|
180
|
+
return;
|
|
181
|
+
const unsubscribe = sdk.addEventListener('element:deselected', onDeselect);
|
|
182
|
+
return unsubscribe;
|
|
183
|
+
}, [sdkLoaded, onDeselect]);
|
|
184
|
+
// Register callbacks
|
|
185
|
+
useEffect(() => {
|
|
186
|
+
const sdk = sdkRef.current;
|
|
187
|
+
if (!sdk)
|
|
188
|
+
return;
|
|
189
|
+
if (onImage) {
|
|
190
|
+
sdk.registerCallback('image', onImage);
|
|
191
|
+
}
|
|
192
|
+
if (onLinkClick) {
|
|
193
|
+
sdk.registerCallback('linkClick', onLinkClick);
|
|
194
|
+
}
|
|
195
|
+
if (onSave) {
|
|
196
|
+
sdk.registerCallback('save', onSave);
|
|
197
|
+
}
|
|
198
|
+
return () => {
|
|
199
|
+
if (sdk.unregisterCallback) {
|
|
200
|
+
sdk.unregisterCallback('image');
|
|
201
|
+
sdk.unregisterCallback('linkClick');
|
|
202
|
+
sdk.unregisterCallback('save');
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
}, [sdkLoaded, onImage, onLinkClick, onSave]);
|
|
206
|
+
// Expose SDK methods via ref
|
|
207
|
+
useImperativeHandle(ref, () => ({
|
|
208
|
+
loadDesign: (design) => sdkRef.current?.loadDesign(design),
|
|
209
|
+
loadBlank: () => sdkRef.current?.loadBlank(),
|
|
210
|
+
saveDesign: (callback) => sdkRef.current?.saveDesign(callback),
|
|
211
|
+
getDesign: () => sdkRef.current?.getDesign(),
|
|
212
|
+
exportHtml: (callback) => sdkRef.current?.exportHtml(callback),
|
|
213
|
+
exportHtmlAsync: () => sdkRef.current?.exportHtmlAsync(),
|
|
214
|
+
save: () => sdkRef.current?.save(),
|
|
215
|
+
undo: () => sdkRef.current?.undo(),
|
|
216
|
+
redo: () => sdkRef.current?.redo(),
|
|
217
|
+
getState: () => sdkRef.current?.getState(),
|
|
218
|
+
isReady: () => isEditorReady,
|
|
219
|
+
getSdk: () => sdkRef.current,
|
|
220
|
+
}), [isEditorReady, sdkLoaded]);
|
|
221
|
+
// Compute styles
|
|
222
|
+
const containerStyle = {
|
|
223
|
+
width: '100%',
|
|
224
|
+
height: typeof height === 'number' ? `${height}px` : height,
|
|
225
|
+
...style,
|
|
226
|
+
};
|
|
227
|
+
// Show error state
|
|
228
|
+
if (error) {
|
|
229
|
+
return (jsx("div", { style: { ...containerStyle, display: 'flex', alignItems: 'center', justifyContent: 'center', backgroundColor: '#fee', color: '#c00' }, children: jsxs("div", { style: { textAlign: 'center' }, children: [jsx("div", { style: { fontSize: '24px', marginBottom: '8px' }, children: "\u26A0\uFE0F" }), jsx("div", { children: "Failed to load Pexelize Editor" }), jsx("div", { style: { fontSize: '12px', marginTop: '4px' }, children: error })] }) }));
|
|
230
|
+
}
|
|
231
|
+
// Show loading state
|
|
232
|
+
if (!sdkLoaded) {
|
|
233
|
+
return (jsx("div", { style: { ...containerStyle, display: 'flex', alignItems: 'center', justifyContent: 'center', backgroundColor: '#f5f5f5' }, children: jsxs("div", { style: { textAlign: 'center' }, children: [jsx("div", { style: { fontSize: '24px', marginBottom: '8px' }, children: "\u23F3" }), jsx("div", { children: "Loading Pexelize Editor..." })] }) }));
|
|
234
|
+
}
|
|
235
|
+
return (jsx("div", { id: containerId.current, ref: containerRef, className: className, style: containerStyle }));
|
|
236
|
+
});
|
|
237
|
+
PexelizeEditor.displayName = 'PexelizeEditor';
|
|
238
|
+
/**
|
|
239
|
+
* Hook to use the Pexelize SDK directly
|
|
240
|
+
*
|
|
241
|
+
* @example
|
|
242
|
+
* ```tsx
|
|
243
|
+
* function MyComponent() {
|
|
244
|
+
* const { sdk, isReady, error } = usePexelizeSDK({
|
|
245
|
+
* containerId: 'my-editor',
|
|
246
|
+
* editorMode: 'email',
|
|
247
|
+
* });
|
|
248
|
+
*
|
|
249
|
+
* const handleExport = () => {
|
|
250
|
+
* if (isReady && sdk) {
|
|
251
|
+
* sdk.exportHtml((data) => console.log(data.html));
|
|
252
|
+
* }
|
|
253
|
+
* };
|
|
254
|
+
*
|
|
255
|
+
* return (
|
|
256
|
+
* <div>
|
|
257
|
+
* <div id="my-editor" style={{ height: '600px' }} />
|
|
258
|
+
* <button onClick={handleExport} disabled={!isReady}>Export</button>
|
|
259
|
+
* </div>
|
|
260
|
+
* );
|
|
261
|
+
* }
|
|
262
|
+
* ```
|
|
263
|
+
*/
|
|
264
|
+
function usePexelizeSDK(config) {
|
|
265
|
+
const sdkRef = useRef(null);
|
|
266
|
+
const [isReady, setIsReady] = useState(false);
|
|
267
|
+
const [sdkLoaded, setSdkLoaded] = useState(false);
|
|
268
|
+
const [error, setError] = useState(null);
|
|
269
|
+
// Load SDK from CDN
|
|
270
|
+
useEffect(() => {
|
|
271
|
+
loadSDKFromCDN()
|
|
272
|
+
.then(() => setSdkLoaded(true))
|
|
273
|
+
.catch((err) => setError(err.message));
|
|
274
|
+
}, []);
|
|
275
|
+
// Initialize SDK
|
|
276
|
+
useEffect(() => {
|
|
277
|
+
if (!sdkLoaded)
|
|
278
|
+
return;
|
|
279
|
+
const pexelize = getSDK();
|
|
280
|
+
if (!pexelize) {
|
|
281
|
+
setError('Pexelize SDK not found');
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
sdkRef.current = pexelize;
|
|
285
|
+
pexelize.init({
|
|
286
|
+
id: config.containerId,
|
|
287
|
+
editorMode: config.editorMode || config.displayMode || 'email',
|
|
288
|
+
...config,
|
|
289
|
+
});
|
|
290
|
+
const unsubscribe = pexelize.addEventListener('editor:ready', () => {
|
|
291
|
+
setIsReady(true);
|
|
292
|
+
});
|
|
293
|
+
return () => {
|
|
294
|
+
unsubscribe();
|
|
295
|
+
pexelize.destroy();
|
|
296
|
+
sdkRef.current = null;
|
|
297
|
+
setIsReady(false);
|
|
298
|
+
};
|
|
299
|
+
}, [sdkLoaded, config.containerId]);
|
|
300
|
+
return {
|
|
301
|
+
sdk: sdkRef.current,
|
|
302
|
+
isReady,
|
|
303
|
+
isLoading: !sdkLoaded && !error,
|
|
304
|
+
error,
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
// Export SDK CDN URL for reference
|
|
308
|
+
const PEXELIZE_SDK_CDN = SDK_CDN_URL;
|
|
309
|
+
|
|
310
|
+
export { PEXELIZE_SDK_CDN, PexelizeEditor, PexelizeEditor as default, usePexelizeSDK };
|
|
311
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/index.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
var react = require('react');
|
|
7
|
+
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// SDK CDN Configuration
|
|
10
|
+
// ============================================================================
|
|
11
|
+
const SDK_CDN_URL = 'https://cdn.jsdelivr.net/gh/Zaman-Meer/pexelize-sdk@dev/dist/pexelize-sdk.min.js';
|
|
12
|
+
// Global SDK reference (loaded from CDN)
|
|
13
|
+
let sdkLoadPromise = null;
|
|
14
|
+
/**
|
|
15
|
+
* Load SDK from CDN (singleton pattern - loads only once)
|
|
16
|
+
*/
|
|
17
|
+
function loadSDKFromCDN() {
|
|
18
|
+
if (sdkLoadPromise) {
|
|
19
|
+
return sdkLoadPromise;
|
|
20
|
+
}
|
|
21
|
+
// Check if already loaded
|
|
22
|
+
if (window.pexelize) {
|
|
23
|
+
return Promise.resolve();
|
|
24
|
+
}
|
|
25
|
+
sdkLoadPromise = new Promise((resolve, reject) => {
|
|
26
|
+
const script = document.createElement('script');
|
|
27
|
+
script.src = SDK_CDN_URL;
|
|
28
|
+
script.async = true;
|
|
29
|
+
script.onload = () => {
|
|
30
|
+
if (window.pexelize) {
|
|
31
|
+
console.log('[Pexelize React] SDK loaded from CDN');
|
|
32
|
+
resolve();
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
reject(new Error('SDK loaded but pexelize global not found'));
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
script.onerror = () => {
|
|
39
|
+
sdkLoadPromise = null;
|
|
40
|
+
reject(new Error(`Failed to load Pexelize SDK from ${SDK_CDN_URL}`));
|
|
41
|
+
};
|
|
42
|
+
document.head.appendChild(script);
|
|
43
|
+
});
|
|
44
|
+
return sdkLoadPromise;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get SDK instance from global
|
|
48
|
+
*/
|
|
49
|
+
function getSDK() {
|
|
50
|
+
return window.pexelize;
|
|
51
|
+
}
|
|
52
|
+
// ============================================================================
|
|
53
|
+
// Component
|
|
54
|
+
// ============================================================================
|
|
55
|
+
/**
|
|
56
|
+
* PexelizeEditor React Component
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```tsx
|
|
60
|
+
* import { PexelizeEditor, PexelizeEditorRef } from '@pexelize/react-editor';
|
|
61
|
+
*
|
|
62
|
+
* function MyEditor() {
|
|
63
|
+
* const editorRef = useRef<PexelizeEditorRef>(null);
|
|
64
|
+
*
|
|
65
|
+
* const handleSave = () => {
|
|
66
|
+
* editorRef.current?.saveDesign((design) => {
|
|
67
|
+
* console.log('Design:', design);
|
|
68
|
+
* });
|
|
69
|
+
* };
|
|
70
|
+
*
|
|
71
|
+
* return (
|
|
72
|
+
* <div>
|
|
73
|
+
* <button onClick={handleSave}>Save</button>
|
|
74
|
+
* <PexelizeEditor
|
|
75
|
+
* ref={editorRef}
|
|
76
|
+
* editorMode="email"
|
|
77
|
+
* onReady={() => console.log('Ready!')}
|
|
78
|
+
* onChange={({ design }) => console.log('Changed:', design)}
|
|
79
|
+
* />
|
|
80
|
+
* </div>
|
|
81
|
+
* );
|
|
82
|
+
* }
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
const PexelizeEditor = react.forwardRef((props, ref) => {
|
|
86
|
+
const { design, mergeTags, displayConditions, className, style, height = '600px', displayMode, editorMode, onReady, onLoad, onChange, onContentModified, onSelect, onDeselect, onImage, onLinkClick, onSave, ...config } = props;
|
|
87
|
+
const containerRef = react.useRef(null);
|
|
88
|
+
const sdkRef = react.useRef(null);
|
|
89
|
+
const containerId = react.useRef(`pexelize-editor-${Math.random().toString(36).substr(2, 9)}`);
|
|
90
|
+
const [isEditorReady, setIsEditorReady] = react.useState(false);
|
|
91
|
+
const [sdkLoaded, setSdkLoaded] = react.useState(false);
|
|
92
|
+
const [error, setError] = react.useState(null);
|
|
93
|
+
// Load SDK from CDN
|
|
94
|
+
react.useEffect(() => {
|
|
95
|
+
loadSDKFromCDN()
|
|
96
|
+
.then(() => setSdkLoaded(true))
|
|
97
|
+
.catch((err) => setError(err.message));
|
|
98
|
+
}, []);
|
|
99
|
+
// Initialize SDK once loaded
|
|
100
|
+
react.useEffect(() => {
|
|
101
|
+
if (!sdkLoaded || !containerRef.current)
|
|
102
|
+
return;
|
|
103
|
+
const pexelize = getSDK();
|
|
104
|
+
if (!pexelize) {
|
|
105
|
+
setError('Pexelize SDK not found after loading');
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
// Store SDK reference
|
|
109
|
+
sdkRef.current = pexelize;
|
|
110
|
+
// Initialize
|
|
111
|
+
pexelize.init({
|
|
112
|
+
id: containerId.current,
|
|
113
|
+
editorMode: editorMode || displayMode || 'email',
|
|
114
|
+
...config,
|
|
115
|
+
});
|
|
116
|
+
// Clean up on unmount
|
|
117
|
+
return () => {
|
|
118
|
+
pexelize.destroy();
|
|
119
|
+
sdkRef.current = null;
|
|
120
|
+
setIsEditorReady(false);
|
|
121
|
+
};
|
|
122
|
+
}, [sdkLoaded]);
|
|
123
|
+
// Handle ready event
|
|
124
|
+
react.useEffect(() => {
|
|
125
|
+
const sdk = sdkRef.current;
|
|
126
|
+
if (!sdk)
|
|
127
|
+
return;
|
|
128
|
+
const handleReady = () => {
|
|
129
|
+
setIsEditorReady(true);
|
|
130
|
+
// Set merge tags if provided
|
|
131
|
+
if (mergeTags) {
|
|
132
|
+
sdk.setMergeTags(mergeTags);
|
|
133
|
+
}
|
|
134
|
+
// Set display conditions if provided
|
|
135
|
+
if (displayConditions) {
|
|
136
|
+
sdk.setDisplayConditions(displayConditions);
|
|
137
|
+
}
|
|
138
|
+
// Load initial design if provided
|
|
139
|
+
if (design) {
|
|
140
|
+
sdk.loadDesign(design);
|
|
141
|
+
}
|
|
142
|
+
// Call onReady callback
|
|
143
|
+
onReady?.();
|
|
144
|
+
};
|
|
145
|
+
const unsubscribe = sdk.addEventListener('editor:ready', handleReady);
|
|
146
|
+
return unsubscribe;
|
|
147
|
+
}, [sdkLoaded, design, mergeTags, displayConditions, onReady]);
|
|
148
|
+
// Handle design loaded event
|
|
149
|
+
react.useEffect(() => {
|
|
150
|
+
const sdk = sdkRef.current;
|
|
151
|
+
if (!sdk || !onLoad)
|
|
152
|
+
return;
|
|
153
|
+
const unsubscribe = sdk.addEventListener('design:loaded', onLoad);
|
|
154
|
+
return unsubscribe;
|
|
155
|
+
}, [sdkLoaded, onLoad]);
|
|
156
|
+
// Handle design updated event
|
|
157
|
+
react.useEffect(() => {
|
|
158
|
+
const sdk = sdkRef.current;
|
|
159
|
+
if (!sdk || !onChange)
|
|
160
|
+
return;
|
|
161
|
+
const unsubscribe = sdk.addEventListener('design:updated', onChange);
|
|
162
|
+
return unsubscribe;
|
|
163
|
+
}, [sdkLoaded, onChange]);
|
|
164
|
+
// Handle content modified event
|
|
165
|
+
react.useEffect(() => {
|
|
166
|
+
const sdk = sdkRef.current;
|
|
167
|
+
if (!sdk || !onContentModified)
|
|
168
|
+
return;
|
|
169
|
+
const unsubscribe = sdk.addEventListener('content:modified', onContentModified);
|
|
170
|
+
return unsubscribe;
|
|
171
|
+
}, [sdkLoaded, onContentModified]);
|
|
172
|
+
// Handle element selected event
|
|
173
|
+
react.useEffect(() => {
|
|
174
|
+
const sdk = sdkRef.current;
|
|
175
|
+
if (!sdk || !onSelect)
|
|
176
|
+
return;
|
|
177
|
+
const unsubscribe = sdk.addEventListener('element:selected', onSelect);
|
|
178
|
+
return unsubscribe;
|
|
179
|
+
}, [sdkLoaded, onSelect]);
|
|
180
|
+
// Handle element deselected event
|
|
181
|
+
react.useEffect(() => {
|
|
182
|
+
const sdk = sdkRef.current;
|
|
183
|
+
if (!sdk || !onDeselect)
|
|
184
|
+
return;
|
|
185
|
+
const unsubscribe = sdk.addEventListener('element:deselected', onDeselect);
|
|
186
|
+
return unsubscribe;
|
|
187
|
+
}, [sdkLoaded, onDeselect]);
|
|
188
|
+
// Register callbacks
|
|
189
|
+
react.useEffect(() => {
|
|
190
|
+
const sdk = sdkRef.current;
|
|
191
|
+
if (!sdk)
|
|
192
|
+
return;
|
|
193
|
+
if (onImage) {
|
|
194
|
+
sdk.registerCallback('image', onImage);
|
|
195
|
+
}
|
|
196
|
+
if (onLinkClick) {
|
|
197
|
+
sdk.registerCallback('linkClick', onLinkClick);
|
|
198
|
+
}
|
|
199
|
+
if (onSave) {
|
|
200
|
+
sdk.registerCallback('save', onSave);
|
|
201
|
+
}
|
|
202
|
+
return () => {
|
|
203
|
+
if (sdk.unregisterCallback) {
|
|
204
|
+
sdk.unregisterCallback('image');
|
|
205
|
+
sdk.unregisterCallback('linkClick');
|
|
206
|
+
sdk.unregisterCallback('save');
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
}, [sdkLoaded, onImage, onLinkClick, onSave]);
|
|
210
|
+
// Expose SDK methods via ref
|
|
211
|
+
react.useImperativeHandle(ref, () => ({
|
|
212
|
+
loadDesign: (design) => sdkRef.current?.loadDesign(design),
|
|
213
|
+
loadBlank: () => sdkRef.current?.loadBlank(),
|
|
214
|
+
saveDesign: (callback) => sdkRef.current?.saveDesign(callback),
|
|
215
|
+
getDesign: () => sdkRef.current?.getDesign(),
|
|
216
|
+
exportHtml: (callback) => sdkRef.current?.exportHtml(callback),
|
|
217
|
+
exportHtmlAsync: () => sdkRef.current?.exportHtmlAsync(),
|
|
218
|
+
save: () => sdkRef.current?.save(),
|
|
219
|
+
undo: () => sdkRef.current?.undo(),
|
|
220
|
+
redo: () => sdkRef.current?.redo(),
|
|
221
|
+
getState: () => sdkRef.current?.getState(),
|
|
222
|
+
isReady: () => isEditorReady,
|
|
223
|
+
getSdk: () => sdkRef.current,
|
|
224
|
+
}), [isEditorReady, sdkLoaded]);
|
|
225
|
+
// Compute styles
|
|
226
|
+
const containerStyle = {
|
|
227
|
+
width: '100%',
|
|
228
|
+
height: typeof height === 'number' ? `${height}px` : height,
|
|
229
|
+
...style,
|
|
230
|
+
};
|
|
231
|
+
// Show error state
|
|
232
|
+
if (error) {
|
|
233
|
+
return (jsxRuntime.jsx("div", { style: { ...containerStyle, display: 'flex', alignItems: 'center', justifyContent: 'center', backgroundColor: '#fee', color: '#c00' }, children: jsxRuntime.jsxs("div", { style: { textAlign: 'center' }, children: [jsxRuntime.jsx("div", { style: { fontSize: '24px', marginBottom: '8px' }, children: "\u26A0\uFE0F" }), jsxRuntime.jsx("div", { children: "Failed to load Pexelize Editor" }), jsxRuntime.jsx("div", { style: { fontSize: '12px', marginTop: '4px' }, children: error })] }) }));
|
|
234
|
+
}
|
|
235
|
+
// Show loading state
|
|
236
|
+
if (!sdkLoaded) {
|
|
237
|
+
return (jsxRuntime.jsx("div", { style: { ...containerStyle, display: 'flex', alignItems: 'center', justifyContent: 'center', backgroundColor: '#f5f5f5' }, children: jsxRuntime.jsxs("div", { style: { textAlign: 'center' }, children: [jsxRuntime.jsx("div", { style: { fontSize: '24px', marginBottom: '8px' }, children: "\u23F3" }), jsxRuntime.jsx("div", { children: "Loading Pexelize Editor..." })] }) }));
|
|
238
|
+
}
|
|
239
|
+
return (jsxRuntime.jsx("div", { id: containerId.current, ref: containerRef, className: className, style: containerStyle }));
|
|
240
|
+
});
|
|
241
|
+
PexelizeEditor.displayName = 'PexelizeEditor';
|
|
242
|
+
/**
|
|
243
|
+
* Hook to use the Pexelize SDK directly
|
|
244
|
+
*
|
|
245
|
+
* @example
|
|
246
|
+
* ```tsx
|
|
247
|
+
* function MyComponent() {
|
|
248
|
+
* const { sdk, isReady, error } = usePexelizeSDK({
|
|
249
|
+
* containerId: 'my-editor',
|
|
250
|
+
* editorMode: 'email',
|
|
251
|
+
* });
|
|
252
|
+
*
|
|
253
|
+
* const handleExport = () => {
|
|
254
|
+
* if (isReady && sdk) {
|
|
255
|
+
* sdk.exportHtml((data) => console.log(data.html));
|
|
256
|
+
* }
|
|
257
|
+
* };
|
|
258
|
+
*
|
|
259
|
+
* return (
|
|
260
|
+
* <div>
|
|
261
|
+
* <div id="my-editor" style={{ height: '600px' }} />
|
|
262
|
+
* <button onClick={handleExport} disabled={!isReady}>Export</button>
|
|
263
|
+
* </div>
|
|
264
|
+
* );
|
|
265
|
+
* }
|
|
266
|
+
* ```
|
|
267
|
+
*/
|
|
268
|
+
function usePexelizeSDK(config) {
|
|
269
|
+
const sdkRef = react.useRef(null);
|
|
270
|
+
const [isReady, setIsReady] = react.useState(false);
|
|
271
|
+
const [sdkLoaded, setSdkLoaded] = react.useState(false);
|
|
272
|
+
const [error, setError] = react.useState(null);
|
|
273
|
+
// Load SDK from CDN
|
|
274
|
+
react.useEffect(() => {
|
|
275
|
+
loadSDKFromCDN()
|
|
276
|
+
.then(() => setSdkLoaded(true))
|
|
277
|
+
.catch((err) => setError(err.message));
|
|
278
|
+
}, []);
|
|
279
|
+
// Initialize SDK
|
|
280
|
+
react.useEffect(() => {
|
|
281
|
+
if (!sdkLoaded)
|
|
282
|
+
return;
|
|
283
|
+
const pexelize = getSDK();
|
|
284
|
+
if (!pexelize) {
|
|
285
|
+
setError('Pexelize SDK not found');
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
sdkRef.current = pexelize;
|
|
289
|
+
pexelize.init({
|
|
290
|
+
id: config.containerId,
|
|
291
|
+
editorMode: config.editorMode || config.displayMode || 'email',
|
|
292
|
+
...config,
|
|
293
|
+
});
|
|
294
|
+
const unsubscribe = pexelize.addEventListener('editor:ready', () => {
|
|
295
|
+
setIsReady(true);
|
|
296
|
+
});
|
|
297
|
+
return () => {
|
|
298
|
+
unsubscribe();
|
|
299
|
+
pexelize.destroy();
|
|
300
|
+
sdkRef.current = null;
|
|
301
|
+
setIsReady(false);
|
|
302
|
+
};
|
|
303
|
+
}, [sdkLoaded, config.containerId]);
|
|
304
|
+
return {
|
|
305
|
+
sdk: sdkRef.current,
|
|
306
|
+
isReady,
|
|
307
|
+
isLoading: !sdkLoaded && !error,
|
|
308
|
+
error,
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
// Export SDK CDN URL for reference
|
|
312
|
+
const PEXELIZE_SDK_CDN = SDK_CDN_URL;
|
|
313
|
+
|
|
314
|
+
exports.PEXELIZE_SDK_CDN = PEXELIZE_SDK_CDN;
|
|
315
|
+
exports.PexelizeEditor = PexelizeEditor;
|
|
316
|
+
exports.default = PexelizeEditor;
|
|
317
|
+
exports.usePexelizeSDK = usePexelizeSDK;
|
|
318
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.tsx"],"sourcesContent":[null],"names":["forwardRef","useRef","useState","useEffect","useImperativeHandle","_jsx","_jsxs"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@pexelize/react-editor",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "React wrapper component for the Pexelize Editor - SDK loaded via CDN",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"module": "dist/index.esm.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/index.esm.js",
|
|
12
|
+
"require": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"README.md",
|
|
19
|
+
"LICENSE"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "rollup -c",
|
|
23
|
+
"build:watch": "rollup -c -w",
|
|
24
|
+
"dev": "rollup -c -w",
|
|
25
|
+
"test": "vitest",
|
|
26
|
+
"lint": "eslint src --ext .ts,.tsx",
|
|
27
|
+
"typecheck": "tsc --noEmit",
|
|
28
|
+
"clean": "rimraf dist",
|
|
29
|
+
"prepublishOnly": "npm run build"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [
|
|
32
|
+
"pexelize",
|
|
33
|
+
"editor",
|
|
34
|
+
"email-editor",
|
|
35
|
+
"react",
|
|
36
|
+
"react-component",
|
|
37
|
+
"template-editor",
|
|
38
|
+
"wysiwyg",
|
|
39
|
+
"cdn"
|
|
40
|
+
],
|
|
41
|
+
"author": "Pexelize",
|
|
42
|
+
"license": "MIT",
|
|
43
|
+
"repository": {
|
|
44
|
+
"type": "git",
|
|
45
|
+
"url": "https://github.com/Zaman-Meer/pexelize-react.git"
|
|
46
|
+
},
|
|
47
|
+
"bugs": {
|
|
48
|
+
"url": "https://github.com/Zaman-Meer/pexelize-react/issues"
|
|
49
|
+
},
|
|
50
|
+
"homepage": "https://github.com/Zaman-Meer/pexelize-react#readme",
|
|
51
|
+
"peerDependencies": {
|
|
52
|
+
"react": ">=17.0.0",
|
|
53
|
+
"react-dom": ">=17.0.0"
|
|
54
|
+
},
|
|
55
|
+
"peerDependenciesMeta": {
|
|
56
|
+
"react": {
|
|
57
|
+
"optional": false
|
|
58
|
+
},
|
|
59
|
+
"react-dom": {
|
|
60
|
+
"optional": false
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
"devDependencies": {
|
|
64
|
+
"@rollup/plugin-commonjs": "^25.0.7",
|
|
65
|
+
"@rollup/plugin-node-resolve": "^15.2.3",
|
|
66
|
+
"@rollup/plugin-typescript": "^11.1.5",
|
|
67
|
+
"@types/node": "^20.10.4",
|
|
68
|
+
"@types/react": "^18.2.43",
|
|
69
|
+
"@types/react-dom": "^18.2.17",
|
|
70
|
+
"@typescript-eslint/eslint-plugin": "^6.13.2",
|
|
71
|
+
"@typescript-eslint/parser": "^6.13.2",
|
|
72
|
+
"eslint": "^8.55.0",
|
|
73
|
+
"react": "^18.2.0",
|
|
74
|
+
"react-dom": "^18.2.0",
|
|
75
|
+
"rollup": "^4.9.0",
|
|
76
|
+
"rollup-plugin-dts": "^6.1.0",
|
|
77
|
+
"rollup-plugin-peer-deps-external": "^2.2.4",
|
|
78
|
+
"tslib": "^2.8.1",
|
|
79
|
+
"typescript": "^5.3.3",
|
|
80
|
+
"vitest": "^1.0.4"
|
|
81
|
+
},
|
|
82
|
+
"engines": {
|
|
83
|
+
"node": ">=16.0.0"
|
|
84
|
+
}
|
|
85
|
+
}
|