fix(chat): 修复重连后对话状态丢失导致消息发送失败的问题

在 WebSocket 重连场景下,服务端可能丢失 `conversationId` 状态,导致后续消息发送被拒绝。通过在客户端消息中携带 `conversationId`,并在服务端添加 fallback 恢复逻辑,确保重连后仍能正常发送消息。

同时优化了 `pendingMessage` 类型定义,支持存储待发送的图片附件,修复了延迟发送场景下图片丢失的问题。
This commit is contained in:
2026-05-08 03:15:21 +08:00
parent 7440ade66d
commit 5087d77f23
4 changed files with 13 additions and 8 deletions

View File

@@ -19,7 +19,7 @@ export function ChatView() {
const [manifestPath, setManifestPath] = useState<string | null>(null);
const [accounts, setAccounts] = useState<Account[]>([]);
const [quote, setQuote] = useState<string | null>(null);
const [pendingMessage, setPendingMessage] = useState<string | null>(null);
const [pendingMessage, setPendingMessage] = useState<{ content: string; images?: Array<{ type: 'image'; data: string; mimeType: string }> } | null>(null);
const [showScrollBtn, setShowScrollBtn] = useState(false);
const creatingRef = useRef(false);
const scrollRef = useRef<HTMLDivElement>(null);
@@ -72,7 +72,7 @@ export function ChatView() {
useEffect(() => {
if (conversationId && connected && pendingMessage) {
const timer = setTimeout(() => {
send(pendingMessage);
send(pendingMessage.content, pendingMessage.images);
setPendingMessage(null);
}, 300);
return () => clearTimeout(timer);
@@ -108,10 +108,10 @@ export function ChatView() {
}, [removeMessage]);
// Delayed conversation creation
const handleSendNew = useCallback(async (content: string) => {
const handleSendNew = useCallback(async (content: string, images?: Array<{ data: string; mimeType: string }>) => {
if (creatingRef.current) return;
creatingRef.current = true;
setPendingMessage(content);
setPendingMessage({ content, images });
try {
const newId = await createConversation(content.slice(0, 30), selectedAccountId || undefined);
@@ -131,7 +131,7 @@ export function ChatView() {
if (conversationId) {
send(content, images);
} else {
handleSendNew(content);
handleSendNew(content, images);
}
}, [send, quote, conversationId]);