mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2026-01-02 02:09:03 +08:00
Ensure session messages are properly restored when switching sessions
- Add Redux selector to check for existing messages in store - Always reload messages to Redux when session data is available - Add effect to restore messages when component mounts if missing from Redux
This commit is contained in:
parent
f533c1a2ca
commit
035001f841
@ -1,6 +1,6 @@
|
|||||||
import { useAppDispatch } from '@renderer/store'
|
import { useAppDispatch, useAppSelector } from '@renderer/store'
|
||||||
import { removeManyBlocks, upsertManyBlocks } from '@renderer/store/messageBlock'
|
import { upsertManyBlocks } from '@renderer/store/messageBlock'
|
||||||
import { newMessagesActions } from '@renderer/store/newMessage'
|
import { newMessagesActions, selectMessagesForTopic } from '@renderer/store/newMessage'
|
||||||
import { AgentPersistedMessage, UpdateSessionForm } from '@renderer/types'
|
import { AgentPersistedMessage, UpdateSessionForm } from '@renderer/types'
|
||||||
import { buildAgentSessionTopicId } from '@renderer/utils/agentSession'
|
import { buildAgentSessionTopicId } from '@renderer/utils/agentSession'
|
||||||
import { useCallback, useEffect, useMemo, useRef } from 'react'
|
import { useCallback, useEffect, useMemo, useRef } from 'react'
|
||||||
@ -17,6 +17,9 @@ export const useSession = (agentId: string, sessionId: string) => {
|
|||||||
const sessionTopicId = useMemo(() => buildAgentSessionTopicId(sessionId), [sessionId])
|
const sessionTopicId = useMemo(() => buildAgentSessionTopicId(sessionId), [sessionId])
|
||||||
const blockIdsRef = useRef<string[]>([])
|
const blockIdsRef = useRef<string[]>([])
|
||||||
|
|
||||||
|
// Check if messages are already in Redux
|
||||||
|
const messagesInRedux = useAppSelector((state) => selectMessagesForTopic(state, sessionTopicId))
|
||||||
|
|
||||||
const fetcher = async () => {
|
const fetcher = async () => {
|
||||||
const data = await client.getSession(agentId, sessionId)
|
const data = await client.getSession(agentId, sessionId)
|
||||||
return data
|
return data
|
||||||
@ -25,6 +28,9 @@ export const useSession = (agentId: string, sessionId: string) => {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const messages = data?.messages ?? []
|
const messages = data?.messages ?? []
|
||||||
|
|
||||||
|
// Always reload messages to Redux when data is available
|
||||||
|
// This ensures messages are restored when switching back to a session
|
||||||
if (!messages.length) {
|
if (!messages.length) {
|
||||||
dispatch(newMessagesActions.messagesReceived({ topicId: sessionTopicId, messages: [] }))
|
dispatch(newMessagesActions.messagesReceived({ topicId: sessionTopicId, messages: [] }))
|
||||||
blockIdsRef.current = []
|
blockIdsRef.current = []
|
||||||
@ -46,14 +52,24 @@ export const useSession = (agentId: string, sessionId: string) => {
|
|||||||
dispatch(newMessagesActions.messagesReceived({ topicId: sessionTopicId, messages: messageRecords }))
|
dispatch(newMessagesActions.messagesReceived({ topicId: sessionTopicId, messages: messageRecords }))
|
||||||
}, [data?.messages, dispatch, sessionTopicId])
|
}, [data?.messages, dispatch, sessionTopicId])
|
||||||
|
|
||||||
|
// Also ensure messages are reloaded when component mounts if they're missing from Redux
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
return () => {
|
// If we have data but no messages in Redux, reload them
|
||||||
if (blockIdsRef.current.length > 0) {
|
if (data?.messages && data.messages.length > 0 && messagesInRedux.length === 0) {
|
||||||
dispatch(removeManyBlocks(blockIdsRef.current))
|
const messages = data.messages
|
||||||
|
const persistedEntries = messages
|
||||||
|
.map((entity) => entity.content as AgentPersistedMessage | undefined)
|
||||||
|
.filter((entry): entry is AgentPersistedMessage => Boolean(entry))
|
||||||
|
|
||||||
|
const allBlocks = persistedEntries.flatMap((entry) => entry.blocks)
|
||||||
|
if (allBlocks.length > 0) {
|
||||||
|
dispatch(upsertManyBlocks(allBlocks))
|
||||||
}
|
}
|
||||||
dispatch(newMessagesActions.clearTopicMessages(sessionTopicId))
|
|
||||||
|
const messageRecords = persistedEntries.map((entry) => entry.message)
|
||||||
|
dispatch(newMessagesActions.messagesReceived({ topicId: sessionTopicId, messages: messageRecords }))
|
||||||
}
|
}
|
||||||
}, [dispatch, sessionTopicId])
|
}, [data?.messages, dispatch, messagesInRedux.length, sessionTopicId])
|
||||||
|
|
||||||
const updateSession = useCallback(
|
const updateSession = useCallback(
|
||||||
async (form: UpdateSessionForm) => {
|
async (form: UpdateSessionForm) => {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user