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,