import { createSlice } from '@reduxjs/toolkit'; import { fetchKnowledgeBases, createKnowledgeBase, updateKnowledgeBase, deleteKnowledgeBase, changeKnowledgeBaseType, searchKnowledgeBases, requestKnowledgeBaseAccess, } from './knowledgeBase.thunks'; const initialState = { knowledgeBases: [], currentKnowledgeBase: null, searchResults: [], searchLoading: false, loading: false, error: null, pagination: { total: 0, page: 1, page_size: 10, total_pages: 1, }, batchPermissions: {}, batchLoading: false, editStatus: 'idle', requestAccessStatus: 'idle', }; const knowledgeBaseSlice = createSlice({ name: 'knowledgeBase', initialState, reducers: { clearCurrentKnowledgeBase: (state) => { state.currentKnowledgeBase = null; }, clearSearchResults: (state) => { state.searchResults = []; }, clearEditStatus: (state) => { state.editStatus = 'idle'; }, }, extraReducers: (builder) => { builder // 获取知识库列表 .addCase(fetchKnowledgeBases.pending, (state) => { state.loading = true; state.error = null; }) .addCase(fetchKnowledgeBases.fulfilled, (state, action) => { state.loading = false; state.knowledgeBases = action.payload.items || []; state.pagination = { total: action.payload.total || 0, page: action.payload.page || 1, page_size: action.payload.page_size || 10, total_pages: action.payload.total_pages || 1, }; }) .addCase(fetchKnowledgeBases.rejected, (state, action) => { state.loading = false; state.error = action.payload || 'Failed to fetch knowledge bases'; }) // 创建知识库 .addCase(createKnowledgeBase.pending, (state) => { state.loading = true; state.error = null; }) .addCase(createKnowledgeBase.fulfilled, (state, action) => { state.loading = false; state.editStatus = 'successful'; // 不需要更新 knowledgeBases,因为创建后会跳转到详情页 }) .addCase(createKnowledgeBase.rejected, (state, action) => { state.loading = false; state.error = action.payload || 'Failed to create knowledge base'; state.editStatus = 'failed'; }) // 更新知识库 .addCase(updateKnowledgeBase.pending, (state) => { state.loading = true; state.error = null; }) .addCase(updateKnowledgeBase.fulfilled, (state, action) => { state.loading = false; state.currentKnowledgeBase = action.payload; state.editStatus = 'successful'; }) .addCase(updateKnowledgeBase.rejected, (state, action) => { state.loading = false; state.error = action.payload || 'Failed to update knowledge base'; state.editStatus = 'failed'; }) // 删除知识库 .addCase(deleteKnowledgeBase.pending, (state) => { state.loading = true; state.error = null; }) .addCase(deleteKnowledgeBase.fulfilled, (state, action) => { state.loading = false; state.knowledgeBases = state.knowledgeBases.filter((kb) => kb.id !== action.meta.arg.knowledgeBaseId); }) .addCase(deleteKnowledgeBase.rejected, (state, action) => { state.loading = false; state.error = action.payload || 'Failed to delete knowledge base'; }) // 修改知识库类型 .addCase(changeKnowledgeBaseType.pending, (state) => { state.loading = true; state.error = null; }) .addCase(changeKnowledgeBaseType.fulfilled, (state, action) => { state.loading = false; if (state.currentKnowledgeBase) { state.currentKnowledgeBase = { ...state.currentKnowledgeBase, type: action.payload.type, department: action.payload.department, group: action.payload.group, }; } state.editStatus = 'successful'; }) .addCase(changeKnowledgeBaseType.rejected, (state, action) => { state.loading = false; state.error = action.payload || 'Failed to change knowledge base type'; state.editStatus = 'failed'; }) // 搜索知识库 .addCase(searchKnowledgeBases.pending, (state) => { state.searchLoading = true; state.error = null; }) .addCase(searchKnowledgeBases.fulfilled, (state, action) => { state.searchLoading = false; if (action.payload && action.payload.code === 200) { state.searchResults = action.payload.data.items || []; } else { state.searchResults = action.payload.items || []; } }) .addCase(searchKnowledgeBases.rejected, (state, action) => { state.searchLoading = false; state.error = action.payload || 'Failed to search knowledge bases'; }) // 申请知识库访问权限 .addCase(requestKnowledgeBaseAccess.pending, (state) => { state.requestAccessStatus = 'loading'; }) .addCase(requestKnowledgeBaseAccess.fulfilled, (state) => { state.requestAccessStatus = 'successful'; }) .addCase(requestKnowledgeBaseAccess.rejected, (state) => { state.requestAccessStatus = 'failed'; }); }, }); export const { clearCurrentKnowledgeBase, clearSearchResults, clearEditStatus } = knowledgeBaseSlice.actions; export default knowledgeBaseSlice.reducer;