fix: normalize topics in useAssistant and assistants slice to prevent errors (#12319)

This commit is contained in:
SuYao 2026-01-09 17:21:20 +08:00 committed by GitHub
parent 9b8420f9b9
commit 7a7089e315
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 16 additions and 7 deletions

View File

@ -83,7 +83,14 @@ export function useAssistant(id: string) {
throw new Error(`Assistant model is not set for assistant with name: ${assistant?.name ?? 'unknown'}`)
}
const assistantWithModel = useMemo(() => ({ ...assistant, model }), [assistant, model])
const normalizedTopics = useMemo(
() => (Array.isArray(assistant?.topics) ? assistant.topics : []),
[assistant?.topics]
)
const assistantWithModel = useMemo(
() => ({ ...assistant, model, topics: normalizedTopics }),
[assistant, model, normalizedTopics]
)
const settingsRef = useRef(assistant?.settings)

View File

@ -43,6 +43,8 @@ const initialState: AssistantsState = {
unifiedListOrder: []
}
const normalizeTopics = (topics: unknown): Topic[] => (Array.isArray(topics) ? topics : [])
const assistantsSlice = createSlice({
name: 'assistants',
initialState,
@ -127,7 +129,7 @@ const assistantsSlice = createSlice({
assistant.id === action.payload.assistantId
? {
...assistant,
topics: uniqBy([topic, ...assistant.topics], 'id')
topics: uniqBy([topic, ...normalizeTopics(assistant.topics)], 'id')
}
: assistant
)
@ -137,7 +139,7 @@ const assistantsSlice = createSlice({
assistant.id === action.payload.assistantId
? {
...assistant,
topics: assistant.topics.filter(({ id }) => id !== action.payload.topic.id)
topics: normalizeTopics(assistant.topics).filter(({ id }) => id !== action.payload.topic.id)
}
: assistant
)
@ -149,7 +151,7 @@ const assistantsSlice = createSlice({
assistant.id === action.payload.assistantId
? {
...assistant,
topics: assistant.topics.map((topic) => {
topics: normalizeTopics(assistant.topics).map((topic) => {
const _topic = topic.id === newTopic.id ? newTopic : topic
_topic.messages = []
return _topic
@ -173,7 +175,7 @@ const assistantsSlice = createSlice({
removeAllTopics: (state, action: PayloadAction<{ assistantId: string }>) => {
state.assistants = state.assistants.map((assistant) => {
if (assistant.id === action.payload.assistantId) {
assistant.topics.forEach((topic) => TopicManager.removeTopic(topic.id))
normalizeTopics(assistant.topics).forEach((topic) => TopicManager.removeTopic(topic.id))
return {
...assistant,
topics: [getDefaultTopic(assistant.id)]
@ -184,7 +186,7 @@ const assistantsSlice = createSlice({
},
updateTopicUpdatedAt: (state, action: PayloadAction<{ topicId: string }>) => {
outer: for (const assistant of state.assistants) {
for (const topic of assistant.topics) {
for (const topic of normalizeTopics(assistant.topics)) {
if (topic.id === action.payload.topicId) {
topic.updatedAt = new Date().toISOString()
break outer
@ -268,7 +270,7 @@ export const {
} = assistantsSlice.actions
export const selectAllTopics = createSelector([(state: RootState) => state.assistants.assistants], (assistants) =>
assistants.flatMap((assistant: Assistant) => assistant.topics)
assistants.flatMap((assistant: Assistant) => normalizeTopics(assistant.topics))
)
export const selectTopicsMap = createSelector([selectAllTopics], (topics) => {