@sitecore-content-sdk/react 0.1.0-beta.4 → 0.1.0-beta.41

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 (46) hide show
  1. package/README.md +5 -4
  2. package/dist/cjs/components/{ComponentLibraryLayout.js → DesignLibrary.js} +5 -5
  3. package/dist/cjs/components/EditingScripts.js +20 -7
  4. package/dist/cjs/components/Form.js +75 -0
  5. package/dist/cjs/components/Placeholder.js +4 -4
  6. package/dist/cjs/components/PlaceholderCommon.js +16 -9
  7. package/dist/cjs/components/SitecoreContext.js +11 -4
  8. package/dist/cjs/components/sharedTypes/components.js +7 -0
  9. package/dist/cjs/components/sharedTypes/index.js +18 -0
  10. package/dist/cjs/enhancers/{withComponentFactory.js → withComponentMap.js} +7 -7
  11. package/dist/cjs/enhancers/withPlaceholder.js +3 -3
  12. package/dist/cjs/enhancers/withSitecoreContext.js +2 -2
  13. package/dist/cjs/index.js +11 -9
  14. package/dist/esm/components/{ComponentLibraryLayout.js → DesignLibrary.js} +4 -4
  15. package/dist/esm/components/EditingScripts.js +21 -8
  16. package/dist/esm/components/Form.js +38 -0
  17. package/dist/esm/components/Placeholder.js +4 -4
  18. package/dist/esm/components/PlaceholderCommon.js +16 -9
  19. package/dist/esm/components/SitecoreContext.js +10 -3
  20. package/dist/esm/components/sharedTypes/components.js +4 -0
  21. package/dist/esm/components/sharedTypes/index.js +2 -0
  22. package/dist/esm/enhancers/withComponentMap.js +20 -0
  23. package/dist/esm/enhancers/withPlaceholder.js +3 -3
  24. package/dist/esm/enhancers/withSitecoreContext.js +3 -3
  25. package/dist/esm/index.js +5 -4
  26. package/package.json +10 -7
  27. package/types/components/DesignLibrary.d.ts +2 -0
  28. package/types/components/EditingScripts.d.ts +15 -2
  29. package/types/components/Form.d.ts +24 -0
  30. package/types/components/PlaceholderCommon.d.ts +7 -7
  31. package/types/components/SitecoreContext.d.ts +7 -4
  32. package/types/components/sharedTypes/components.d.ts +32 -0
  33. package/types/components/sharedTypes/index.d.ts +2 -0
  34. package/types/components/sharedTypes/props.d.ts +14 -0
  35. package/types/enhancers/withComponentMap.d.ts +12 -0
  36. package/types/enhancers/withSitecoreContext.d.ts +3 -6
  37. package/types/index.d.ts +6 -5
  38. package/dist/cjs/ComponentBuilder.js +0 -25
  39. package/dist/esm/ComponentBuilder.js +0 -21
  40. package/dist/esm/enhancers/withComponentFactory.js +0 -20
  41. package/types/ComponentBuilder.d.ts +0 -27
  42. package/types/components/ComponentLibraryLayout.d.ts +0 -2
  43. package/types/components/sharedTypes.d.ts +0 -28
  44. package/types/enhancers/withComponentFactory.d.ts +0 -12
  45. /package/dist/cjs/components/{sharedTypes.js → sharedTypes/props.js} +0 -0
  46. /package/dist/esm/components/{sharedTypes.js → sharedTypes/props.js} +0 -0
package/README.md CHANGED
@@ -1,10 +1,11 @@
1
- # Sitecore JavaScript Rendering SDK for React
1
+ # Sitecore Content SDK for React
2
2
 
3
- This module is provided as a part of Sitecore JavaScript Rendering SDK (JSS). It contains React components and integration for JSS.
3
+ This module is provided as a part of Sitecore Content SDK. It contains React components and integration for Sitecore Content SDK.
4
4
 
5
5
  <!---
6
- @TODO: use new name when decided
6
+ @TODO: Update link with appropriate page when avaiable
7
7
  -->
8
- [Documentation (XM Cloud)](https://doc.sitecore.com/xmc/en/developers/xm-cloud/sitecore-javascript-rendering-sdk--jss--for-next-js.html)
8
+
9
+ [Documentation](https://doc.sitecore.com/xmc/en/developers/xm-cloud/sitecore-javascript-rendering-sdk--jss--for-next-js.html)
9
10
 
10
11
  [API reference documentation](/ref-docs/react/)
@@ -33,13 +33,13 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.ComponentLibraryLayout = void 0;
36
+ exports.DesignLibrary = void 0;
37
37
  const react_1 = __importStar(require("react"));
38
38
  const Placeholder_1 = require("./Placeholder");
39
39
  const layout_1 = require("@sitecore-content-sdk/core/layout");
40
40
  const editing_1 = require("@sitecore-content-sdk/core/editing");
41
41
  const EditingScripts_1 = require("./EditingScripts");
42
- const ComponentLibraryLayout = (layoutData) => {
42
+ const DesignLibrary = (layoutData) => {
43
43
  const { route } = layoutData.sitecore;
44
44
  const [renderKey, setRenderKey] = (0, react_1.useState)(0);
45
45
  const [rootUpdate, setRootUpdate] = (0, react_1.useState)(null);
@@ -56,7 +56,7 @@ const ComponentLibraryLayout = (layoutData) => {
56
56
  // useEffect will fire when components are ready - and we inform the whole wide world of it too
57
57
  if (!componentReady) {
58
58
  componentReady = true;
59
- window.top.postMessage((0, editing_1.getComponentLibraryStatusEvent)(editing_1.ComponentLibraryStatus.READY, rootComponent.uid), '*');
59
+ window.top.postMessage((0, editing_1.getDesignLibraryStatusEvent)(editing_1.DesignLibraryStatus.READY, rootComponent.uid), '*');
60
60
  }
61
61
  const unsubscribe = (0, editing_1.addComponentUpdateHandler)(persistedRoot, (updatedRoot) => {
62
62
  setRootUpdate(Object.assign({}, updatedRoot));
@@ -70,11 +70,11 @@ const ComponentLibraryLayout = (layoutData) => {
70
70
  if (renderKey === 0) {
71
71
  return;
72
72
  }
73
- window.top.postMessage((0, editing_1.getComponentLibraryStatusEvent)(editing_1.ComponentLibraryStatus.RENDERED, rootComponent.uid), '*');
73
+ window.top.postMessage((0, editing_1.getDesignLibraryStatusEvent)(editing_1.DesignLibraryStatus.RENDERED, rootComponent.uid), '*');
74
74
  }, [renderKey, rootComponent.uid]);
75
75
  return (react_1.default.createElement(react_1.default.Fragment, null,
76
76
  react_1.default.createElement(EditingScripts_1.EditingScripts, null),
77
77
  react_1.default.createElement("main", null,
78
78
  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 }))))));
79
79
  };
80
- exports.ComponentLibraryLayout = ComponentLibraryLayout;
80
+ exports.DesignLibrary = DesignLibrary;
@@ -8,17 +8,30 @@ const react_1 = __importDefault(require("react"));
8
8
  const layout_1 = require("@sitecore-content-sdk/core/layout");
9
9
  const withSitecoreContext_1 = require("../enhancers/withSitecoreContext");
10
10
  const editing_1 = require("@sitecore-content-sdk/core/editing");
11
+ const editing_2 = require("@sitecore-content-sdk/core/editing");
11
12
  /**
12
- * Renders client scripts and data for editing/preview mode in Pages.
13
+ * Renders client scripts and data for editing/preview mode for Pages.
14
+ * Renders script required for the Design Library (when RenderingType is `component`).
15
+ * @param {EditingScriptsProps} props - The props for the EditingScripts component.
16
+ * @param {string} props.sitecoreEdgeUrl - Sitecore Edge Platform URL.
17
+ * @returns A JSX element containing the editing scripts or an empty fragment if not in editing/preview mode.
13
18
  */
14
- const EditingScripts = () => {
15
- const { sitecoreContext: { pageState, clientData, clientScripts }, } = (0, withSitecoreContext_1.useSitecoreContext)();
16
- // Don't render anything if not in editing/preview mode
17
- if (pageState === layout_1.LayoutServicePageState.Normal ||
18
- pageState === layout_1.LayoutServicePageState.Preview ||
19
- !pageState) {
19
+ const EditingScripts = (props) => {
20
+ const { sitecoreContext: { pageState, clientData, clientScripts, renderingType }, } = (0, withSitecoreContext_1.useSitecoreContext)();
21
+ // Don't render anything if not in editing/preview mode and rendering type is not component
22
+ if (renderingType !== layout_1.RenderingType.Component &&
23
+ (pageState === layout_1.LayoutServicePageState.Normal ||
24
+ pageState === layout_1.LayoutServicePageState.Preview ||
25
+ !pageState)) {
20
26
  return react_1.default.createElement(react_1.default.Fragment, null);
21
27
  }
28
+ // In case of RenderingType.Component - render only the script for Design Libnrary
29
+ if (renderingType === layout_1.RenderingType.Component) {
30
+ // Add cache buster to the script URL
31
+ const scriptUrl = `${(0, editing_2.getDesignLibraryScriptLink)(props.sitecoreEdgeUrl)}?cb=${Date.now()}`;
32
+ return (react_1.default.createElement(react_1.default.Fragment, null,
33
+ react_1.default.createElement("script", { src: scriptUrl, suppressHydrationWarning: true })));
34
+ }
22
35
  const jssClientData = Object.assign(Object.assign({}, clientData), (0, editing_1.getJssPagesClientData)());
23
36
  return (react_1.default.createElement(react_1.default.Fragment, null, clientScripts === null || clientScripts === void 0 ? void 0 :
24
37
  clientScripts.map((src, index) => (react_1.default.createElement("script", { src: src, key: index }))),
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.Form = void 0;
37
+ const react_1 = __importStar(require("react"));
38
+ const form_1 = require("@sitecore-content-sdk/core/form");
39
+ const withSitecoreContext_1 = require("../enhancers/withSitecoreContext");
40
+ const Form = ({ params, rendering }) => {
41
+ var _a;
42
+ const id = params === null || params === void 0 ? void 0 : params.RenderingIdentifier;
43
+ const [error, setError] = (0, react_1.useState)(false);
44
+ const [content, setContent] = (0, react_1.useState)('');
45
+ const context = (0, withSitecoreContext_1.useSitecoreContext)();
46
+ const formRef = (0, react_1.useRef)(null);
47
+ const isEditing = context.sitecoreContext.pageEditing;
48
+ (0, react_1.useEffect)(() => {
49
+ var _a, _b, _c, _d;
50
+ if (!content) {
51
+ (0, form_1.loadForm)((_b = (_a = context.api) === null || _a === void 0 ? void 0 : _a.edge) === null || _b === void 0 ? void 0 : _b.contextId, params.FormId, (_d = (_c = context.api) === null || _c === void 0 ? void 0 : _c.edge) === null || _d === void 0 ? void 0 : _d.edgeUrl)
52
+ .then(setContent)
53
+ .catch(() => {
54
+ if (isEditing) {
55
+ console.error(`Failed to load form with id ${params.FormId}. Check debug logs for sitecore-jss:form for more details.`);
56
+ }
57
+ setError(true);
58
+ });
59
+ }
60
+ else {
61
+ // If we are in editing mode, we don't want to send any events
62
+ if (!isEditing) {
63
+ (0, form_1.subscribeToFormSubmitEvent)(formRef.current, rendering.uid);
64
+ }
65
+ (0, form_1.executeScriptElements)(formRef.current);
66
+ }
67
+ }, [content]);
68
+ if (isEditing) {
69
+ if (error) {
70
+ return (react_1.default.createElement("div", { className: "sc-jss-placeholder-error" }, "There was a problem loading this section"));
71
+ }
72
+ }
73
+ return (react_1.default.createElement("div", { ref: formRef, dangerouslySetInnerHTML: { __html: content }, className: (_a = params.styles) === null || _a === void 0 ? void 0 : _a.trimEnd(), id: id ? id : undefined }));
74
+ };
75
+ exports.Form = Form;
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.Placeholder = void 0;
7
7
  const react_1 = __importDefault(require("react"));
8
8
  const PlaceholderCommon_1 = require("./PlaceholderCommon");
9
- const withComponentFactory_1 = require("../enhancers/withComponentFactory");
9
+ const withComponentMap_1 = require("../enhancers/withComponentMap");
10
10
  const editing_1 = require("@sitecore-content-sdk/core/editing");
11
11
  const withSitecoreContext_1 = require("../enhancers/withSitecoreContext");
12
12
  class PlaceholderComponent extends PlaceholderCommon_1.PlaceholderCommon {
@@ -30,7 +30,7 @@ class PlaceholderComponent extends PlaceholderCommon_1.PlaceholderCommon {
30
30
  render() {
31
31
  var _a, _b;
32
32
  const childProps = Object.assign({}, this.props);
33
- delete childProps.componentFactory;
33
+ delete childProps.componentMap;
34
34
  if (this.state.error) {
35
35
  if (childProps.errorComponent) {
36
36
  return react_1.default.createElement(childProps.errorComponent, { error: this.state.error });
@@ -68,5 +68,5 @@ class PlaceholderComponent extends PlaceholderCommon_1.PlaceholderCommon {
68
68
  }
69
69
  }
70
70
  PlaceholderComponent.propTypes = PlaceholderCommon_1.PlaceholderCommon.propTypes;
71
- const PlaceholderWithComponentFactory = (0, withComponentFactory_1.withComponentFactory)(PlaceholderComponent);
72
- exports.Placeholder = (0, withSitecoreContext_1.withSitecoreContext)()(PlaceholderWithComponentFactory);
71
+ const PlaceholderWithComponentMap = (0, withComponentMap_1.withComponentMap)(PlaceholderComponent);
72
+ exports.Placeholder = (0, withSitecoreContext_1.withSitecoreContext)()(PlaceholderWithComponentMap);
@@ -18,6 +18,7 @@ exports.PlaceholderCommon = void 0;
18
18
  const react_1 = __importDefault(require("react"));
19
19
  const prop_types_1 = __importDefault(require("prop-types"));
20
20
  const MissingComponent_1 = require("./MissingComponent");
21
+ const sharedTypes_1 = require("./sharedTypes");
21
22
  const layout_1 = require("@sitecore-content-sdk/core/layout");
22
23
  const core_1 = require("@sitecore-content-sdk/core");
23
24
  const HiddenRendering_1 = require("./HiddenRendering");
@@ -102,7 +103,7 @@ class PlaceholderCommon extends react_1.default.Component {
102
103
  else {
103
104
  component = this.getComponentForRendering(componentRendering);
104
105
  }
105
- // Fallback/defaults for Sitecore Component renderings (in case not defined in component factory)
106
+ // Fallback/defaults for Sitecore Component renderings (in case not defined in component map)
106
107
  if (!component) {
107
108
  if (componentRendering.componentName === FEaaSComponent_1.FEAAS_COMPONENT_RENDERING_NAME) {
108
109
  component = FEaaSComponent_1.FEaaSComponent;
@@ -118,7 +119,7 @@ class PlaceholderCommon extends react_1.default.Component {
118
119
  }
119
120
  }
120
121
  if (!component) {
121
- console.error(`Placeholder ${name} contains unknown component ${componentRendering.componentName}. Ensure that a React component exists for it, and that it is registered in your componentFactory.js.`);
122
+ console.error(`Placeholder ${name} contains unknown component ${componentRendering.componentName}. Ensure that a React component exists for it, and that it is registered in your component-map file.`);
122
123
  component = missingComponentComponent !== null && missingComponentComponent !== void 0 ? missingComponentComponent : MissingComponent_1.MissingComponent;
123
124
  isEmpty = true;
124
125
  }
@@ -151,16 +152,22 @@ class PlaceholderCommon extends react_1.default.Component {
151
152
  }
152
153
  getComponentForRendering(renderingDefinition) {
153
154
  var _a;
154
- const componentFactory = this.props.componentFactory;
155
- if (!componentFactory || typeof componentFactory !== 'function') {
156
- console.warn(`No componentFactory was available to service request for component ${renderingDefinition}`);
155
+ const componentMap = this.props.componentMap;
156
+ if (!componentMap || componentMap.size === 0) {
157
+ console.warn(`No components were available in component map to service request for component ${renderingDefinition}`);
157
158
  return null;
158
159
  }
159
- // Render SXA Rendering Variant
160
- if ((_a = renderingDefinition.params) === null || _a === void 0 ? void 0 : _a.FieldNames) {
161
- return componentFactory(renderingDefinition.componentName, renderingDefinition.params.FieldNames);
160
+ // Render SXA Rendering Variant if available
161
+ const exportName = (_a = renderingDefinition.params) === null || _a === void 0 ? void 0 : _a.FieldNames;
162
+ const component = componentMap.get(renderingDefinition.componentName);
163
+ if (!component)
164
+ return null;
165
+ if (exportName && exportName !== sharedTypes_1.DEFAULT_EXPORT_NAME) {
166
+ return component[exportName];
162
167
  }
163
- return componentFactory(renderingDefinition.componentName);
168
+ return (component.default ||
169
+ component.Default ||
170
+ component);
164
171
  }
165
172
  }
166
173
  exports.PlaceholderCommon = PlaceholderCommon;
@@ -3,15 +3,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.SitecoreContext = exports.ComponentFactoryReactContext = exports.SitecoreContextReactContext = void 0;
6
+ exports.SitecoreContext = exports.ComponentMapReactContext = exports.SitecoreContextReactContext = void 0;
7
7
  /* eslint-disable @typescript-eslint/no-explicit-any */
8
8
  const react_1 = __importDefault(require("react"));
9
9
  const prop_types_1 = __importDefault(require("prop-types"));
10
10
  const react_2 = __importDefault(require("fast-deep-equal/es6/react"));
11
+ const core_1 = require("@sitecore-content-sdk/core");
11
12
  exports.SitecoreContextReactContext = react_1.default.createContext({});
12
- exports.ComponentFactoryReactContext = react_1.default.createContext({});
13
+ exports.ComponentMapReactContext = react_1.default.createContext(new Map());
13
14
  class SitecoreContext extends react_1.default.Component {
14
15
  constructor(props) {
16
+ var _a, _b, _c, _d;
15
17
  super(props);
16
18
  /**
17
19
  * Update context state. Value can be @type {LayoutServiceData} which will be automatically transformed
@@ -26,9 +28,14 @@ class SitecoreContext extends react_1.default.Component {
26
28
  });
27
29
  };
28
30
  const context = this.constructContext(props.layoutData);
31
+ let api = props.api;
32
+ if (((_b = (_a = props.api) === null || _a === void 0 ? void 0 : _a.edge) === null || _b === void 0 ? void 0 : _b.contextId) && !((_d = (_c = props.api) === null || _c === void 0 ? void 0 : _c.edge) === null || _d === void 0 ? void 0 : _d.edgeUrl)) {
33
+ api = Object.assign(Object.assign({}, props.api), { edge: Object.assign(Object.assign({}, props.api.edge), { edgeUrl: core_1.constants.SITECORE_EDGE_URL_DEFAULT }) });
34
+ }
29
35
  this.state = {
30
36
  context,
31
37
  setContext: this.setContext,
38
+ api,
32
39
  };
33
40
  }
34
41
  constructContext(layoutData) {
@@ -49,14 +56,14 @@ class SitecoreContext extends react_1.default.Component {
49
56
  }
50
57
  }
51
58
  render() {
52
- return (react_1.default.createElement(exports.ComponentFactoryReactContext.Provider, { value: this.props.componentFactory },
59
+ return (react_1.default.createElement(exports.ComponentMapReactContext.Provider, { value: this.props.componentMap },
53
60
  react_1.default.createElement(exports.SitecoreContextReactContext.Provider, { value: this.state }, this.props.children)));
54
61
  }
55
62
  }
56
63
  exports.SitecoreContext = SitecoreContext;
57
64
  SitecoreContext.propTypes = {
58
65
  children: prop_types_1.default.any.isRequired,
59
- componentFactory: prop_types_1.default.func,
66
+ componentMap: prop_types_1.default.instanceOf(Map),
60
67
  layoutData: prop_types_1.default.shape({
61
68
  sitecore: prop_types_1.default.shape({
62
69
  context: prop_types_1.default.any,
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_EXPORT_NAME = void 0;
4
+ /**
5
+ * SXA uses custom default export name
6
+ */
7
+ exports.DEFAULT_EXPORT_NAME = 'Default';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./components"), exports);
18
+ __exportStar(require("./props"), exports);
@@ -3,24 +3,24 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.withComponentFactory = withComponentFactory;
6
+ exports.withComponentMap = withComponentMap;
7
7
  const react_1 = __importDefault(require("react"));
8
8
  const SitecoreContext_1 = require("../components/SitecoreContext");
9
9
  const react_2 = require("react");
10
10
  /**
11
11
  * @param {React.ComponentClass<T> | React.FC<T>} Component
12
12
  */
13
- function withComponentFactory(Component) {
13
+ function withComponentMap(Component) {
14
14
  /**
15
15
  * @param {T} props - props to pass to the wrapped component
16
16
  * @returns {JSX.Element} - the rendered component
17
17
  */
18
- function WithComponentFactory(props) {
19
- const context = (0, react_2.useContext)(SitecoreContext_1.ComponentFactoryReactContext);
20
- return react_1.default.createElement(Component, Object.assign({}, props, { componentFactory: props.componentFactory || context }));
18
+ function WithComponentMap(props) {
19
+ const context = (0, react_2.useContext)(SitecoreContext_1.ComponentMapReactContext);
20
+ return react_1.default.createElement(Component, Object.assign({}, props, { componentMap: props.componentMap || context }));
21
21
  }
22
- WithComponentFactory.displayName = `withComponentFactory(${Component.displayName ||
22
+ WithComponentMap.displayName = `withComponentMap(${Component.displayName ||
23
23
  Component.name ||
24
24
  'Anonymous'})`;
25
- return WithComponentFactory;
25
+ return WithComponentMap;
26
26
  }
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.withPlaceholder = withPlaceholder;
7
7
  const react_1 = __importDefault(require("react"));
8
8
  const PlaceholderCommon_1 = require("../components/PlaceholderCommon");
9
- const withComponentFactory_1 = require("./withComponentFactory");
9
+ const withComponentMap_1 = require("./withComponentMap");
10
10
  const withSitecoreContext_1 = require("./withSitecoreContext");
11
11
  /**
12
12
  * @param {WithPlaceholderSpec} placeholders
@@ -20,7 +20,7 @@ function withPlaceholder(placeholders, options) {
20
20
  }
21
21
  render() {
22
22
  let childProps = Object.assign({}, this.props);
23
- delete childProps.componentFactory;
23
+ delete childProps.componentMap;
24
24
  if (options && options.propsTransformer) {
25
25
  childProps = options.propsTransformer(childProps);
26
26
  }
@@ -58,6 +58,6 @@ function withPlaceholder(placeholders, options) {
58
58
  }
59
59
  }
60
60
  WithPlaceholder.propTypes = PlaceholderCommon_1.PlaceholderCommon.propTypes;
61
- return (0, withSitecoreContext_1.withSitecoreContext)()((0, withComponentFactory_1.withComponentFactory)(WithPlaceholder));
61
+ return (0, withSitecoreContext_1.withSitecoreContext)()((0, withComponentMap_1.withComponentMap)(WithPlaceholder));
62
62
  };
63
63
  }
@@ -13,7 +13,7 @@ const SitecoreContext_1 = require("../components/SitecoreContext");
13
13
  function withSitecoreContext(options) {
14
14
  return function withSitecoreContextHoc(Component) {
15
15
  return function WithSitecoreContext(props) {
16
- return (react_1.default.createElement(SitecoreContext_1.SitecoreContextReactContext.Consumer, null, (context) => (react_1.default.createElement(Component, Object.assign({}, props, { sitecoreContext: context.context, updateSitecoreContext: options && options.updatable && context.setContext })))));
16
+ return (react_1.default.createElement(SitecoreContext_1.SitecoreContextReactContext.Consumer, null, (context) => (react_1.default.createElement(Component, Object.assign({}, props, { sitecoreContext: context.context, api: context.api, updateSitecoreContext: options && options.updatable && context.setContext })))));
17
17
  };
18
18
  };
19
19
  }
@@ -23,7 +23,6 @@ function withSitecoreContext(options) {
23
23
  * - pageEditing - Provided by Layout Service, a boolean indicating whether the route is being accessed via the Sitecore Editor.
24
24
  * - pageState - Like pageEditing, but a string: normal, preview or edit.
25
25
  * - site - Provided by Layout Service, an object containing the name of the current Sitecore site context.
26
- * @see https://jss.sitecore.com/docs/techniques/extending-layout-service/layoutservice-extending-context
27
26
  * @param {WithSitecoreContextOptions} [options] hook options
28
27
  * @example
29
28
  * const EditMode = () => {
@@ -42,6 +41,7 @@ function useSitecoreContext(options) {
42
41
  const reactContext = react_1.default.useContext(SitecoreContext_1.SitecoreContextReactContext);
43
42
  const updatable = options === null || options === void 0 ? void 0 : options.updatable;
44
43
  return {
44
+ api: reactContext.api,
45
45
  sitecoreContext: reactContext.context,
46
46
  updateSitecoreContext: updatable ? reactContext.setContext : undefined,
47
47
  };
package/dist/cjs/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DefaultEmptyFieldEditingComponentImage = exports.DefaultEmptyFieldEditingComponentText = exports.EditingScripts = exports.withEmptyFieldEditingComponent = exports.withFieldMetadata = exports.ComponentBuilder = exports.withDatasourceCheck = exports.withPlaceholder = exports.withEditorChromes = exports.useSitecoreContext = exports.withSitecoreContext = exports.SitecoreContextReactContext = exports.SitecoreContext = exports.File = exports.LinkPropTypes = exports.Link = exports.BYOCWrapper = exports.fetchBYOCComponentServerProps = exports.BYOCComponent = exports.ComponentLibraryLayout = exports.FEaaSWrapper = exports.fetchFEaaSComponentServerProps = exports.FEaaSComponent = exports.DateField = exports.Text = exports.RichTextPropTypes = exports.RichText = exports.Image = exports.Placeholder = exports.mediaApi = exports.GraphQLRequestClient = exports.DefaultRetryStrategy = exports.GraphQLDictionaryService = exports.EditMode = exports.getFieldValue = exports.getChildPlaceholder = exports.GraphQLLayoutService = exports.LayoutServicePageState = exports.getComponentLibraryStylesheetLinks = exports.getContentStylesheetLink = exports.resetEditorChromes = exports.isEditorActive = exports.NativeDataFetcher = exports.MemoryCacheClient = exports.ClientError = exports.enableDebug = exports.constants = void 0;
3
+ exports.GraphQLSitePathService = exports.DefaultEmptyFieldEditingComponentImage = exports.DefaultEmptyFieldEditingComponentText = exports.EditingScripts = exports.withEmptyFieldEditingComponent = exports.withFieldMetadata = exports.withDatasourceCheck = exports.withPlaceholder = exports.withEditorChromes = exports.useSitecoreContext = exports.withSitecoreContext = exports.SitecoreContextReactContext = exports.SitecoreContext = exports.File = exports.LinkPropTypes = exports.Link = exports.BYOCWrapper = exports.fetchBYOCComponentServerProps = exports.BYOCComponent = exports.DesignLibrary = exports.FEaaSWrapper = exports.fetchFEaaSComponentServerProps = exports.FEaaSComponent = exports.DateField = exports.Text = exports.RichTextPropTypes = exports.RichText = exports.Image = exports.Placeholder = exports.Form = exports.mediaApi = exports.GraphQLRequestClient = exports.DefaultRetryStrategy = exports.GraphQLDictionaryService = exports.EditMode = exports.getFieldValue = exports.getChildPlaceholder = exports.GraphQLLayoutService = exports.LayoutServicePageState = exports.getDesignLibraryStylesheetLinks = exports.getContentStylesheetLink = exports.resetEditorChromes = exports.isEditorActive = exports.NativeDataFetcher = exports.MemoryCacheClient = exports.ClientError = exports.enableDebug = exports.constants = void 0;
4
4
  var core_1 = require("@sitecore-content-sdk/core");
5
5
  Object.defineProperty(exports, "constants", { enumerable: true, get: function () { return core_1.constants; } });
6
6
  Object.defineProperty(exports, "enableDebug", { enumerable: true, get: function () { return core_1.enableDebug; } });
@@ -12,7 +12,7 @@ Object.defineProperty(exports, "isEditorActive", { enumerable: true, get: functi
12
12
  Object.defineProperty(exports, "resetEditorChromes", { enumerable: true, get: function () { return editing_1.resetEditorChromes; } });
13
13
  var layout_1 = require("@sitecore-content-sdk/core/layout");
14
14
  Object.defineProperty(exports, "getContentStylesheetLink", { enumerable: true, get: function () { return layout_1.getContentStylesheetLink; } });
15
- Object.defineProperty(exports, "getComponentLibraryStylesheetLinks", { enumerable: true, get: function () { return layout_1.getComponentLibraryStylesheetLinks; } });
15
+ Object.defineProperty(exports, "getDesignLibraryStylesheetLinks", { enumerable: true, get: function () { return layout_1.getDesignLibraryStylesheetLinks; } });
16
16
  Object.defineProperty(exports, "LayoutServicePageState", { enumerable: true, get: function () { return layout_1.LayoutServicePageState; } });
17
17
  Object.defineProperty(exports, "GraphQLLayoutService", { enumerable: true, get: function () { return layout_1.GraphQLLayoutService; } });
18
18
  Object.defineProperty(exports, "getChildPlaceholder", { enumerable: true, get: function () { return layout_1.getChildPlaceholder; } });
@@ -20,11 +20,13 @@ Object.defineProperty(exports, "getFieldValue", { enumerable: true, get: functio
20
20
  Object.defineProperty(exports, "EditMode", { enumerable: true, get: function () { return layout_1.EditMode; } });
21
21
  var i18n_1 = require("@sitecore-content-sdk/core/i18n");
22
22
  Object.defineProperty(exports, "GraphQLDictionaryService", { enumerable: true, get: function () { return i18n_1.GraphQLDictionaryService; } });
23
- var graphql_1 = require("@sitecore-content-sdk/core/graphql");
24
- Object.defineProperty(exports, "DefaultRetryStrategy", { enumerable: true, get: function () { return graphql_1.DefaultRetryStrategy; } });
25
- Object.defineProperty(exports, "GraphQLRequestClient", { enumerable: true, get: function () { return graphql_1.GraphQLRequestClient; } });
23
+ var client_1 = require("@sitecore-content-sdk/core/client");
24
+ Object.defineProperty(exports, "DefaultRetryStrategy", { enumerable: true, get: function () { return client_1.DefaultRetryStrategy; } });
25
+ Object.defineProperty(exports, "GraphQLRequestClient", { enumerable: true, get: function () { return client_1.GraphQLRequestClient; } });
26
26
  var media_1 = require("@sitecore-content-sdk/core/media");
27
27
  Object.defineProperty(exports, "mediaApi", { enumerable: true, get: function () { return media_1.mediaApi; } });
28
+ var Form_1 = require("./components/Form");
29
+ Object.defineProperty(exports, "Form", { enumerable: true, get: function () { return Form_1.Form; } });
28
30
  var Placeholder_1 = require("./components/Placeholder");
29
31
  Object.defineProperty(exports, "Placeholder", { enumerable: true, get: function () { return Placeholder_1.Placeholder; } });
30
32
  var Image_1 = require("./components/Image");
@@ -41,8 +43,8 @@ Object.defineProperty(exports, "FEaaSComponent", { enumerable: true, get: functi
41
43
  Object.defineProperty(exports, "fetchFEaaSComponentServerProps", { enumerable: true, get: function () { return FEaaSComponent_1.fetchFEaaSComponentServerProps; } });
42
44
  var FEaaSWrapper_1 = require("./components/FEaaSWrapper");
43
45
  Object.defineProperty(exports, "FEaaSWrapper", { enumerable: true, get: function () { return FEaaSWrapper_1.FEaaSWrapper; } });
44
- var ComponentLibraryLayout_1 = require("./components/ComponentLibraryLayout");
45
- Object.defineProperty(exports, "ComponentLibraryLayout", { enumerable: true, get: function () { return ComponentLibraryLayout_1.ComponentLibraryLayout; } });
46
+ var DesignLibrary_1 = require("./components/DesignLibrary");
47
+ Object.defineProperty(exports, "DesignLibrary", { enumerable: true, get: function () { return DesignLibrary_1.DesignLibrary; } });
46
48
  var BYOCComponent_1 = require("./components/BYOCComponent");
47
49
  Object.defineProperty(exports, "BYOCComponent", { enumerable: true, get: function () { return BYOCComponent_1.BYOCComponent; } });
48
50
  Object.defineProperty(exports, "fetchBYOCComponentServerProps", { enumerable: true, get: function () { return BYOCComponent_1.fetchBYOCComponentServerProps; } });
@@ -65,8 +67,6 @@ var withPlaceholder_1 = require("./enhancers/withPlaceholder");
65
67
  Object.defineProperty(exports, "withPlaceholder", { enumerable: true, get: function () { return withPlaceholder_1.withPlaceholder; } });
66
68
  var withDatasourceCheck_1 = require("./enhancers/withDatasourceCheck");
67
69
  Object.defineProperty(exports, "withDatasourceCheck", { enumerable: true, get: function () { return withDatasourceCheck_1.withDatasourceCheck; } });
68
- var ComponentBuilder_1 = require("./ComponentBuilder");
69
- Object.defineProperty(exports, "ComponentBuilder", { enumerable: true, get: function () { return ComponentBuilder_1.ComponentBuilder; } });
70
70
  var withFieldMetadata_1 = require("./enhancers/withFieldMetadata");
71
71
  Object.defineProperty(exports, "withFieldMetadata", { enumerable: true, get: function () { return withFieldMetadata_1.withFieldMetadata; } });
72
72
  var withEmptyFieldEditingComponent_1 = require("./enhancers/withEmptyFieldEditingComponent");
@@ -76,3 +76,5 @@ Object.defineProperty(exports, "EditingScripts", { enumerable: true, get: functi
76
76
  var DefaultEmptyFieldEditingComponents_1 = require("./components/DefaultEmptyFieldEditingComponents");
77
77
  Object.defineProperty(exports, "DefaultEmptyFieldEditingComponentText", { enumerable: true, get: function () { return DefaultEmptyFieldEditingComponents_1.DefaultEmptyFieldEditingComponentText; } });
78
78
  Object.defineProperty(exports, "DefaultEmptyFieldEditingComponentImage", { enumerable: true, get: function () { return DefaultEmptyFieldEditingComponents_1.DefaultEmptyFieldEditingComponentImage; } });
79
+ var site_1 = require("@sitecore-content-sdk/core/site");
80
+ Object.defineProperty(exports, "GraphQLSitePathService", { enumerable: true, get: function () { return site_1.GraphQLSitePathService; } });
@@ -1,9 +1,9 @@
1
1
  import React, { useEffect, useMemo, useState } from 'react';
2
2
  import { Placeholder } from './Placeholder';
3
3
  import { EDITING_COMPONENT_ID, EDITING_COMPONENT_PLACEHOLDER, } from '@sitecore-content-sdk/core/layout';
4
- import { ComponentLibraryStatus, getComponentLibraryStatusEvent, addComponentUpdateHandler, } from '@sitecore-content-sdk/core/editing';
4
+ import { DesignLibraryStatus, getDesignLibraryStatusEvent, addComponentUpdateHandler, } from '@sitecore-content-sdk/core/editing';
5
5
  import { EditingScripts } from './EditingScripts';
6
- export const ComponentLibraryLayout = (layoutData) => {
6
+ export const DesignLibrary = (layoutData) => {
7
7
  const { route } = layoutData.sitecore;
8
8
  const [renderKey, setRenderKey] = useState(0);
9
9
  const [rootUpdate, setRootUpdate] = useState(null);
@@ -20,7 +20,7 @@ export const ComponentLibraryLayout = (layoutData) => {
20
20
  // useEffect will fire when components are ready - and we inform the whole wide world of it too
21
21
  if (!componentReady) {
22
22
  componentReady = true;
23
- window.top.postMessage(getComponentLibraryStatusEvent(ComponentLibraryStatus.READY, rootComponent.uid), '*');
23
+ window.top.postMessage(getDesignLibraryStatusEvent(DesignLibraryStatus.READY, rootComponent.uid), '*');
24
24
  }
25
25
  const unsubscribe = addComponentUpdateHandler(persistedRoot, (updatedRoot) => {
26
26
  setRootUpdate(Object.assign({}, updatedRoot));
@@ -34,7 +34,7 @@ export const ComponentLibraryLayout = (layoutData) => {
34
34
  if (renderKey === 0) {
35
35
  return;
36
36
  }
37
- window.top.postMessage(getComponentLibraryStatusEvent(ComponentLibraryStatus.RENDERED, rootComponent.uid), '*');
37
+ window.top.postMessage(getDesignLibraryStatusEvent(DesignLibraryStatus.RENDERED, rootComponent.uid), '*');
38
38
  }, [renderKey, rootComponent.uid]);
39
39
  return (React.createElement(React.Fragment, null,
40
40
  React.createElement(EditingScripts, null),
@@ -1,18 +1,31 @@
1
1
  import React from 'react';
2
- import { LayoutServicePageState } from '@sitecore-content-sdk/core/layout';
2
+ import { LayoutServicePageState, RenderingType } from '@sitecore-content-sdk/core/layout';
3
3
  import { useSitecoreContext } from '../enhancers/withSitecoreContext';
4
4
  import { getJssPagesClientData } from '@sitecore-content-sdk/core/editing';
5
+ import { getDesignLibraryScriptLink } from '@sitecore-content-sdk/core/editing';
5
6
  /**
6
- * Renders client scripts and data for editing/preview mode in Pages.
7
+ * Renders client scripts and data for editing/preview mode for Pages.
8
+ * Renders script required for the Design Library (when RenderingType is `component`).
9
+ * @param {EditingScriptsProps} props - The props for the EditingScripts component.
10
+ * @param {string} props.sitecoreEdgeUrl - Sitecore Edge Platform URL.
11
+ * @returns A JSX element containing the editing scripts or an empty fragment if not in editing/preview mode.
7
12
  */
8
- export const EditingScripts = () => {
9
- const { sitecoreContext: { pageState, clientData, clientScripts }, } = useSitecoreContext();
10
- // Don't render anything if not in editing/preview mode
11
- if (pageState === LayoutServicePageState.Normal ||
12
- pageState === LayoutServicePageState.Preview ||
13
- !pageState) {
13
+ export const EditingScripts = (props) => {
14
+ const { sitecoreContext: { pageState, clientData, clientScripts, renderingType }, } = useSitecoreContext();
15
+ // Don't render anything if not in editing/preview mode and rendering type is not component
16
+ if (renderingType !== RenderingType.Component &&
17
+ (pageState === LayoutServicePageState.Normal ||
18
+ pageState === LayoutServicePageState.Preview ||
19
+ !pageState)) {
14
20
  return React.createElement(React.Fragment, null);
15
21
  }
22
+ // In case of RenderingType.Component - render only the script for Design Libnrary
23
+ if (renderingType === RenderingType.Component) {
24
+ // Add cache buster to the script URL
25
+ const scriptUrl = `${getDesignLibraryScriptLink(props.sitecoreEdgeUrl)}?cb=${Date.now()}`;
26
+ return (React.createElement(React.Fragment, null,
27
+ React.createElement("script", { src: scriptUrl, suppressHydrationWarning: true })));
28
+ }
16
29
  const jssClientData = Object.assign(Object.assign({}, clientData), getJssPagesClientData());
17
30
  return (React.createElement(React.Fragment, null, clientScripts === null || clientScripts === void 0 ? void 0 :
18
31
  clientScripts.map((src, index) => (React.createElement("script", { src: src, key: index }))),
@@ -0,0 +1,38 @@
1
+ import React, { useEffect, useRef, useState } from 'react';
2
+ import { executeScriptElements, loadForm, subscribeToFormSubmitEvent, } from '@sitecore-content-sdk/core/form';
3
+ import { useSitecoreContext } from '../enhancers/withSitecoreContext';
4
+ export const Form = ({ params, rendering }) => {
5
+ var _a;
6
+ const id = params === null || params === void 0 ? void 0 : params.RenderingIdentifier;
7
+ const [error, setError] = useState(false);
8
+ const [content, setContent] = useState('');
9
+ const context = useSitecoreContext();
10
+ const formRef = useRef(null);
11
+ const isEditing = context.sitecoreContext.pageEditing;
12
+ useEffect(() => {
13
+ var _a, _b, _c, _d;
14
+ if (!content) {
15
+ loadForm((_b = (_a = context.api) === null || _a === void 0 ? void 0 : _a.edge) === null || _b === void 0 ? void 0 : _b.contextId, params.FormId, (_d = (_c = context.api) === null || _c === void 0 ? void 0 : _c.edge) === null || _d === void 0 ? void 0 : _d.edgeUrl)
16
+ .then(setContent)
17
+ .catch(() => {
18
+ if (isEditing) {
19
+ console.error(`Failed to load form with id ${params.FormId}. Check debug logs for sitecore-jss:form for more details.`);
20
+ }
21
+ setError(true);
22
+ });
23
+ }
24
+ else {
25
+ // If we are in editing mode, we don't want to send any events
26
+ if (!isEditing) {
27
+ subscribeToFormSubmitEvent(formRef.current, rendering.uid);
28
+ }
29
+ executeScriptElements(formRef.current);
30
+ }
31
+ }, [content]);
32
+ if (isEditing) {
33
+ if (error) {
34
+ return (React.createElement("div", { className: "sc-jss-placeholder-error" }, "There was a problem loading this section"));
35
+ }
36
+ }
37
+ return (React.createElement("div", { ref: formRef, dangerouslySetInnerHTML: { __html: content }, className: (_a = params.styles) === null || _a === void 0 ? void 0 : _a.trimEnd(), id: id ? id : undefined }));
38
+ };
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import { PlaceholderCommon } from './PlaceholderCommon';
3
- import { withComponentFactory } from '../enhancers/withComponentFactory';
3
+ import { withComponentMap } from '../enhancers/withComponentMap';
4
4
  import { PagesEditor } from '@sitecore-content-sdk/core/editing';
5
5
  import { withSitecoreContext } from '../enhancers/withSitecoreContext';
6
6
  class PlaceholderComponent extends PlaceholderCommon {
@@ -24,7 +24,7 @@ class PlaceholderComponent extends PlaceholderCommon {
24
24
  render() {
25
25
  var _a, _b;
26
26
  const childProps = Object.assign({}, this.props);
27
- delete childProps.componentFactory;
27
+ delete childProps.componentMap;
28
28
  if (this.state.error) {
29
29
  if (childProps.errorComponent) {
30
30
  return React.createElement(childProps.errorComponent, { error: this.state.error });
@@ -62,5 +62,5 @@ class PlaceholderComponent extends PlaceholderCommon {
62
62
  }
63
63
  }
64
64
  PlaceholderComponent.propTypes = PlaceholderCommon.propTypes;
65
- const PlaceholderWithComponentFactory = withComponentFactory(PlaceholderComponent);
66
- export const Placeholder = withSitecoreContext()(PlaceholderWithComponentFactory);
65
+ const PlaceholderWithComponentMap = withComponentMap(PlaceholderComponent);
66
+ export const Placeholder = withSitecoreContext()(PlaceholderWithComponentMap);