203 lines
5.0 KiB
JavaScript
203 lines
5.0 KiB
JavaScript
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;
|