chore: merge with epic

This commit is contained in:
pandeymangg
2025-11-20 22:09:07 +05:30
3 changed files with 1195 additions and 834 deletions
@@ -46,8 +46,8 @@ interface BlockCardProps {
blockIdx: number;
moveQuestion: (questionIndex: number, up: boolean) => void;
updateQuestion: (questionIdx: number, updatedAttributes: any) => void;
updateBlockLogic: (blockIdx: number, logic: TSurveyBlockLogic[]) => void;
updateBlockLogicFallback: (blockIdx: number, logicFallback: string | undefined) => void;
updateBlockLogic: (questionIdx: number, logic: TSurveyBlockLogic[]) => void;
updateBlockLogicFallback: (questionIdx: number, logicFallback: string | undefined) => void;
updateBlockButtonLabel: (
blockIndex: number,
labelKey: "buttonLabel" | "backButtonLabel",
@@ -128,11 +128,286 @@ export const BlockCard = ({
const hasInvalidElement = block.elements.some((element) => invalidQuestions?.includes(element.id));
const [openAdvanced, setOpenAdvanced] = useState(blockLogic.length > 0);
const [isBlockCollapsed, setIsBlockCollapsed] = useState(false);
const [openAdvanced, setOpenAdvanced] = useState(blockLogic.length > 0);
const [parent] = useAutoAnimate();
const [elementsParent] = useAutoAnimate();
// Get button labels from the block
const blockButtonLabel = block.buttonLabel;
const getElementHeadline = (
element: TSurveyElement,
languageCode: string
): (string | React.ReactElement)[] | string | undefined => {
const headlineData = recallToHeadline(element.headline, localSurvey, true, languageCode);
const headlineText = headlineData[languageCode];
if (headlineText) {
return formatTextWithSlashes(getTextContent(headlineText ?? ""));
}
return getTSurveyQuestionTypeEnumName(element.type, t);
};
const shouldShowCautionAlert = (elementType: TSurveyElementTypeEnum): boolean => {
return (
responseCount > 0 &&
[
TSurveyElementTypeEnum.MultipleChoiceSingle,
TSurveyElementTypeEnum.MultipleChoiceMulti,
TSurveyElementTypeEnum.PictureSelection,
TSurveyElementTypeEnum.Rating,
TSurveyElementTypeEnum.NPS,
TSurveyElementTypeEnum.Ranking,
TSurveyElementTypeEnum.Matrix,
].includes(elementType)
);
};
const renderElementForm = (
element: TSurveyElement,
questionIdx: number,
blockButtonLabel?: TI18nString
) => {
switch (element.type) {
case TSurveyElementTypeEnum.OpenText:
return (
<OpenQuestionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
lastQuestion={lastQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={invalidQuestions ? invalidQuestions.includes(element.id) : false}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
);
case TSurveyElementTypeEnum.MultipleChoiceSingle:
return (
<MultipleChoiceQuestionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={invalidQuestions ? invalidQuestions.includes(element.id) : false}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
);
case TSurveyElementTypeEnum.MultipleChoiceMulti:
return (
<MultipleChoiceQuestionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={invalidQuestions ? invalidQuestions.includes(element.id) : false}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
);
case TSurveyElementTypeEnum.NPS:
return (
<NPSQuestionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
lastQuestion={lastQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={invalidQuestions ? invalidQuestions.includes(element.id) : false}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
buttonLabel={blockButtonLabel}
/>
);
case TSurveyElementTypeEnum.CTA:
return (
<CTAQuestionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
lastQuestion={lastQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={invalidQuestions ? invalidQuestions.includes(element.id) : false}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
);
case TSurveyElementTypeEnum.Rating:
return (
<RatingQuestionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
lastQuestion={lastQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={invalidQuestions ? invalidQuestions.includes(element.id) : false}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
);
case TSurveyElementTypeEnum.Consent:
return (
<ConsentQuestionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={invalidQuestions ? invalidQuestions.includes(element.id) : false}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
);
case TSurveyElementTypeEnum.Date:
return (
<DateQuestionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={invalidQuestions ? invalidQuestions.includes(element.id) : false}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
);
case TSurveyElementTypeEnum.PictureSelection:
return (
<PictureSelectionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={invalidQuestions ? invalidQuestions.includes(element.id) : false}
locale={locale}
isStorageConfigured={isStorageConfigured}
/>
);
case TSurveyElementTypeEnum.FileUpload:
return (
<FileUploadQuestionForm
localSurvey={localSurvey}
project={project}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={invalidQuestions ? invalidQuestions.includes(element.id) : false}
isFormbricksCloud={isFormbricksCloud}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
);
case TSurveyElementTypeEnum.Cal:
return (
<CalQuestionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
lastQuestion={lastQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={invalidQuestions ? invalidQuestions.includes(element.id) : false}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
);
case TSurveyElementTypeEnum.Matrix:
return (
<MatrixQuestionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={invalidQuestions ? invalidQuestions.includes(element.id) : false}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
);
case TSurveyElementTypeEnum.Address:
return (
<AddressQuestionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={invalidQuestions ? invalidQuestions.includes(element.id) : false}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
);
case TSurveyElementTypeEnum.Ranking:
return (
<RankingQuestionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={invalidQuestions ? invalidQuestions.includes(element.id) : false}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
);
case TSurveyElementTypeEnum.ContactInfo:
return (
<ContactInfoQuestionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
lastQuestion={lastQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={invalidQuestions ? invalidQuestions.includes(element.id) : false}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
);
default:
return null;
}
};
const style = {
transition: transition ?? "transform 100ms ease",
transform: CSS.Translate.toString(transform),
@@ -246,23 +521,7 @@ export const BlockCard = ({
</p>
)}
<h3 className="text-sm font-semibold">
{recallToHeadline(
element.headline,
localSurvey,
true,
selectedLanguageCode
)[selectedLanguageCode]
? formatTextWithSlashes(
getTextContent(
recallToHeadline(
element.headline,
localSurvey,
true,
selectedLanguageCode
)[selectedLanguageCode] ?? ""
)
)
: getTSurveyQuestionTypeEnumName(element.type, t)}
{getElementHeadline(element, selectedLanguageCode)}
</h3>
{!open && (
<p className="mt-1 truncate text-xs text-slate-500">
@@ -303,225 +562,15 @@ export const BlockCard = ({
</div>
</Collapsible.CollapsibleTrigger>
<Collapsible.CollapsibleContent className={`flex flex-col px-4 ${open && "pb-4"}`}>
{responseCount > 0 &&
[
TSurveyElementTypeEnum.MultipleChoiceSingle,
TSurveyElementTypeEnum.MultipleChoiceMulti,
TSurveyElementTypeEnum.PictureSelection,
TSurveyElementTypeEnum.Rating,
TSurveyElementTypeEnum.NPS,
TSurveyElementTypeEnum.Ranking,
TSurveyElementTypeEnum.Matrix,
].includes(element.type) ? (
{shouldShowCautionAlert(element.type) && (
<Alert variant="warning" size="small" className="w-fill" role="alert">
<AlertTitle>{t("environments.surveys.edit.caution_text")}</AlertTitle>
<AlertButton onClick={() => onAlertTrigger()}>
{t("common.learn_more")}
</AlertButton>
</Alert>
) : null}
{element.type === TSurveyElementTypeEnum.OpenText ? (
<OpenQuestionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
lastQuestion={lastQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={isInvalid}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
) : element.type === TSurveyElementTypeEnum.MultipleChoiceSingle ? (
<MultipleChoiceQuestionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={isInvalid}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
) : element.type === TSurveyElementTypeEnum.MultipleChoiceMulti ? (
<MultipleChoiceQuestionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={isInvalid}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
) : element.type === TSurveyElementTypeEnum.NPS ? (
<NPSQuestionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={isInvalid}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
) : element.type === TSurveyElementTypeEnum.CTA ? (
<CTAQuestionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
lastQuestion={lastQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={isInvalid}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
) : element.type === TSurveyElementTypeEnum.Rating ? (
<RatingQuestionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
lastQuestion={lastQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={isInvalid}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
) : element.type === TSurveyElementTypeEnum.Consent ? (
<ConsentQuestionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={isInvalid}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
) : element.type === TSurveyElementTypeEnum.Date ? (
<DateQuestionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={isInvalid}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
) : element.type === TSurveyElementTypeEnum.PictureSelection ? (
<PictureSelectionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={isInvalid}
locale={locale}
isStorageConfigured={isStorageConfigured}
/>
) : element.type === TSurveyElementTypeEnum.FileUpload ? (
<FileUploadQuestionForm
localSurvey={localSurvey}
project={project}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={isInvalid}
isFormbricksCloud={isFormbricksCloud}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
) : element.type === TSurveyElementTypeEnum.Cal ? (
<CalQuestionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
lastQuestion={lastQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={isInvalid}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
) : element.type === TSurveyElementTypeEnum.Matrix ? (
<MatrixQuestionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={isInvalid}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
) : element.type === TSurveyElementTypeEnum.Address ? (
<AddressQuestionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={isInvalid}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
) : element.type === TSurveyElementTypeEnum.Ranking ? (
<RankingQuestionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={isInvalid}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
) : element.type === TSurveyElementTypeEnum.ContactInfo ? (
<ContactInfoQuestionForm
localSurvey={localSurvey}
question={element}
questionIdx={questionIdx}
updateQuestion={updateQuestion}
lastQuestion={lastQuestion}
selectedLanguageCode={selectedLanguageCode}
setSelectedLanguageCode={setSelectedLanguageCode}
isInvalid={isInvalid}
locale={locale}
isStorageConfigured={isStorageConfigured}
isExternalUrlsAllowed={isExternalUrlsAllowed}
/>
) : null}
)}
{renderElementForm(element, questionIdx, blockButtonLabel)}
<div className="mt-4">
<Collapsible.Root
open={openAdvanced}
File diff suppressed because it is too large Load Diff
@@ -113,195 +113,228 @@ export function ElementConditional({
return null;
}
return (
<div ref={containerRef}>
{element.type === TSurveyElementTypeEnum.OpenText ? (
<OpenTextQuestion
key={element.id}
question={element}
value={typeof value === "string" ? value : ""}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
autoFocusEnabled={autoFocusEnabled}
currentQuestionId={currentElementId}
dir={dir}
/>
) : element.type === TSurveyElementTypeEnum.MultipleChoiceSingle ? (
<MultipleChoiceSingleQuestion
key={element.id}
question={element}
value={typeof value === "string" ? value : undefined}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
autoFocusEnabled={autoFocusEnabled}
currentQuestionId={currentElementId}
dir={dir}
/>
) : element.type === TSurveyElementTypeEnum.MultipleChoiceMulti ? (
<MultipleChoiceMultiQuestion
key={element.id}
question={element}
value={Array.isArray(value) ? value : []}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
autoFocusEnabled={autoFocusEnabled}
currentQuestionId={currentElementId}
dir={dir}
/>
) : element.type === TSurveyElementTypeEnum.NPS ? (
<NPSQuestion
key={element.id}
question={element}
value={typeof value === "number" ? value : undefined}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
autoFocusEnabled={autoFocusEnabled}
currentQuestionId={currentElementId}
dir={dir}
/>
) : element.type === TSurveyElementTypeEnum.CTA ? (
<CTAQuestion
key={element.id}
question={element}
value={typeof value === "string" ? value : ""}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
autoFocusEnabled={autoFocusEnabled}
currentQuestionId={currentElementId}
onOpenExternalURL={onOpenExternalURL}
/>
) : element.type === TSurveyElementTypeEnum.Rating ? (
<RatingQuestion
key={element.id}
question={element}
value={typeof value === "number" ? value : undefined}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
autoFocusEnabled={autoFocusEnabled}
currentQuestionId={currentElementId}
dir={dir}
/>
) : element.type === TSurveyElementTypeEnum.Consent ? (
<ConsentQuestion
key={element.id}
question={element}
value={typeof value === "string" ? value : ""}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
autoFocusEnabled={autoFocusEnabled}
currentQuestionId={currentElementId}
dir={dir}
/>
) : element.type === TSurveyElementTypeEnum.Date ? (
<DateQuestion
key={element.id}
question={element}
value={typeof value === "string" ? value : ""}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
autoFocusEnabled={autoFocusEnabled}
currentQuestionId={currentElementId}
/>
) : element.type === TSurveyElementTypeEnum.PictureSelection ? (
<PictureSelectionQuestion
key={element.id}
question={element}
value={Array.isArray(value) ? value : []}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
autoFocusEnabled={autoFocusEnabled}
currentQuestionId={currentElementId}
dir={dir}
/>
) : element.type === TSurveyElementTypeEnum.FileUpload ? (
<FileUploadQuestion
key={element.id}
surveyId={surveyId}
question={element}
value={Array.isArray(value) ? value : []}
onChange={onChange}
onFileUpload={onFileUpload}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
autoFocusEnabled={autoFocusEnabled}
currentQuestionId={currentElementId}
/>
) : element.type === TSurveyElementTypeEnum.Cal ? (
<CalQuestion
key={element.id}
question={element}
value={typeof value === "string" ? value : ""}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
currentQuestionId={currentElementId}
/>
) : element.type === TSurveyElementTypeEnum.Matrix ? (
<MatrixQuestion
question={element}
value={typeof value === "object" && !Array.isArray(value) ? value : {}}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
currentQuestionId={currentElementId}
/>
) : element.type === TSurveyElementTypeEnum.Address ? (
<AddressQuestion
question={element}
value={Array.isArray(value) ? value : undefined}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
currentQuestionId={currentElementId}
autoFocusEnabled={autoFocusEnabled}
dir={dir}
/>
) : element.type === TSurveyElementTypeEnum.Ranking ? (
<RankingQuestion
question={element}
value={Array.isArray(value) ? getResponseValueForRankingQuestion(value, element.choices) : []}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
autoFocusEnabled={autoFocusEnabled}
currentQuestionId={currentElementId}
/>
) : element.type === TSurveyElementTypeEnum.ContactInfo ? (
<ContactInfoQuestion
question={element}
value={Array.isArray(value) ? value : undefined}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
currentQuestionId={currentElementId}
autoFocusEnabled={autoFocusEnabled}
dir={dir}
/>
) : null}
</div>
);
const renderElement = () => {
switch (element.type) {
case TSurveyElementTypeEnum.OpenText:
return (
<OpenTextQuestion
key={element.id}
question={element}
value={typeof value === "string" ? value : ""}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
autoFocusEnabled={autoFocusEnabled}
currentQuestionId={currentElementId}
dir={dir}
/>
);
case TSurveyElementTypeEnum.MultipleChoiceSingle:
return (
<MultipleChoiceSingleQuestion
key={element.id}
question={element}
value={typeof value === "string" ? value : undefined}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
autoFocusEnabled={autoFocusEnabled}
currentQuestionId={currentElementId}
dir={dir}
/>
);
case TSurveyElementTypeEnum.MultipleChoiceMulti:
return (
<MultipleChoiceMultiQuestion
key={element.id}
question={element}
value={Array.isArray(value) ? value : []}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
autoFocusEnabled={autoFocusEnabled}
currentQuestionId={currentElementId}
dir={dir}
/>
);
case TSurveyElementTypeEnum.NPS:
return (
<NPSQuestion
key={element.id}
question={element}
value={typeof value === "number" ? value : undefined}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
autoFocusEnabled={autoFocusEnabled}
currentQuestionId={currentElementId}
dir={dir}
/>
);
case TSurveyElementTypeEnum.CTA:
return (
<CTAQuestion
key={element.id}
question={element}
value={typeof value === "string" ? value : ""}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
autoFocusEnabled={autoFocusEnabled}
currentQuestionId={currentElementId}
onOpenExternalURL={onOpenExternalURL}
/>
);
case TSurveyElementTypeEnum.Rating:
return (
<RatingQuestion
key={element.id}
question={element}
value={typeof value === "number" ? value : undefined}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
autoFocusEnabled={autoFocusEnabled}
currentQuestionId={currentElementId}
dir={dir}
/>
);
case TSurveyElementTypeEnum.Consent:
return (
<ConsentQuestion
key={element.id}
question={element}
value={typeof value === "string" ? value : ""}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
autoFocusEnabled={autoFocusEnabled}
currentQuestionId={currentElementId}
dir={dir}
/>
);
case TSurveyElementTypeEnum.Date:
return (
<DateQuestion
key={element.id}
question={element}
value={typeof value === "string" ? value : ""}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
autoFocusEnabled={autoFocusEnabled}
currentQuestionId={currentElementId}
/>
);
case TSurveyElementTypeEnum.PictureSelection:
return (
<PictureSelectionQuestion
key={element.id}
question={element}
value={Array.isArray(value) ? value : []}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
autoFocusEnabled={autoFocusEnabled}
currentQuestionId={currentElementId}
dir={dir}
/>
);
case TSurveyElementTypeEnum.FileUpload:
return (
<FileUploadQuestion
key={element.id}
surveyId={surveyId}
question={element}
value={Array.isArray(value) ? value : []}
onChange={onChange}
onFileUpload={onFileUpload}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
autoFocusEnabled={autoFocusEnabled}
currentQuestionId={currentElementId}
/>
);
case TSurveyElementTypeEnum.Cal:
return (
<CalQuestion
key={element.id}
question={element}
value={typeof value === "string" ? value : ""}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
currentQuestionId={currentElementId}
/>
);
case TSurveyElementTypeEnum.Matrix:
return (
<MatrixQuestion
question={element}
value={typeof value === "object" && !Array.isArray(value) ? value : {}}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
currentQuestionId={currentElementId}
/>
);
case TSurveyElementTypeEnum.Address:
return (
<AddressQuestion
question={element}
value={Array.isArray(value) ? value : undefined}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
currentQuestionId={currentElementId}
autoFocusEnabled={autoFocusEnabled}
dir={dir}
/>
);
case TSurveyElementTypeEnum.Ranking:
return (
<RankingQuestion
question={element}
value={Array.isArray(value) ? getResponseValueForRankingQuestion(value, element.choices) : []}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
autoFocusEnabled={autoFocusEnabled}
currentQuestionId={currentElementId}
/>
);
case TSurveyElementTypeEnum.ContactInfo:
return (
<ContactInfoQuestion
question={element}
value={Array.isArray(value) ? value : undefined}
onChange={onChange}
languageCode={languageCode}
ttc={ttc}
setTtc={setTtc}
currentQuestionId={currentElementId}
autoFocusEnabled={autoFocusEnabled}
dir={dir}
/>
);
default:
return null;
}
};
return <div ref={containerRef}>{renderElement()}</div>;
}