Files
SillyTavern_replica/frontend/src/Store/SideBarLeft/CharacterCardUISlice.jsx

149 lines
3.3 KiB
JavaScript

import { create } from 'zustand';
/**
* CharacterCard UI 状态 Store
* 管理角色卡列表的 UI 交互状态(非持久化)
*/
const useCharacterCardUIStore = create((set) => ({
// ==================== 状态 ====================
// 筛选标签数组 - 支持多标签交集筛选
// 格式: ['include:tag1', 'exclude:tag2', 'include:tag3']
filterTags: [],
// 是否处于编辑模式
isEditing: false,
// 编辑表单数据
editForm: null,
// 当前页码
currentPage: 1,
// 每页显示数量
pageSize: 12,
// ==================== Actions ====================
/**
* 设置筛选标签(三次切换:无筛选 -> 包含 -> 排除 -> 无筛选)
* @param {string} tag - 标签名
*/
setFilterTag: (tag) => {
set((state) => {
const currentFilter = state.filterTag;
// 如果点击的是同一个标签,循环切换状态
if (currentFilter && (currentFilter === tag || currentFilter === `include:${tag}` || currentFilter === `exclude:${tag}`)) {
if (currentFilter === tag || currentFilter === `include:${tag}`) {
// 从包含切换到排除
return { filterTag: `exclude:${tag}`, currentPage: 1 };
} else {
// 从排除切换到无筛选
return { filterTag: '', currentPage: 1 };
}
} else {
// 点击新标签,设置为包含模式
return { filterTag: `include:${tag}`, currentPage: 1 };
}
});
},
/**
* 清空筛选
*/
clearFilter: () => {
set({ filterTag: '', currentPage: 1 });
},
/**
* 进入编辑模式
* @param {Object} character - 角色数据
*/
startEditing: (character) => {
set({
isEditing: true,
editForm: {
name: character.name,
description: character.description || '',
personality: character.personality || '',
scenario: character.scenario || '',
first_mes: character.first_mes || '',
mes_example: character.mes_example || '',
categories: character.categories || [],
tags: character.tags || [],
worldInfoId: character.worldInfoId || null
}
});
},
/**
* 退出编辑模式
*/
cancelEditing: () => {
set({
isEditing: false,
editForm: null
});
},
/**
* 更新编辑表单字段
* @param {string} field - 字段名
* @param {*} value - 字段值
*/
updateEditForm: (field, value) => {
set((state) => ({
editForm: {
...state.editForm,
[field]: value
}
}));
},
/**
* 设置页码
* @param {number} page - 页码
*/
setCurrentPage: (page) => {
set({ currentPage: page });
},
/**
* 设置每页显示数量
* @param {number} size - 每页数量
*/
setPageSize: (size) => {
set({ pageSize: size, currentPage: 1 }); // 重置页码
},
/**
* 下一页
*/
nextPage: () => {
set((state) => ({ currentPage: state.currentPage + 1 }));
},
/**
* 上一页
*/
prevPage: () => {
set((state) => ({ currentPage: Math.max(1, state.currentPage - 1) }));
},
/**
* 重置所有 UI 状态
*/
reset: () => {
set({
filterTag: '',
isEditing: false,
editForm: null,
currentPage: 1,
pageSize: 12
});
}
}));
export default useCharacterCardUIStore;