diff --git a/src/modules/lesson-preparation/components/detail-panel/qa-editor.tsx b/src/modules/lesson-preparation/components/detail-panel/qa-editor.tsx new file mode 100644 index 0000000..fb7f9bb --- /dev/null +++ b/src/modules/lesson-preparation/components/detail-panel/qa-editor.tsx @@ -0,0 +1,250 @@ +"use client"; + +import { useTranslations } from "next-intl"; +import { createId } from "@paralleldrive/cuid2"; +import type { InteractionBlockData, QATurn } from "../../types"; +import { useLessonPlanEditor } from "../../hooks/use-lesson-plan-editor"; + +interface Props { + nodeId: string; + data: InteractionBlockData; +} + +export function QaEditor({ nodeId, data }: Props) { + const t = useTranslations("lessonPreparation"); + const updateNode = useLessonPlanEditor((s) => s.updateNode); + + const updateData = (next: InteractionBlockData) => { + updateNode(nodeId, { data: next }); + }; + + const addTurn = () => { + const newTurn: QATurn = { + id: createId(), + role: "teacher", + content: "", + expectedAnswer: "", + order: data.turns.length, + }; + updateData({ ...data, turns: [...data.turns, newTurn] }); + }; + + const updateTurn = (id: string, patch: Partial) => { + updateData({ + ...data, + turns: data.turns.map((t) => (t.id === id ? { ...t, ...patch } : t)), + }); + }; + + const removeTurn = (id: string) => { + updateData({ + ...data, + turns: data.turns + .filter((t) => t.id !== id) + .map((t, i) => ({ ...t, order: i })), + }); + }; + + const moveTurn = (id: string, direction: "up" | "down") => { + const idx = data.turns.findIndex((t) => t.id === id); + if (idx < 0) return; + const newIdx = direction === "up" ? idx - 1 : idx + 1; + if (newIdx < 0 || newIdx >= data.turns.length) return; + const turns = [...data.turns]; + [turns[idx], turns[newIdx]] = [turns[newIdx], turns[idx]]; + updateData({ + ...data, + turns: turns.map((t, i) => ({ ...t, order: i })), + }); + }; + + return ( +
+
+ +