import { AlertTriangle, Loader2, Trash2, X } from 'lucide-react' import { FormEvent, useEffect, useState } from 'react' import { api } from '../api' import type { Course } from '../types' interface DeleteCourseModalProps { isOpen: boolean onClose: () => void course: Course onSuccess: () => void } export function DeleteCourseModal({ isOpen, onClose, course, onSuccess }: DeleteCourseModalProps) { const [confirmName, setConfirmName] = useState('') const [busy, setBusy] = useState(false) const [error, setError] = useState('') useEffect(() => { if (isOpen) { setConfirmName('') setError('') setBusy(false) } }, [isOpen]) // 监听 ESC 键关闭 useEffect(() => { function handleKeyDown(e: KeyboardEvent) { if (e.key === 'Escape' && isOpen && !busy) { onClose() } } window.addEventListener('keydown', handleKeyDown) return () => window.removeEventListener('keydown', handleKeyDown) }, [isOpen, busy, onClose]) if (!isOpen) return null const isMatch = confirmName.trim() === course.name.trim() async function handleSubmit(e: FormEvent) { e.preventDefault() if (!isMatch) { setError('输入的课程名称不一致,请核对后重试') return } setBusy(true) setError('') try { await api.deleteCourse(course.id) onSuccess() } catch (err) { setError((err as Error).message || '删除课程失败,请稍后重试') setBusy(false) } } return (
{ if (e.target === e.currentTarget && !busy) { onClose() } }} >

删除课程

此操作无法撤销。该课程及其关联的 {course.episodes?.length || 0} 个分集{course.assets?.length || 0} 份素材文件和讲师信息都将被永久删除。

{course.name}
{ setConfirmName(e.target.value) if (error) setError('') }} placeholder="在此输入完整的课程名称" disabled={busy} className="delete-confirm-input" />
{error &&
{error}
}
) }