@@ -10,10 +10,11 @@ import {
1010 ExperienceComponentNode ,
1111 DisplaySettingsType ,
1212 ExperienceCompositionNode ,
13+ Infer ,
1314} from '../infer.js' ;
1415import { isComponentNode } from '../util/baseTypeUtil.js' ;
15- import { parseDisplaySettings } from '../model/displayTemplates.js' ;
16- import { getDisplayTemplateTag } from '../model/displayTemplateRegistry.js' ;
16+ import { DisplayTemplate , parseDisplaySettings } from '../model/displayTemplates.js' ;
17+ import { getDisplayTemplate , getDisplayTemplateTag } from '../model/displayTemplateRegistry.js' ;
1718import { isDev } from '../util/environment.js' ;
1819
1920type ComponentType = React . ComponentType < any > ;
@@ -70,7 +71,7 @@ export function initReactComponentRegistry(options: InitOptions) {
7071}
7172
7273/** Props for the {@linkcode OptimizelyComponent} component */
73- type OptimizelyComponentProps = {
74+ type OptimizelyComponentProps < T extends DisplayTemplate = DisplayTemplate > = {
7475 /** Data read from the CMS */
7576 opti : {
7677 /** Content type name */
@@ -87,7 +88,7 @@ type OptimizelyComponentProps = {
8788 __composition ?: ExperienceCompositionNode ;
8889 } ;
8990
90- displaySettings ?: Record < string , string > ;
91+ displaySettings ?: Partial < Infer < T > > ;
9192} ;
9293
9394export async function OptimizelyComponent ( {
@@ -106,8 +107,7 @@ export async function OptimizelyComponent({
106107
107108 if ( ! Component ) {
108109 console . log (
109- `[optimizely-cms-sdk] No component found for content type ${
110- opti . __typename
110+ `[optimizely-cms-sdk] No component found for content type ${ opti . __typename
111111 } ${ opti . __tag ? `with tag "${ opti . __tag } "` : '' } `
112112 ) ;
113113
@@ -127,16 +127,16 @@ export async function OptimizelyComponent({
127127 ) ;
128128}
129129
130- export type StructureContainerProps = {
130+ export type StructureContainerProps < T extends DisplayTemplate = DisplayTemplate > = {
131131 node : ExperienceStructureNode ;
132132 children : React . ReactNode ;
133133 index ?: number ;
134- displaySettings ?: Record < string , string > ;
134+ displaySettings ?: Partial < Infer < T > > ;
135135} ;
136- export type ComponentContainerProps = {
136+ export type ComponentContainerProps < T extends DisplayTemplate = DisplayTemplate > = {
137137 node : ExperienceComponentNode ;
138138 children : React . ReactNode ;
139- displaySettings ?: Record < string , string > ;
139+ displaySettings ?: Partial < Infer < T > > ;
140140} ;
141141export type StructureContainer = (
142142 props : StructureContainerProps
@@ -154,7 +154,14 @@ export function OptimizelyExperience({
154154} ) {
155155 return nodes . map ( ( node ) => {
156156 const tag = getDisplayTemplateTag ( node . displayTemplateKey ) ;
157- const parsedDisplaySettings = parseDisplaySettings ( node . displaySettings ) ;
157+ const template = node . displayTemplateKey
158+ ? getDisplayTemplate ( node . displayTemplateKey )
159+ : null ;
160+
161+ const parsedDisplaySettings = template
162+ ? parseDisplaySettings ( node . displaySettings , template . settings )
163+ : { } ;
164+ console . error ( parsedDisplaySettings ) ;
158165
159166 if ( isComponentNode ( node ) ) {
160167 const Wrapper = ComponentWrapper ?? React . Fragment ;
@@ -255,7 +262,13 @@ export function OptimizelyGridSection({
255262
256263 return nodes . map ( ( node , i ) => {
257264 const tag = getDisplayTemplateTag ( node . displayTemplateKey ) ;
258- const parsedDisplaySettings = parseDisplaySettings ( node . displaySettings ) ;
265+ const template = node . displayTemplateKey
266+ ? getDisplayTemplate ( node . displayTemplateKey )
267+ : null ;
268+
269+ const parsedDisplaySettings = template
270+ ? parseDisplaySettings ( node . displaySettings , template . settings )
271+ : { } ;
259272
260273 if ( isComponentNode ( node ) ) {
261274 return (
0 commit comments