diff --git a/src/components/chat/message-input.tsx b/src/components/chat/message-input.tsx index 1100ed9..365a6b0 100644 --- a/src/components/chat/message-input.tsx +++ b/src/components/chat/message-input.tsx @@ -7,7 +7,11 @@ import { open } from "@tauri-apps/plugin-dialog" import Image from "next/image" import { useTranslations } from "next-intl" import { Button } from "@/components/ui/button" -import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover" +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover" import { Textarea } from "@/components/ui/textarea" import { Ellipsis, FileSearch, Plus, Send, Square, X } from "lucide-react" import { cn } from "@/lib/utils" @@ -1133,9 +1137,7 @@ export function MessageInput({ {/* 宽屏内联显示,窄屏(<300px)通过"更多"气泡显示 */} -
- {selectorItems} -
+
{selectorItems}
{hasAnySelector && ( diff --git a/src/components/conversations/conversation-detail-panel.tsx b/src/components/conversations/conversation-detail-panel.tsx index 6ad7d99..528b344 100644 --- a/src/components/conversations/conversation-detail-panel.tsx +++ b/src/components/conversations/conversation-detail-panel.tsx @@ -245,6 +245,10 @@ const ConversationTabView = memo(function ConversationTabView({ disconnect: connDisconnect, sessionId: connSessionId, } = conn + const connStatusRef = useRef(connStatus) + useEffect(() => { + connStatusRef.current = connStatus + }, [connStatus]) const isConnecting = connStatus === "connecting" || connStatus === "downloading" const connectionModes = useMemo( @@ -281,7 +285,7 @@ const ConversationTabView = memo(function ConversationTabView({ // resetting syncState while streaming. The useEffect with the // connStatus === "prompting" guard will handle it naturally // once prompting ends. - if (prevStatusRef.current === "prompting") return + if (connStatusRef.current === "prompting") return acknowledgePersistedDetail(refreshConversationId, refreshed) } catch (error) { setSyncState(refreshConversationId, "failed") @@ -348,11 +352,14 @@ const ConversationTabView = memo(function ConversationTabView({ acknowledgePersistedDetail(dbConversationId, detail) }, [acknowledgePersistedDetail, connStatus, dbConversationId, detail]) - const prevStatusRef = useRef(connStatus) + const [prevConnStatus, setPrevConnStatus] = useState(connStatus) + const promptingJustEnded = + prevConnStatus === "prompting" && connStatus !== "prompting" + if (prevConnStatus !== connStatus) { + setPrevConnStatus(connStatus) + } useEffect(() => { - const prev = prevStatusRef.current - prevStatusRef.current = connStatus - if (prev !== "prompting" || connStatus === "prompting") return + if (!promptingJustEnded) return setSyncState(effectiveConversationId, "reconciling") const persistedId = dbConvIdRef.current @@ -374,6 +381,7 @@ const ConversationTabView = memo(function ConversationTabView({ }, [ clearReconcileTimer, connStatus, + promptingJustEnded, effectiveConversationId, refreshConversations, refreshFromDb,