import { Exercise } from "@/components/Exercises/models/exercise"; import { useExercisesQuery } from "@/components/Exercises/queries"; import { StepProps } from "@/components/Exercises/screens/Add/AddExerciseStepper"; import { useExerciseSubmissionStateValue } from "@/components/Exercises/screens/Add/state"; import { setNewBaseVariationId, setVariationId } from "@/components/Exercises/screens/Add/state/exerciseSubmissionReducer"; import { LoadingPlaceholder } from "@/core/ui/LoadingWidget/LoadingWidget"; import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; import PhotoIcon from '@mui/icons-material/Photo'; import SearchIcon from '@mui/icons-material/Search'; import { Alert, AlertTitle, Avatar, AvatarGroup, Box, Button, InputAdornment, List, ListItem, ListItemButton, ListItemIcon, ListItemText, Paper, Switch, TextField, Typography } from "@mui/material"; import Grid from '@mui/material/Grid'; import React, { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; /* * Groups a list of objects by a property */ function groupBy(list: T[], keyGetter: (item: T) => K): Map { const map = new Map(); list.forEach((item) => { const key = keyGetter(item); const collection = map.get(key); if (!collection) { map.set(key, [item]); } else { collection.push(item); } }); return map; } // New component that displays the exercise info in a ListItem const ExerciseInfoListItem = ({ exercises }: { exercises: Exercise[] }) => { const MAX_EXERCISE_IMAGES = 4; const MAX_EXERCISE_NAMES = 5; const variationGroup = exercises[0].variationGroup; const exerciseId = exercises[0].id; const [state, dispatch] = useExerciseSubmissionStateValue(); const [showMore, setShowMore] = useState(false); const [stateVariationGroup, setStateVariationGroup] = useState(state.variationGroup); const [stateNewVariationId, setStateNewVariationId] = useState(state.newVariationExerciseId); useEffect(() => { dispatch(setVariationId(stateVariationGroup)); }, [dispatch, stateVariationGroup]); useEffect(() => { dispatch(setNewBaseVariationId(stateNewVariationId)); }, [dispatch, stateNewVariationId]); const handleToggle = (variationGroup: string | null, newVariationId: number | null) => () => { if (variationGroup !== null) { newVariationId = null; if (variationGroup === state.variationGroup) { variationGroup = null; } } else { variationGroup = null; if (newVariationId === state.newVariationExerciseId) { newVariationId = null; } } setStateVariationGroup(variationGroup); setStateNewVariationId(newVariationId); }; let isChecked; if (variationGroup === null) { isChecked = state.newVariationExerciseId === exerciseId; } else { isChecked = variationGroup === state.variationGroup; } return ( {exercises.map((base) => base.mainImage ? : )}

{exercise.getTranslation().name}

)} /> {!showMore && exercises.length > MAX_EXERCISE_NAMES ? setShowMore(true)} /> : null }
); }; export const Step2Variations = ({ onContinue, onBack }: StepProps) => { const [t] = useTranslation(); const exercisesQuery = useExercisesQuery(); const [searchTerm, setSearchTerms] = useState(''); // Group exercises by variationGroup let exercises: Exercise[] = []; let groupedExercises = new Map(); if (exercisesQuery.isSuccess) { exercises = exercisesQuery.data; if (searchTerm !== '') { exercises = exercises.filter((base) => base.getTranslation().name.toLowerCase().includes(searchTerm.toLowerCase())); } } groupedExercises = groupBy(exercises.filter(b => b.variationGroup !== null), (b: Exercise) => b.variationGroup!); return <> {t('exercises.whatVariationsExist')} setSearchTerms(event.target.value)} slotProps={{ input: { startAdornment: ( ), } }} /> {exercisesQuery.isLoading ? : {exercises.filter(b => b.variationGroup === null).map(exercise => )} {[...groupedExercises.keys()].map(variationGroup => )} } {t("exercises.identicalExercise")} {t('exercises.identicalExercisePleaseDiscard')}
; };