"use client" import type { ReactNode } from "react" import { useTranslations } from "next-intl" import type { KnowledgePoint } from "../types" import { Button } from "@/shared/components/ui/button" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/shared/components/ui/dialog" import { Input } from "@/shared/components/ui/input" import { Label } from "@/shared/components/ui/label" import { Textarea } from "@/shared/components/ui/textarea" /** * 题目创建器的渲染接口。 * * 通过 render prop 注入,避免 textbooks 模块直接 import questions 模块组件(P0-1 解耦)。 * 页面层负责传入实际的 CreateQuestionDialog 实现。 */ export interface QuestionCreatorRenderProps { open: boolean onOpenChange: (open: boolean) => void targetKp: KnowledgePoint | null } export interface KnowledgePointDialogsProps { // Create KP dialog createDialogOpen: boolean setCreateDialogOpen: (open: boolean) => void selectedText: string isCreating: boolean onCreateKnowledgePoint: (formData: FormData) => Promise // Edit KP dialog editKpDialogOpen: boolean setEditKpDialogOpen: (open: boolean) => void editingKp: KnowledgePoint | null isUpdatingKp: boolean onUpdateKnowledgePoint: (formData: FormData) => Promise // Question dialog(通过 render prop 注入,解耦 questions 模块) questionDialogOpen: boolean setQuestionDialogOpen: (open: boolean) => void targetKpForQuestion: KnowledgePoint | null /** * 题目创建器渲染函数。 * 由页面层注入实际的 questions 模块组件,模块内部不直接 import questions。 * 若不传则不渲染题目创建入口(学生端等无权限场景)。 */ renderQuestionCreator?: (props: QuestionCreatorRenderProps) => ReactNode } export function KnowledgePointDialogs({ createDialogOpen, setCreateDialogOpen, selectedText, isCreating, onCreateKnowledgePoint, editKpDialogOpen, setEditKpDialogOpen, editingKp, isUpdatingKp, onUpdateKnowledgePoint, questionDialogOpen, setQuestionDialogOpen, targetKpForQuestion, renderQuestionCreator, }: KnowledgePointDialogsProps) { const t = useTranslations("textbooks.dialog.knowledge") return ( <> {t("createTitle")} {t("createDesc")} {/* 包装为 void 返回,避免 as 断言;Promise 仍会被 React 处理 */}
{ void onCreateKnowledgePoint(formData) }}>