diff --git a/src/app/(dashboard)/admin/dashboard/loading.tsx b/src/app/(dashboard)/admin/dashboard/loading.tsx index ba4d093..731b99b 100644 --- a/src/app/(dashboard)/admin/dashboard/loading.tsx +++ b/src/app/(dashboard)/admin/dashboard/loading.tsx @@ -1,5 +1,5 @@ -import { DashboardLoadingSkeleton } from "@/modules/dashboard/components/dashboard-loading-skeleton" +import { SkeletonCard } from "@/shared/components/ui/skeleton" export default function AdminDashboardLoading() { - return + return } diff --git a/src/app/(dashboard)/dashboard/loading.tsx b/src/app/(dashboard)/dashboard/loading.tsx index dc464d6..be129f2 100644 --- a/src/app/(dashboard)/dashboard/loading.tsx +++ b/src/app/(dashboard)/dashboard/loading.tsx @@ -1,5 +1,5 @@ -import { DashboardLoadingSkeleton } from "@/modules/dashboard/components/dashboard-loading-skeleton" +import { SkeletonCard } from "@/shared/components/ui/skeleton" export default function DashboardLoading() { - return + return } diff --git a/src/app/(dashboard)/student/dashboard/loading.tsx b/src/app/(dashboard)/student/dashboard/loading.tsx index d9e7c4a..44b23f4 100644 --- a/src/app/(dashboard)/student/dashboard/loading.tsx +++ b/src/app/(dashboard)/student/dashboard/loading.tsx @@ -1,5 +1,5 @@ -import { DashboardLoadingSkeleton } from "@/modules/dashboard/components/dashboard-loading-skeleton" +import { SkeletonCard } from "@/shared/components/ui/skeleton" export default function StudentDashboardLoading() { - return + return } diff --git a/src/app/(dashboard)/teacher/dashboard/loading.tsx b/src/app/(dashboard)/teacher/dashboard/loading.tsx index 0ac89b1..10ea8d1 100644 --- a/src/app/(dashboard)/teacher/dashboard/loading.tsx +++ b/src/app/(dashboard)/teacher/dashboard/loading.tsx @@ -1,5 +1,5 @@ -import { DashboardLoadingSkeleton } from "@/modules/dashboard/components/dashboard-loading-skeleton" +import { SkeletonCard } from "@/shared/components/ui/skeleton" export default function TeacherDashboardLoading() { - return + return } diff --git a/src/modules/ai/components/ai-chat-input.tsx b/src/modules/ai/components/ai-chat-input.tsx new file mode 100644 index 0000000..89a7c89 --- /dev/null +++ b/src/modules/ai/components/ai-chat-input.tsx @@ -0,0 +1,128 @@ +"use client" + +import { useTranslations } from "next-intl" +import { Send, Square } from "lucide-react" + +import { Button } from "@/shared/components/ui/button" +import { Textarea } from "@/shared/components/ui/textarea" + +type AiChatInputProps = { + value: string + onChange: (value: string) => void + onKeyDown: (e: React.KeyboardEvent) => void + streaming: boolean + onSend: () => void + onStop: () => void + maxReached: boolean + variant: "card" | "widget" + placeholder?: string +} + +/** + * AI 聊天输入框 + * + * 渲染文本输入区域与发送/停止按钮,支持 card / widget 两种视觉变体。 + * 纯展示组件,所有状态由容器通过 props 注入。 + */ +export function AiChatInput({ + value, + onChange, + onKeyDown, + streaming, + onSend, + onStop, + maxReached, + variant, + placeholder, +}: AiChatInputProps): React.ReactNode { + const t = useTranslations("ai") + const isWidget = variant === "widget" + + if (isWidget) { + return ( +
+
+