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.

124 lines (123 loc) 6.37 kB
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime"; import { RenderPageClient } from './render-page-client'; import { pageLayout } from './utils'; import { RenderWidgetService } from '../services/render-widget-service'; import { RenderLazyWidgetsClient } from './render-lazy-widgets.client'; import { RenderPageScripts } from './render-page-scripts'; import { ServiceMetadata } from '../rest-sdk/service-metadata'; import { headers } from 'next/headers'; import { ErrorCodeException } from '../rest-sdk/errors/error-code.exception'; import { notFound, permanentRedirect, redirect } from 'next/navigation'; import { PageScriptLocation } from '../rest-sdk/dto/scripts'; import { PageFrontEndUtilLoader } from './page-frontend-util-loader'; import { Tracer } from '@progress/sitefinity-nextjs-sdk/diagnostics/empty'; import { getPageNumber } from '../widgets/pager/pager-view-model'; import { ContentListsCommonRestService } from '../widgets/content-lists-common/content-lists-rest.setvice'; import { initServerSideRestSdk } from '../rest-sdk/init'; import { setHostServerContext } from '../services/server-context'; export async function RenderPage({ params, searchParams, relatedFields, templates }) { const host = headers().get('host') || ''; setHostServerContext(host); let layoutResponse = null; if (params && params.slug && params.slug.length > 0) { if (params.slug.some(x => x === '_next') || params.slug[params.slug.length - 1].indexOf('.') !== -1) { notFound(); } } if (searchParams && searchParams['sf-auth']) { searchParams['sf-auth'] = encodeURIComponent(searchParams['sf-auth']); } const { span, ctx } = Tracer.startSpan(`RenderPage ${params.slug.join('/')}`, true); try { layoutResponse = await pageLayout({ params, searchParams, relatedFields, traceContext: ctx }); } catch (error) { if (error instanceof ErrorCodeException && (error.code === 'NotFound' || error.code === 'Forbidden')) { notFound(); } } if (!layoutResponse) { throw layoutResponse; } // nasty hack if (layoutResponse.isRedirect) { const redirectResponse = layoutResponse.redirect; if (redirectResponse.Permenant) { return permanentRedirect(redirectResponse.Location); } else { return redirect(redirectResponse.Location); } } if (!layoutResponse.layout) { return notFound(); } const isEdit = searchParams['sfaction'] === 'edit'; const isPreview = searchParams['sfaction'] === 'preview'; const isLive = !(isEdit || isPreview); const layout = layoutResponse.layout; await initServerSideRestSdk({ metadataHash: layout.MetadataHash, queryParams: { sf_culture: layout.Culture, sf_site: isEdit || layout.Site.IsSubFolder ? layout.SiteId : '' } }); const appState = { requestContext: { layout: layout, searchParams: searchParams, detailItem: layout.DetailItem, culture: layout.Culture, isEdit, isPreview, isLive, url: params.slug.join('/'), pageNode: layout.Fields }, widgets: layout.ComponentContext.Components }; // get all list widgets const allWidgets = flattenWidgets(layout.ComponentContext.Components || []); allWidgets.filter(x => x.Name === 'SitefinityContentList' || x.Name === 'SitefinityDocumentList').forEach(x => { // try to resolve pagers const entity = x.Properties; getPageNumber(entity.PagerMode, appState.requestContext, entity.PagerQueryTemplate, entity.PagerTemplate); // try to resolve classifications ContentListsCommonRestService.getClassificationSegment(appState.requestContext); }); // if not resolved urls => 404 if (layout.UrlParameters && layout.UrlParameters.length > 0 && !layout.DetailItem) { notFound(); } const liveUrl = '/' + params.slug.join('/') + '?' + new URLSearchParams(searchParams).toString(); let pageTemplate; if (layout.TemplateName && templates && templates[layout.TemplateName]) { let template = templates[layout.TemplateName]; if (template && template.templateFunction) { const sortedWidgets = {}; appState.widgets.forEach(widget => { const placeholder = widget.PlaceHolder; if (!sortedWidgets[placeholder]) { sortedWidgets[placeholder] = []; } sortedWidgets[placeholder].push(RenderWidgetService.createComponent(widget, appState.requestContext, ctx)); }); pageTemplate = template.templateFunction({ widgets: sortedWidgets, requestContext: appState.requestContext }); } } if (!pageTemplate) { pageTemplate = appState.widgets.map((child) => { return RenderWidgetService.createComponent(child, appState.requestContext, ctx); }); } return (_jsxs(_Fragment, { children: [_jsx(PageFrontEndUtilLoader, { metadata: ServiceMetadata.serviceMetadataCache, taxonomies: ServiceMetadata.taxonomies, additionalQueryParams: { sf_culture: layout.Culture, sf_site: isEdit || layout.Site.IsSubFolder ? layout.SiteId : '' } }), _jsx(RenderPageScripts, { layout: layout, scriptLocation: PageScriptLocation.Head }), _jsx(RenderPageScripts, { layout: layout, scriptLocation: PageScriptLocation.BodyTop }), isEdit && _jsx(RenderPageClient, { layout: layout, metadata: ServiceMetadata.serviceMetadataCache, taxonomies: ServiceMetadata.taxonomies, context: appState.requestContext }), !isEdit && appState.requestContext.layout?.ComponentContext.HasLazyComponents && _jsx(RenderLazyWidgetsClient, { metadata: ServiceMetadata.serviceMetadataCache, taxonomies: ServiceMetadata.taxonomies, url: liveUrl }), pageTemplate, _jsx(RenderPageScripts, { layout: layout, scriptLocation: PageScriptLocation.BodyBottom }), Tracer.endSpan(span)] })); } function flattenWidgets(widgets) { return widgets.reduce((acc, widget) => { if (Array.isArray(widget?.Children) && widget.Children.length) { return acc.concat(flattenWidgets(widget.Children)); } return acc.concat([widget]); }, []); }