UNPKG

@progress/sitefinity-nextjs-sdk

Version:

Provides OOB widgets developed using the Next.js framework, which includes an abstraction layer for Sitefinity communication. Additionally, it offers an expanded API, typings, and tools for further development and integration.

54 lines (53 loc) 3.02 kB
import React from 'react'; import { getMinimumRequestContext, getMinimumWidgetContext } from '../editor/widget-framework/widget-context'; import { LazyComponent } from '../widgets/lazy/lazy-component'; import { deepCopy } from '../editor/utils/object-utils'; import { EntityMetadataGenerator } from '@progress/sitefinity-widget-designers-sdk'; import { getMinimumMetadata } from '../editor/widget-framework/widget-metadata'; import { Tracer } from '@progress/sitefinity-nextjs-sdk/diagnostics/empty'; import { ErrorBoundaryCustom } from '../pages/error-boundary'; import { WidgetExecutionError } from '../widgets/error/widget-execution-error-component'; export class RenderWidgetService { static widgetRegistry; static createComponent(widgetModel, requestContext, traceContext) { Tracer.logEvent(`render widget start: ${widgetModel.Caption || widgetModel.Name}`); const registeredType = RenderWidgetService.widgetRegistry.widgets[widgetModel.Name]; const propsForWidget = { metadata: getMinimumMetadata(registeredType, requestContext.isEdit), // modify props to remove functions in order to pass them to client component model: deepCopy(widgetModel), requestContext: getMinimumRequestContext(deepCopy(requestContext)), traceContext: registeredType?.ssr ? traceContext : null }; try { if (!registeredType) { throw new Error(`No widget named "${widgetModel.Name}" found in the registry`); } propsForWidget.model.Properties = RenderWidgetService.parseProperties(propsForWidget.model.Properties, registeredType); let componentType = registeredType.componentType; if (!requestContext.isEdit && widgetModel.Lazy) { componentType = LazyComponent; } const element = React.createElement(componentType, { key: widgetModel.Id, ...propsForWidget }); const propsForErrorBoundary = getMinimumWidgetContext(propsForWidget); const result = React.createElement(ErrorBoundaryCustom, { key: 'err' + widgetModel.Id, children: element, context: propsForErrorBoundary }); return result; } catch (err) { if (requestContext.isEdit) { const errCast = err; const errorProps = { context: propsForWidget, error: errCast.message }; const errorElement = React.createElement(WidgetExecutionError, errorProps); return errorElement; } return null; } } static parseProperties(widgetProperties, widgetMetadata) { const defaultValues = widgetMetadata.defaultValues || {}; const persistedProperties = widgetMetadata?.designerMetadata ? EntityMetadataGenerator.parseValues(widgetProperties, widgetMetadata.designerMetadata) : {}; return Object.assign({}, defaultValues, persistedProperties); } }