You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

163 lines
3.7 KiB

"use client";
import type { QuestionField } from "@/lib/schema-adapter";
import QuestionBirthplace from "./question-birthplace";
import QuestionButton from "./question-button";
import QuestionCheckbox from "./question-checkbox";
import QuestionDate from "./question-date";
import QuestionSheet from "./question-sheet";
import QuestionFile from "./question-file";
import QuestionNumber from "./question-number";
import QuestionPhone from "./question-phone";
import QuestionPhoto from "./question-photo";
import QuestionRadio from "./question-radio";
import QuestionSlider from "./question-slider";
import QuestionText from "./question-text";
import QuestionTextarea from "./question-textarea";
type QuestionRendererProps = {
question: QuestionField;
disabled?: boolean;
dobQuestion?: QuestionField;
};
export function QuestionRenderer({
question,
disabled,
dobQuestion,
}: QuestionRendererProps) {
const compactTextHeight =
question.type === "email" || question.ui_config?.compact === true
? "h-[54px]"
: undefined;
switch (question.type) {
case "birthplace":
case "location":
case "residence":
return (
<QuestionBirthplace
question={question}
disabled={disabled}
/>
);
case "button":
return (
<QuestionButton
question={question}
disabled={disabled}
/>
);
case "checkbox":
return (
<QuestionCheckbox
question={question}
disabled={disabled}
/>
);
case "date":
return (
<QuestionDate
question={question}
disabled={disabled}
/>
);
case "dropdown":
return (
<QuestionSheet
question={question}
disabled={disabled}
/>
);
case "file":
return (
<QuestionFile
question={question}
disabled={disabled}
/>
);
case "number":
if (
question.ui_config?.derivedFromDob === true &&
dobQuestion
) {
return (
<QuestionNumber
question={question}
derivedFromQuestion={dobQuestion}
disabled={disabled}
/>
);
}
return (
<QuestionNumber
question={question}
disabled={disabled}
/>
);
case "phone":
return (
<QuestionPhone
question={question}
disabled={disabled}
/>
);
case "photo":
return (
<QuestionPhoto
question={question}
disabled={disabled}
/>
);
case "radio":
return (
<QuestionRadio
question={question}
disabled={disabled}
/>
);
case "slider":
case "scale":
case "range":
return (
<QuestionSlider
question={question}
disabled={disabled}
/>
);
case "text":
if (
question.ui_config?.enable_geoip === true ||
question.ui_config?.location_kind === "residence" ||
question.id?.includes("approximate_location_of_current_living_area") ||
question.id?.includes("current_residence") ||
question.id?.includes("living_area")
) {
return (
<QuestionBirthplace
question={question}
disabled={disabled}
/>
);
}
return (
<QuestionText
question={question}
heightClassName={compactTextHeight}
disabled={disabled}
/>
);
case "textarea":
return (
<QuestionTextarea
question={question}
disabled={disabled}
/>
);
default:
return null;
}
}
export default QuestionRenderer;