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.

96 lines (95 loc) 3.59 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 }) { try { const args = { pagePath: params.slug.join('/'), queryParams: searchParams, cookie: cookies().toString(), followRedirects: false, relatedFields, traceContext }; // adding X-SF-Access-Key header so the layout service can return responce in edit if ((!args.cookie || process.env.NODE_ENV === 'test') && process.env['SF_ACCESS_KEY']) { args.additionalHeaders = { 'X-SF-Access-Key': process.env['SF_ACCESS_KEY'] }; } 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 -> ${params.slug.join('/')}`; } } export async function pageMetadata({ params, searchParams }) { let layoutResponse = null; if (/^sitefinity\/(template|forms)/i.test(params.slug.join('/'))) { return {}; } if (params && params.slug && params.slug.length > 0) { if (params.slug.some(x => x === '_next') || params.slug[params.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; }