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.

95 lines (94 loc) 3.58 kB
import { cookies } from 'next/headers'; import { RestClient } from '../rest-sdk/rest-client'; import { ErrorCodeException } from '../rest-sdk/errors/error-code.exception'; export async function pageLayout({ params, searchParams, relatedFields, traceContext }) { const pageParams = params instanceof Promise ? await params : params; const queryParams = searchParams instanceof Promise ? await searchParams : searchParams; try { const args = { pagePath: pageParams?.slug.join('/'), queryParams, cookie: (await cookies()).toString(), followRedirects: false, relatedFields, traceContext }; const layout = await RestClient.getPageLayout(args); return layout; } catch (error) { if (error instanceof ErrorCodeException) { throw error; } if (typeof error === 'string') { throw error; } throw `Could not fetch layout for url -> ${pageParams?.slug.join('/')}`; } } export async function pageMetadata({ params, searchParams }) { const pageParams = params instanceof Promise ? await params : params; let layoutResponse = null; if (/^sitefinity\/(template|forms)/i.test(pageParams?.slug.join('/'))) { return {}; } if (pageParams && pageParams.slug && pageParams.slug.length > 0) { if (pageParams.slug.some(x => x === '_next') || pageParams.slug[pageParams.slug.length - 1].indexOf('.') !== -1) { return {}; } } try { layoutResponse = await pageLayout({ params, searchParams }); } catch (error) { return {}; } if (layoutResponse.isRedirect) { return {}; } const layout = layoutResponse.layout; if (layout?.MetaInfo) { const result = { title: layout.MetaInfo.Title, description: layout.MetaInfo.Description, openGraph: { title: layout.MetaInfo.OpenGraphTitle, description: layout.MetaInfo.OpenGraphDescription, images: [ { url: layout.MetaInfo.OpenGraphImage } ], videos: [ { url: layout.MetaInfo.OpenGraphVideo } ], siteName: layout.MetaInfo.OpenGraphSite }, alternates: { canonical: layout.MetaInfo.CanonicalUrl }, robots: layout?.Fields && layout.Fields.Crawlable === false ? { index: false } : undefined }; // hack to check ogTypes. Otherwise and error is thrown and the whole page does not render const ogTypes = ['article', 'book', 'music.song', 'music.album', 'music.playlist', 'music.radio_station', 'profile', 'website', 'video.tv_show', 'video.other', 'video.movie', 'video.episode']; if (layout.MetaInfo.OpenGraphType && ogTypes.indexOf(layout.MetaInfo.OpenGraphType) > -1) { result.openGraph.type = layout.MetaInfo.OpenGraphType; } // only in sfcloud if (process?.env?.SF_NEXTJS_SET_CACHE_CONTROL_METATAG && layout.CacheControl) { result.other = { 'Sf-Cache-Control': layout.CacheControl }; } return result; } return {}; } /** * @deprecated Not needed anymore */ export function initRendering(widgetRegistry, errorComponentType) { // RenderWidgetService.widgetRegistry = widgetRegistry; }