From e2fa35abf90303a7223d1f89ad4beb241b9d6639 Mon Sep 17 00:00:00 2001 From: Evan Ping Date: Tue, 12 Nov 2024 23:59:57 -0500 Subject: [PATCH 1/6] test templates 1,2,3 --- @empirica-mocks/core/mocks.js | 38 +++++- src/app/editor/components/EditElement.tsx | 22 +++- src/app/editor/components/ElementCard.tsx | 38 ++++-- src/app/editor/components/StageCard.tsx | 140 +++++++++++++--------- src/app/editor/components/Timeline.tsx | 76 +++++++----- 5 files changed, 209 insertions(+), 105 deletions(-) diff --git a/@empirica-mocks/core/mocks.js b/@empirica-mocks/core/mocks.js index 148a396..40cd6fc 100644 --- a/@empirica-mocks/core/mocks.js +++ b/@empirica-mocks/core/mocks.js @@ -80,7 +80,36 @@ export function useStage() { //const treatmentString = localStorage.getItem("treatment"); //const treatment = JSON.parse(treatmentString); + var tempStage; // for template stages + const stageTemplateName = treatment.treatments[0]?.gameStages[currentStageIndex]?.template || ""; + var fields = treatment.treatments[0]?.gameStages[currentStageIndex]?.fields || []; + if (stageTemplateName !== "") { + tempStage = templatesMap.get(stageTemplateName)[0] + } + //console.log("fields", fields) + + //logic to fill in ${} props + const variablePattern = /\${([^}]+)}/; + tempStage.elements.forEach(element => { + Object.keys(element).forEach(key => { + const value = element[key]; + + if (typeof value === "string" && variablePattern.test(value)) { + const match = value.match(variablePattern); + if (match) { + console.log("replaced " + match[1] + " with " + fields[match[1]]); + element[key] = fields[match[1]]; + } + } + }); + }); + + if (varName === "elements") { + if (tempStage) { + return tempStage.elements; + } + var elements = treatment.treatments[0]?.gameStages[currentStageIndex]?.elements elements = elements.flatMap((element) => { if (element.template) { @@ -88,12 +117,19 @@ export function useStage() { } return [element]; }); - console.log("revised elements", elements) return elements; } else if (varName === "discussion") { + if (tempStage) { + return tempStage.discussion; + } + return treatment.treatments[0]?.gameStages[currentStageIndex]?.discussion } else if (varName === "name") { + if (tempStage) { + return tempStage.name; + } return treatment.treatments[0]?.gameStages[currentStageIndex]?.name + } else if (varName === "index") { return currentStageIndex } diff --git a/src/app/editor/components/EditElement.tsx b/src/app/editor/components/EditElement.tsx index 9f9c6e3..bdce30e 100644 --- a/src/app/editor/components/EditElement.tsx +++ b/src/app/editor/components/EditElement.tsx @@ -29,6 +29,9 @@ export function EditElement({ setTemplatesMap, } = useContext(StageContext) + const stageTemplateName = + treatment.treatments[0]?.gameStages[currentStageIndex]?.template || '' + const { register, watch, @@ -37,12 +40,19 @@ export function EditElement({ formState: { errors }, } = useForm({ defaultValues: { - name: - treatment?.treatments[0].gameStages[stageIndex]?.elements[elementIndex] - ?.name || '', - selectedOption: - treatment?.treatments[0].gameStages[stageIndex]?.elements[elementIndex] - ?.type || 'Pick one', + // WEIRD BUG WITH ELEMENTINDEX NOT SURE WHY + name: '', + // stageTemplateName == "" + // ? treatment?.treatments[0].gameStages[stageIndex]?.elements[ + // elementIndex + // ]?.name || '' + // : '', + selectedOption: 'Pick one', + // stageTemplateName == "" + // ? treatment?.treatments[0].gameStages[stageIndex]?.elements[ + // elementIndex + // ]?.type || 'Pick one' + // : 'Pick one', file: '', url: '', params: [], diff --git a/src/app/editor/components/ElementCard.tsx b/src/app/editor/components/ElementCard.tsx index 371258a..d483ddc 100644 --- a/src/app/editor/components/ElementCard.tsx +++ b/src/app/editor/components/ElementCard.tsx @@ -1,4 +1,4 @@ -import React, { useState, useContext } from 'react' +import React, { useState, useContext, useEffect } from 'react' import { Modal } from './Modal' import { EditElement } from './EditElement' import { TreatmentType } from '../../../../deliberation-empirica/server/src/preFlight/validateTreatmentFile' @@ -12,6 +12,7 @@ export function ElementCard({ stageIndex, elementIndex, elementOptions, + isTemplate, }: { element: any scale: number @@ -20,10 +21,18 @@ export function ElementCard({ stageIndex: number elementIndex: number elementOptions: any + isTemplate: boolean }) { const startTime = element.displayTime || 0 const endTime = element.hideTime || stageDuration const [modalOpen, setModalOpen] = useState(false) + const [isElementTemplate, setIsElementTemplate] = useState(false) + + useEffect(() => { + if (element.template) { + setIsElementTemplate(true) + } + }, [element]) const { currentStageIndex, @@ -51,18 +60,21 @@ export function ElementCard({

))} - + + {!isElementTemplate && !isTemplate && ( + + )} diff --git a/src/app/editor/components/StageCard.tsx b/src/app/editor/components/StageCard.tsx index 262b734..55e432c 100644 --- a/src/app/editor/components/StageCard.tsx +++ b/src/app/editor/components/StageCard.tsx @@ -13,6 +13,7 @@ import { setCurrentStageIndex } from './utils' import { useStage } from '../../../../@empirica-mocks/core/mocks' import { StageContext } from '../stageContext.jsx' import { Droppable, Draggable, DragDropContext } from '@hello-pangea/dnd' +import { i } from 'node_modules/@empirica/core/dist/context-302225e8' export function StageCard({ title, @@ -22,6 +23,7 @@ export function StageCard({ sequence, stageIndex, setRenderPanelStage, + isTemplate, }: { title: string elements: any[] @@ -30,6 +32,7 @@ export function StageCard({ sequence: string stageIndex: number setRenderPanelStage: any + isTemplate: boolean }) { const { currentStageIndex, @@ -119,20 +122,22 @@ export function StageCard({ >

{title}

- + {!isTemplate && ( + + )} @@ -152,32 +157,49 @@ export function StageCard({ {...provided.droppableProps} > {elements !== undefined && - elements.map((element, index) => ( - - {(provided) => ( -
- -
- )} -
- ))} + elements.map((element, index) => + isTemplate ? ( +
+ +
+ ) : ( + + {(provided) => ( +
+ +
+ )} +
+ ) + )} {provided.placeholder}
)} @@ -185,25 +207,27 @@ export function StageCard({ {/* Add Element Button*/} -
- + {!isTemplate && ( +
+ - - - -
+ + + +
+ )} ) } diff --git a/src/app/editor/components/Timeline.tsx b/src/app/editor/components/Timeline.tsx index 497c336..d91094f 100644 --- a/src/app/editor/components/Timeline.tsx +++ b/src/app/editor/components/Timeline.tsx @@ -103,33 +103,55 @@ export default function Timeline({ ref={provided.innerRef} className="flex flex-row gap-x-1" > - {treatment?.treatments[0]?.gameStages?.map( - (stage: any, index: any) => ( - - {(provided) => ( -
- -
- )} -
- ) - )} + {treatment?.treatments.length > 0 && + treatment?.treatments[0]?.gameStages?.map( + (stage: any, index: any) => ( + + {(provided) => ( +
+ {stage.name && ( + + )} + {stage.template && ( + + )} +
+ )} +
+ ) + )} {provided.placeholder} )} From 9412e7cc9287542bfb48df63f6b3f9998abedb5e Mon Sep 17 00:00:00 2001 From: Evan Ping Date: Tue, 19 Nov 2024 15:00:29 -0500 Subject: [PATCH 2/6] elementIndex bug fix --- @empirica-mocks/core/mocks.js | 35 ++++++++++++----------- cypress/fixtures/testTemplates3.yaml | 4 +-- src/app/editor/components/EditElement.tsx | 30 +++++++++++-------- 3 files changed, 38 insertions(+), 31 deletions(-) diff --git a/@empirica-mocks/core/mocks.js b/@empirica-mocks/core/mocks.js index 40cd6fc..165c17a 100644 --- a/@empirica-mocks/core/mocks.js +++ b/@empirica-mocks/core/mocks.js @@ -80,29 +80,32 @@ export function useStage() { //const treatmentString = localStorage.getItem("treatment"); //const treatment = JSON.parse(treatmentString); - var tempStage; // for template stages + var tempStage = null; // for template stages const stageTemplateName = treatment.treatments[0]?.gameStages[currentStageIndex]?.template || ""; var fields = treatment.treatments[0]?.gameStages[currentStageIndex]?.fields || []; if (stageTemplateName !== "") { tempStage = templatesMap.get(stageTemplateName)[0] } - //console.log("fields", fields) + console.log("tempStage", tempStage); //logic to fill in ${} props + // move logic outside get() const variablePattern = /\${([^}]+)}/; - tempStage.elements.forEach(element => { - Object.keys(element).forEach(key => { - const value = element[key]; - - if (typeof value === "string" && variablePattern.test(value)) { - const match = value.match(variablePattern); - if (match) { - console.log("replaced " + match[1] + " with " + fields[match[1]]); - element[key] = fields[match[1]]; + {tempStage && + tempStage.elements.forEach(element => { + Object.keys(element).forEach(key => { + const value = element[key]; + + if (typeof value === "string" && variablePattern.test(value)) { + const match = value.match(variablePattern); + if (match) { + console.log("replaced " + match[1] + " with " + fields[match[1]]); + element[key] = fields[match[1]]; + } } - } + }); }); - }); + } if (varName === "elements") { @@ -110,7 +113,7 @@ export function useStage() { return tempStage.elements; } - var elements = treatment.treatments[0]?.gameStages[currentStageIndex]?.elements + var elements = treatment.treatments[0]?.gameStages[currentStageIndex]?.elements; elements = elements.flatMap((element) => { if (element.template) { return templatesMap.get(element.template); @@ -120,10 +123,10 @@ export function useStage() { return elements; } else if (varName === "discussion") { if (tempStage) { - return tempStage.discussion; + return tempStage.discussion || []; } - return treatment.treatments[0]?.gameStages[currentStageIndex]?.discussion + return treatment.treatments[0]?.gameStages[currentStageIndex]?.discussion || []; } else if (varName === "name") { if (tempStage) { return tempStage.name; diff --git a/cypress/fixtures/testTemplates3.yaml b/cypress/fixtures/testTemplates3.yaml index ccbe19c..be6da4d 100644 --- a/cypress/fixtures/testTemplates3.yaml +++ b/cypress/fixtures/testTemplates3.yaml @@ -7,8 +7,7 @@ templates: - type: prompt file: projects/example/multipleChoiceColors.md - type: submitButton - buttonText: ${submitButtonText} - + buttonText: treatments: - name: simple template test @@ -17,4 +16,3 @@ treatments: - template: testGameStagesTemplate fields: submitButtonText: TestButtonTextProceed - diff --git a/src/app/editor/components/EditElement.tsx b/src/app/editor/components/EditElement.tsx index bdce30e..9c3bfc8 100644 --- a/src/app/editor/components/EditElement.tsx +++ b/src/app/editor/components/EditElement.tsx @@ -32,6 +32,10 @@ export function EditElement({ const stageTemplateName = treatment.treatments[0]?.gameStages[currentStageIndex]?.template || '' + console.log("stageTemplateName == ''", stageTemplateName == '') + console.log('stageIndex', stageIndex) + console.log('elementIndex', elementIndex) + const { register, watch, @@ -41,18 +45,20 @@ export function EditElement({ } = useForm({ defaultValues: { // WEIRD BUG WITH ELEMENTINDEX NOT SURE WHY - name: '', - // stageTemplateName == "" - // ? treatment?.treatments[0].gameStages[stageIndex]?.elements[ - // elementIndex - // ]?.name || '' - // : '', - selectedOption: 'Pick one', - // stageTemplateName == "" - // ? treatment?.treatments[0].gameStages[stageIndex]?.elements[ - // elementIndex - // ]?.type || 'Pick one' - // : 'Pick one', + //'', + name: + stageTemplateName == '' + ? treatment?.treatments[0].gameStages[stageIndex]?.elements?.[ + elementIndex + ]?.name || '' + : '', + //'Pick one', + selectedOption: + stageTemplateName == '' + ? treatment?.treatments[0].gameStages[stageIndex]?.elements?.[ + elementIndex + ]?.type || 'Pick one' + : 'Pick one', file: '', url: '', params: [], From 16da09ea11a1a12f7c5770112a63f955a708c807 Mon Sep 17 00:00:00 2001 From: Evan Ping Date: Wed, 20 Nov 2024 10:30:06 -0500 Subject: [PATCH 3/6] fix obj bug --- src/app/editor/components/Timeline.tsx | 62 +++++++++++++------------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/src/app/editor/components/Timeline.tsx b/src/app/editor/components/Timeline.tsx index af44148..f291297 100644 --- a/src/app/editor/components/Timeline.tsx +++ b/src/app/editor/components/Timeline.tsx @@ -179,36 +179,38 @@ export default function Timeline({ {...provided.draggableProps} {...provided.dragHandleProps} > - {stage.name && ( - - )} - {stage.template && ( - - )} + {obj.stage.name && ( + + )} + {obj.stage.template && ( + + )} )} From a5d7a7476eb7bb86b413899896c9ed782b55a33a Mon Sep 17 00:00:00 2001 From: Evan Ping Date: Tue, 3 Dec 2024 22:47:10 -0500 Subject: [PATCH 4/6] conditional rendering for input reference and exists comparator --- @empirica-mocks/core/mocks.js | 33 +++++++++++++++++++++++ cypress/fixtures/testTemplates3.yaml | 2 +- src/app/editor/components/ElementCard.tsx | 2 +- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/@empirica-mocks/core/mocks.js b/@empirica-mocks/core/mocks.js index 165c17a..1489fcb 100644 --- a/@empirica-mocks/core/mocks.js +++ b/@empirica-mocks/core/mocks.js @@ -118,6 +118,39 @@ export function useStage() { if (element.template) { return templatesMap.get(element.template); } + if (element.conditions) { + // update with other comparators + var refData = JSON.parse(localStorage.getItem('jsonData') || '{}'); + const conditions = element.conditions; + const comparator = conditions[0]?.comparator || "x"; + const reference = conditions[0]?.reference || "x"; + console.log("refData", refData) + console.log("reference", reference , typeof reference) + if (comparator === "x") { + return [element]; + } else if (comparator === "exists") { + console.log("comparing") + console.log(refData[`stage_${currentStageIndex}`]) + if (refData[`stage_${currentStageIndex}`]?.[reference]) { + console.log("SHOWING") + const newElement = {...element}; + delete newElement.conditions; + return [newElement]; + } else { + return []; + } + } + + const condition = conditions.find((condition) => { + if (condition.field) { + return fields[condition.field] === condition.value; + } + return true; + }); + if (condition) { + return [element]; + } + } return [element]; }); return elements; diff --git a/cypress/fixtures/testTemplates3.yaml b/cypress/fixtures/testTemplates3.yaml index be6da4d..61c6530 100644 --- a/cypress/fixtures/testTemplates3.yaml +++ b/cypress/fixtures/testTemplates3.yaml @@ -7,7 +7,7 @@ templates: - type: prompt file: projects/example/multipleChoiceColors.md - type: submitButton - buttonText: + buttonText: TestButtonTextProceed treatments: - name: simple template test diff --git a/src/app/editor/components/ElementCard.tsx b/src/app/editor/components/ElementCard.tsx index d483ddc..1d401fc 100644 --- a/src/app/editor/components/ElementCard.tsx +++ b/src/app/editor/components/ElementCard.tsx @@ -56,7 +56,7 @@ export function ElementCard({
{Object.keys(element).map((key) => (

- {key}: {element[key]} + {key}: {element[key].toString()}

))}
From dbc584d06963dd595b46fbd12138e274bb2e0687 Mon Sep 17 00:00:00 2001 From: Evan Ping Date: Tue, 3 Dec 2024 23:06:43 -0500 Subject: [PATCH 5/6] automatic rerender when saving references --- @empirica-mocks/core/mocks.js | 11 ++++------- src/app/editor/components/ReferenceData.tsx | 7 ++++++- src/app/editor/stageContext.jsx | 3 +++ 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/@empirica-mocks/core/mocks.js b/@empirica-mocks/core/mocks.js index 1489fcb..a083a1f 100644 --- a/@empirica-mocks/core/mocks.js +++ b/@empirica-mocks/core/mocks.js @@ -69,6 +69,8 @@ export function useStage() { setTreatment, templatesMap, setTemplatesMap, + refData, + setRefData, } = useContext(StageContext) // const stage1 = useContext(StageContext); // console.log("useStageMock", stage1) @@ -119,20 +121,15 @@ export function useStage() { return templatesMap.get(element.template); } if (element.conditions) { - // update with other comparators - var refData = JSON.parse(localStorage.getItem('jsonData') || '{}'); + // TODO: update with other comparators + // var refData = JSON.parse(localStorage.getItem('jsonData') || '{}'); const conditions = element.conditions; const comparator = conditions[0]?.comparator || "x"; const reference = conditions[0]?.reference || "x"; - console.log("refData", refData) - console.log("reference", reference , typeof reference) if (comparator === "x") { return [element]; } else if (comparator === "exists") { - console.log("comparing") - console.log(refData[`stage_${currentStageIndex}`]) if (refData[`stage_${currentStageIndex}`]?.[reference]) { - console.log("SHOWING") const newElement = {...element}; delete newElement.conditions; return [newElement]; diff --git a/src/app/editor/components/ReferenceData.tsx b/src/app/editor/components/ReferenceData.tsx index 1f27d31..cf04305 100644 --- a/src/app/editor/components/ReferenceData.tsx +++ b/src/app/editor/components/ReferenceData.tsx @@ -1,4 +1,5 @@ -import React, { useEffect, useState } from 'react' +import React, { useEffect, useState, useContext } from 'react' +import { StageContext } from '@/editor/stageContext' // helper to format references const formatReference = (reference: string) => { @@ -70,6 +71,8 @@ const ReferenceData = ({ treatment, stageIndex }: ReferenceDataProps) => { const [jsonData, setJsonData] = useState({}) const [inputValues, setInputValues] = useState({}) + const { refData, setRefData } = useContext(StageContext) + // load refs for curr stage useEffect(() => { if (treatment?.gameStages?.[stageIndex]) { @@ -123,6 +126,7 @@ const ReferenceData = ({ treatment, stageIndex }: ReferenceDataProps) => { [`stage_${stageIndex}`]: inputValues[`stage_${stageIndex}`], } setJsonData(updatedJson) + setRefData(updatedJson) localStorage.setItem('jsonData', JSON.stringify(updatedJson)) console.log('Saved JSON Data:', JSON.stringify(updatedJson, null, 2)) } @@ -134,6 +138,7 @@ const ReferenceData = ({ treatment, stageIndex }: ReferenceDataProps) => { if (savedJson) { console.log('Loaded JSON Data from localStorage:', JSON.parse(savedJson)) setJsonData(JSON.parse(savedJson)) + setRefData(JSON.parse(savedJson)) } if (savedInputValues) { diff --git a/src/app/editor/stageContext.jsx b/src/app/editor/stageContext.jsx index 7dde34e..67ff05d 100644 --- a/src/app/editor/stageContext.jsx +++ b/src/app/editor/stageContext.jsx @@ -14,6 +14,7 @@ const StageProvider = ({ children }) => { const [elapsed, setElapsed] = useState(0) const [treatment, setTreatment] = useState(null) const [templatesMap, setTemplatesMap] = useState(new Map()) + const [refData, setRefData] = useState({}) // for updating code editor, requires reload function editTreatment(newTreatment) { @@ -32,6 +33,8 @@ const StageProvider = ({ children }) => { editTreatment, templatesMap, setTemplatesMap, + refData, + setRefData, } return ( From a8d91a253180f5767ed3130606984c4d3050bbcc Mon Sep 17 00:00:00 2001 From: Evan Ping Date: Fri, 10 Jan 2025 19:20:03 -0800 Subject: [PATCH 6/6] conditional rendering within templates --- @empirica-mocks/core/mocks.js | 37 ++++++++++++++++++--- cypress/fixtures/testTemplates3.yaml | 2 +- src/app/editor/components/ReferenceData.tsx | 24 +++++++++---- 3 files changed, 51 insertions(+), 12 deletions(-) diff --git a/@empirica-mocks/core/mocks.js b/@empirica-mocks/core/mocks.js index a083a1f..2106f47 100644 --- a/@empirica-mocks/core/mocks.js +++ b/@empirica-mocks/core/mocks.js @@ -111,21 +111,34 @@ export function useStage() { if (varName === "elements") { + var elements if (tempStage) { - return tempStage.elements; + elements = tempStage.elements; + } else { + elements = treatment.treatments[0]?.gameStages[currentStageIndex]?.elements; } - var elements = treatment.treatments[0]?.gameStages[currentStageIndex]?.elements; - elements = elements.flatMap((element) => { + console.log("CURRELEMENTS", elements) + + // TODO: change to template if needed + // map to templates first + elements = elements.flatMap((element) => { if (element.template) { return templatesMap.get(element.template); + } else { + return element; } + }) + + //console.log("ELEMENTS_TO_DISPLAY", elements) + // check all conditions + elements = elements.flatMap((element) => { if (element.conditions) { // TODO: update with other comparators - // var refData = JSON.parse(localStorage.getItem('jsonData') || '{}'); const conditions = element.conditions; const comparator = conditions[0]?.comparator || "x"; const reference = conditions[0]?.reference || "x"; + const value = conditions[0]?.value || "x"; if (comparator === "x") { return [element]; } else if (comparator === "exists") { @@ -136,6 +149,22 @@ export function useStage() { } else { return []; } + } else if (comparator === "equals") { + if (refData[`stage_${currentStageIndex}`]?.[reference] == value) { + const newElement = {...element}; + delete newElement.conditions; + return [newElement]; + } else { + return []; + } + } else if (comparator === "doesNotEqual") { + if (refData[`stage_${currentStageIndex}`]?.[reference] != value) { + const newElement = {...element}; + delete newElement.conditions; + return [newElement]; + } else { + return []; + } } const condition = conditions.find((condition) => { diff --git a/cypress/fixtures/testTemplates3.yaml b/cypress/fixtures/testTemplates3.yaml index 61c6530..b5368c7 100644 --- a/cypress/fixtures/testTemplates3.yaml +++ b/cypress/fixtures/testTemplates3.yaml @@ -7,7 +7,7 @@ templates: - type: prompt file: projects/example/multipleChoiceColors.md - type: submitButton - buttonText: TestButtonTextProceed + buttonText: ${submitButtonText} treatments: - name: simple template test diff --git a/src/app/editor/components/ReferenceData.tsx b/src/app/editor/components/ReferenceData.tsx index cf04305..66ff515 100644 --- a/src/app/editor/components/ReferenceData.tsx +++ b/src/app/editor/components/ReferenceData.tsx @@ -16,15 +16,25 @@ const getPlaceholderText = (reference: string) => { } // find 'references' in the treatment object by stage (recursively..hopefully runtime not too bad) -const findReferencesByStage = (obj: any): any[] => { +const findReferencesByStage = (obj: any, templatesMap: any): any[] => { let references: any[] = [] if (typeof obj === 'object' && obj !== null) { for (const key in obj) { if (key === 'reference') { references.push(obj[key]) + } else if (key === 'template') { + const templateReferences = templatesMap + .get(obj[key]) + .flatMap((templateElement: any) => + findReferencesByStage(templateElement, templatesMap) + ) + + references = references.concat(templateReferences) } else if (typeof obj[key] === 'object') { - references = references.concat(findReferencesByStage(obj[key])) + references = references.concat( + findReferencesByStage(obj[key], templatesMap) + ) } } } @@ -33,10 +43,10 @@ const findReferencesByStage = (obj: any): any[] => { } // initializing json data for each stage -const initializeJsonData = (treatment: any) => { +const initializeJsonData = (treatment: any, templatesMap: any) => { const jsonData: { [key: string]: any } = {} treatment?.gameStages?.forEach((stage: any, index: number) => { - const references = findReferencesByStage(stage) + const references = findReferencesByStage(stage, templatesMap) jsonData[`stage_${index}`] = {} references.forEach((reference) => { jsonData[`stage_${index}`][reference] = '' @@ -71,18 +81,18 @@ const ReferenceData = ({ treatment, stageIndex }: ReferenceDataProps) => { const [jsonData, setJsonData] = useState({}) const [inputValues, setInputValues] = useState({}) - const { refData, setRefData } = useContext(StageContext) + const { refData, setRefData, templatesMap } = useContext(StageContext) // load refs for curr stage useEffect(() => { if (treatment?.gameStages?.[stageIndex]) { const stage = treatment.gameStages[stageIndex] - const allReferences = findReferencesByStage(stage) + const allReferences = findReferencesByStage(stage, templatesMap) setReferences(allReferences) // load json data for curr stage if (!jsonData[`stage_${stageIndex}`]) { - const initializedJson = initializeJsonData(treatment) + const initializedJson = initializeJsonData(treatment, templatesMap) setJsonData((prev) => ({ ...prev, ...initializedJson })) }