UNPKG

@jss-rule-engine/nextjs

Version:

131 lines (105 loc) 3.96 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 RulesSSGPersonalizationPlugin 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; } extractRuleActions(variantId:string) { console.log('extractRuleActions - ', variantId); const values = variantId.replace('_variantId',''); let result = []; for (let i = 0; i < values.length; i++) { result.push(values[i]=="1"); } console.log('extract rule actions result ', result) return result; } /** * 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('RulesSSGPersonalizationPlugin', 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"]; let staticPropsContext = context as GetStaticPropsContext; if(personalizationRule && staticPropsContext && personalizeOnEdge && personalizeOnEdge.value == "1") { console.log('### CONTEXT:'); console.log('Active variant id:', props.activeVariantId); let activeVariantId = props.activeVariantId; if(activeVariantId) { console.log('Extracting rule actions') var ruleActions = this.extractRuleActions(activeVariantId); var personalizationHelper = new PersonalizationHelper(this.graphQLEndpoint, this.sitecoreApiKey); await personalizationHelper.runRuleActions(this.ruleEngine, props, personalizationRule, ruleActions); } } } return props; } }