UNPKG

@jss-rule-engine/nextjs

Version:

118 lines (94 loc) 3.55 kB
import { GetServerSidePropsContext, GetStaticPropsContext } from 'next'; import { PersonalizationHelper } from '../../lib/PersonalizationHelper'; import { JssRuleEngine } from '@jss-rule-engine/core' import { DictionaryPhrases, ComponentPropsCollection, LayoutServiceData, SiteInfo, HTMLLink, } from '@sitecore-jss/sitecore-jss-nextjs'; export type SitecorePageProps = { site: SiteInfo; locale: string; dictionary: DictionaryPhrases; componentProps: ComponentPropsCollection; notFound: boolean; layoutData: LayoutServiceData; headLinks: HTMLLink[]; }; interface Plugin { /** * Detect order when the plugin should be called, e.g. 0 - will be called first (can be a plugin which data is required for other plugins) */ order: number; /** * A function which will be called during page props generation */ exec( props: SitecorePageProps, context: GetServerSidePropsContext | GetStaticPropsContext ): Promise<SitecorePageProps>; } export class RulesSSRPersonalizationPlugin implements Plugin { graphQLEndpoint:string; sitecoreApiKey:string; ruleEngine:JssRuleEngine; constructor(endpointUrl:string, sitecoreApiKey: string, ruleEngine:JssRuleEngine) { this.graphQLEndpoint = endpointUrl; this.sitecoreApiKey = sitecoreApiKey; this.ruleEngine = ruleEngine; } order = 3; isDisconnectedMode(props:any) { const disconnectedMode = props.layoutData.sitecore.context.site?.name === 'JssDisconnectedLayoutService'; return disconnectedMode; } isPageEditing(props:any) { const isEditing = props.layoutData.sitecore.context.pageEditing; return isEditing; } /** * Determines whether context is GetServerSidePropsContext (SSR) or GetStaticPropsContext (SSG) * @param {GetServerSidePropsContext | GetStaticPropsContext} context */ isServerSidePropsContext( context: GetServerSidePropsContext | GetStaticPropsContext ): context is GetServerSidePropsContext { return (<GetServerSidePropsContext>context).req !== undefined; }; async exec(props: any, context: GetServerSidePropsContext | GetStaticPropsContext) { console.log('RulesSSRPersonalizationPlugin', props, context); var doRun = this.isServerSidePropsContext(context) && !context.preview && !this.isDisconnectedMode(props) && !this.isPageEditing(props); if (!doRun) { return props; } if(props.layoutData.sitecore.route && props.layoutData.sitecore.route.fields) { var routeFields = props.layoutData.sitecore.route.fields; var personalizationRule = routeFields["PersonalizationRules"]; var personalizeOnEdge = routeFields["PersonalizeOnEdge"]; var serverSideProps = <GetServerSidePropsContext>context; if(personalizationRule && serverSideProps && personalizeOnEdge && personalizeOnEdge.value == "1") { console.log('Personalizing SSR'); //check if we are running in SSR mode - then pass the request url if(serverSideProps.req?.url) { this.ruleEngine.setRequestContext({ url: serverSideProps.req.url }); } var personalizationHelper = new PersonalizationHelper(this.graphQLEndpoint, this.sitecoreApiKey); await personalizationHelper.personalize(this.ruleEngine, props, personalizationRule); } } return props; } }