Untitled
unknown
typescript
a year ago
2.8 kB
5
Indexable
// Get selected option ids from cache data const requiredSelectedOptionsCount: number = Number( /Click on (\d+) answers/.exec(sectionStepNumberData.question_text)![1], ); const [activedQuestionOptionIds, setActivedQuestionOptionIds] = useState< number[] >([]); useEffect(() => { if (fetchTestQuestionOptions.isSuccess) { const selectedOptionIds = fetchTestQuestionOptions.data .filter((questionOption) => questionOption.is_selected) .map((questionOption) => questionOption.id); setActivedQuestionOptionIds(selectedOptionIds); } }, [fetchTestQuestionOptions.isSuccess]); // Handle select question option const mutationAnswerTestQuestionOptions = useMutation({ mutationKey: queryKeyTestQuestionOptions, mutationFn: async (selectedOptionId: number) => { // Toggle selected option id in actived question option ids [maximal selected options count = requiredSelectedOptionsCount] setActivedQuestionOptionIds((prev) => { const isOptionSelected = prev.includes(selectedOptionId); if (isOptionSelected) { return prev.filter((id) => id !== selectedOptionId); } if (prev.length < requiredSelectedOptionsCount) { return [...prev, selectedOptionId]; } return prev; }); // If actived options selected length === requiredSelectedOptionsCount ===> set to cache data and send to api const isAllRequiredOptionsSelected = activedQuestionOptionIds.length === requiredSelectedOptionsCount - 1; if (isAllRequiredOptionsSelected) { console.log( activedQuestionOptionIds.length, requiredSelectedOptionsCount, ); // Toggle selected option in options data const newOptions = fetchTestQuestionOptions.data!.map( (questionOption) => ({ ...questionOption, is_selected: activedQuestionOptionIds.includes(questionOption.id), }), ); // Active selected option in cache data queryClient.setQueryData(queryKeyTestQuestionOptions, newOptions); // Send selected option ids to api const extractSelectedOptionIds = newOptions .filter((option) => option.is_selected) .map((option) => option.id); await APIanswerTestQuestion({ testName: testUrlParams.testName, sectionId: atomStateTestData.sections[testUrlParams.sectionNumber - 1]!.id, questionId: sectionStepNumberData.id, selectedOptionIds: extractSelectedOptionIds, }); } }, }); const handleSelectQuestionOption = (selectedOptionId: number) => { mutationAnswerTestQuestionOptions.mutate(selectedOptionId); };
Editor is loading...
Leave a Comment