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 = ({