import React, {useMemo} from 'react' import { BodySubmitProfilingQuestionsProductIdProfilingQuestionsPost, ProfilingQuestionsApiFactory, UpkQuestionChoice, UserQuestionAnswerIn } from "@/api"; import {Card, CardContent, CardFooter, CardHeader, CardTitle} from "@/components/ui/card.tsx"; import {useAppDispatch, useAppSelector} from "@/hooks.ts"; import {addAnswer, Answer, makeSelectChoicesByQuestion, saveAnswer, submitAnswer} from "@/models/answerSlice.ts"; import {useSelector} from "react-redux"; import {Button} from "@/components/ui/button" import { Pagination, PaginationContent, PaginationItem, PaginationLink, PaginationNext, } from "@/components/ui/pagination" import {Input} from "@/components/ui/input" import {Badge} from "@/components/ui/badge" import clsx from "clsx" import { ProfileQuestion, selectNextAvailableQuestion, selectQuestions, setNextQuestion, setQuestionActive } from "@/models/questionSlice.ts"; import {assert} from "@/lib/utils.ts"; const TextEntry: React.FC<{ question: ProfileQuestion }> = ({question}) => { const dispatch = useAppDispatch() const selectAnswer = useMemo(() => makeSelectChoicesByQuestion(question), [question]); const answer: Answer = useSelector(selectAnswer); const error: Boolean = answer.error_msg.length > 0 const handleInputChange = (event: React.ChangeEvent) => { dispatch(addAnswer({question: question, val: event.target.value})) }; return ( <> { error &&

{answer.error_msg}

} ) } const MultiChoiceItem: React.FC<{ question: ProfileQuestion, choice: UpkQuestionChoice }> = ({question, choice}) => { const dispatch = useAppDispatch() const selectAnswer = useMemo(() => makeSelectChoicesByQuestion(question), [question]); const answer: Answer = useSelector(selectAnswer); const selected: Boolean = answer.values.includes(choice.choice_id) return (
  • ) } const MultipleChoice: React.FC<{ question: ProfileQuestion }> = ({question}) => { const selectAnswer = useMemo(() => makeSelectChoicesByQuestion(question), [question]); const answer: Answer = useSelector(selectAnswer); const error: Boolean = answer.error_msg.length > 0 return ( <> { error &&

    {answer.error_msg}

    }
      { question.choices.map(c => { return }) }
    ) } const ProfileQuestionFull: React.FC<{ question: ProfileQuestion, }> = ({question}) => { const dispatch = useAppDispatch() const selectAnswer = useMemo(() => makeSelectChoicesByQuestion(question), [question]); const answer: Answer = useSelector(selectAnswer); const app = useAppSelector(state => state.app) const provided_answer = answer.values.length > 0 const error: Boolean = answer.error_msg.length > 0 const can_submit = provided_answer && !error && !answer.complete const renderContent = () => { switch (question.question_type) { case 'TE': return case 'MC': return } }; const submitAnswerEvt = () => { dispatch(submitAnswer({question: question})) assert(!answer.complete, "Can't submit completed Answer") assert(!answer.processing, "Can't submit processing Answer") assert(answer.error_msg.length == 0, "Can't submit Answer with error message") let body: BodySubmitProfilingQuestionsProductIdProfilingQuestionsPost = { 'answers': [{ "question_id": question.question_id, "answer": answer.values } as UserQuestionAnswerIn ] } new ProfilingQuestionsApiFactory().submitProfilingQuestionsProductIdProfilingQuestionsPost(app.bpid, app.bpuid, body) .then(res => { if (res.status == 200) { dispatch(saveAnswer({question: question})) dispatch(setNextQuestion()) } else { // let error_msg = res.data.msg } }) .catch(err => console.log(err)); } return ( {question.task_count.toLocaleString()} {question.question_text} {renderContent()} ) } const PaginationIcon: React.FC<{ question: ProfileQuestion, idx: number, }> = ({question, idx}) => { const dispatch = useAppDispatch() const answers = useAppSelector(state => state.answers) const completed: Boolean = Boolean(answers[question.question_id]?.complete) const setQuestion = (evt) => { if (completed) { evt.preventDefault() } else { dispatch(setQuestionActive(question)) } } return ( {idx + 1} ) } const QuestionsPage = () => { const dispatch = useAppDispatch() const questions = useSelector(selectQuestions) const question = useSelector(selectNextAvailableQuestion) dispatch(setQuestionActive(question)) const clickNext = () => { // TODO: if nextQuestion was already submitted, skip it! const index = questions.findIndex(q => q.question_id === question.question_id) const nextQuestion = index !== -1 ? questions[index + 1] ?? null : null dispatch(setQuestionActive(nextQuestion)) } return (

    A total of {questions.length} questions are available.

    { questions.slice(0, 5).map((q, i) => { return }) }
    ) } export { QuestionsPage }