初步迁移状态完成,成功做到显示当前角色、聊天
This commit is contained in:
202
frontend-react/src/Store/Slices/RoleSelectorSlice.jsx
Normal file
202
frontend-react/src/Store/Slices/RoleSelectorSlice.jsx
Normal file
@@ -0,0 +1,202 @@
|
||||
import { create } from 'zustand';
|
||||
|
||||
// 异步获取角色数据
|
||||
const fetchRoleData = async () => {
|
||||
try {
|
||||
const response = await fetch('/api/tool_bar/get_all_role_and_chat', {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Cache-Control': 'no-cache',
|
||||
'Pragma': 'no-cache',
|
||||
'Expires': '0'
|
||||
}
|
||||
});
|
||||
const data = await response.json();
|
||||
return data;
|
||||
} catch (error) {
|
||||
console.error('获取角色数据失败:', error);
|
||||
throw error;
|
||||
}
|
||||
};
|
||||
|
||||
const useRoleSelectorStore = create((set, get) => ({
|
||||
// 状态
|
||||
roleData: {},
|
||||
selectedRole: null,
|
||||
selectedChat: null,
|
||||
hoveredRole: null,
|
||||
clickedRole: null,
|
||||
isLoading: false,
|
||||
searchTerm: '',
|
||||
editingRole: null,
|
||||
editingChat: null,
|
||||
showDeleteConfirm: null,
|
||||
deleteType: null,
|
||||
|
||||
// 操作
|
||||
fetchRoleData: async () => {
|
||||
set({ isLoading: true });
|
||||
try {
|
||||
const data = await fetchRoleData();
|
||||
set({ roleData: data, isLoading: false });
|
||||
} catch (error) {
|
||||
set({ isLoading: false });
|
||||
console.error('获取角色数据失败:', error);
|
||||
}
|
||||
},
|
||||
|
||||
setSelectedRole: (role) => set({ selectedRole: role }),
|
||||
|
||||
setSelectedChat: (chat) => set({ selectedChat: chat }),
|
||||
|
||||
setHoveredRole: (role) => set({ hoveredRole: role }),
|
||||
|
||||
setClickedRole: (role) => set({ clickedRole: role }),
|
||||
|
||||
setSearchTerm: (term) => set({ searchTerm: term }),
|
||||
|
||||
setEditingRole: (role) => set({ editingRole: role }),
|
||||
|
||||
setEditingChat: (chat) => set({ editingChat: chat }),
|
||||
|
||||
setShowDeleteConfirm: (name) => set({ showDeleteConfirm: name }),
|
||||
|
||||
setDeleteType: (type) => set({ deleteType: type }),
|
||||
|
||||
handleRenameRole: (oldName, newName) => {
|
||||
const { roleData, selectedRole } = get();
|
||||
if (newName && newName !== oldName) {
|
||||
const newRoleData = { ...roleData };
|
||||
const chats = newRoleData[oldName];
|
||||
delete newRoleData[oldName];
|
||||
newRoleData[newName] = chats;
|
||||
|
||||
if (selectedRole === oldName) {
|
||||
set({
|
||||
roleData: newRoleData,
|
||||
selectedRole: newName,
|
||||
editingRole: null
|
||||
});
|
||||
} else {
|
||||
set({
|
||||
roleData: newRoleData,
|
||||
editingRole: null
|
||||
});
|
||||
}
|
||||
} else {
|
||||
set({ editingRole: null });
|
||||
}
|
||||
},
|
||||
|
||||
handleRenameChat: (oldName, newName) => {
|
||||
const { roleData, selectedRole, selectedChat } = get();
|
||||
if (newName && newName !== oldName) {
|
||||
const newRoleData = { ...roleData };
|
||||
const chatIndex = newRoleData[selectedRole].indexOf(oldName);
|
||||
if (chatIndex !== -1) {
|
||||
newRoleData[selectedRole][chatIndex] = newName;
|
||||
|
||||
if (selectedChat === oldName) {
|
||||
set({
|
||||
roleData: newRoleData,
|
||||
selectedChat: newName,
|
||||
editingChat: null
|
||||
});
|
||||
} else {
|
||||
set({
|
||||
roleData: newRoleData,
|
||||
editingChat: null
|
||||
});
|
||||
}
|
||||
} else {
|
||||
set({ editingChat: null });
|
||||
}
|
||||
} else {
|
||||
set({ editingChat: null });
|
||||
}
|
||||
},
|
||||
|
||||
confirmDelete: () => {
|
||||
const { roleData, selectedRole, selectedChat, showDeleteConfirm, deleteType } = get();
|
||||
const newRoleData = { ...roleData };
|
||||
|
||||
if (deleteType === 'role') {
|
||||
delete newRoleData[showDeleteConfirm];
|
||||
if (selectedRole === showDeleteConfirm) {
|
||||
set({
|
||||
roleData: newRoleData,
|
||||
selectedRole: null,
|
||||
selectedChat: null,
|
||||
showDeleteConfirm: null,
|
||||
deleteType: null
|
||||
});
|
||||
} else {
|
||||
set({
|
||||
roleData: newRoleData,
|
||||
showDeleteConfirm: null,
|
||||
deleteType: null
|
||||
});
|
||||
}
|
||||
} else if (deleteType === 'chat') {
|
||||
const chatIndex = newRoleData[selectedRole].indexOf(showDeleteConfirm);
|
||||
if (chatIndex !== -1) {
|
||||
newRoleData[selectedRole].splice(chatIndex, 1);
|
||||
if (selectedChat === showDeleteConfirm) {
|
||||
set({
|
||||
roleData: newRoleData,
|
||||
selectedChat: null,
|
||||
showDeleteConfirm: null,
|
||||
deleteType: null
|
||||
});
|
||||
} else {
|
||||
set({
|
||||
roleData: newRoleData,
|
||||
showDeleteConfirm: null,
|
||||
deleteType: null
|
||||
});
|
||||
}
|
||||
} else {
|
||||
set({
|
||||
showDeleteConfirm: null,
|
||||
deleteType: null
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
cancelDelete: () => set({ showDeleteConfirm: null, deleteType: null }),
|
||||
|
||||
handleAddRole: () => {
|
||||
const { roleData } = get();
|
||||
const newRole = '新角色';
|
||||
const newRoleData = { ...roleData };
|
||||
newRoleData[newRole] = [];
|
||||
set({
|
||||
roleData: newRoleData,
|
||||
editingRole: newRole
|
||||
});
|
||||
},
|
||||
|
||||
handleAddChat: () => {
|
||||
const { roleData, selectedRole } = get();
|
||||
if (!selectedRole) return;
|
||||
|
||||
const newChat = '新聊天';
|
||||
const newRoleData = { ...roleData };
|
||||
newRoleData[selectedRole].push(newChat);
|
||||
set({
|
||||
roleData: newRoleData,
|
||||
editingChat: newChat
|
||||
});
|
||||
},
|
||||
|
||||
resetPanel: () => set({
|
||||
hoveredRole: null,
|
||||
clickedRole: null,
|
||||
editingRole: null,
|
||||
editingChat: null,
|
||||
showDeleteConfirm: null
|
||||
})
|
||||
}));
|
||||
|
||||
export default useRoleSelectorStore;
|
||||
2
frontend-react/src/Store/indexStore.jsx
Normal file
2
frontend-react/src/Store/indexStore.jsx
Normal file
@@ -0,0 +1,2 @@
|
||||
// frontend-react/src/store/index.js
|
||||
export { default as useRoleSelectorStore } from './roleSelectorStore';
|
||||
Reference in New Issue
Block a user