From 9c1e80ac74b06555dcb96290937fe9535ee0a56d Mon Sep 17 00:00:00 2001 From: = <=> Date: Fri, 24 Apr 2026 17:44:39 +1000 Subject: [PATCH] logic done --- site/src/quiz/features/Choosing.tsx | 14 ++++++---- site/src/quiz/features/Matching.tsx | 2 +- site/src/quiz/features/Quiz.tsx | 41 ++++++++++++++++++---------- site/src/quiz/features/Sorting.tsx | 2 +- site/src/quiz/features/quizSlice.tsx | 15 +++++++--- site/src/quiz/quizData.tsx | 10 +++---- 6 files changed, 53 insertions(+), 31 deletions(-) diff --git a/site/src/quiz/features/Choosing.tsx b/site/src/quiz/features/Choosing.tsx index 0765572..da76e42 100644 --- a/site/src/quiz/features/Choosing.tsx +++ b/site/src/quiz/features/Choosing.tsx @@ -19,9 +19,11 @@ function Matching({ tasks, index }: ComponentProps) { const answers: boolean[] = tasks.map((item) => Boolean(item.answer)); const items: string[] = tasks.map((item) => String(item.answer)); const arr = useSelector((state: RootState) => state.quiz.userAnswers[index]); + // const correctAnswers = useSelector((state: RootState) => state.quiz.correctAnswers[index]); + const questions = useSelector((state: RootState) => state.quiz.questions[index]); const isDisabled = useSelector((state: RootState) => state.quiz.isTestingDone); useEffect(() => { - dispatch(addList({ index, items: items, answers: answers, quizType: "M" })); + dispatch(addList({ index, items: items,questions:tasks.map((item) => String(item.question)), answers: answers, quizType: "M" })); }, []); useEffect(() => { @@ -29,19 +31,19 @@ function Matching({ tasks, index }: ComponentProps) { }, []); - const handleCheckboxAction = (checkboxIndex: number) => (event: ChangeEvent, checked: boolean) => { - let answersCopy = [ ...arr ]; + const handleCheckboxAction = (checkboxIndex: number) => (_: ChangeEvent, checked: boolean) => { + let answersCopy = arr.map((x)=>(Boolean(x))); answersCopy[checkboxIndex] = checked; dispatch(setCheckedItems({ index, items: answersCopy })); }; - console.log(arr); + // console.log(arr); return ( - {tasks.map((item, itemIndex) => ( + {tasks.map((_, itemIndex) => ( - + { _ } : handleCheckboxAction(itemIndex)} checked={Boolean(arr == undefined ? false : arr[itemIndex])} diff --git a/site/src/quiz/features/Matching.tsx b/site/src/quiz/features/Matching.tsx index b5ee79b..6004ed0 100644 --- a/site/src/quiz/features/Matching.tsx +++ b/site/src/quiz/features/Matching.tsx @@ -14,7 +14,7 @@ function Matching({ tasks, index }: ComponentProps) { const answers: string[] = tasks.map((item) => String(item.answer)); // Добавляем список ответов очередного задания в хранилище useEffect(() => { - dispatch(addList({ index, items: answers, answers:answers, quizType: "M" })); + dispatch(addList({ index, items: answers, answers:answers, questions:tasks.map((item) => String(item.question)), quizType: "M" })); }, []); useEffect(() => { diff --git a/site/src/quiz/features/Quiz.tsx b/site/src/quiz/features/Quiz.tsx index 4c16b36..9e12663 100644 --- a/site/src/quiz/features/Quiz.tsx +++ b/site/src/quiz/features/Quiz.tsx @@ -11,27 +11,40 @@ import { useDispatch } from 'react-redux'; import { mixUp, startTesting, stopTesting } from './quizSlice'; function QuizStats() { + let correctAnswers = useSelector((state: RootState) => state.quiz.correctAnswers); + const userAnswers = useSelector((state: RootState) => state.quiz.userAnswers); const correctCount = (index: number): number => { - let quiz = useSelector((state: RootState) => state.quiz); let state = store.getState(); if (state.quiz.correctAnswers.length <= index) { return 0; } - return quiz.userAnswers[index].reduce((prev, answ, i) => prev + Number(quiz.correctAnswers[index][i] === answ), 0); + return userAnswers[index].reduce((prev, answ, i) => prev + Number(correctAnswers[index][i] === answ), 0); } - const quizPartText = (counter: number, len: number): string => { + const counts = userAnswers.map((_,index)=>correctCount(index)); + const questionCounts = userAnswers.map((answers)=>answers.length); + + const total= counts.reduce((x,c)=>c+x,0); + const totalQuestionCount= questionCounts.reduce((x,c)=>c+x,0); + + const donePercentage = Math.round(total/totalQuestionCount*100*100)/100; + + const quizPartText = (counter: number, len: number, taskIndex:number) => { if (counter == len) { - return "все ответы верные" + return Задание {taskIndex+1}: все ответы верные } - return `верно ${counter}/${len}` + return Задание {taskIndex+1}: верно {counter}/{len} } + + return ( - -

Результаты теста

- {/* Задание 1: {checkTask(0)} */} - {/* Задание 2: {checkTask(1)} */} + +

Результаты теста

+ { + counts.map((count,idx)=>quizPartText(count,questionCounts[idx],idx)) + } +

Итого {donePercentage}% Верно

) } @@ -61,19 +74,19 @@ function Quiz() { {[ - , + , - , + , - + ][(["M", "S", "C"].indexOf(item.type))]} ))} - - + + {displayingResults && } diff --git a/site/src/quiz/features/Sorting.tsx b/site/src/quiz/features/Sorting.tsx index 3b0923c..e1fa2b8 100644 --- a/site/src/quiz/features/Sorting.tsx +++ b/site/src/quiz/features/Sorting.tsx @@ -14,7 +14,7 @@ function Matching({ tasks, index }: ComponentProps) { const answers: string[] = tasks.map((item) => String(item.answer)); // Добавляем список ответов очередного задания в хранилище useEffect(() => { - dispatch(addList({ index, items: answers, answers:answers, quizType: "M" })); + dispatch(addList({ index, items: answers, answers:answers,questions:tasks.map((item) => String(item.question)), quizType: "M" })); }, []); useEffect(() => { diff --git a/site/src/quiz/features/quizSlice.tsx b/site/src/quiz/features/quizSlice.tsx index f93ea65..7301feb 100644 --- a/site/src/quiz/features/quizSlice.tsx +++ b/site/src/quiz/features/quizSlice.tsx @@ -20,6 +20,7 @@ function shuffle(array: Array): Array { interface QuizState { userAnswers: (string | boolean)[][]; // хранит перемещаемые элементы каждого списка ответов + questions: string[][]; correctAnswers: (string | boolean)[][];// ответы для вопрсов, в случае с matching просто правильная последоавтельность, для sorting аналогично, для choosе последоватеьность boolean quizTypes: Array<"M" | "S" | "C">; isTestingDone: boolean// запрет на взаимодействие с квизом после окончания тестирования, чтобю юзер не наглел @@ -29,6 +30,7 @@ const initialState: QuizState = { userAnswers: [], correctAnswers: [], quizTypes: [], + questions:[], isTestingDone: false, }; @@ -36,8 +38,9 @@ const listsSlice = createSlice({ name: 'lists', initialState, reducers: { - addList: (state, action: PayloadAction<{ index: number; items: string[]; answers: (string|boolean)[]; quizType : "S" | "M" | "C"}>) => { - const { index, items,answers,quizType} = action.payload; + addList: (state, action: PayloadAction<{ index: number; items: string[]; questions: string[]; answers: (string|boolean)[]; quizType : "S" | "M" | "C"}>) => { + const { index, items,questions,answers,quizType} = action.payload; + state.questions.splice(index, 1, questions); state.userAnswers.splice(index, 1, items); // с нулём создаётся по 2 экземпляра, видно в отладке state.quizTypes.splice(index, 1, quizType); // state.correctAnswers.splice(index, 1, answers); @@ -49,7 +52,7 @@ const listsSlice = createSlice({ state.userAnswers[index] = items; // обновляем конкретный список } }, - setCheckedItems: (state, action: PayloadAction<{ index: number; items: (string|boolean)[] }>) => { + setCheckedItems: (state, action: PayloadAction<{ index: number; items: boolean[] }>) => { const { index, items } = action.payload; if (index >= 0 && index < state.userAnswers.length) { state.userAnswers[index] = items; // обновляем конкретный список @@ -58,7 +61,11 @@ const listsSlice = createSlice({ mixUp: (state) => { state.userAnswers = state.userAnswers.map((list,index) => { if(typeof(state.correctAnswers[index][0])==="boolean"){ - return list.map(()=>false); + list.map(()=>false); + let indexes = shuffle( list.map((_,idx)=>idx)); + state.correctAnswers[index]=state.correctAnswers[index].map((_,i,arr)=>arr[indexes[i]]) + state.questions[index]=state.questions[index].map((_,i,arr)=>arr[indexes[i]]) + return list.map(()=>false) } return shuffle(list); }) diff --git a/site/src/quiz/quizData.tsx b/site/src/quiz/quizData.tsx index 411b3ce..0129328 100644 --- a/site/src/quiz/quizData.tsx +++ b/site/src/quiz/quizData.tsx @@ -68,23 +68,23 @@ export const quiz: tQuizzes = [ "title": "Вопрос 3 Выбирай", "tasks": [ { - "question": "123", + "question": "да", "answer": true }, { - "question": "456", + "question": "нет", "answer": false }, { - "question": "789", + "question": "да1", "answer": true }, { - "question": "101112", + "question": "нет1", "answer": false }, { - "question": "131415", + "question": "да2", "answer": true }, ]