diff --git a/src/components/AppLayout.tsx b/src/components/AppLayout.tsx index ac7e240..7afaf1f 100644 --- a/src/components/AppLayout.tsx +++ b/src/components/AppLayout.tsx @@ -501,7 +501,6 @@ export function AppLayout() {
setScrollToMessageId(undefined)} diff --git a/src/features/chat/components/ChatHeader.tsx b/src/features/chat/components/ChatHeader.tsx index 0e4feb0..c3f5d15 100644 --- a/src/features/chat/components/ChatHeader.tsx +++ b/src/features/chat/components/ChatHeader.tsx @@ -1,6 +1,5 @@ import { memo, useState, useEffect } from "react"; import { - Loader2, MoreHorizontal, PanelLeft, Pin, @@ -35,7 +34,6 @@ const PERMISSION_MODE_LABELS: Record = { interface ChatHeaderProps { sidebarOpen: boolean; - isProcessing: boolean; model?: string; sessionId?: string; totalCost: number; @@ -53,7 +51,6 @@ interface ChatHeaderProps { export const ChatHeader = memo(function ChatHeader({ sidebarOpen, - isProcessing, model, sessionId, totalCost, @@ -151,13 +148,6 @@ export const ChatHeader = memo(function ChatHeader({
)} - {isProcessing && ( - - - Processing - - )} - {model && ( {model} diff --git a/src/features/chat/components/ChatView.tsx b/src/features/chat/components/ChatView.tsx index 3b17def..173232e 100644 --- a/src/features/chat/components/ChatView.tsx +++ b/src/features/chat/components/ChatView.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useMemo, useCallback, memo } from "react"; +import { Loader2 } from "lucide-react"; import { ScrollArea } from "@/components/ui/scroll-area"; import type { UIMessage } from "@/types"; import { MessageBubble } from "@/components/MessageBubble"; @@ -7,12 +8,19 @@ import { ToolCall } from "@/features/tools"; interface ChatViewProps { messages: UIMessage[]; + isProcessing: boolean; extraBottomPadding?: boolean; scrollToMessageId?: string; onScrolledToMessage?: () => void; } -export const ChatView = memo(function ChatView({ messages, extraBottomPadding, scrollToMessageId, onScrolledToMessage }: ChatViewProps) { +export const ChatView = memo(function ChatView({ + messages, + isProcessing, + extraBottomPadding, + scrollToMessageId, + onScrolledToMessage, +}: ChatViewProps) { const bottomRef = useRef(null); const scrollAreaRef = useRef(null); const scrollTimerRef = useRef(0); @@ -92,6 +100,17 @@ export const ChatView = memo(function ChatView({ messages, extraBottomPadding, s return ids; }, [messages]); + const activePromptId = useMemo(() => { + if (!isProcessing) return null; + for (let i = messages.length - 1; i >= 0; i -= 1) { + const msg = messages[i]; + if (msg.role !== "user") continue; + const hasAssistantAfter = messages.slice(i + 1).some((next) => next.role === "assistant"); + return hasAssistantAfter ? null : msg.id; + } + return null; + }, [messages, isProcessing]); + if (messages.length === 0) { return (
@@ -123,6 +142,19 @@ export const ChatView = memo(function ChatView({ messages, extraBottomPadding, s message={msg} isContinuation={continuationIds.has(msg.id)} /> + {msg.id === activePromptId && ( +
+
+ + + Processing + +
+
+ )}
); })}