@sitecore-content-sdk/react 1.2.0-canary.1 → 1.2.0-canary.11

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.
Files changed (29) hide show
  1. package/dist/cjs/components/BYOCComponent.js +1 -0
  2. package/dist/cjs/components/BYOCWrapper.js +1 -0
  3. package/dist/cjs/components/DefaultEmptyFieldEditingComponents.js +4 -4
  4. package/dist/cjs/components/DesignLibrary.js +27 -21
  5. package/dist/cjs/components/FEaaSComponent.js +1 -0
  6. package/dist/cjs/components/FEaaSWrapper.js +1 -0
  7. package/dist/cjs/components/Form.js +1 -0
  8. package/dist/cjs/components/SitecoreProvider.js +1 -0
  9. package/dist/cjs/enhancers/withEmptyFieldEditingComponent.js +12 -5
  10. package/dist/cjs/enhancers/withSitecore.js +1 -0
  11. package/dist/esm/components/BYOCComponent.js +1 -0
  12. package/dist/esm/components/BYOCWrapper.js +1 -0
  13. package/dist/esm/components/DefaultEmptyFieldEditingComponents.js +4 -4
  14. package/dist/esm/components/DesignLibrary.js +27 -21
  15. package/dist/esm/components/FEaaSComponent.js +1 -0
  16. package/dist/esm/components/FEaaSWrapper.js +1 -0
  17. package/dist/esm/components/Form.js +1 -0
  18. package/dist/esm/components/SitecoreProvider.js +1 -0
  19. package/dist/esm/enhancers/withEmptyFieldEditingComponent.js +12 -5
  20. package/dist/esm/enhancers/withSitecore.js +1 -0
  21. package/package.json +3 -3
  22. package/types/components/Date.d.ts +1 -1
  23. package/types/components/DefaultEmptyFieldEditingComponents.d.ts +8 -2
  24. package/types/components/Image.d.ts +1 -1
  25. package/types/components/Link.d.ts +1 -1
  26. package/types/components/RichText.d.ts +1 -1
  27. package/types/components/Text.d.ts +1 -1
  28. package/types/components/sharedTypes/props.d.ts +2 -2
  29. package/types/enhancers/withEmptyFieldEditingComponent.d.ts +3 -3
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ 'use client';
2
3
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
4
  if (k2 === undefined) k2 = k;
4
5
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ 'use client';
2
3
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
4
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
5
  };
@@ -5,11 +5,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.DefaultEmptyFieldEditingComponentImage = exports.DefaultEmptyFieldEditingComponentText = void 0;
7
7
  const react_1 = __importDefault(require("react"));
8
- const DefaultEmptyFieldEditingComponentText = () => {
9
- return react_1.default.createElement("span", null, "[No text in field]");
8
+ const DefaultEmptyFieldEditingComponentText = (props) => {
9
+ return react_1.default.createElement(props.tag || 'span', props, '[No text in field]');
10
10
  };
11
11
  exports.DefaultEmptyFieldEditingComponentText = DefaultEmptyFieldEditingComponentText;
12
- const DefaultEmptyFieldEditingComponentImage = () => {
12
+ const DefaultEmptyFieldEditingComponentImage = (props) => {
13
13
  const inlineStyles = {
14
14
  minWidth: '48px',
15
15
  minHeight: '48px',
@@ -17,6 +17,6 @@ const DefaultEmptyFieldEditingComponentImage = () => {
17
17
  maxHeight: '400px',
18
18
  cursor: 'pointer',
19
19
  };
20
- return (react_1.default.createElement("img", { alt: "", src: 'data:image/svg+xml,%3Csvg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 240 240" style="enable-background:new 0 0 240 240;" xml:space="preserve"%3E%3Cstyle type="text/css"%3E .st0%7Bfill:none;%7D .st1%7Bfill:%23969696;%7D .st2%7Bfill:%23FFFFFF;%7D .st3%7Bfill:%23FFFFFF;stroke:%23FFFFFF;stroke-width:0.75;stroke-miterlimit:10;%7D%0A%3C/style%3E%3Cg%3E%3Crect class="st0" width="240" height="240"/%3E%3Cg%3E%3Cg%3E%3Crect x="20" y="20" class="st1" width="200" height="200"/%3E%3C/g%3E%3Cg%3E%3Ccircle class="st2" cx="174" cy="67" r="14"/%3E%3Cpath class="st2" d="M174,54c7.17,0,13,5.83,13,13s-5.83,13-13,13s-13-5.83-13-13S166.83,54,174,54 M174,52 c-8.28,0-15,6.72-15,15s6.72,15,15,15s15-6.72,15-15S182.28,52,174,52L174,52z"/%3E%3C/g%3E%3Cpolyline class="st3" points="29.5,179.25 81.32,122.25 95.41,137.75 137.23,91.75 209.5,179.75 "/%3E%3C/g%3E%3C/g%3E%3C/svg%3E', className: "scEmptyImage", style: inlineStyles }));
20
+ return (react_1.default.createElement("img", Object.assign({}, props, { alt: "", src: 'data:image/svg+xml,%3Csvg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 240 240" style="enable-background:new 0 0 240 240;" xml:space="preserve"%3E%3Cstyle type="text/css"%3E .st0%7Bfill:none;%7D .st1%7Bfill:%23969696;%7D .st2%7Bfill:%23FFFFFF;%7D .st3%7Bfill:%23FFFFFF;stroke:%23FFFFFF;stroke-width:0.75;stroke-miterlimit:10;%7D%0A%3C/style%3E%3Cg%3E%3Crect class="st0" width="240" height="240"/%3E%3Cg%3E%3Cg%3E%3Crect x="20" y="20" class="st1" width="200" height="200"/%3E%3C/g%3E%3Cg%3E%3Ccircle class="st2" cx="174" cy="67" r="14"/%3E%3Cpath class="st2" d="M174,54c7.17,0,13,5.83,13,13s-5.83,13-13,13s-13-5.83-13-13S166.83,54,174,54 M174,52 c-8.28,0-15,6.72-15,15s6.72,15,15,15s15-6.72,15-15S182.28,52,174,52L174,52z"/%3E%3C/g%3E%3Cpolyline class="st3" points="29.5,179.25 81.32,122.25 95.41,137.75 137.23,91.75 209.5,179.75 "/%3E%3C/g%3E%3C/g%3E%3C/svg%3E', className: `scEmptyImage ${props.className || ''}`, style: inlineStyles })));
21
21
  };
22
22
  exports.DefaultEmptyFieldEditingComponentImage = DefaultEmptyFieldEditingComponentImage;
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ 'use client';
2
3
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
4
  if (k2 === undefined) k2 = k;
4
5
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -96,6 +97,11 @@ const Preview = () => {
96
97
  react_1.default.createElement("main", null,
97
98
  react_1.default.createElement("div", { id: layout_1.EDITING_COMPONENT_ID }, route && (react_1.default.createElement(Placeholder_1.Placeholder, { name: layout_1.EDITING_COMPONENT_PLACEHOLDER, rendering: route, key: renderKey }))))));
98
99
  };
100
+ const sendErrorEvent = (uid, error, type) => {
101
+ const errorEvent = codegen.getDesignLibraryComponentPreviewErrorEvent(uid, error, type);
102
+ console.error('Component Library: sending error event', errorEvent);
103
+ window.top.postMessage(errorEvent, '*');
104
+ };
99
105
  class ErrorBoundary extends react_1.default.Component {
100
106
  constructor() {
101
107
  super(...arguments);
@@ -112,9 +118,7 @@ class ErrorBoundary extends react_1.default.Component {
112
118
  }
113
119
  }
114
120
  componentDidCatch(error) {
115
- const errorEvent = codegen.getDesignLibraryComponentPreviewErrorEvent(this.props.uid, error, codegen.DesignLibraryPreviewError.Render);
116
- console.debug('Component Library: sending error event', errorEvent);
117
- window.top.postMessage(errorEvent, '*');
121
+ sendErrorEvent(this.props.uid, error, codegen.DesignLibraryPreviewError.Render);
118
122
  }
119
123
  render() {
120
124
  if (this.state.hasError) {
@@ -132,12 +136,7 @@ const VariantGeneration = (props) => {
132
136
  const { layout: { sitecore: { route }, }, } = page;
133
137
  const rendering = route === null || route === void 0 ? void 0 : route.placeholders[layout_1.EDITING_COMPONENT_PLACEHOLDER][0];
134
138
  const [renderKey, setRenderKey] = (0, react_1.useState)(0);
135
- const [initError, setInitError] = (0, react_1.useState)(false);
136
- const [importMapError, setImportMapError] = (0, react_1.useState)(false);
137
139
  const [Component, setComponent] = (0, react_1.useState)(null);
138
- if (!rendering) {
139
- return react_1.default.createElement("div", null, "No component found in layout data. Please check your layout data.");
140
- }
141
140
  // eslint-disable-next-line react-hooks/rules-of-hooks
142
141
  (0, react_1.useEffect)(() => {
143
142
  let cancelled = false;
@@ -145,10 +144,11 @@ const VariantGeneration = (props) => {
145
144
  // unsubscribe function for useEffect cleanup will also be returned once importMap promise has been resolved or rejected
146
145
  let unsubscribe = undefined;
147
146
  const init = () => __awaiter(void 0, void 0, void 0, function* () {
147
+ var _a;
148
148
  let importMap = undefined;
149
149
  if (!props.loadImportMap) {
150
- console.error('No loadImportMap prop provided. Please provide a dynamic import map function for DesignLibrary.');
151
- setImportMapError(true);
150
+ const errorMessage = 'No loadImportMap prop provided. Please provide a dynamic import map function for DesignLibrary.';
151
+ sendErrorEvent(rendering.uid, errorMessage, codegen.DesignLibraryPreviewError.RenderInit);
152
152
  return;
153
153
  }
154
154
  try {
@@ -156,20 +156,19 @@ const VariantGeneration = (props) => {
156
156
  importMap = importMapImport.default;
157
157
  }
158
158
  catch (error) {
159
- console.error('Error loading import map:', error);
160
- setImportMapError(true);
159
+ const errorMessage = `Error loading import map: ${error}`;
160
+ sendErrorEvent(rendering.uid, errorMessage, codegen.DesignLibraryPreviewError.RenderInit);
161
161
  return;
162
162
  }
163
163
  // account for component being unmounted while resolving async import map
164
164
  if (cancelled)
165
165
  return;
166
166
  unsubscribe = addComponentPreviewHandler(importMap, (error, Component) => {
167
- setRenderKey((key) => key + 1);
167
+ // Error event is already sent in the addComponentPreviewHandler
168
168
  if (error) {
169
- setInitError(true);
170
169
  return;
171
170
  }
172
- setInitError(false);
171
+ setRenderKey((key) => key + 1);
173
172
  setComponent(() => Component);
174
173
  });
175
174
  const importMapEvent = getDesignLibraryImportMapEvent(rendering.uid, importMap);
@@ -178,6 +177,9 @@ const VariantGeneration = (props) => {
178
177
  const componentPropsEvent = getDesignLibraryComponentPropsEvent(rendering.uid, rendering.fields, rendering.params);
179
178
  console.debug('Component Library: sending event', componentPropsEvent);
180
179
  window.top.postMessage(componentPropsEvent, '*');
180
+ const readyEvent = (0, editing_1.getDesignLibraryStatusEvent)(editing_1.DesignLibraryStatus.READY, rendering.uid);
181
+ console.debug('Component Library: sending event', readyEvent);
182
+ (_a = window.top) === null || _a === void 0 ? void 0 : _a.postMessage(readyEvent, '*');
181
183
  });
182
184
  init();
183
185
  // return function that calls unsubsubribe - if the component was mounted correctly
@@ -188,12 +190,16 @@ const VariantGeneration = (props) => {
188
190
  }
189
191
  };
190
192
  }, []);
191
- if (importMapError) {
192
- return (react_1.default.createElement("div", null, "No dynamic import map loaded. Please check a dynamic import map function is passed into Design Library"));
193
- }
194
- if (initError) {
195
- return react_1.default.createElement("div", { key: renderKey }, "Error during component initialization");
196
- }
193
+ // eslint-disable-next-line react-hooks/rules-of-hooks
194
+ (0, react_1.useEffect)(() => {
195
+ var _a;
196
+ // Send a rendered event only as effect of a component update command
197
+ if (renderKey === 0)
198
+ return undefined;
199
+ const renderedEvent = (0, editing_1.getDesignLibraryStatusEvent)(editing_1.DesignLibraryStatus.RENDERED, rendering.uid);
200
+ console.debug('Component Library: sending event', renderedEvent);
201
+ (_a = window.top) === null || _a === void 0 ? void 0 : _a.postMessage(renderedEvent, '*');
202
+ }, [renderKey, rendering === null || rendering === void 0 ? void 0 : rendering.uid]);
197
203
  return (react_1.default.createElement("main", null, Component ? (react_1.default.createElement(ErrorBoundary, { uid: rendering.uid, renderKey: renderKey },
198
204
  react_1.default.createElement(Component, { fields: rendering.fields, params: rendering.params, key: renderKey }))) : (react_1.default.createElement("div", null, "Loading preview..."))));
199
205
  };
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ 'use client';
2
3
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
4
  if (k2 === undefined) k2 = k;
4
5
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ 'use client';
2
3
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
4
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
5
  };
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ 'use client';
2
3
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
4
  if (k2 === undefined) k2 = k;
4
5
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ 'use client';
2
3
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
4
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
5
  };
@@ -46,18 +46,25 @@ function withEmptyFieldEditingComponent(FieldComponent, options) {
46
46
  var _a;
47
47
  const { editable = true } = props;
48
48
  if (((_a = props.field) === null || _a === void 0 ? void 0 : _a.metadata) && editable && (0, layout_1.isFieldValueEmpty)(props.field)) {
49
- return props.emptyFieldEditingComponent || options.defaultEmptyFieldEditingComponent;
49
+ const Component = props.emptyFieldEditingComponent || options.defaultEmptyFieldEditingComponent;
50
+ let resolvedProps = props;
51
+ // If no custom empty field editing component is provided, we can omit unnecessary props
52
+ // to do not insert them to html
53
+ if (!props.emptyFieldEditingComponent) {
54
+ resolvedProps = Object.assign(Object.assign({}, props), { editable: undefined, field: undefined });
55
+ }
56
+ return react_1.default.createElement(Component, Object.assign({}, resolvedProps));
50
57
  }
51
58
  return null;
52
59
  };
53
60
  if (options.isForwardRef) {
54
61
  return (0, react_1.forwardRef)((props, ref) => {
55
- const EmptyFieldEditingComponent = getEmptyFieldEditingComponent(props);
56
- return (react_1.default.createElement(react_1.default.Fragment, null, (EmptyFieldEditingComponent && react_1.default.createElement(EmptyFieldEditingComponent, null)) || (react_1.default.createElement(FieldComponent, Object.assign({}, props, { ref: ref })))));
62
+ const emptyFieldEditingComponent = getEmptyFieldEditingComponent(props);
63
+ return (emptyFieldEditingComponent || (react_1.default.createElement(FieldComponent, Object.assign({}, props, { ref: ref }))));
57
64
  });
58
65
  }
59
66
  return (props) => {
60
- const EmptyFieldEditingComponent = getEmptyFieldEditingComponent(props);
61
- return (react_1.default.createElement(react_1.default.Fragment, null, (EmptyFieldEditingComponent && react_1.default.createElement(EmptyFieldEditingComponent, null)) || (react_1.default.createElement(FieldComponent, Object.assign({}, props)))));
67
+ const emptyFieldEditingComponent = getEmptyFieldEditingComponent(props);
68
+ return emptyFieldEditingComponent || react_1.default.createElement(FieldComponent, Object.assign({}, props));
62
69
  };
63
70
  }
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ 'use client';
2
3
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
4
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
5
  };
@@ -1,3 +1,4 @@
1
+ 'use client';
1
2
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
3
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
4
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -1,3 +1,4 @@
1
+ 'use client';
1
2
  import { BYOCComponent } from './BYOCComponent';
2
3
  import React from 'react';
3
4
  export const BYOC_WRAPPER_RENDERING_NAME = 'BYOCWrapper';
@@ -1,8 +1,8 @@
1
1
  import React from 'react';
2
- export const DefaultEmptyFieldEditingComponentText = () => {
3
- return React.createElement("span", null, "[No text in field]");
2
+ export const DefaultEmptyFieldEditingComponentText = (props) => {
3
+ return React.createElement(props.tag || 'span', props, '[No text in field]');
4
4
  };
5
- export const DefaultEmptyFieldEditingComponentImage = () => {
5
+ export const DefaultEmptyFieldEditingComponentImage = (props) => {
6
6
  const inlineStyles = {
7
7
  minWidth: '48px',
8
8
  minHeight: '48px',
@@ -10,5 +10,5 @@ export const DefaultEmptyFieldEditingComponentImage = () => {
10
10
  maxHeight: '400px',
11
11
  cursor: 'pointer',
12
12
  };
13
- return (React.createElement("img", { alt: "", src: 'data:image/svg+xml,%3Csvg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 240 240" style="enable-background:new 0 0 240 240;" xml:space="preserve"%3E%3Cstyle type="text/css"%3E .st0%7Bfill:none;%7D .st1%7Bfill:%23969696;%7D .st2%7Bfill:%23FFFFFF;%7D .st3%7Bfill:%23FFFFFF;stroke:%23FFFFFF;stroke-width:0.75;stroke-miterlimit:10;%7D%0A%3C/style%3E%3Cg%3E%3Crect class="st0" width="240" height="240"/%3E%3Cg%3E%3Cg%3E%3Crect x="20" y="20" class="st1" width="200" height="200"/%3E%3C/g%3E%3Cg%3E%3Ccircle class="st2" cx="174" cy="67" r="14"/%3E%3Cpath class="st2" d="M174,54c7.17,0,13,5.83,13,13s-5.83,13-13,13s-13-5.83-13-13S166.83,54,174,54 M174,52 c-8.28,0-15,6.72-15,15s6.72,15,15,15s15-6.72,15-15S182.28,52,174,52L174,52z"/%3E%3C/g%3E%3Cpolyline class="st3" points="29.5,179.25 81.32,122.25 95.41,137.75 137.23,91.75 209.5,179.75 "/%3E%3C/g%3E%3C/g%3E%3C/svg%3E', className: "scEmptyImage", style: inlineStyles }));
13
+ return (React.createElement("img", Object.assign({}, props, { alt: "", src: 'data:image/svg+xml,%3Csvg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 240 240" style="enable-background:new 0 0 240 240;" xml:space="preserve"%3E%3Cstyle type="text/css"%3E .st0%7Bfill:none;%7D .st1%7Bfill:%23969696;%7D .st2%7Bfill:%23FFFFFF;%7D .st3%7Bfill:%23FFFFFF;stroke:%23FFFFFF;stroke-width:0.75;stroke-miterlimit:10;%7D%0A%3C/style%3E%3Cg%3E%3Crect class="st0" width="240" height="240"/%3E%3Cg%3E%3Cg%3E%3Crect x="20" y="20" class="st1" width="200" height="200"/%3E%3C/g%3E%3Cg%3E%3Ccircle class="st2" cx="174" cy="67" r="14"/%3E%3Cpath class="st2" d="M174,54c7.17,0,13,5.83,13,13s-5.83,13-13,13s-13-5.83-13-13S166.83,54,174,54 M174,52 c-8.28,0-15,6.72-15,15s6.72,15,15,15s15-6.72,15-15S182.28,52,174,52L174,52z"/%3E%3C/g%3E%3Cpolyline class="st3" points="29.5,179.25 81.32,122.25 95.41,137.75 137.23,91.75 209.5,179.75 "/%3E%3C/g%3E%3C/g%3E%3C/svg%3E', className: `scEmptyImage ${props.className || ''}`, style: inlineStyles })));
14
14
  };
@@ -1,3 +1,4 @@
1
+ 'use client';
1
2
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
3
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
4
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -59,6 +60,11 @@ const Preview = () => {
59
60
  React.createElement("main", null,
60
61
  React.createElement("div", { id: EDITING_COMPONENT_ID }, route && (React.createElement(Placeholder, { name: EDITING_COMPONENT_PLACEHOLDER, rendering: route, key: renderKey }))))));
61
62
  };
63
+ const sendErrorEvent = (uid, error, type) => {
64
+ const errorEvent = codegen.getDesignLibraryComponentPreviewErrorEvent(uid, error, type);
65
+ console.error('Component Library: sending error event', errorEvent);
66
+ window.top.postMessage(errorEvent, '*');
67
+ };
62
68
  class ErrorBoundary extends React.Component {
63
69
  constructor() {
64
70
  super(...arguments);
@@ -75,9 +81,7 @@ class ErrorBoundary extends React.Component {
75
81
  }
76
82
  }
77
83
  componentDidCatch(error) {
78
- const errorEvent = codegen.getDesignLibraryComponentPreviewErrorEvent(this.props.uid, error, codegen.DesignLibraryPreviewError.Render);
79
- console.debug('Component Library: sending error event', errorEvent);
80
- window.top.postMessage(errorEvent, '*');
84
+ sendErrorEvent(this.props.uid, error, codegen.DesignLibraryPreviewError.Render);
81
85
  }
82
86
  render() {
83
87
  if (this.state.hasError) {
@@ -95,12 +99,7 @@ export const VariantGeneration = (props) => {
95
99
  const { layout: { sitecore: { route }, }, } = page;
96
100
  const rendering = route === null || route === void 0 ? void 0 : route.placeholders[EDITING_COMPONENT_PLACEHOLDER][0];
97
101
  const [renderKey, setRenderKey] = useState(0);
98
- const [initError, setInitError] = useState(false);
99
- const [importMapError, setImportMapError] = useState(false);
100
102
  const [Component, setComponent] = useState(null);
101
- if (!rendering) {
102
- return React.createElement("div", null, "No component found in layout data. Please check your layout data.");
103
- }
104
103
  // eslint-disable-next-line react-hooks/rules-of-hooks
105
104
  useEffect(() => {
106
105
  let cancelled = false;
@@ -108,10 +107,11 @@ export const VariantGeneration = (props) => {
108
107
  // unsubscribe function for useEffect cleanup will also be returned once importMap promise has been resolved or rejected
109
108
  let unsubscribe = undefined;
110
109
  const init = () => __awaiter(void 0, void 0, void 0, function* () {
110
+ var _a;
111
111
  let importMap = undefined;
112
112
  if (!props.loadImportMap) {
113
- console.error('No loadImportMap prop provided. Please provide a dynamic import map function for DesignLibrary.');
114
- setImportMapError(true);
113
+ const errorMessage = 'No loadImportMap prop provided. Please provide a dynamic import map function for DesignLibrary.';
114
+ sendErrorEvent(rendering.uid, errorMessage, codegen.DesignLibraryPreviewError.RenderInit);
115
115
  return;
116
116
  }
117
117
  try {
@@ -119,20 +119,19 @@ export const VariantGeneration = (props) => {
119
119
  importMap = importMapImport.default;
120
120
  }
121
121
  catch (error) {
122
- console.error('Error loading import map:', error);
123
- setImportMapError(true);
122
+ const errorMessage = `Error loading import map: ${error}`;
123
+ sendErrorEvent(rendering.uid, errorMessage, codegen.DesignLibraryPreviewError.RenderInit);
124
124
  return;
125
125
  }
126
126
  // account for component being unmounted while resolving async import map
127
127
  if (cancelled)
128
128
  return;
129
129
  unsubscribe = addComponentPreviewHandler(importMap, (error, Component) => {
130
- setRenderKey((key) => key + 1);
130
+ // Error event is already sent in the addComponentPreviewHandler
131
131
  if (error) {
132
- setInitError(true);
133
132
  return;
134
133
  }
135
- setInitError(false);
134
+ setRenderKey((key) => key + 1);
136
135
  setComponent(() => Component);
137
136
  });
138
137
  const importMapEvent = getDesignLibraryImportMapEvent(rendering.uid, importMap);
@@ -141,6 +140,9 @@ export const VariantGeneration = (props) => {
141
140
  const componentPropsEvent = getDesignLibraryComponentPropsEvent(rendering.uid, rendering.fields, rendering.params);
142
141
  console.debug('Component Library: sending event', componentPropsEvent);
143
142
  window.top.postMessage(componentPropsEvent, '*');
143
+ const readyEvent = getDesignLibraryStatusEvent(DesignLibraryStatus.READY, rendering.uid);
144
+ console.debug('Component Library: sending event', readyEvent);
145
+ (_a = window.top) === null || _a === void 0 ? void 0 : _a.postMessage(readyEvent, '*');
144
146
  });
145
147
  init();
146
148
  // return function that calls unsubsubribe - if the component was mounted correctly
@@ -151,12 +153,16 @@ export const VariantGeneration = (props) => {
151
153
  }
152
154
  };
153
155
  }, []);
154
- if (importMapError) {
155
- return (React.createElement("div", null, "No dynamic import map loaded. Please check a dynamic import map function is passed into Design Library"));
156
- }
157
- if (initError) {
158
- return React.createElement("div", { key: renderKey }, "Error during component initialization");
159
- }
156
+ // eslint-disable-next-line react-hooks/rules-of-hooks
157
+ useEffect(() => {
158
+ var _a;
159
+ // Send a rendered event only as effect of a component update command
160
+ if (renderKey === 0)
161
+ return undefined;
162
+ const renderedEvent = getDesignLibraryStatusEvent(DesignLibraryStatus.RENDERED, rendering.uid);
163
+ console.debug('Component Library: sending event', renderedEvent);
164
+ (_a = window.top) === null || _a === void 0 ? void 0 : _a.postMessage(renderedEvent, '*');
165
+ }, [renderKey, rendering === null || rendering === void 0 ? void 0 : rendering.uid]);
160
166
  return (React.createElement("main", null, Component ? (React.createElement(ErrorBoundary, { uid: rendering.uid, renderKey: renderKey },
161
167
  React.createElement(Component, { fields: rendering.fields, params: rendering.params, key: renderKey }))) : (React.createElement("div", null, "Loading preview..."))));
162
168
  };
@@ -1,3 +1,4 @@
1
+ 'use client';
1
2
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
3
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
4
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -1,3 +1,4 @@
1
+ 'use client';
1
2
  import { FEaaSComponent } from './FEaaSComponent';
2
3
  import React from 'react';
3
4
  export const FEAAS_WRAPPER_RENDERING_NAME = 'FEaaSWrapper';
@@ -1,3 +1,4 @@
1
+ 'use client';
1
2
  import React, { useEffect, useRef, useState } from 'react';
2
3
  import { form } from '@sitecore-content-sdk/core';
3
4
  import { useSitecore } from '../enhancers/withSitecore';
@@ -1,3 +1,4 @@
1
+ 'use client';
1
2
  import React from 'react';
2
3
  import fastDeepEqual from 'fast-deep-equal/es6/react';
3
4
  import { constants } from '@sitecore-content-sdk/core';
@@ -10,18 +10,25 @@ export function withEmptyFieldEditingComponent(FieldComponent, options) {
10
10
  var _a;
11
11
  const { editable = true } = props;
12
12
  if (((_a = props.field) === null || _a === void 0 ? void 0 : _a.metadata) && editable && isFieldValueEmpty(props.field)) {
13
- return props.emptyFieldEditingComponent || options.defaultEmptyFieldEditingComponent;
13
+ const Component = props.emptyFieldEditingComponent || options.defaultEmptyFieldEditingComponent;
14
+ let resolvedProps = props;
15
+ // If no custom empty field editing component is provided, we can omit unnecessary props
16
+ // to do not insert them to html
17
+ if (!props.emptyFieldEditingComponent) {
18
+ resolvedProps = Object.assign(Object.assign({}, props), { editable: undefined, field: undefined });
19
+ }
20
+ return React.createElement(Component, Object.assign({}, resolvedProps));
14
21
  }
15
22
  return null;
16
23
  };
17
24
  if (options.isForwardRef) {
18
25
  return forwardRef((props, ref) => {
19
- const EmptyFieldEditingComponent = getEmptyFieldEditingComponent(props);
20
- return (React.createElement(React.Fragment, null, (EmptyFieldEditingComponent && React.createElement(EmptyFieldEditingComponent, null)) || (React.createElement(FieldComponent, Object.assign({}, props, { ref: ref })))));
26
+ const emptyFieldEditingComponent = getEmptyFieldEditingComponent(props);
27
+ return (emptyFieldEditingComponent || (React.createElement(FieldComponent, Object.assign({}, props, { ref: ref }))));
21
28
  });
22
29
  }
23
30
  return (props) => {
24
- const EmptyFieldEditingComponent = getEmptyFieldEditingComponent(props);
25
- return (React.createElement(React.Fragment, null, (EmptyFieldEditingComponent && React.createElement(EmptyFieldEditingComponent, null)) || (React.createElement(FieldComponent, Object.assign({}, props)))));
31
+ const emptyFieldEditingComponent = getEmptyFieldEditingComponent(props);
32
+ return emptyFieldEditingComponent || React.createElement(FieldComponent, Object.assign({}, props));
26
33
  };
27
34
  }
@@ -1,3 +1,4 @@
1
+ 'use client';
1
2
  import React from 'react';
2
3
  import { SitecoreProviderReactContext, } from '../components/SitecoreProvider';
3
4
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sitecore-content-sdk/react",
3
- "version": "1.2.0-canary.1",
3
+ "version": "1.2.0-canary.11",
4
4
  "main": "dist/cjs/index.js",
5
5
  "module": "dist/esm/index.js",
6
6
  "sideEffects": false,
@@ -72,12 +72,12 @@
72
72
  "react-dom": "^19.1.0"
73
73
  },
74
74
  "dependencies": {
75
- "@sitecore-content-sdk/core": "1.2.0-canary.1",
75
+ "@sitecore-content-sdk/core": "1.2.0-canary.11",
76
76
  "fast-deep-equal": "^3.1.3"
77
77
  },
78
78
  "description": "",
79
79
  "types": "types/index.d.ts",
80
- "gitHead": "565f6fc2a2cb57ddcaf3dddb6e0a416a996eeb80",
80
+ "gitHead": "9bca85610fb5ee5f98e918ae3dd4734419ecdfe3",
81
81
  "files": [
82
82
  "dist",
83
83
  "types"
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { EditableFieldProps } from './sharedTypes';
3
3
  import { FieldMetadata } from '@sitecore-content-sdk/core/layout';
4
- export interface DateFieldProps extends EditableFieldProps {
4
+ export interface DateFieldProps extends EditableFieldProps<DateFieldProps> {
5
5
  /** The date field data. */
6
6
  [htmlAttributes: string]: unknown;
7
7
  field: FieldMetadata & {
@@ -1,3 +1,9 @@
1
1
  import React from 'react';
2
- export declare const DefaultEmptyFieldEditingComponentText: React.FC;
3
- export declare const DefaultEmptyFieldEditingComponentImage: React.FC;
2
+ export declare const DefaultEmptyFieldEditingComponentText: React.FC<{
3
+ [key: string]: unknown;
4
+ tag?: string;
5
+ }>;
6
+ export declare const DefaultEmptyFieldEditingComponentImage: React.FC<{
7
+ [key: string]: unknown;
8
+ className?: string;
9
+ }>;
@@ -25,7 +25,7 @@ export interface ImageSizeParameters {
25
25
  /** Image scale. Defaults to 1.0 */
26
26
  sc?: number;
27
27
  }
28
- export interface ImageProps extends EditableFieldProps {
28
+ export interface ImageProps extends EditableFieldProps<ImageProps> {
29
29
  [attributeName: string]: unknown;
30
30
  /** Image field data (consistent with other field types) */
31
31
  field?: (ImageField | ImageFieldValue) & FieldMetadata;
@@ -16,7 +16,7 @@ export interface LinkFieldValue {
16
16
  export interface LinkField {
17
17
  value: LinkFieldValue;
18
18
  }
19
- export type LinkProps = EditableFieldProps & React.AnchorHTMLAttributes<HTMLAnchorElement> & RefAttributes<HTMLAnchorElement> & {
19
+ export type LinkProps = EditableFieldProps<LinkProps> & React.AnchorHTMLAttributes<HTMLAnchorElement> & RefAttributes<HTMLAnchorElement> & {
20
20
  /** The link field data. */
21
21
  field: (LinkField | LinkFieldValue) & FieldMetadata;
22
22
  /**
@@ -4,7 +4,7 @@ import { FieldMetadata } from '@sitecore-content-sdk/core/layout';
4
4
  export interface RichTextField extends FieldMetadata {
5
5
  value?: string;
6
6
  }
7
- export interface RichTextProps extends EditableFieldProps {
7
+ export interface RichTextProps extends EditableFieldProps<RichTextProps> {
8
8
  [htmlAttributes: string]: unknown;
9
9
  /** The rich text field data. */
10
10
  field?: RichTextField;
@@ -4,7 +4,7 @@ import { FieldMetadata } from '@sitecore-content-sdk/core/layout';
4
4
  export interface TextField extends FieldMetadata {
5
5
  value?: string | number;
6
6
  }
7
- export interface TextProps extends EditableFieldProps {
7
+ export interface TextProps extends EditableFieldProps<TextProps> {
8
8
  [htmlAttributes: string]: unknown;
9
9
  /** The text field data. */
10
10
  field?: TextField;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Shared editing field props
3
3
  */
4
- export interface EditableFieldProps {
4
+ export interface EditableFieldProps<EmptyFieldEditingComponentProps = unknown> {
5
5
  /**
6
6
  * Can be used to explicitly disable inline editing.
7
7
  * @default true
@@ -10,5 +10,5 @@ export interface EditableFieldProps {
10
10
  /**
11
11
  * Custom element to render in Pages in edit mode if field value is empty
12
12
  */
13
- emptyFieldEditingComponent?: React.ComponentClass<unknown> | React.FC<unknown>;
13
+ emptyFieldEditingComponent?: React.ComponentClass<EmptyFieldEditingComponentProps> | React.FC<EmptyFieldEditingComponentProps>;
14
14
  }
@@ -13,15 +13,15 @@ export interface WithEmptyFieldEditingComponentOptions {
13
13
  */
14
14
  isForwardRef?: boolean;
15
15
  }
16
- interface WithEmptyFieldEditingComponentProps {
16
+ interface WithEmptyFieldEditingComponentProps<Props> {
17
17
  field?: (Partial<Field> | GenericFieldValue) & FieldMetadata;
18
18
  editable?: boolean;
19
- emptyFieldEditingComponent?: React.ComponentClass | React.FC;
19
+ emptyFieldEditingComponent?: React.ComponentClass<Props> | React.FC<Props>;
20
20
  }
21
21
  /**
22
22
  * Returns the passed field component or default component in case field value is empty and edit mode is 'metadata'
23
23
  * @param {ComponentType<FieldComponentProps>} FieldComponent the field component
24
24
  * @param {WithEmptyFieldEditingComponentProps} options the options of the HOC;
25
25
  */
26
- export declare function withEmptyFieldEditingComponent<FieldComponentProps extends WithEmptyFieldEditingComponentProps, RefElementType = HTMLElement>(FieldComponent: ComponentType<FieldComponentProps>, options: WithEmptyFieldEditingComponentOptions): React.ForwardRefExoticComponent<React.PropsWithoutRef<FieldComponentProps> & React.RefAttributes<RefElementType>> | ((props: FieldComponentProps) => React.JSX.Element);
26
+ export declare function withEmptyFieldEditingComponent<FieldComponentProps extends WithEmptyFieldEditingComponentProps<FieldComponentProps>, RefElementType = HTMLElement>(FieldComponent: ComponentType<FieldComponentProps>, options: WithEmptyFieldEditingComponentOptions): React.ForwardRefExoticComponent<React.PropsWithoutRef<FieldComponentProps> & React.RefAttributes<RefElementType>> | ((props: FieldComponentProps) => React.JSX.Element);
27
27
  export {};