diff --git a/tnoodle-ui/src/main/components/EventPicker.tsx b/tnoodle-ui/src/main/components/EventPicker.tsx index 17a8fc982..b5e5038a7 100644 --- a/tnoodle-ui/src/main/components/EventPicker.tsx +++ b/tnoodle-ui/src/main/components/EventPicker.tsx @@ -17,7 +17,7 @@ import "./EventPicker.css"; import FmcTranslationsDetail from "./FmcTranslationsDetail"; import MbldDetail from "./MbldDetail"; import "@cubing/icons"; -import { useCallback, useEffect, useState } from "react"; +import { useCallback, useEffect, useMemo, useState } from "react"; import SVG from "react-inlinesvg"; import SchemeColorPicker from "./SchemeColorPicker"; import ScrambleAndImage from "../model/ScrambleAndImage"; @@ -61,11 +61,17 @@ const EventPicker = ({ wcaEvent, wcifEvent }: EventPickerProps) => { const [defaultColorScheme, setDefaultColorScheme] = useState>(); - const [colorScheme, setColorScheme] = useState>(); const [showColorSchemeConfig, setShowColorSchemeConfig] = useState(false); + const colorScheme = useMemo(() => { + return ( + findExtension(wcifEvent, colorSchemeExtensionId)?.data + ?.colorScheme || defaultColorScheme + ); + }, [wcifEvent, defaultColorScheme]); + const fetchDisplayScramble = useCallback( (fetchNewScramble = true) => { // we need this additional boolean to make sure we can fetch only once @@ -93,19 +99,6 @@ const EventPicker = ({ wcaEvent, wcifEvent }: EventPickerProps) => { } }, [wcaEvent.puzzle_id, colorScheme, fetchDisplayScramble]); - useEffect(() => { - let colorSchemeExtension = findExtension( - wcifEvent, - colorSchemeExtensionId - ); - - if (colorSchemeExtension !== undefined) { - setColorScheme(colorSchemeExtension.data.colorScheme); - } else if (defaultColorScheme !== undefined) { - setColorScheme(defaultColorScheme); - } - }, [wcifEvent, defaultColorScheme]); - const dispatch = useDispatch(); useEffect(() => { @@ -243,9 +236,7 @@ const EventPicker = ({ wcaEvent, wcifEvent }: EventPickerProps) => { setExtensionLazily( wcifEvent, colorSchemeExtensionId, - () => { - return buildColorSchemeExtension(colorScheme); - }, + () => buildColorSchemeExtension(colorScheme), dispatchWcifEvent ); } diff --git a/tnoodle-ui/src/main/components/FmcTranslationsDetail.tsx b/tnoodle-ui/src/main/components/FmcTranslationsDetail.tsx index fa8119059..132d3859a 100644 --- a/tnoodle-ui/src/main/components/FmcTranslationsDetail.tsx +++ b/tnoodle-ui/src/main/components/FmcTranslationsDetail.tsx @@ -1,5 +1,5 @@ import { chunk } from "lodash"; -import React, { useCallback, useEffect, useState } from "react"; +import React, { useCallback, useEffect, useMemo, useState } from "react"; import { useDispatch, useSelector } from "react-redux"; import RootState from "../model/RootState"; import { setFileZip } from "../redux/slice/ScramblingSlice"; @@ -8,11 +8,7 @@ import tnoodleApi from "../api/tnoodle.api"; import WcifEvent from "../model/WcifEvent"; import { fmcTranslationsExtensionId } from "../util/wcif.util"; import { setWcifEvent } from "../redux/slice/WcifSlice"; -import { - findAndProcessExtension, - findExtension, - setExtensionLazily, -} from "../util/extension.util"; +import { findExtension, setExtensionLazily } from "../util/extension.util"; const TRANSLATIONS_PER_LINE = 3; @@ -32,21 +28,6 @@ const FmcTranslationsDetail = ({ const [availableTranslations, setAvailableTranslations] = useState>(); - const [selectedTranslations, setSelectedTranslations] = useState( - [] - ); - - const [showTranslations, setShowTranslations] = useState(false); - - useEffect(() => { - findAndProcessExtension( - fmcWcifEvent, - fmcTranslationsExtensionId, - (ext) => { - setSelectedTranslations(ext.data.languageTags); - } - ); - }, [fmcWcifEvent]); useEffect(() => { if (availableTranslations === undefined) { @@ -56,6 +37,17 @@ const FmcTranslationsDetail = ({ } }, [availableTranslations]); + const [showTranslations, setShowTranslations] = useState(false); + + const selectedTranslations = useMemo(() => { + return ( + findExtension(fmcWcifEvent, fmcTranslationsExtensionId)?.data + ?.languageTags || + suggestedFmcTranslations || + [] + ); + }, [fmcWcifEvent, suggestedFmcTranslations]); + const dispatch = useDispatch(); const buildFmcExtension = (selectedTranslations: string[]) => { @@ -81,24 +73,6 @@ const FmcTranslationsDetail = ({ [dispatch, fmcWcifEvent] ); - useEffect(() => { - const existingExtensionFmc = findExtension( - fmcWcifEvent, - fmcTranslationsExtensionId - ); - - if ( - existingExtensionFmc === undefined && - suggestedFmcTranslations !== undefined - ) { - updateEventSelectedTranslations(suggestedFmcTranslations); - } - }, [ - fmcWcifEvent, - updateEventSelectedTranslations, - suggestedFmcTranslations, - ]); - const handleTranslation = (id: string, status: boolean) => { let newSelectedTranslations = selectedTranslations.filter( (it) => it !== id || status diff --git a/tnoodle-ui/src/main/components/MbldDetail.tsx b/tnoodle-ui/src/main/components/MbldDetail.tsx index a1816fbf6..6912c2929 100644 --- a/tnoodle-ui/src/main/components/MbldDetail.tsx +++ b/tnoodle-ui/src/main/components/MbldDetail.tsx @@ -5,9 +5,8 @@ import { setWcifEvent } from "../redux/slice/WcifSlice"; import { setFileZip } from "../redux/slice/ScramblingSlice"; import WcifEvent from "../model/WcifEvent"; import { mbldCubesExtensionId } from "../util/wcif.util"; -import { useCallback, useEffect, useState } from "react"; +import { useCallback, useMemo } from "react"; import { - findAndProcessExtension, findExtension, setExtensionLazily, upsertExtension, @@ -25,13 +24,14 @@ const MbldDetail = ({ mbldWcifEvent }: MbldDetailProps) => { (state: RootState) => state.scramblingSlice.generatingScrambles ); - const [mbld, setMbld] = useState(MBLD_DEFAULT); - - useEffect(() => { - findAndProcessExtension(mbldWcifEvent, mbldCubesExtensionId, (ext) => - setMbld(ext.data.requestedScrambles) + const mbld = useMemo(() => { + return ( + findExtension(mbldWcifEvent, mbldCubesExtensionId)?.data + ?.requestedScrambles || + bestMbldAttempt || + MBLD_DEFAULT ); - }, [mbldWcifEvent]); + }, [mbldWcifEvent, bestMbldAttempt]); const dispatch = useDispatch(); @@ -53,6 +53,7 @@ const MbldDetail = ({ mbldWcifEvent }: MbldDetailProps) => { newWcifEvent.rounds = newWcifEvent.rounds.map( (wcifRound) => { const overrideExtension = buildMbldExtension(mbld); + return upsertExtension( wcifRound, overrideExtension @@ -68,20 +69,6 @@ const MbldDetail = ({ mbldWcifEvent }: MbldDetailProps) => { [dispatch, mbldWcifEvent] ); - useEffect(() => { - const existingExtensionMbld = findExtension( - mbldWcifEvent, - mbldCubesExtensionId - ); - const shouldOverride = - existingExtensionMbld === undefined || - existingExtensionMbld.data.requestedScrambles !== bestMbldAttempt; - - if (shouldOverride && bestMbldAttempt !== undefined) { - updateEventMbld(bestMbldAttempt); - } - }, [mbldWcifEvent, updateEventMbld, bestMbldAttempt]); - return ( diff --git a/tnoodle-ui/src/test/Main.test.tsx b/tnoodle-ui/src/test/Main.test.tsx index 4e6f204d4..4ee946b6a 100644 --- a/tnoodle-ui/src/test/Main.test.tsx +++ b/tnoodle-ui/src/test/Main.test.tsx @@ -136,8 +136,8 @@ it("There should be only 1 button of type submit, check FMC changes", async () = // The only submit button must be Generate Scrambles expect(buttonsTypeSubmit[0].innerHTML).toBe("Generate Scrambles"); - // At first, the default translation selection should be the recommended tags - expect(getFmcLanguageTags(store)).toEqual(suggestedFmcTranslations); + // At first, there should be no translation information at all + expect(getFmcLanguageTags(store)).toBeUndefined(); // Select suggested await act(async () => { diff --git a/tnoodle-ui/src/test/mock/wca.api.test.mock.ts b/tnoodle-ui/src/test/mock/wca.api.test.mock.ts index 5f91b2c10..1ce807353 100644 --- a/tnoodle-ui/src/test/mock/wca.api.test.mock.ts +++ b/tnoodle-ui/src/test/mock/wca.api.test.mock.ts @@ -681,15 +681,7 @@ export const wcifs: Record = { scrambleSetCount: "1", }, ], - extensions: [ - { - data: { - languageTags: ["de", "es", "pt-BR"], - }, - id: "org.worldcubeassociation.tnoodle.FmcLanguages", - specUrl: "", - }, - ], + extensions: [], }, { id: "333mbf", @@ -706,26 +698,11 @@ export const wcifs: Record = { id: "org.worldcubeassociation.tnoodle.SheetCopyCount", specUrl: "", }, - { - data: { - requestedScrambles: 60, - }, - id: "org.worldcubeassociation.tnoodle.MultiScrambleCount", - specUrl: "", - }, ], scrambleSetCount: "1", }, ], - extensions: [ - { - data: { - requestedScrambles: 60, - }, - id: "org.worldcubeassociation.tnoodle.MultiScrambleCount", - specUrl: "", - }, - ], + extensions: [], }, ], schedule: { numberOfDays: 0, venues: [] },