@picsart/react-photo-editor 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @picsart/react-photo-editor
2
2
 
3
- React component for embedding the Picsart Photo & Video Editor (Create) SDK in web apps.
3
+ React component that loads the **official Picsart Create SDK** from `sdk.picsart.io` (script tag) and mounts the editor into your page. No bundled copy of the editor runtime is shipped in this package—only a thin React wrapper.
4
4
 
5
5
  ## Install
6
6
 
@@ -8,51 +8,60 @@ React component for embedding the Picsart Photo & Video Editor (Create) SDK in w
8
8
  npm install @picsart/react-photo-editor
9
9
  ```
10
10
 
11
- Requires **React 17+** as a peer dependency.
11
+ Peer dependencies: **React 17+** and **react-dom**.
12
12
 
13
13
  ## Usage
14
14
 
15
+ Callers must set the same core fields as the [Picsart quick start](https://docs.picsart.io/docs/photo-video-editor-quick-start): **`apiKey`**, **`customerId`**, **`propertyId`**. The component renders the editor container and passes a matching **`containerId`** to the SDK (you can set **`containerId`** yourself, or omit it to get a stable auto-generated id). **`title`** defaults to **`Photo Print Designer`** if omitted.
16
+
15
17
  ```tsx
16
- import { PhotoEditor } from '@picsart/react-photo-editor';
18
+ import { PicsartEditor } from '@picsart/react-photo-editor';
17
19
 
18
- export function Editor() {
20
+ export function Page() {
19
21
  return (
20
- <PhotoEditor
22
+ <PicsartEditor
21
23
  apiKey={process.env.NEXT_PUBLIC_PICSART_API_KEY!}
22
24
  customerId={process.env.NEXT_PUBLIC_PICSART_CUSTOMER_ID!}
23
- propertyId={process.env.NEXT_PUBLIC_PICSART_PROPERTY_ID}
24
- editorDomain={process.env.NEXT_PUBLIC_PICSART_EDITOR_DOMAIN!}
25
- parentDomain={process.env.NEXT_PUBLIC_PICSART_PARENT_DOMAIN}
26
- imageUrl="https://example.com/image.png"
27
- onExport={(result) => console.log(result)}
25
+ propertyId={process.env.NEXT_PUBLIC_PICSART_PROPERTY_ID!}
26
+ containerId="my-editor-root"
27
+ title="Photo Print Designer"
28
28
  />
29
29
  );
30
30
  }
31
31
  ```
32
32
 
33
- For local dev over `http://localhost`, set **`parentDomain`** (or `NEXT_PUBLIC_PICSART_PARENT_DOMAIN` / `VITE_PICSART_PARENT_DOMAIN`) to an **HTTPS** tunnel origin so the SDK can validate the parent window.
33
+ ### SDK script URL
34
34
 
35
- ## Publish to npm (Picsart org members)
35
+ By default the component loads `https://sdk.picsart.io/cdn.min.js`. If that URL does not match your SDK version, pass **`sdkScriptUrl`** (see [Picsart docs](https://docs.picsart.io/) for the correct `cdn?...` URL).
36
36
 
37
- 1. Use an npm account that is a **member of the `@picsart` organization** with publish permission.
38
- 2. From this repository root:
37
+ ### Ref (imperative API)
39
38
 
40
- ```bash
41
- npm login
42
- npm run build
43
- npm run publish:npm
44
- ```
39
+ ```tsx
40
+ const ref = useRef<PicsartEditorRef>(null);
41
+ <PicsartEditor ref={ref} ... />
42
+ ref.current?.export();
43
+ ref.current?.getInstance();
44
+ ```
45
45
 
46
- This project includes a root **`.npmrc`** so installs and publishes target **`https://registry.npmjs.org/`** for the `@picsart` scope (and avoids accidental publishes to other registries).
46
+ ## Publish to npm (`@picsart` org)
47
47
 
48
- 3. Scoped packages must be **public** (already set via `publishConfig.access`).
48
+ ```bash
49
+ npm whoami
50
+ npm login
51
+ npm run publish:npm
52
+ ```
49
53
 
50
- If `npm publish` fails with **403**, your user is not on the `@picsart` org or lacks publish rights—ask your org admin on npmjs.com.
54
+ - Your npm user must be a **member of the `@picsart` organization** with permission to **publish** scoped packages.
55
+ - This repo’s **`.npmrc`** and **`publishConfig.registry`** target **`https://registry.npmjs.org/`** (not GitLab).
51
56
 
52
- ## Local example
57
+ If **`npm publish`** returns **404** on `PUT …/@picsart%2freact-photo-editor`, npm is almost always telling you the current login **cannot publish that scope** (or you are not logged in). Fix org membership / use `npm login`, then retry.
58
+
59
+ To ship a **new** version after changes, bump **`version`** in `package.json`, then run `npm run publish:npm` again.
53
60
 
54
- See the `example/` app: copy `example/.env.example` to `example/.env`, then from repo root:
61
+ ## Local example
55
62
 
56
63
  ```bash
57
64
  npm run dev:example
58
65
  ```
66
+
67
+ Configure `example/.env` from `example/.env.example`.
package/dist/index.d.mts CHANGED
@@ -1,180 +1,120 @@
1
- import * as react from 'react';
2
- import { CSSProperties } from 'react';
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { CSSProperties, ReactNode } from 'react';
3
3
 
4
- declare class Picsart {
5
- constructor(settings: any);
6
- settings: any;
7
- provideShapesData: {
8
- data: ({
9
- id: number;
10
- shapeURL: string;
11
- previewURL: string;
12
- shapeData: {};
13
- height: number;
14
- width: number;
15
- meta_data?: undefined;
16
- } | {
17
- id: number;
18
- shapeURL: string;
19
- previewURL: string;
20
- meta_data: {};
21
- height: number;
22
- width: number;
23
- shapeData?: undefined;
24
- })[];
4
+ type PicsartTheme = 'dark' | 'light';
5
+ type PicsartExportType = 'base64' | 'blob' | 'buffer';
6
+ interface PicsartOpenOptions {
7
+ replayUrl?: string;
8
+ templateId?: string;
9
+ imageUrl?: string;
10
+ videoUrl?: string;
11
+ subtitleUrl?: string;
12
+ }
13
+ interface PicsartExportOutput {
14
+ templateId?: string;
15
+ data: {
16
+ replayData?: Blob | ArrayBuffer | string;
17
+ imageData?: string | Blob;
18
+ printData?: string | Blob;
19
+ previewPdfData?: string | Blob;
20
+ pdfData?: string | Blob;
21
+ previewsData?: Array<string | Blob>;
22
+ videoData?: unknown;
23
+ videoUrl?: string;
25
24
  };
26
- isEditorReady: boolean;
27
- onExportCb: () => void;
28
- messageListener: ({ data, origin }: {
29
- data: any;
30
- origin: any;
31
- }) => void;
32
- isMessageListenerAttached: boolean;
33
- log(...args: any[]): void;
34
- onOpen(callback: any): this;
35
- openCallBack: any;
36
- renderNew(src: any): void;
37
- iframe: HTMLIFrameElement | null | undefined;
38
- render(src: any): void;
39
- close(): this;
40
- hide(): void;
41
- callCloseHandlers(): void;
42
- resetTempData(): void;
43
- tempOnClose: any;
44
- tempOnExport: any;
45
- tempExportType: any;
46
- tempExportSettings: any;
47
- onClose(cb?: () => void): this;
48
- cbClose: (() => void) | undefined;
49
- /**
50
- * @param {(payload: any) => void} [cb]
51
- */
52
- onError(cb?: (payload: any) => void): this;
53
- cbError: ((payload: any) => void) | undefined;
54
- clear(): this;
55
- applySettings(settings: any): void;
56
- isIframeLoaded(): boolean | null | undefined;
57
- onReady(cb?: () => void): this;
58
- exportData(payload: any, cb: any): Promise<void>;
59
- handleUpload(data: any): void;
60
- onUpload(handler: any): void;
61
- /**
62
- * @param {(result: any) => void} [cb]
63
- */
64
- onExport(cb?: (result: any) => void): this;
65
- export(): void;
66
- getEditorSettings(params: any): any;
67
- open(params?: {}): this;
68
- openOld(params?: {}): this;
69
- sendMessage(type: any, data: any): void;
70
- attachMessageListener(): void;
71
- detachMessageListener(): void;
72
- handleMessage({ data, origin }: {
73
- data: any;
74
- origin: any;
75
- }): void;
76
- handleEditorReady(): void;
77
- flushPendingData(): void;
78
- getFetch(url: any): Promise<any>;
79
- getCategoriesData(data: any): Promise<any[]>;
80
- provideTemplates({ data, dataURL }: {
81
- data: any;
82
- dataURL: any;
83
- }): Promise<this | undefined>;
84
- provideTemplatesData: {
85
- data: any;
86
- dataURL: any;
87
- } | undefined;
88
- provideShapes({ data, dataURL }: {
89
- data: any;
90
- dataURL: any;
91
- }): Promise<this | undefined>;
92
- provideStickerShapes(): Promise<this>;
93
- provideTexts({ data, dataURL }: {
94
- data: any;
95
- dataURL: any;
96
- }): Promise<this | undefined>;
97
- provideTextsData: {
98
- data: any;
99
- dataURL: any;
100
- } | undefined;
101
- provideColors(data: any): this | undefined;
102
- provideColorsData: any;
103
- providePhotos({ data, dataURL }: {
104
- data: any;
105
- dataURL: any;
106
- }): Promise<this | undefined>;
107
- providePhotosData: {
108
- data: any;
109
- dataURL: any;
110
- } | undefined;
111
- provideStickers({ data, dataURL }: {
112
- data: any;
113
- dataURL: any;
114
- }): Promise<this | undefined>;
115
- provideStickersData: {
116
- data: any;
117
- dataURL: any;
118
- } | undefined;
119
- provideFonts({ data, dataURL }: {
120
- data: any;
121
- dataURL: any;
122
- }): Promise<this | undefined>;
123
- provideFontsData: {
124
- data: any;
125
- dataURL: any;
126
- } | undefined;
127
- provideCanvasSizes({ data, dataURL }: {
128
- data: any;
129
- dataURL: any;
130
- }): Promise<this | undefined>;
131
- provideCanvasSizesData: {
132
- data: any;
133
- dataURL: any;
134
- } | undefined;
135
- provideLabels(data: any): this | undefined;
136
- provideLabelsData: any;
137
- provideExportSettings(): void;
25
+ }
26
+ type PicsartUploadHandler = (file: Blob | ArrayBuffer | Uint8Array, mimeType: string) => Promise<{
27
+ url: string;
28
+ status: string;
29
+ progress: number;
30
+ error: unknown;
31
+ }>;
32
+ interface PicsartInstance {
33
+ onError(cb: (error: unknown) => void): PicsartInstance;
34
+ onExport(cb: (output: PicsartExportOutput) => void): PicsartInstance;
35
+ onClose(cb?: () => void): PicsartInstance;
36
+ open(options?: PicsartOpenOptions): PicsartInstance;
37
+ close(): PicsartInstance;
38
+ }
39
+ interface PicsartConstructorOptions {
40
+ apiKey: string;
41
+ customerId: string;
42
+ propertyId: string;
43
+ containerId: string;
44
+ exportType?: PicsartExportType;
45
+ theme?: PicsartTheme;
46
+ title?: string;
47
+ selectedCategory?: string;
48
+ canvasSize?: string;
49
+ templatesTitleText?: string;
50
+ templatesSubTitle?: string;
51
+ replayUrl?: string;
52
+ videoUrl?: string;
53
+ imageUrl?: string;
54
+ subtitleUrl?: string;
55
+ templateId?: string;
56
+ stickerText?: string;
57
+ stickerImageUrl?: string;
58
+ templatesFilters?: Record<string, unknown>;
59
+ onUpload?: PicsartUploadHandler;
60
+ }
61
+ interface PicsartConstructor {
62
+ new (options: PicsartConstructorOptions): PicsartInstance;
63
+ }
64
+ declare global {
65
+ interface Window {
66
+ Picsart?: PicsartConstructor;
67
+ }
138
68
  }
139
69
 
140
- type PhotoEditorOpenParams = Record<string, unknown>;
141
- type PhotoEditorProps = {
70
+ /** Matches Picsart quick-start: apiKey, customerId, propertyId, containerId, title. */
71
+ interface PicsartEditorProps {
72
+ /** From Picsart signup / dashboard. */
142
73
  apiKey: string;
74
+ /** From Picsart signup / dashboard. */
143
75
  customerId: string;
144
- propertyId?: string;
76
+ /** From Picsart signup / dashboard (required for the standard SDK flow). */
77
+ propertyId: string;
145
78
  /**
146
- * Full editor entry URL used as the iframe `src` origin (before `?query`).
147
- * Use the value from your Picsart onboarding / docs for your SDK version.
79
+ * Must match the inner editor container’s `id`. If omitted, a stable unique id is generated
80
+ * and passed to the SDK for you (same as embedding a div with that id).
148
81
  */
149
- editorDomain?: string;
82
+ containerId?: string;
150
83
  /**
151
- * Origin the editor uses as the embedding parent (query `parentDomain`).
152
- * **Important:** `http://localhost` often fails SDK origin / postMessage checks.
153
- * For local dev use an HTTPS tunnel (ngrok, etc.) and set this to that `https://…` origin,
154
- * or set env `NEXT_PUBLIC_PICSART_PARENT_DOMAIN` / `VITE_PICSART_PARENT_DOMAIN`.
84
+ * Editor chrome title when supported. Defaults to **Photo Print Designer** (Picsart docs default).
155
85
  */
156
- parentDomain?: string;
86
+ title?: string;
87
+ sdkScriptUrl?: string;
157
88
  className?: string;
158
89
  style?: CSSProperties;
159
- title?: string;
90
+ children?: ReactNode;
91
+ exportType?: PicsartExportType;
92
+ theme?: PicsartTheme;
93
+ selectedCategory?: string;
94
+ canvasSize?: string;
95
+ templatesTitleText?: string;
96
+ templatesSubTitle?: string;
97
+ templatesFilters?: Record<string, unknown>;
98
+ replayUrl?: string;
99
+ videoUrl?: string;
160
100
  imageUrl?: string;
161
- /** When true (default), merges the bundled CMS-style defaults from `cmsSettings`. */
162
- cms?: boolean;
163
- debug?: boolean;
164
- onExport?: (result: unknown) => void;
165
- onError?: (payload: unknown) => void;
101
+ subtitleUrl?: string;
102
+ templateId?: string;
103
+ stickerText?: string;
104
+ stickerImageUrl?: string;
105
+ onUpload?: PicsartUploadHandler;
106
+ onExport?: (output: PicsartExportOutput) => void;
107
+ onError?: (error: unknown) => void;
166
108
  onClose?: () => void;
167
- onOpen?: () => void;
168
- /** Merged into the Picsart constructor (advanced). */
169
- picsartSettings?: Record<string, unknown>;
170
- /** Merged into the `.open()` call after mount. */
171
- openParams?: PhotoEditorOpenParams;
172
- };
173
- type PhotoEditorHandle = {
174
- picsart: InstanceType<typeof Picsart> | null;
175
- open: (params?: PhotoEditorOpenParams) => InstanceType<typeof Picsart>;
176
- close: () => InstanceType<typeof Picsart>;
177
- };
178
- declare const PhotoEditor: react.ForwardRefExoticComponent<PhotoEditorProps & react.RefAttributes<PhotoEditorHandle>>;
109
+ /** When false, `open()` is called with no asset (blank editor). Default true. */
110
+ autoOpen?: boolean;
111
+ /** Override initial `open()` payload when autoOpen is true. */
112
+ openOptions?: PicsartOpenOptions;
113
+ }
114
+ declare function PicsartEditor({ apiKey, customerId, propertyId, containerId: containerIdProp, title, sdkScriptUrl, className, style, children, exportType, theme, selectedCategory, canvasSize, templatesTitleText, templatesSubTitle, templatesFilters, replayUrl, videoUrl, imageUrl, subtitleUrl, templateId, stickerText, stickerImageUrl, onUpload, onExport, onError, onClose, autoOpen, openOptions, }: PicsartEditorProps): react_jsx_runtime.JSX.Element;
115
+
116
+ declare function loadPicsartSdk(scriptUrl?: string): Promise<void>;
117
+
118
+ declare function createDefaultVideoUpload(apiKey: string): PicsartUploadHandler;
179
119
 
180
- export { PhotoEditor, type PhotoEditorHandle, type PhotoEditorOpenParams, type PhotoEditorProps, Picsart };
120
+ export { type PicsartConstructorOptions, PicsartEditor, type PicsartEditorProps, type PicsartExportOutput, type PicsartExportType, type PicsartInstance, type PicsartOpenOptions, type PicsartTheme, type PicsartUploadHandler, createDefaultVideoUpload, loadPicsartSdk };