From 27021f93288f79cfc33503ee7650bf098d4553b4 Mon Sep 17 00:00:00 2001 From: chenhang Date: Mon, 22 Jun 2026 18:23:50 +0800 Subject: [PATCH] fix(chat): normalize message date headers --- src/data/dto/chat/ui_message.ts | 2 +- src/stores/chat/chat-machine.helpers.ts | 14 ++++++++++---- src/stores/chat/chat-machine.ts | 6 +++--- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/data/dto/chat/ui_message.ts b/src/data/dto/chat/ui_message.ts index 7b76b4e7..fa154322 100644 --- a/src/data/dto/chat/ui_message.ts +++ b/src/data/dto/chat/ui_message.ts @@ -10,7 +10,7 @@ import { z } from "zod"; export const UiMessageSchema = z.object({ content: z.string(), isFromAI: z.boolean(), - /** 显示用时间戳(HH:mm) */ + /** 日期分隔条使用的本地日期(YYYY-MM-DD) */ date: z.string(), /** 图片 URL(base64 data URL 或 http URL) */ imageUrl: z.string().optional(), diff --git a/src/stores/chat/chat-machine.helpers.ts b/src/stores/chat/chat-machine.helpers.ts index 19de1ca0..9b1565c5 100644 --- a/src/stores/chat/chat-machine.helpers.ts +++ b/src/stores/chat/chat-machine.helpers.ts @@ -25,7 +25,7 @@ import { chatRepository } from "@/data/repositories/chat_repository"; import type { IChatRepository } from "@/data/repositories/interfaces"; import { ChatStorage } from "@/data/storage/chat/chat_storage"; import { ChatSendResponse } from "@/data/dto/chat/chat_send_response"; -import { formatDate, Result, Logger } from "@/utils"; +import { todayString, Result, Logger } from "@/utils"; import type { ChatState } from "./chat-state"; @@ -61,10 +61,16 @@ export function localMessagesToUi( return records.map((m) => ({ content: m.content, isFromAI: m.role === "assistant", - date: m.createdAt, + date: messageDateFromCreatedAt(m.createdAt), })); } +function messageDateFromCreatedAt(createdAt: string): string { + const parsed = new Date(createdAt); + if (Number.isNaN(parsed.getTime())) return todayString(); + return todayString(parsed); +} + /** * ChatSendResponse → UiMessage(纯函数) * - 业务事实:后端响应就是 AI 的回复 @@ -74,7 +80,7 @@ export function sendResponseToUiMessage(response: ChatSendResponse): UiMessage { return { content: response.reply, isFromAI: true, - date: formatDate(new Date(response.timestamp)), + date: todayString(new Date(response.timestamp)), }; } @@ -201,7 +207,7 @@ export async function readAndSyncHistory(): Promise<{ "there were things I couldn't say there. " + "Finally I can relax. How was your day out?", isFromAI: true, - date: formatDate(), + date: todayString(), }; // 1. 读 local diff --git a/src/stores/chat/chat-machine.ts b/src/stores/chat/chat-machine.ts index 4472bfbc..3768a476 100644 --- a/src/stores/chat/chat-machine.ts +++ b/src/stores/chat/chat-machine.ts @@ -38,7 +38,7 @@ import { setup, assign } from "xstate"; import { ChatStorage } from "@/data/storage/chat/chat_storage"; -import { formatDate, todayString, Logger } from "@/utils"; +import { todayString, Logger } from "@/utils"; import { ChatState, initialState } from "./chat-state"; import type { ChatEvent } from "./chat-events"; @@ -229,7 +229,7 @@ export const chatMachine = setup({ messages.push({ content: event.text, isFromAI: true, - date: formatDate(), + date: todayString(), }); } else { const last = messages[messages.length - 1]; @@ -255,7 +255,7 @@ export const chatMachine = setup({ { content: "Something went wrong. Try sending again?", isFromAI: true, - date: formatDate(), + date: todayString(), }, ]; return { messages, isReplyingAI: false };