mirror of
https://github.com/Funkoala14/KnowledgeBase_OOIN.git
synced 2025-06-09 09:48:15 +08:00
199 lines
7.6 KiB
JavaScript
199 lines
7.6 KiB
JavaScript
|
import { createSlice } from '@reduxjs/toolkit';
|
||
|
import {
|
||
|
fetchKnowledgeBases,
|
||
|
searchKnowledgeBases,
|
||
|
createKnowledgeBase,
|
||
|
getKnowledgeBaseById,
|
||
|
updateKnowledgeBase,
|
||
|
deleteKnowledgeBase,
|
||
|
} from './knowledgeBase.thunks';
|
||
|
|
||
|
const initialState = {
|
||
|
// List state
|
||
|
list: {
|
||
|
items: [],
|
||
|
total: 0,
|
||
|
page: 1,
|
||
|
page_size: 10,
|
||
|
status: 'idle', // 'idle' | 'loading' | 'succeeded' | 'failed'
|
||
|
error: null,
|
||
|
},
|
||
|
// Search state
|
||
|
search: {
|
||
|
items: [],
|
||
|
total: 0,
|
||
|
page: 1,
|
||
|
page_size: 10,
|
||
|
keyword: '',
|
||
|
status: 'idle', // 'idle' | 'loading' | 'succeeded' | 'failed'
|
||
|
error: null,
|
||
|
},
|
||
|
// Current knowledge base details
|
||
|
current: {
|
||
|
data: null,
|
||
|
status: 'idle', // 'idle' | 'loading' | 'succeeded' | 'failed'
|
||
|
error: null,
|
||
|
},
|
||
|
// Create/update/delete operations status
|
||
|
operations: {
|
||
|
status: 'idle', // 'idle' | 'loading' | 'succeeded' | 'failed'
|
||
|
error: null,
|
||
|
operationType: null, // 'create' | 'update' | 'delete'
|
||
|
},
|
||
|
};
|
||
|
|
||
|
const knowledgeBaseSlice = createSlice({
|
||
|
name: 'knowledgeBase',
|
||
|
initialState,
|
||
|
reducers: {
|
||
|
resetOperationStatus: (state) => {
|
||
|
state.operations = {
|
||
|
status: 'idle',
|
||
|
error: null,
|
||
|
operationType: null,
|
||
|
};
|
||
|
},
|
||
|
resetCurrentKnowledgeBase: (state) => {
|
||
|
state.current = {
|
||
|
data: null,
|
||
|
status: 'idle',
|
||
|
error: null,
|
||
|
};
|
||
|
},
|
||
|
resetSearchState: (state) => {
|
||
|
state.search = {
|
||
|
items: [],
|
||
|
total: 0,
|
||
|
page: 1,
|
||
|
page_size: 10,
|
||
|
keyword: '',
|
||
|
status: 'idle',
|
||
|
error: null,
|
||
|
};
|
||
|
},
|
||
|
},
|
||
|
extraReducers: (builder) => {
|
||
|
builder
|
||
|
// Fetch knowledge bases
|
||
|
.addCase(fetchKnowledgeBases.pending, (state) => {
|
||
|
state.list.status = 'loading';
|
||
|
})
|
||
|
.addCase(fetchKnowledgeBases.fulfilled, (state, action) => {
|
||
|
state.list.status = 'succeeded';
|
||
|
state.list.items = action.payload.items;
|
||
|
state.list.total = action.payload.total;
|
||
|
state.list.page = action.payload.page;
|
||
|
state.list.page_size = action.payload.page_size;
|
||
|
state.list.error = null;
|
||
|
})
|
||
|
.addCase(fetchKnowledgeBases.rejected, (state, action) => {
|
||
|
state.list.status = 'failed';
|
||
|
state.list.error = action.payload;
|
||
|
})
|
||
|
|
||
|
// Search knowledge bases
|
||
|
.addCase(searchKnowledgeBases.pending, (state, action) => {
|
||
|
state.search.status = 'loading';
|
||
|
// Store the keyword for reference
|
||
|
if (action.meta.arg.keyword) {
|
||
|
state.search.keyword = action.meta.arg.keyword;
|
||
|
}
|
||
|
})
|
||
|
.addCase(searchKnowledgeBases.fulfilled, (state, action) => {
|
||
|
state.search.status = 'succeeded';
|
||
|
state.search.items = action.payload.items;
|
||
|
state.search.total = action.payload.total;
|
||
|
state.search.page = action.payload.page;
|
||
|
state.search.page_size = action.payload.page_size;
|
||
|
state.search.error = null;
|
||
|
})
|
||
|
.addCase(searchKnowledgeBases.rejected, (state, action) => {
|
||
|
state.search.status = 'failed';
|
||
|
state.search.error = action.payload;
|
||
|
})
|
||
|
|
||
|
// Get knowledge base by ID
|
||
|
.addCase(getKnowledgeBaseById.pending, (state) => {
|
||
|
state.current.status = 'loading';
|
||
|
})
|
||
|
.addCase(getKnowledgeBaseById.fulfilled, (state, action) => {
|
||
|
state.current.status = 'succeeded';
|
||
|
state.current.data = action.payload;
|
||
|
state.current.error = null;
|
||
|
})
|
||
|
.addCase(getKnowledgeBaseById.rejected, (state, action) => {
|
||
|
state.current.status = 'failed';
|
||
|
state.current.error = action.payload;
|
||
|
})
|
||
|
|
||
|
// Create knowledge base
|
||
|
.addCase(createKnowledgeBase.pending, (state) => {
|
||
|
state.operations.status = 'loading';
|
||
|
state.operations.operationType = 'create';
|
||
|
})
|
||
|
.addCase(createKnowledgeBase.fulfilled, (state, action) => {
|
||
|
state.operations.status = 'succeeded';
|
||
|
// Don't add to list here - better to refetch the list to ensure consistency
|
||
|
state.operations.error = null;
|
||
|
})
|
||
|
.addCase(createKnowledgeBase.rejected, (state, action) => {
|
||
|
state.operations.status = 'failed';
|
||
|
state.operations.error = action.payload;
|
||
|
})
|
||
|
|
||
|
// Update knowledge base
|
||
|
.addCase(updateKnowledgeBase.pending, (state) => {
|
||
|
state.operations.status = 'loading';
|
||
|
state.operations.operationType = 'update';
|
||
|
})
|
||
|
.addCase(updateKnowledgeBase.fulfilled, (state, action) => {
|
||
|
state.operations.status = 'succeeded';
|
||
|
// Update in list if present
|
||
|
const index = state.list.items.findIndex((item) => item.id === action.payload.id);
|
||
|
if (index !== -1) {
|
||
|
state.list.items[index] = action.payload;
|
||
|
}
|
||
|
// Update in search results if present
|
||
|
const searchIndex = state.search.items.findIndex((item) => item.id === action.payload.id);
|
||
|
if (searchIndex !== -1) {
|
||
|
state.search.items[searchIndex] = action.payload;
|
||
|
}
|
||
|
// Update current if it's the same knowledge base
|
||
|
if (state.current.data && state.current.data.id === action.payload.id) {
|
||
|
state.current.data = action.payload;
|
||
|
}
|
||
|
state.operations.error = null;
|
||
|
})
|
||
|
.addCase(updateKnowledgeBase.rejected, (state, action) => {
|
||
|
state.operations.status = 'failed';
|
||
|
state.operations.error = action.payload;
|
||
|
})
|
||
|
|
||
|
// Delete knowledge base
|
||
|
.addCase(deleteKnowledgeBase.pending, (state) => {
|
||
|
state.operations.status = 'loading';
|
||
|
state.operations.operationType = 'delete';
|
||
|
})
|
||
|
.addCase(deleteKnowledgeBase.fulfilled, (state, action) => {
|
||
|
state.operations.status = 'succeeded';
|
||
|
// Remove from list if present
|
||
|
state.list.items = state.list.items.filter((item) => item.id !== action.payload);
|
||
|
// Remove from search results if present
|
||
|
state.search.items = state.search.items.filter((item) => item.id !== action.payload);
|
||
|
// Reset current if it's the same knowledge base
|
||
|
if (state.current.data && state.current.data.id === action.payload) {
|
||
|
state.current.data = null;
|
||
|
}
|
||
|
state.operations.error = null;
|
||
|
})
|
||
|
.addCase(deleteKnowledgeBase.rejected, (state, action) => {
|
||
|
state.operations.status = 'failed';
|
||
|
state.operations.error = action.payload;
|
||
|
});
|
||
|
},
|
||
|
});
|
||
|
|
||
|
export const { resetOperationStatus, resetCurrentKnowledgeBase, resetSearchState } = knowledgeBaseSlice.actions;
|
||
|
const knowledgeBaseReducer = knowledgeBaseSlice.reducer;
|
||
|
export default knowledgeBaseReducer;
|