"use client" import { Button } from "@/components/ui/button" import { Card } from "@/components/ui/card" import { EmptyState } from "@/components/ui/empty-state" import { Input } from "@/components/ui/input" import { ScrollArea } from "@/components/ui/scroll-area" import { uploadFile } from "@/lib/api" import { useChatSocket } from "@/lib/hooks/use-chat-socket" import { notifyInfo } from "@/lib/toast" import { cn } from "@/lib/utils" import { useAuthStore } from "@/store/auth" import { ArrowLeft, ImagePlus, MessageSquare, Send } from "lucide-react" import Image from "next/image" import Link from "next/link" import { use, useEffect, useRef, useState } from "react" export default function ChatDetailPage({ params }: { params: Promise<{ id: string }> }) { const { id: targetUserId } = use(params) const [input, setInput] = useState("") const [uploading, setUploading] = useState(false) const imageInputRef = useRef(null) const { user } = useAuthStore() const { connected, sessionId, messages, error, createDM, joinSession, leaveSession, sendTextMessage, sendImageMessage, } = useChatSocket() const cacheKey = user?.id ? `chat:dm:${user.id}:${targetUserId}` : null useEffect(() => { if (!connected || !cacheKey) return const cached = window.localStorage.getItem(cacheKey) if (cached) { joinSession(cached) } else { createDM(targetUserId) } }, [connected, cacheKey, createDM, joinSession, targetUserId]) useEffect(() => { if (!sessionId || !cacheKey) return window.localStorage.setItem(cacheKey, sessionId) }, [sessionId, cacheKey]) useEffect( () => () => { if (sessionId) leaveSession(sessionId) }, [leaveSession, sessionId], ) if (!user?.id) { return (
) } return (
会话 {targetUserId}

{connected ? (sessionId ? "已连接" : "正在创建会话") : "连接中"}

{error &&

{error}

} {messages.length === 0 && ( )} {messages.map((msg) => { if (msg.type === "system") { return (
{msg.content}
) } const isMine = msg.senderId === user.id return (
{msg.type === "image" ? ( 聊天图片 ) : (

{msg.content}

)}

{new Date(msg.createdAt).toLocaleTimeString("zh-CN", { hour: "2-digit", minute: "2-digit", })}

) })}
{ const target = event.currentTarget const file = target.files?.[0] if (!file) return setUploading(true) void uploadFile(file, "chat") .then((imageUrl) => sendImageMessage(imageUrl)) .catch(() => notifyInfo("图片发送失败")) .finally(() => { setUploading(false) target.value = "" }) }} />
{ event.preventDefault() const text = input.trim() if (!text || !sessionId) return sendTextMessage(text) setInput("") }} > setInput(event.target.value)} placeholder="输入消息..." className="flex-1 border-border/60" />
) }