From 32e2f10122e5f5511fca41ba454e31ab1f362fb3 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 30 Mar 2026 14:13:24 +0000 Subject: [PATCH 1/2] Fix: show translation (not repeated L2 word) on MultipleChoiceContext solution MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When a user clicked "Show Solution" in the MultipleChoiceContext exercise, isExerciseOver was set to true externally but wordInContextHeadline stayed as exerciseBookmark.from (the L2 word). The context also highlighted that same word, so the learned word appeared twice and the translation was never shown. Fix: replace the wordInContextHeadline state with a derived value — show exerciseBookmark.from during the exercise, exerciseBookmark.to once over. This also removes the now-unnecessary setWordInContextHeadline call in notifyChoiceSelection. Closes #999 --- .../multipleChoiceContext/MultipleChoiceContext.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/exercises/exerciseTypes/multipleChoiceContext/MultipleChoiceContext.js b/src/exercises/exerciseTypes/multipleChoiceContext/MultipleChoiceContext.js index 172ed2011..a337448ce 100644 --- a/src/exercises/exerciseTypes/multipleChoiceContext/MultipleChoiceContext.js +++ b/src/exercises/exerciseTypes/multipleChoiceContext/MultipleChoiceContext.js @@ -30,7 +30,6 @@ export default function MultipleChoiceContext({ const [exerciseBookmark, setExerciseBookmark] = useState({ ...bookmarksToStudy[0], isExercise: true }); const [clickedIndex, setClickedIndex] = useState(null); const [clickedOption, setClickedOption] = useState(null); - const [wordInContextHeadline, setWordInContextHeadline] = useState(removePunctuation(bookmarksToStudy[0].from)); const isExerciseOverRef = useShadowRef(isExerciseOver); useEffect(() => { @@ -78,7 +77,6 @@ export default function MultipleChoiceContext({ setClickedOption(index); if (selectedChoiceId === exerciseBookmark.id) { setClickedIndex(index); - setWordInContextHeadline(removePunctuation(exerciseBookmark.to)); notifyCorrectAnswer(exerciseBookmark); } else { setClickedIndex(null); @@ -113,7 +111,9 @@ export default function MultipleChoiceContext({ {strings.multipleChoiceContextHeadline} -

{wordInContextHeadline}

+

+ {isExerciseOver ? removePunctuation(exerciseBookmark.to) : removePunctuation(exerciseBookmark.from)} +

{bookmarkProgressBar}
From 2384b817c154536e58e095e0375fc43afc862f6a Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 30 Mar 2026 14:13:53 +0000 Subject: [PATCH 2/2] Refactor: simplify MultipleChoiceContext (boy scout rule) - Replace 4-line for-loop with a single .map() for setting isExercise flags - Remove unused selectedChoiceContext parameter from notifyChoiceSelection (option.context was passed at the call site but never read in the function) --- .../multipleChoiceContext/MultipleChoiceContext.js | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/exercises/exerciseTypes/multipleChoiceContext/MultipleChoiceContext.js b/src/exercises/exerciseTypes/multipleChoiceContext/MultipleChoiceContext.js index a337448ce..9d454bbfe 100644 --- a/src/exercises/exerciseTypes/multipleChoiceContext/MultipleChoiceContext.js +++ b/src/exercises/exerciseTypes/multipleChoiceContext/MultipleChoiceContext.js @@ -36,11 +36,7 @@ export default function MultipleChoiceContext({ speech.stopAudio(); // Stop any pending speech from previous exercise resetSubSessionTimer(); setExerciseType(EXERCISE_TYPE); - let initExerciseBookmarks = [...bookmarksToStudy]; - for (let i = 0; i < initExerciseBookmarks.length; i++) { - if (i === 0) initExerciseBookmarks[i].isExercise = true; - else initExerciseBookmarks[i].isExercise = false; - } + const initExerciseBookmarks = bookmarksToStudy.map((b, i) => ({ ...b, isExercise: i === 0 })); setExerciseBookmarks(shuffle(initExerciseBookmarks)); // eslint-disable-next-line }, []); @@ -72,7 +68,7 @@ export default function MultipleChoiceContext({ // eslint-disable-next-line }, [reload, bookmarksToStudy]); - function notifyChoiceSelection(selectedChoiceId, selectedChoiceContext, index, e) { + function notifyChoiceSelection(selectedChoiceId, index, e) { if (isExerciseOver) return; setClickedOption(index); if (selectedChoiceId === exerciseBookmark.id) { @@ -126,7 +122,7 @@ export default function MultipleChoiceContext({ className={ clickedOption !== null ? (index === clickedOption ? (option.isExercise ? "correct" : "wrong") : "") : "" } - onClick={(e) => notifyChoiceSelection(option.id, option.context, index, e)} + onClick={(e) => notifyChoiceSelection(option.id, index, e)} > {option.left_ellipsis && <>...}