refactor(web): 界面工具 - 代码优化,替换重复的复制、打包、项目选择和主题切换实现

删除未再引用的文字扫光组件。复制提示、压缩包读写、项目多选和主题揭示的对外行为保持不变。
This commit is contained in:
ddcat666
2026-10-01 11:40:08 +08:00
parent 22e7331d04
commit 572bc341f0
7 changed files with 264 additions and 425 deletions

View File

@@ -1,10 +1,17 @@
import { create } from "zustand";
type CanvasUiStore = {
editingProjectId: string | null;
editingProjectTitle: string;
selectedProjectIds: string[];
deleteProjectIds: string[];
type ProjectId = string;
type ProjectTitle = string;
type ProjectIdList = string[];
type ProjectUiState = {
editingProjectId: ProjectId | null;
editingProjectTitle: ProjectTitle;
selectedProjectIds: ProjectIdList;
deleteProjectIds: ProjectIdList;
};
type CanvasUiStore = ProjectUiState & {
startEditingProject: (id: string, title: string) => void;
setEditingProjectTitle: (title: string) => void;
stopEditingProject: () => void;
@@ -13,15 +20,42 @@ type CanvasUiStore = {
removeSelectedProjectIds: (ids: string[]) => void;
};
export const useCanvasUiStore = create<CanvasUiStore>((set) => ({
const emptyProjectUi: ProjectUiState = {
editingProjectId: null,
editingProjectTitle: "",
selectedProjectIds: [],
deleteProjectIds: [],
startEditingProject: (editingProjectId, editingProjectTitle) => set({ editingProjectId, editingProjectTitle }),
setEditingProjectTitle: (editingProjectTitle) => set({ editingProjectTitle }),
stopEditingProject: () => set({ editingProjectId: null }),
toggleSelectedProjectId: (id, selected) => set((state) => ({ selectedProjectIds: selected ? [...new Set([...state.selectedProjectIds, id])] : state.selectedProjectIds.filter((item) => item !== id) })),
setDeleteProjectIds: (deleteProjectIds) => set({ deleteProjectIds }),
removeSelectedProjectIds: (ids) => set((state) => ({ selectedProjectIds: state.selectedProjectIds.filter((id) => !ids.includes(id)) })),
selectedProjectIds: [] as ProjectIdList,
deleteProjectIds: [] as ProjectIdList,
};
function selectProject(ids: readonly string[], id: string, selected: boolean): string[] {
if (!selected) return ids.filter((item) => item !== id);
if (ids.includes(id)) return [...ids];
return [...ids, id];
}
function dropProjects(ids: readonly string[], removed: readonly string[]): string[] {
const blocked = new Set(removed);
return ids.filter((id) => !blocked.has(id));
}
export const useCanvasUiStore = create<CanvasUiStore>((set) => ({
...emptyProjectUi,
startEditingProject: (id, title) => {
set({ editingProjectId: id, editingProjectTitle: title });
},
setEditingProjectTitle: (title) => {
set({ editingProjectTitle: title });
},
stopEditingProject: () => {
set({ editingProjectId: null });
},
toggleSelectedProjectId: (id, selected) => {
set((state) => ({ selectedProjectIds: selectProject(state.selectedProjectIds, id, selected) }));
},
setDeleteProjectIds: (ids) => {
set({ deleteProjectIds: ids });
},
removeSelectedProjectIds: (ids) => {
set((state) => ({ selectedProjectIds: dropProjects(state.selectedProjectIds, ids) }));
},
}));