import { type PaymentType, type Platform, type Skill, type SkillLevel } from "@prisma/client" import { type Dispatch, type SetStateAction, useState, useEffect } from "react"; export type QuestionTypes = Platform | Skill | SkillLevel | PaymentType | string; export interface Option { label: string, value: T, } export interface Question { for: string, header: string, question: string, maxSelect?: number, optional: true, options: Option[] } const GreetingPage = ({updatePage}: { updatePage: (pageNumber: number) => void, }) => { const getStartedClick = () => { updatePage(1); } return (

Welcome to the resources survey!

We will ask a few questions about the patient and then recommend the best resources based on your answers!

) } /** * Single question component for a guided survey */ const QuestionPage = ({isLastPage, page, question, updatePage, formData, updateFormData, dontCareData, setDontCareData}: { isLastPage: boolean, page: number, question: Question, updatePage: (pageNumber: number) => void, formData: Record, updateFormData: Dispatch>>, dontCareData: Record, setDontCareData: Dispatch>>, }) => { const dontCare = dontCareData[question.for] ?? false; const OptionToggle = ({option}: {option: Option}) => { const selected = formData[question.for]?.includes(option.value) ?? false; const handleToggle = () => { const newFormData = { ...formData }; if (!newFormData[question.for]) { newFormData[question.for] = [option.value]; } else if (newFormData[question.for]?.includes(option.value)) { newFormData[question.for] = newFormData[question.for]?.filter(function(item) { return item !== option.value }) ?? []; } else { newFormData[question.for] = [...newFormData[question.for] ?? [], option.value]; } updateFormData(newFormData); } if (dontCare) { return ( ) } return ( ) } useEffect(() => { if (!formData[question.for]) { const newFormData = {...formData}; newFormData[question.for] = []; updateFormData(newFormData); } }); const dontCareToggle = () => { if (formData[question.for]) { const newFormData = { ...formData }; newFormData[question.for] = []; updateFormData(newFormData); } const newDontCareData = { ...dontCareData } newDontCareData[question.for] = !dontCare; setDontCareData(newDontCareData); } const nextClick = () => { updatePage(page + 1); } const backClick = () => { updatePage(page - 1); } const AdvanceButtons = () => { return (
{!isLastPage ?
:
}
) }; return (

{question.question}

{question.options.map((option, index) => { return ( ); })}
{question.optional ? : undefined}
) } const PageTransition = ({lastPage, currentPage}: { lastPage: JSX.Element | null, currentPage: JSX.Element, }) => { return (
{currentPage}
{/** last page */}
{lastPage}
); }; /** * Main guided survey component. * Page 0 = greeting page. */ const GuidedSurvey = ({questions}: { questions: Question[], }) => { const [page, setPage] = useState(0); const [formData, setFormData] = useState<(Record)>({}); const [dontCareData, setDoneCareData] = useState<(Record)>({}); const [previousPage, setPreviousPage] = useState(undefined); const updatePage = (pageNumber: number) => { setPreviousPage(page); setPage(pageNumber); }; const SurveyPage = ({pageNumber}: { pageNumber?: number, }) => { if (pageNumber === undefined) { return null; } if (pageNumber === 0) { return ( ); } const question = questions[pageNumber-1]; if (!question) { return null; } const isLastPage = pageNumber === questions.length return ( ); } /** * Renders the hidden html form selectors */ const HTMLQuestion = ({question}: {question: Question}) => { return ( ); } const lastPage = ; const currentPage = ; return (

Search

{/** Hidden html */}
{questions.map((question, index) => { return })}
) } export { GuidedSurvey, }