Files
NextEdu/src/modules/textbooks/components/textbook-form-dialog.tsx
SpecialX f3c223d914 feat(settings,questions,school,textbooks): add brand config, question components, school dialogs, textbooks hooks
settings:

- Add actions-brand, brand-config, data-access-brand for brand management

- Add admin-file-upload-card, admin-notification-config-card, admin-school-info-card, admin-security-policy-card

- Add ai-provider-delete-dialog, ai-provider-selector, brand-config-card

- Add security-recent-logins-section, security-two-factor-section

- Add config/profile-overview-config, data-access-profile-overview, lib/system-settings-utils

questions:

- Add batch-operations, import-export-buttons, knowledge-point-selector, options-editor

- Add question-bank-results-client, question-cascade-filter, question-content-renderer, utils

school:

- Add grade-delete-dialog, grade-form-dialog, grade-list-toolbar, grade-overview-cards

- Add use-grade-data hook

textbooks:

- Add textbook-form-fields component

- Add use-kp-create, use-kp-delete, use-kp-update hooks
2026-07-03 10:26:00 +08:00

74 lines
2.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"use client"
import { useState } from "react"
import { Plus } from "lucide-react"
import { useFormStatus } from "react-dom"
import { useTranslations } from "next-intl"
import { Button } from "@/shared/components/ui/button"
import {
Dialog,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
DialogTrigger,
} from "@/shared/components/ui/dialog"
import { createTextbookAction } from "../actions"
import { toast } from "sonner"
import { TextbookFormFields } from "./textbook-form-fields"
function SubmitButton() {
const { pending } = useFormStatus()
const t = useTranslations("textbooks")
return (
<Button type="submit" disabled={pending}>
{pending ? t("dialog.create.saving") : t("dialog.create.submit")}
</Button>
)
}
export function TextbookFormDialog() {
const t = useTranslations("textbooks")
const [open, setOpen] = useState(false)
const handleSubmit = async (formData: FormData) => {
try {
const result = await createTextbookAction(null, formData)
if (result.success) {
toast.success(result.message)
setOpen(false)
} else {
toast.error(result.message)
}
} catch (e) {
console.error("Failed to create textbook", e)
toast.error(t("reader.createFailed"))
}
}
return (
<Dialog open={open} onOpenChange={setOpen}>
<DialogTrigger asChild>
<Button>
<Plus className="mr-2 h-4 w-4" />
{t("list.add")}
</Button>
</DialogTrigger>
{/* 任意值 sm:max-w-[425px]shadcn/ui Dialog 标准宽度约定 */}
<DialogContent className="sm:max-w-[425px]">
<DialogHeader>
<DialogTitle>{t("dialog.create.title")}</DialogTitle>
<DialogDescription>{t("dialog.create.description")}</DialogDescription>
</DialogHeader>
<form action={handleSubmit}>
<TextbookFormFields />
<DialogFooter>
<SubmitButton />
</DialogFooter>
</form>
</DialogContent>
</Dialog>
)
}