@dotcms/react 0.0.1-beta.2 → 0.0.1-beta.21

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.
@@ -1,6 +1,5 @@
1
1
  /// <reference types="react" />
2
- import { DotCMSPageRendererMode } from '../../contexts/DotCMSPageContext';
3
- import { DotCMSContentlet, DotCMSPageAsset } from '../../types';
2
+ import { DotCMSContentlet, DotCMSPageAsset, DotCMSPageRendererMode } from '@dotcms/uve/types';
4
3
  interface DotCMSLayoutBodyProps {
5
4
  page: DotCMSPageAsset;
6
5
  components: Record<string, React.ComponentType<DotCMSContentlet>>;
@@ -9,28 +8,18 @@ interface DotCMSLayoutBodyProps {
9
8
  /**
10
9
  * DotCMSLayoutBody component renders the layout body for a DotCMS page.
11
10
  *
12
- * It utilizes the page asset's layout body to render rows using the Row component.
13
- * If the layout body does not exist, it renders an error message.
14
- * It also provides context (DotCMSPageContext) with the page asset, optional user components,
15
- * and the renderer mode to its children.
11
+ * It utilizes the dotCMS page asset's layout body to render the page body.
12
+ * If the layout body does not exist, it renders an error message in the mode is `development`.
16
13
  *
17
14
  * @public
18
15
  * @component
19
16
  * @param {Object} props - Component properties.
20
17
  * @param {DotCMSPageAsset} props.page - The DotCMS page asset containing the layout information.
21
- * @param {Record<string, React.ComponentType<DotCMSContentlet>>} [props.components] - Optional mapping of custom components for content rendering.
18
+ * @param {Record<string, React.ComponentType<DotCMSContentlet>>} [props.components] - mapping of custom components for content rendering.
22
19
  * @param {DotCMSPageRendererMode} [props.mode='production'] - The renderer mode; defaults to 'production'. Alternate modes might trigger different behaviors.
23
20
  *
24
21
  * @returns {JSX.Element} The rendered DotCMS page body or an error message if the layout body is missing.
25
22
  *
26
- * -------------------------------------------------------------------
27
- *
28
- * El componente DotCMSLayoutBody renderiza el cuerpo del layout para una página de DotCMS.
29
- *
30
- * Utiliza el "body" del layout del asset de la página para renderizar las filas mediante el componente Row.
31
- * Si el "body" del layout no está presente, renderiza un mensaje de error.
32
- * También provee un contexto (DotCMSPageContext) con el asset de la página, componentes de usuario opcionales,
33
- * y el modo del renderizado para sus componentes hijos.
34
23
  */
35
24
  export declare const DotCMSLayoutBody: ({ page, components, mode }: DotCMSLayoutBodyProps) => import("react/jsx-runtime").JSX.Element;
36
25
  export {};
@@ -1,9 +1,6 @@
1
- import { DotCMSPageRendererMode } from '../../../contexts/DotCMSPageContext';
2
1
  /**
3
2
  * Error message component for when the page body is missing
4
3
  *
5
4
  * @return {JSX.Element} Error message component
6
5
  */
7
- export declare const ErrorMessage: ({ mode }: {
8
- mode: DotCMSPageRendererMode;
9
- }) => import("react/jsx-runtime").JSX.Element | null;
6
+ export declare const ErrorMessage: () => false | import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,49 @@
1
+ /// <reference types="react" />
2
+ import { UVE_MODE } from '@dotcms/uve/types';
3
+ /**
4
+ * Props for the DotCMSShow component.
5
+ *
6
+ * @typedef {Object} DotCMSShowProps
7
+ * @property {React.ReactNode} children - The children to be rendered when the condition is met.
8
+ * @property {UVE_MODE} [when=UVE_MODE.EDIT] - The UVE mode in which the children should be rendered.
9
+ */
10
+ type DotCMSShowProps = {
11
+ children: React.ReactNode;
12
+ when?: UVE_MODE;
13
+ };
14
+ /**
15
+ * DotCMSShow component is used to conditionally render its children
16
+ * based on the Universal Visual Editor (UVE) mode. It checks if the UVE
17
+ * is in a specified mode and only renders its children in that case.
18
+ *
19
+ * @param {Object} props - The component props.
20
+ * @param {React.ReactNode} props.children - The children to be rendered when the condition is met.
21
+ * @param {UVE_MODE} [props.when=UVE_MODE.EDIT] - The UVE mode in which the children should be rendered.
22
+ * @returns {React.ReactNode | null} The children if the current UVE mode matches the `when` prop, otherwise null.
23
+ *
24
+ * @example
25
+ * // Basic usage: Render content only in edit mode
26
+ * <DotCMSShow when={UVE_MODE.EDIT}>
27
+ * <div>Edit Mode Content</div>
28
+ * </DotCMSShow>
29
+ *
30
+ * // This will render <div>Edit Mode Content</div> only if the UVE is in edit mode.
31
+ *
32
+ * @example
33
+ * // Render content in preview mode
34
+ * <DotCMSShow when={UVE_MODE.PREVIEW}>
35
+ * <MyCustomPreviewComponent />
36
+ * </DotCMSShow>
37
+ *
38
+ * // MyCustomPreviewComponent will only be rendered if the UVE is in preview mode.
39
+ *
40
+ * @example
41
+ * // Render content in live mode
42
+ * <DotCMSShow when={UVE_MODE.LIVE}>
43
+ * <LiveContentComponent />
44
+ * </DotCMSShow>
45
+ *
46
+ * // LiveContentComponent will only be rendered if the UVE is in live mode.
47
+ */
48
+ export declare const DotCMSShow: ({ children, when }: DotCMSShowProps) => React.ReactNode | null;
49
+ export {};
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
- import { DotCMSContentlet } from '../../types';
2
+ import { DotCMSContentlet } from '@dotcms/uve/types';
3
3
  /**
4
4
  * @internal
5
5
  *
@@ -1,4 +1,4 @@
1
- import { DotPageAssetLayoutRow } from '../../types';
1
+ import { DotPageAssetLayoutRow } from '@dotcms/uve/types';
2
2
  /**
3
3
  * @internal
4
4
  *
@@ -1,6 +1,5 @@
1
1
  /// <reference types="react" />
2
- import { DotCMSContentlet, DotCMSPageAsset } from '../types';
3
- export type DotCMSPageRendererMode = 'production' | 'development';
2
+ import { DotCMSContentlet, DotCMSPageAsset, DotCMSPageRendererMode } from '@dotcms/uve/types';
4
3
  /**
5
4
  * @internal
6
5
  *
@@ -0,0 +1,31 @@
1
+ import { UVE_MODE } from '@dotcms/uve/types';
2
+ /**
3
+ * Custom hook to determine if the current UVE (Universal Visual Editor) mode
4
+ * matches the specified mode. This hook is useful for conditionally rendering
5
+ * components based on the UVE mode.
6
+ *
7
+ * @param {UVE_MODE} when - The UVE mode to check against.
8
+ * @returns {boolean} True if the current UVE mode matches the specified mode, otherwise false.
9
+ *
10
+ * @example
11
+ * // Basic usage: Check if the UVE is in edit mode
12
+ * const showInEditMode = useDotCMSShowWhen(UVE_MODE.EDIT);
13
+ * if (showInEditMode) {
14
+ * // Render edit-specific components
15
+ * }
16
+ *
17
+ * @example
18
+ * // Check if the UVE is in preview mode
19
+ * const showInPreviewMode = useDotCMSShowWhen(UVE_MODE.PREVIEW);
20
+ * if (showInPreviewMode) {
21
+ * // Render preview-specific components
22
+ * }
23
+ *
24
+ * @example
25
+ * // Check if the UVE is in live mode
26
+ * const showInLiveMode = useDotCMSShowWhen(UVE_MODE.LIVE);
27
+ * if (showInLiveMode) {
28
+ * // Render live-specific components
29
+ * }
30
+ */
31
+ export declare const useDotCMSShowWhen: (when: UVE_MODE) => boolean;
@@ -0,0 +1,90 @@
1
+ import { DotCMSEditablePage } from '@dotcms/uve/types';
2
+ /**
3
+ * Custom hook to manage the editable state of a DotCMS page.
4
+ *
5
+ * This hook initializes the Universal Visual Editor (UVE) and subscribes to content changes.
6
+ * It updates the editable page state when content changes are detected in the UVE,
7
+ * ensuring your React components always display the latest content when editing in DotCMS.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * // Import the hook and the client
12
+ * import { useEditableDotCMSPage } from '@dotcms/react';
13
+ * import { createDotCMSClient } from '@dotcms/client';
14
+ *
15
+ * // Create the client
16
+ * const client = createDotCMSClient({
17
+ * dotcmsURL: 'https://your-dotcms-instance.com',
18
+ * authToken: 'your-auth-token'
19
+ * });
20
+ *
21
+ * // Get the page
22
+ * const page = await client.page.get('/', {
23
+ * languageId: '1',
24
+ * });
25
+ *
26
+ * // Use the hook to get an editable version of the page
27
+ * const editablePage = useEditableDotCMSPage(page);
28
+ *
29
+ * // Then use the page data in your component
30
+ * return (
31
+ * <div>
32
+ * <h1>{editablePage.page.title}</h1>
33
+ * <div dangerouslySetInnerHTML={{ __html: editablePage.page.body }} />
34
+ * </div>
35
+ * );
36
+ * ```
37
+ *
38
+ * @example
39
+ * ```ts
40
+ * // Import the hook and the client
41
+ * import { useEditableDotCMSPage } from '@dotcms/react';
42
+ * import { createDotCMSClient } from '@dotcms/client';
43
+ *
44
+ * // Create the client
45
+ * const client = createDotCMSClient({
46
+ * dotcmsURL: 'https://your-dotcms-instance.com',
47
+ * authToken: 'your-auth-token'
48
+ * });
49
+ *
50
+ * // Get the page with GraphQL content
51
+ * const page = await client.page.get('/', {
52
+ * languageId: '1',
53
+ * graphql: {
54
+ * content: {
55
+ * products: `ProductCollection(query: "+title:snow", limit: 10, offset: 0, sortBy: "score") {
56
+ * title
57
+ * urlMap
58
+ * category {
59
+ * name
60
+ * inode
61
+ * }
62
+ * retailPrice
63
+ * image {
64
+ * versionPath
65
+ * }
66
+ * }`
67
+ * }
68
+ * }
69
+ * });
70
+ *
71
+ * // Use the hook to get an editable version of the page and its content
72
+ * const editablePage = useEditableDotCMSPage(page);
73
+ *
74
+ * // Access both page data and GraphQL content
75
+ * const { page: pageData, content } = editablePage;
76
+ *
77
+ * // Use the products from GraphQL content
78
+ * return (
79
+ * <div>
80
+ * <h1>{pageData.title}</h1>
81
+ * <ProductList products={content.products} />
82
+ * </div>
83
+ * );
84
+ * ```
85
+ * @param {DotCMSEditablePage} editablePage - The initial editable page data from client.page.get().
86
+ *
87
+ * @returns {DotCMSEditablePage} The updated editable page state that reflects any changes made in the UVE.
88
+ * The structure includes page data and any GraphQL content that was requested.
89
+ */
90
+ export declare const useEditableDotCMSPage: (editablePage: DotCMSEditablePage) => DotCMSEditablePage;
@@ -1,13 +1,10 @@
1
- import { DotCMSPageRendererMode } from '../contexts/DotCMSPageContext';
2
1
  /**
3
2
  * @internal
4
3
  * A React hook that determines if the current environment is in development mode.
5
4
  *
6
5
  * The hook returns `true` if either:
7
- * - The context mode (or the optional `renderMode` argument) is set to 'development', or
8
- * - The application is running inside the DotCMS editor (as determined by `isInsideEditor()`).
6
+ * - The application is running inside the DotCMS editor (as determined by `getUVEState()`).
9
7
  *
10
- * @param {DotCMSPageRendererMode} [renderMode] - Optional override for the render mode.
11
8
  * @returns {boolean} - `true` if in development mode or inside the editor; otherwise, `false`.
12
9
  */
13
- export declare const useIsDevMode: (renderMode?: DotCMSPageRendererMode) => boolean;
10
+ export declare const useIsDevMode: () => boolean;
package/src/next.d.ts CHANGED
@@ -1 +1,4 @@
1
1
  export { DotCMSLayoutBody } from './lib/next/components/DotCMSLayoutBody/DotCMSLayoutBody';
2
+ export { DotCMSShow } from './lib/next/components/DotCMSShow/DotCMSShow';
3
+ export { useDotCMSShowWhen } from './lib/next/hooks/useDotCMSShowWhen';
4
+ export { useEditableDotCMSPage } from './lib/next/hooks/useEditableDotCMSPage';
@@ -1,421 +0,0 @@
1
- export interface DotCMSPageAsset {
2
- canCreateTemplate?: boolean;
3
- containers: {
4
- [key: string]: DotCMSPageAssetContainer;
5
- };
6
- layout: DotCMSLayout;
7
- page: DotCMSPage;
8
- site: DotCMSSite;
9
- template: DotCMSTemplate;
10
- viewAs?: DotCMSViewAs;
11
- vanityUrl?: DotCMSVanityUrl;
12
- }
13
- export interface DotPageAssetLayoutRow {
14
- identifier: number;
15
- value?: string;
16
- id?: string;
17
- columns: DotPageAssetLayoutColumn[];
18
- styleClass?: string;
19
- }
20
- export interface DotCMSVanityUrl {
21
- pattern: string;
22
- vanityUrlId: string;
23
- url: string;
24
- siteId: string;
25
- languageId: number;
26
- forwardTo: string;
27
- response: number;
28
- order: number;
29
- temporaryRedirect: boolean;
30
- permanentRedirect: boolean;
31
- forward: boolean;
32
- }
33
- export interface DotPageAssetLayoutColumn {
34
- preview: boolean;
35
- containers: DotCMSColumnContainer[];
36
- widthPercent: number;
37
- width: number;
38
- leftOffset: number;
39
- left: number;
40
- styleClass?: string;
41
- }
42
- export interface DotCMSColumnContainer {
43
- identifier: string;
44
- uuid: string;
45
- historyUUIDs: string[];
46
- }
47
- export interface DotCMSPageAssetContainer {
48
- container: DotCMSContainer;
49
- containerStructures: DotCMSContainerStructure[];
50
- contentlets: {
51
- [key: string]: DotCMSContentlet[];
52
- };
53
- }
54
- export interface DotCMSContainer {
55
- identifier: string;
56
- uuid: string;
57
- iDate: number;
58
- type: string;
59
- owner?: string;
60
- inode: string;
61
- source: string;
62
- title: string;
63
- friendlyName: string;
64
- modDate: number;
65
- modUser: string;
66
- sortOrder: number;
67
- showOnMenu: boolean;
68
- code?: string;
69
- maxContentlets: number;
70
- useDiv: boolean;
71
- sortContentletsBy?: string;
72
- preLoop: string;
73
- postLoop: string;
74
- staticify: boolean;
75
- luceneQuery?: string;
76
- notes: string;
77
- languageId?: number;
78
- path?: string;
79
- live: boolean;
80
- locked: boolean;
81
- working: boolean;
82
- deleted: boolean;
83
- name: string;
84
- archived: boolean;
85
- permissionId: string;
86
- versionId: string;
87
- versionType: string;
88
- permissionType: string;
89
- categoryId: string;
90
- idate: number;
91
- new: boolean;
92
- acceptTypes: string;
93
- contentlets: DotCMSContentlet[];
94
- parentPermissionable: DotCMSSiteParentPermissionable;
95
- }
96
- export interface DotCMSContentlet {
97
- archived: boolean;
98
- baseType: string;
99
- deleted?: boolean;
100
- binary?: string;
101
- binaryContentAsset?: string;
102
- binaryVersion?: string;
103
- contentType: string;
104
- file?: string;
105
- folder: string;
106
- hasLiveVersion?: boolean;
107
- hasTitleImage: boolean;
108
- host: string;
109
- hostName: string;
110
- identifier: string;
111
- inode: string;
112
- image?: any;
113
- languageId: number;
114
- language?: string;
115
- live: boolean;
116
- locked: boolean;
117
- mimeType?: string;
118
- modDate: string;
119
- modUser: string;
120
- modUserName: string;
121
- owner: string;
122
- sortOrder: number;
123
- stInode: string;
124
- title: string;
125
- titleImage: string;
126
- text?: string;
127
- url: string;
128
- working: boolean;
129
- body?: string;
130
- contentTypeIcon?: string;
131
- variant?: string;
132
- __icon__?: string;
133
- [key: string]: any;
134
- }
135
- export interface DotcmsNavigationItem {
136
- code?: any;
137
- folder: string;
138
- children?: DotcmsNavigationItem[];
139
- host: string;
140
- languageId: number;
141
- href: string;
142
- title: string;
143
- type: string;
144
- hash: number;
145
- target: string;
146
- order: number;
147
- }
148
- interface DotCMSTemplate {
149
- iDate: number;
150
- type: string;
151
- owner: string;
152
- inode: string;
153
- identifier: string;
154
- source: string;
155
- title: string;
156
- friendlyName: string;
157
- modDate: number;
158
- modUser: string;
159
- sortOrder: number;
160
- showOnMenu: boolean;
161
- image: string;
162
- drawed: boolean;
163
- drawedBody: string;
164
- theme: string;
165
- anonymous: boolean;
166
- template: boolean;
167
- name: string;
168
- live: boolean;
169
- archived: boolean;
170
- locked: boolean;
171
- working: boolean;
172
- permissionId: string;
173
- versionId: string;
174
- versionType: string;
175
- deleted: boolean;
176
- permissionType: string;
177
- categoryId: string;
178
- idate: number;
179
- new: boolean;
180
- canEdit: boolean;
181
- }
182
- interface DotCMSPage {
183
- template: string;
184
- modDate: number;
185
- metadata: string;
186
- cachettl: string;
187
- pageURI: string;
188
- title: string;
189
- type: string;
190
- showOnMenu: string;
191
- httpsRequired: boolean;
192
- inode: string;
193
- disabledWYSIWYG: any[];
194
- seokeywords: string;
195
- host: string;
196
- lastReview: number;
197
- working: boolean;
198
- locked: boolean;
199
- stInode: string;
200
- friendlyName: string;
201
- live: boolean;
202
- owner: string;
203
- identifier: string;
204
- nullProperties: any[];
205
- friendlyname: string;
206
- pagemetadata: string;
207
- languageId: number;
208
- url: string;
209
- seodescription: string;
210
- modUserName: string;
211
- folder: string;
212
- deleted: boolean;
213
- sortOrder: number;
214
- modUser: string;
215
- pageUrl: string;
216
- workingInode: string;
217
- shortyWorking: string;
218
- canEdit: boolean;
219
- canRead: boolean;
220
- canLock: boolean;
221
- lockedOn: number;
222
- lockedBy: string;
223
- lockedByName: string;
224
- liveInode: string;
225
- shortyLive: string;
226
- }
227
- interface DotCMSViewAs {
228
- language: {
229
- id: number;
230
- languageCode: string;
231
- countryCode: string;
232
- language: string;
233
- country: string;
234
- };
235
- mode: string;
236
- }
237
- interface DotCMSLayout {
238
- pageWidth: string;
239
- width: string;
240
- layout: string;
241
- title: string;
242
- header: boolean;
243
- footer: boolean;
244
- body: DotPageAssetLayoutBody;
245
- sidebar: DotPageAssetLayoutSidebar;
246
- }
247
- interface DotCMSContainerStructure {
248
- id: string;
249
- structureId: string;
250
- containerInode: string;
251
- containerId: string;
252
- code: string;
253
- contentTypeVar: string;
254
- }
255
- interface DotPageAssetLayoutSidebar {
256
- preview: boolean;
257
- containers: DotCMSContainer[];
258
- location: string;
259
- widthPercent: number;
260
- width: string;
261
- }
262
- interface DotPageAssetLayoutBody {
263
- rows: DotPageAssetLayoutRow[];
264
- }
265
- interface DotCMSSite {
266
- lowIndexPriority: boolean;
267
- name: string;
268
- default: boolean;
269
- aliases: string;
270
- parent: boolean;
271
- tagStorage: string;
272
- systemHost: boolean;
273
- inode: string;
274
- versionType: string;
275
- structureInode: string;
276
- hostname: string;
277
- hostThumbnail?: any;
278
- owner: string;
279
- permissionId: string;
280
- permissionType: string;
281
- type: string;
282
- identifier: string;
283
- modDate: number;
284
- host: string;
285
- live: boolean;
286
- indexPolicy: string;
287
- categoryId: string;
288
- actionId?: any;
289
- new: boolean;
290
- archived: boolean;
291
- locked: boolean;
292
- disabledWysiwyg: any[];
293
- modUser: string;
294
- working: boolean;
295
- titleImage: {
296
- present: boolean;
297
- };
298
- folder: string;
299
- htmlpage: boolean;
300
- fileAsset: boolean;
301
- vanityUrl: boolean;
302
- keyValue: boolean;
303
- structure?: DotCMSSiteStructure;
304
- title: string;
305
- languageId: number;
306
- indexPolicyDependencies: string;
307
- contentTypeId: string;
308
- versionId: string;
309
- lastReview: number;
310
- nextReview?: any;
311
- reviewInterval?: any;
312
- sortOrder: number;
313
- contentType: DotCMSSiteContentType;
314
- }
315
- interface DotCMSSiteContentType {
316
- owner?: any;
317
- parentPermissionable: DotCMSSiteParentPermissionable;
318
- permissionId: string;
319
- permissionType: string;
320
- }
321
- export interface DotCMSSiteParentPermissionable {
322
- Inode: string;
323
- Identifier: string;
324
- permissionByIdentifier: boolean;
325
- type: string;
326
- owner?: any;
327
- identifier: string;
328
- permissionId: string;
329
- parentPermissionable?: any;
330
- permissionType: string;
331
- inode: string;
332
- childrenPermissionable?: any;
333
- variantId?: string;
334
- }
335
- interface DotCMSSiteStructure {
336
- iDate: number;
337
- type: string;
338
- owner?: any;
339
- inode: string;
340
- identifier: string;
341
- name: string;
342
- description: string;
343
- defaultStructure: boolean;
344
- reviewInterval?: any;
345
- reviewerRole?: any;
346
- pagedetail?: any;
347
- structureType: number;
348
- fixed: boolean;
349
- system: boolean;
350
- velocityVarName: string;
351
- urlMapPattern?: any;
352
- host: string;
353
- folder: string;
354
- publishDateVar?: any;
355
- expireDateVar?: any;
356
- modDate: number;
357
- fields: DotCMSSiteField[];
358
- widget: boolean;
359
- detailPage?: any;
360
- fieldsBySortOrder: DotCMSSiteField[];
361
- form: boolean;
362
- htmlpageAsset: boolean;
363
- content: boolean;
364
- fileAsset: boolean;
365
- persona: boolean;
366
- permissionId: string;
367
- permissionType: string;
368
- live: boolean;
369
- categoryId: string;
370
- idate: number;
371
- new: boolean;
372
- archived: boolean;
373
- locked: boolean;
374
- modUser: string;
375
- working: boolean;
376
- title: string;
377
- versionId: string;
378
- versionType: string;
379
- }
380
- interface DotCMSSiteField {
381
- iDate: number;
382
- type: string;
383
- owner?: any;
384
- inode: string;
385
- identifier: string;
386
- structureInode: string;
387
- fieldName: string;
388
- fieldType: string;
389
- fieldRelationType?: any;
390
- fieldContentlet: string;
391
- required: boolean;
392
- velocityVarName: string;
393
- sortOrder: number;
394
- values?: any;
395
- regexCheck?: any;
396
- hint?: any;
397
- defaultValue?: any;
398
- indexed: boolean;
399
- listed: boolean;
400
- fixed: boolean;
401
- readOnly: boolean;
402
- searchable: boolean;
403
- unique: boolean;
404
- modDate: number;
405
- dataType: string;
406
- live: boolean;
407
- categoryId: string;
408
- idate: number;
409
- new: boolean;
410
- archived: boolean;
411
- locked: boolean;
412
- modUser: string;
413
- working: boolean;
414
- permissionId: string;
415
- parentPermissionable?: any;
416
- permissionType: string;
417
- title: string;
418
- versionId: string;
419
- versionType: string;
420
- }
421
- export {};