diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 80cd3c1..2ec0c6f 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -29,7 +29,15 @@ export default function App() { const ws = connectDashboardSocket((event: DashboardEvent) => { switch (event.type) { case "message_created": - setMessages((prev) => [event.data, ...prev].slice(0, 200)); + setMessages((prev) => { + const existing = prev.some((message) => message.id === event.data.id); + if (existing) { + return prev.map((message) => + message.id === event.data.id ? event.data : message, + ); + } + return [event.data, ...prev].slice(0, 200); + }); break; case "message_analyzed": setMessages((prev) => diff --git a/frontend/src/api/client.ts b/frontend/src/api/client.ts index 3b9d4dd..5edbbb1 100644 --- a/frontend/src/api/client.ts +++ b/frontend/src/api/client.ts @@ -29,16 +29,7 @@ export interface PageResult { nextCursor: string | null; } -export interface DashboardMessage { - id: string; - channel_id: string; - user_id: string; - username: string; - avatar_url: string | null; - content: string; - created_at: number; - type: "text" | "image" | "voice"; -} +export type DashboardMessage = MessageRecord; export interface Guild { id: string; diff --git a/frontend/src/components/messages/MessageCard.tsx b/frontend/src/components/messages/MessageCard.tsx index 400644b..6aa94e9 100644 --- a/frontend/src/components/messages/MessageCard.tsx +++ b/frontend/src/components/messages/MessageCard.tsx @@ -60,6 +60,7 @@ export function MessageCard({ message, onReanalyze }: MessageCardProps) {