继续优化重构后的逻辑

This commit is contained in:
xintaofei
2026-03-10 21:32:21 +08:00
parent 516aebd7e5
commit a048a4cae2
2 changed files with 12 additions and 48 deletions

View File

@@ -165,10 +165,6 @@ const ConversationTabView = memo(function ConversationTabView({
const dbConvIdRef = useRef<number | null>(conversationId) const dbConvIdRef = useRef<number | null>(conversationId)
const statusUpdatedRef = useRef(false) const statusUpdatedRef = useRef(false)
const selectedAgentRef = useRef(selectedAgent) const selectedAgentRef = useRef(selectedAgent)
const pendingPromptRef = useRef<{
draft: PromptDraft
modeId: string | null
} | null>(null)
const createConversationPendingRef = useRef(false) const createConversationPendingRef = useRef(false)
const reconcileTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null) const reconcileTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)
const externalIdSavedRef = useRef(false) const externalIdSavedRef = useRef(false)
@@ -355,14 +351,6 @@ const ConversationTabView = memo(function ConversationTabView({
setSyncState, setSyncState,
]) ])
useEffect(() => {
if (connStatus === "connected" && pendingPromptRef.current) {
const pending = pendingPromptRef.current
pendingPromptRef.current = null
lifecycleSend(pending.draft, pending.modeId)
}
}, [connStatus, lifecycleSend])
useEffect(() => { useEffect(() => {
if (connStatus === "connected" || connStatus === "prompting") { if (connStatus === "connected" || connStatus === "prompting") {
statusUpdatedRef.current = false statusUpdatedRef.current = false
@@ -424,6 +412,7 @@ const ConversationTabView = memo(function ConversationTabView({
setAgentConnectError(tWelcome("enableAgentFirstPlaceholder")) setAgentConnectError(tWelcome("enableAgentFirstPlaceholder"))
return return
} }
if (connStatus !== "connected") return
const optimisticTurn = buildOptimisticUserTurnFromDraft( const optimisticTurn = buildOptimisticUserTurnFromDraft(
draft, draft,
@@ -436,32 +425,7 @@ const ConversationTabView = memo(function ConversationTabView({
) )
setSendSignal((prev) => prev + 1) setSendSignal((prev) => prev + 1)
setSyncState(effectiveConversationId, "awaiting_persist") setSyncState(effectiveConversationId, "awaiting_persist")
lifecycleSend(draft, selectedModeIdArg)
if (connStatus === "connected") {
lifecycleSend(draft, selectedModeIdArg)
} else {
pendingPromptRef.current = {
draft,
modeId: selectedModeIdArg ?? null,
}
if (
(!connStatus ||
connStatus === "disconnected" ||
connStatus === "error") &&
workingDirForConnection
) {
connConnect(
selectedAgent,
workingDirForConnection,
dbConversationId != null ? externalId : undefined,
{
source: "auto_link",
}
).catch((e) => {
setAgentConnectError(normalizeErrorMessage(e))
})
}
}
const persistedId = dbConvIdRef.current const persistedId = dbConvIdRef.current
if (persistedId) { if (persistedId) {
@@ -511,11 +475,8 @@ const ConversationTabView = memo(function ConversationTabView({
appendOptimisticTurn, appendOptimisticTurn,
bindConversationTab, bindConversationTab,
canAutoConnect, canAutoConnect,
connConnect,
connStatus, connStatus,
dbConversationId,
effectiveConversationId, effectiveConversationId,
externalId,
folderId, folderId,
hasPersistedConversation, hasPersistedConversation,
lifecycleSend, lifecycleSend,
@@ -530,7 +491,6 @@ const ConversationTabView = memo(function ConversationTabView({
tabId, tabId,
temporaryConversationId, temporaryConversationId,
trySaveExternalId, trySaveExternalId,
workingDirForConnection,
] ]
) )
@@ -659,12 +619,17 @@ export function ConversationDetailPanel() {
const { tabs, activeTabId, openNewConversationTab, closeTab } = const { tabs, activeTabId, openNewConversationTab, closeTab } =
useTabContext() useTabContext()
const [reloadByTabId, setReloadByTabId] = useState<Record<string, number>>({}) const [reloadByTabId, setReloadByTabId] = useState<Record<string, number>>({})
const tabsRef = useRef(tabs)
const conversationsRef = useRef(conversations) const conversationsRef = useRef(conversations)
const pendingClosedConversationIdsRef = useRef<Set<number>>(new Set()) const pendingClosedConversationIdsRef = useRef<Set<number>>(new Set())
const pendingRefreshTimerRef = useRef<ReturnType<typeof setTimeout> | null>( const pendingRefreshTimerRef = useRef<ReturnType<typeof setTimeout> | null>(
null null
) )
useEffect(() => {
tabsRef.current = tabs
}, [tabs])
useEffect(() => { useEffect(() => {
conversationsRef.current = conversations conversationsRef.current = conversations
}, [conversations]) }, [conversations])
@@ -744,6 +709,11 @@ export function ConversationDetailPanel() {
runtimeConversationId ?? summary?.id ?? null runtimeConversationId ?? summary?.id ?? null
if (!matchedConversationId) return if (!matchedConversationId) return
const isOpenInTabs = tabsRef.current.some(
(tab) => tab.conversationId === matchedConversationId
)
if (isOpenInTabs) return
invalidateDetailCache(matchedConversationId) invalidateDetailCache(matchedConversationId)
setSyncState(matchedConversationId, "reconciling") setSyncState(matchedConversationId, "reconciling")

View File

@@ -70,12 +70,6 @@ async function loadAndCacheDetail(
return promise return promise
} }
export async function warmupDetailCache(
conversationId: number
): Promise<DbConversationDetail> {
return loadAndCacheDetail(conversationId)
}
export async function refreshDetailCache( export async function refreshDetailCache(
conversationId: number conversationId: number
): Promise<DbConversationDetail> { ): Promise<DbConversationDetail> {