diff --git a/src/features/activity/index.tsx b/src/features/activity/index.tsx index e9be2b1..fb8f6b7 100644 --- a/src/features/activity/index.tsx +++ b/src/features/activity/index.tsx @@ -1,4 +1,4 @@ -import { useState } from "react"; +import { useEffect, useState } from "react"; import { DragIntoBlanksExercise } from "./drag_into_blanks_exercise"; import { Layout } from "./layout"; import { MultipleChoiceExercise } from "./multiple_choice_exercise"; @@ -13,7 +13,13 @@ import { TrueFalseQuestion, } from "@/core/models/entities/question"; -export function Activity({ activity }: { activity: IActivity }) { +export function Activity({ + activity, + closeActivity, +}: { + activity: IActivity; + closeActivity: VoidFunction; +}) { const { title, textContent, @@ -24,16 +30,16 @@ export function Activity({ activity }: { activity: IActivity }) { activityType, questions, } = activity; - const [isFormLocked, setIsFormLocked] = useState(false); - const [replies, setReplies] = useState( - new Array(questions.length).fill(undefined) - ); + const [replies, setReplies] = useState([]); + + useEffect(() => setReplies([]), [activityType]); + const handleFinishClick = () => { setIsFormLocked(true); }; const handleReattemptClick = () => { - setReplies(new Array(questions.length).fill(undefined)); + setReplies([]); setIsFormLocked(false); }; @@ -48,6 +54,7 @@ export function Activity({ activity }: { activity: IActivity }) { isFormLocked={isFormLocked} handleReattemptClick={handleReattemptClick} handleFinishClick={handleFinishClick} + closeActivity={closeActivity} > {activityType === "true-false" ? ( ["title"]; @@ -24,8 +25,9 @@ export function Layout({ image: Activity["image"]; youtubeVideoUrl: Activity["youtubeVideoUrl"]; isFormLocked: boolean; - handleReattemptClick: () => void; - handleFinishClick: () => void; + handleReattemptClick: VoidFunction; + handleFinishClick: VoidFunction; + closeActivity: VoidFunction; }) { return (
@@ -79,7 +81,7 @@ export function Layout({ - diff --git a/src/features/activity/multiple_choice_exercise/index.tsx b/src/features/activity/multiple_choice_exercise/index.tsx index 5cec5d9..44e1b97 100644 --- a/src/features/activity/multiple_choice_exercise/index.tsx +++ b/src/features/activity/multiple_choice_exercise/index.tsx @@ -1,17 +1,17 @@ import { MultipleChoiceQuestion } from "@/core/models/entities/question"; import styles from "./styles.module.scss"; -import { Dispatch, SetStateAction } from "react"; +import { Dispatch, SetStateAction, useState } from "react"; export function MultipleChoiceExercise({ - replies, - setReplies, isFormLocked, exercise, + replies, + setReplies, }: { - replies: number[]; - setReplies: Dispatch>; isFormLocked: boolean; exercise: MultipleChoiceQuestion[]; + replies: number[]; + setReplies: Dispatch>; }) { return (
    @@ -36,13 +36,14 @@ export function MultipleChoiceExercise({
    + onChange={() => setReplies((prev) => { const newReplies = [...prev]; newReplies[index] = i; return newReplies; }) } + checked={replies[index] === i} type="radio" id={`choice-${index}-${i}`} name={`choice-${index}`} diff --git a/src/features/activity/true_false_exercise/index.tsx b/src/features/activity/true_false_exercise/index.tsx index f576d0d..0a9e820 100644 --- a/src/features/activity/true_false_exercise/index.tsx +++ b/src/features/activity/true_false_exercise/index.tsx @@ -1,17 +1,17 @@ import styles from "./styles.module.scss"; -import { Dispatch, SetStateAction } from "react"; +import { Dispatch, SetStateAction, useState } from "react"; import { TrueFalseQuestion } from "@/core/models/entities/question"; export function TrueFalseExercise({ - replies, - setReplies, exercise, isFormLocked, + replies, + setReplies, }: { - replies: boolean[]; - setReplies: Dispatch>; isFormLocked: boolean; exercise: TrueFalseQuestion[]; + replies: boolean[]; + setReplies: Dispatch>; }) { return (
    + onChange={() => { setReplies((prev) => { const newReplies = [...prev]; newReplies[i] = true; return newReplies; - }) - } + }); + }} />
    @@ -60,13 +60,13 @@ export function TrueFalseExercise({ name={`true-false-${i}`} disabled={isFormLocked} checked={reply === false} - onClick={() => + onChange={() => { setReplies((prev) => { const newReplies = [...prev]; newReplies[i] = false; return newReplies; - }) - } + }); + }} />
    diff --git a/src/features/activity/type_in_blanks_exercise/index.tsx b/src/features/activity/type_in_blanks_exercise/index.tsx index 8ce5e74..eee1ab6 100644 --- a/src/features/activity/type_in_blanks_exercise/index.tsx +++ b/src/features/activity/type_in_blanks_exercise/index.tsx @@ -1,6 +1,4 @@ -import { IViewModel } from "@/features/activity_editor/model/view_model"; -import styles from "./styles.module.scss"; -import { Dispatch, SetStateAction, useRef, useState } from "react"; +import { Dispatch, SetStateAction, useEffect, useRef, useState } from "react"; import { FillInBlanksQuestion } from "@/core/models/entities/question"; export function TypeInBlanksExercise({ @@ -9,8 +7,8 @@ export function TypeInBlanksExercise({ isFormLocked, exercise, }: { - replies: { [index: number]: string }[]; - setReplies: Dispatch>; + replies: Map[]; + setReplies: Dispatch[]>>; isFormLocked: boolean; exercise: FillInBlanksQuestion[]; }) { @@ -25,7 +23,10 @@ export function TypeInBlanksExercise({ return

    {pieceValue}

    ; } - const reply = replies[index][i]; + const replyMap = replies[index] as + | Map + | undefined; + const reply = replyMap?.get(pieceKey); const isCorrect = reply !== undefined && reply !== null ? item.check(pieceKey, reply) @@ -34,16 +35,21 @@ export function TypeInBlanksExercise({ return ( { setReplies((prev) => { const newReplies = [...prev]; - newReplies[index][i] = e.target.value; + const newReplyMap = new Map( + newReplies[index] ?? new Map() + ); + newReplyMap.set(pieceKey, e.target.value); + newReplies[index] = newReplyMap; return newReplies; }); }} diff --git a/src/features/activity_editor/view/editor_form/activity/index.tsx b/src/features/activity_editor/view/editor_form/exercise_editor/index.tsx similarity index 81% rename from src/features/activity_editor/view/editor_form/activity/index.tsx rename to src/features/activity_editor/view/editor_form/exercise_editor/index.tsx index 8a74f47..f8bf247 100644 --- a/src/features/activity_editor/view/editor_form/activity/index.tsx +++ b/src/features/activity_editor/view/editor_form/exercise_editor/index.tsx @@ -2,10 +2,10 @@ import { Paper } from "@mui/material"; import TrueOrFalseExercise from "./true_or_false_exercise"; import FillOrDragExercise from "./type_or_drag_exercise"; import useViewModelContext from "@/features/activity_editor/view_model"; -import { MultipleChoiceExerciseForm } from "../multiple_choice_exercise_form"; -import { PairTextsWithImagesExerciseForm } from "../pair_texts_with_images_exercise_form"; +import { MultipleChoiceExerciseForm } from "./multiple_choice_exercise_form"; +import { PairTextsWithImagesExerciseForm } from "./pair_texts_with_images_exercise_form"; -export default function Activity() { +export default function ExerciseEditor() { const { activityType } = useViewModelContext()!; return ( diff --git a/src/features/activity_editor/view/editor_form/multiple_choice_exercise_form/index.tsx b/src/features/activity_editor/view/editor_form/exercise_editor/multiple_choice_exercise_form/index.tsx similarity index 100% rename from src/features/activity_editor/view/editor_form/multiple_choice_exercise_form/index.tsx rename to src/features/activity_editor/view/editor_form/exercise_editor/multiple_choice_exercise_form/index.tsx diff --git a/src/features/activity_editor/view/editor_form/multiple_choice_exercise_form/styles.module.scss b/src/features/activity_editor/view/editor_form/exercise_editor/multiple_choice_exercise_form/styles.module.scss similarity index 100% rename from src/features/activity_editor/view/editor_form/multiple_choice_exercise_form/styles.module.scss rename to src/features/activity_editor/view/editor_form/exercise_editor/multiple_choice_exercise_form/styles.module.scss diff --git a/src/features/activity_editor/view/editor_form/pair_texts_with_images_exercise_form/index.tsx b/src/features/activity_editor/view/editor_form/exercise_editor/pair_texts_with_images_exercise_form/index.tsx similarity index 100% rename from src/features/activity_editor/view/editor_form/pair_texts_with_images_exercise_form/index.tsx rename to src/features/activity_editor/view/editor_form/exercise_editor/pair_texts_with_images_exercise_form/index.tsx index a5acdbb..7bbca64 100644 --- a/src/features/activity_editor/view/editor_form/pair_texts_with_images_exercise_form/index.tsx +++ b/src/features/activity_editor/view/editor_form/exercise_editor/pair_texts_with_images_exercise_form/index.tsx @@ -6,12 +6,12 @@ import { PhotoLibraryOutlined, } from "@mui/icons-material"; import { useState } from "react"; -import useViewModelContext from "@/features/activity_editor/view_model"; import { nanoid } from "nanoid"; import { SimpleQuestion } from "@/core/models/entities/question"; import { Fab } from "@mui/material"; import { AltEditDialog } from "@/features/edit_dialog/index.alt"; import { Testable } from "@/core/models/entities/testable"; +import useViewModelContext from "@/features/activity_editor/view_model"; interface ImageCard { question: string; diff --git a/src/features/activity_editor/view/editor_form/pair_texts_with_images_exercise_form/styles.module.scss b/src/features/activity_editor/view/editor_form/exercise_editor/pair_texts_with_images_exercise_form/styles.module.scss similarity index 100% rename from src/features/activity_editor/view/editor_form/pair_texts_with_images_exercise_form/styles.module.scss rename to src/features/activity_editor/view/editor_form/exercise_editor/pair_texts_with_images_exercise_form/styles.module.scss diff --git a/src/features/activity_editor/view/editor_form/activity/true_or_false_exercise.tsx b/src/features/activity_editor/view/editor_form/exercise_editor/true_or_false_exercise.tsx similarity index 100% rename from src/features/activity_editor/view/editor_form/activity/true_or_false_exercise.tsx rename to src/features/activity_editor/view/editor_form/exercise_editor/true_or_false_exercise.tsx diff --git a/src/features/activity_editor/view/editor_form/activity/type_or_drag_exercise.tsx b/src/features/activity_editor/view/editor_form/exercise_editor/type_or_drag_exercise.tsx similarity index 100% rename from src/features/activity_editor/view/editor_form/activity/type_or_drag_exercise.tsx rename to src/features/activity_editor/view/editor_form/exercise_editor/type_or_drag_exercise.tsx diff --git a/src/features/activity_editor/view/editor_form/index.tsx b/src/features/activity_editor/view/editor_form/index.tsx index 03d6084..b340597 100644 --- a/src/features/activity_editor/view/editor_form/index.tsx +++ b/src/features/activity_editor/view/editor_form/index.tsx @@ -1,12 +1,12 @@ import { FormControl, InputLabel, MenuItem, Select } from "@mui/material"; import styles from "../styles.module.scss"; import useViewModelContext from "../../view_model"; -import Activity from "./activity"; import { Activity as IActivity } from "@/core/models/entities/learning_unit"; import { MediaTester } from "@/core/components/media_tester"; import YouTube from "react-youtube"; import { NextImageContainer } from "@/core/components/next_image_container"; import getYouTubeID from "get-youtube-id"; +import ExerciseEditor from "./exercise_editor"; const activityTypeMap = { "true-false": "Doğru yanlış", @@ -155,7 +155,7 @@ export default function EditorForm() { placeholder="ses.mp3" />
- + ); } diff --git a/src/features/activity_editor/view/index.tsx b/src/features/activity_editor/view/index.tsx index 5bc5f34..431556f 100644 --- a/src/features/activity_editor/view/index.tsx +++ b/src/features/activity_editor/view/index.tsx @@ -5,10 +5,7 @@ import { Activity } from "@/features/activity"; import useViewModelContext from "../view_model"; import { useMemo } from "react"; import { Activity as IActivity } from "@/core/models/entities/learning_unit"; -import { - FillInBlanksQuestion, - TrueFalseQuestion, -} from "@/core/models/entities/question"; +import { FillInBlanksQuestion } from "@/core/models/entities/question"; import { ExerciseConverter } from "../services/exercise_converter"; export default function View() { @@ -79,7 +76,7 @@ export default function View() {
- + {}} activity={activity} />
diff --git a/src/features/admin_tools/theme_side_bar.tsx b/src/features/admin_tools/theme_side_bar.tsx index 55b3ecc..8dd4263 100644 --- a/src/features/admin_tools/theme_side_bar.tsx +++ b/src/features/admin_tools/theme_side_bar.tsx @@ -4,7 +4,6 @@ import { Dispatch, SetStateAction, useEffect, useState } from "react"; import { DeleteOutline, DesignServices, - RssFeed, WarningAmber, } from "@mui/icons-material"; import { useAdminViewModelContext } from "../theme_page/view_model/context_providers/admin_view_model"; @@ -24,8 +23,7 @@ export function ThemeSideBar({ // context state const { themeTitle, themeExplanation, themeImage, themeYoutubeVideoUrl } = useBaseViewModelContext()!; - const { saveTheme, deleteTheme, publishChanges } = - useAdminViewModelContext()!; + const { saveTheme, deleteTheme } = useAdminViewModelContext()!; // component state const [modified, setModified] = useState(false); @@ -98,10 +96,6 @@ export function ThemeSideBar({ >

Tema Editörü

-
{modified && ( diff --git a/src/features/app_bar/index.tsx b/src/features/app_bar/index.tsx index a605329..193aec7 100644 --- a/src/features/app_bar/index.tsx +++ b/src/features/app_bar/index.tsx @@ -14,7 +14,7 @@ export function AppBar({ home }: { home: "/admin" | "/" }) {