继续优化重构后的逻辑
This commit is contained in:
@@ -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")
|
||||||
|
|
||||||
if (connStatus === "connected") {
|
|
||||||
lifecycleSend(draft, selectedModeIdArg)
|
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")
|
||||||
|
|
||||||
|
|||||||
@@ -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> {
|
||||||
|
|||||||
Reference in New Issue
Block a user