From afdcac2465d147abc58166d88f039e1640eb28cb Mon Sep 17 00:00:00 2001 From: Dhruwang Jariwala <67850763+Dhruwang@users.noreply.github.com> Date: Fri, 17 May 2024 14:48:32 +0530 Subject: [PATCH] fix: Shuffled choices issue (#2639) --- .../edit/components/SelectQuestionChoice.tsx | 3 +- .../questions/MultipleChoiceMultiQuestion.tsx | 124 ++++++++++-------- .../MultipleChoiceSingleQuestion.tsx | 106 ++++++++------- packages/surveys/src/lib/utils.ts | 32 +++-- 4 files changed, 149 insertions(+), 116 deletions(-) diff --git a/apps/web/app/(app)/(survey-editor)/environments/[environmentId]/surveys/[surveyId]/edit/components/SelectQuestionChoice.tsx b/apps/web/app/(app)/(survey-editor)/environments/[environmentId]/surveys/[surveyId]/edit/components/SelectQuestionChoice.tsx index e4242afb71..030cac66b4 100644 --- a/apps/web/app/(app)/(survey-editor)/environments/[environmentId]/surveys/[surveyId]/edit/components/SelectQuestionChoice.tsx +++ b/apps/web/app/(app)/(survey-editor)/environments/[environmentId]/surveys/[surveyId]/edit/components/SelectQuestionChoice.tsx @@ -55,9 +55,10 @@ export const SelectQuestionChoice = ({ surveyLanguageCodes, updateQuestion, }: ChoiceProps) => { + const isDragDisabled = choice.id === "other"; const { attributes, listeners, setNodeRef, transform, transition } = useSortable({ id: choice.id, - disabled: choice.id === "other", + disabled: isDragDisabled, }); const style = { diff --git a/packages/surveys/src/components/questions/MultipleChoiceMultiQuestion.tsx b/packages/surveys/src/components/questions/MultipleChoiceMultiQuestion.tsx index 7cefe21e01..011fc936c4 100644 --- a/packages/surveys/src/components/questions/MultipleChoiceMultiQuestion.tsx +++ b/packages/surveys/src/components/questions/MultipleChoiceMultiQuestion.tsx @@ -5,7 +5,7 @@ import { QuestionMedia } from "@/components/general/QuestionMedia"; import { Subheader } from "@/components/general/Subheader"; import { ScrollableContainer } from "@/components/wrappers/ScrollableContainer"; import { getUpdatedTtc, useTtc } from "@/lib/ttc"; -import { cn, shuffleQuestions } from "@/lib/utils"; +import { cn, getShuffledChoicesIds } from "@/lib/utils"; import { useCallback, useEffect, useMemo, useRef, useState } from "preact/hooks"; import { getLocalizedValue } from "@formbricks/lib/i18n/utils"; @@ -45,6 +45,13 @@ export const MultipleChoiceMultiQuestion = ({ const isMediaAvailable = question.imageUrl || question.videoUrl; useTtc(question.id, ttc, setTtc, startTime, setStartTime, question.id === currentQuestionId); + const shuffledChoicesIds = useMemo(() => { + if (question.shuffleOption) { + return getShuffledChoicesIds(question.choices, question.shuffleOption); + } else return question.choices.map((choice) => choice.id); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [question.shuffleOption, question.choices.length, question.choices[question.choices.length - 1].id]); + const getChoicesWithoutOtherLabels = useCallback( () => question.choices @@ -73,15 +80,17 @@ export const MultipleChoiceMultiQuestion = ({ if (!question.choices) { return []; } - const choicesWithoutOther = question.choices.filter((choice) => choice.id !== "other"); - if (question.shuffleOption) { - return shuffleQuestions(choicesWithoutOther, question.shuffleOption); - } - return choicesWithoutOther; - }, [question.choices, question.shuffleOption]); + if (question.shuffleOption === "none" || question.shuffleOption === undefined) return question.choices; + return shuffledChoicesIds.map((choiceId) => { + const choice = question.choices.find((choice) => { + return choice.id === choiceId; + }); + return choice; + }); + }, [question.choices, question.shuffleOption, shuffledChoicesIds]); const questionChoiceLabels = questionChoices.map((questionChoice) => { - return questionChoice.label[languageCode]; + return questionChoice?.label[languageCode]; }); const otherOption = useMemo( @@ -152,55 +161,60 @@ export const MultipleChoiceMultiQuestion = ({
Options
- {questionChoices.map((choice, idx) => ( - + ); + })} {otherOption && (