149 lines
3.3 KiB
JavaScript
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;
|