@@ -11,10 +11,11 @@ import {
1111 DisplaySettingsType ,
1212 ExperienceCompositionNode ,
1313 InferredContentReference ,
14+ Infer ,
1415} from '../infer.js' ;
1516import { isComponentNode } from '../util/baseTypeUtil.js' ;
16- import { parseDisplaySettings } from '../model/displayTemplates.js' ;
17- import { getDisplayTemplateTag } from '../model/displayTemplateRegistry.js' ;
17+ import { DisplayTemplate , parseDisplaySettings } from '../model/displayTemplates.js' ;
18+ import { getDisplayTemplate , getDisplayTemplateTag } from '../model/displayTemplateRegistry.js' ;
1819import { isDev } from '../util/environment.js' ;
1920import { appendToken } from '../util/preview.js' ;
2021
@@ -72,7 +73,7 @@ export function initReactComponentRegistry(options: InitOptions) {
7273}
7374
7475/** Props for the {@linkcode OptimizelyComponent} component */
75- type OptimizelyComponentProps = {
76+ type OptimizelyComponentProps < T extends DisplayTemplate = DisplayTemplate > = {
7677 /** Data read from the CMS */
7778 opti : {
7879 /** Content type name */
@@ -89,7 +90,7 @@ type OptimizelyComponentProps = {
8990 __composition ?: ExperienceCompositionNode ;
9091 } ;
9192
92- displaySettings ?: Record < string , string > ;
93+ displaySettings ?: Partial < Infer < T > > ;
9394} ;
9495
9596export async function OptimizelyComponent ( {
@@ -107,6 +108,11 @@ export async function OptimizelyComponent({
107108 } ) ;
108109
109110 if ( ! Component ) {
111+ console . log (
112+ `[optimizely-cms-sdk] No component found for content type ${ opti . __typename
113+ } ${ opti . __tag ? `with tag "${ opti . __tag } "` : '' } `
114+ ) ;
115+
110116 return (
111117 < FallbackComponent >
112118 No component found for content type < b > { opti . __typename } </ b >
@@ -123,16 +129,16 @@ export async function OptimizelyComponent({
123129 ) ;
124130}
125131
126- export type StructureContainerProps = {
132+ export type StructureContainerProps < T extends DisplayTemplate = DisplayTemplate > = {
127133 node : ExperienceStructureNode ;
128134 children : React . ReactNode ;
129135 index ?: number ;
130- displaySettings ?: Record < string , string > ;
136+ displaySettings ?: Partial < Infer < T > > ;
131137} ;
132- export type ComponentContainerProps = {
138+ export type ComponentContainerProps < T extends DisplayTemplate = DisplayTemplate > = {
133139 node : ExperienceComponentNode ;
134140 children : React . ReactNode ;
135- displaySettings ?: Record < string , string > ;
141+ displaySettings ?: Partial < Infer < T > > ;
136142} ;
137143export type StructureContainer = (
138144 props : StructureContainerProps
@@ -150,7 +156,14 @@ export function OptimizelyExperience({
150156} ) {
151157 return nodes . map ( ( node ) => {
152158 const tag = getDisplayTemplateTag ( node . displayTemplateKey ) ;
153- const parsedDisplaySettings = parseDisplaySettings ( node . displaySettings ) ;
159+ const template = node . displayTemplateKey
160+ ? getDisplayTemplate ( node . displayTemplateKey )
161+ : null ;
162+
163+ const parsedDisplaySettings = template
164+ ? parseDisplaySettings ( node . displaySettings , template . settings )
165+ : { } ;
166+ console . error ( parsedDisplaySettings ) ;
154167
155168 if ( isComponentNode ( node ) ) {
156169 const Wrapper = ComponentWrapper ?? React . Fragment ;
@@ -251,7 +264,13 @@ export function OptimizelyGridSection({
251264
252265 return nodes . map ( ( node , i ) => {
253266 const tag = getDisplayTemplateTag ( node . displayTemplateKey ) ;
254- const parsedDisplaySettings = parseDisplaySettings ( node . displaySettings ) ;
267+ const template = node . displayTemplateKey
268+ ? getDisplayTemplate ( node . displayTemplateKey )
269+ : null ;
270+
271+ const parsedDisplaySettings = template
272+ ? parseDisplaySettings ( node . displaySettings , template . settings )
273+ : { } ;
255274
256275 if ( isComponentNode ( node ) ) {
257276 return (
0 commit comments