Skip to content

Commit 251fa62

Browse files
committed
feat: add tree data persist
1 parent aa30586 commit 251fa62

File tree

1 file changed

+94
-87
lines changed

1 file changed

+94
-87
lines changed

src/renderer/store/tree.ts

Lines changed: 94 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
TreeDataType,
44
} from '@arco-design/web-react/es/Tree/interface';
55
import { create } from 'zustand';
6+
import { persist } from 'zustand/middleware';
67
import { immer } from 'zustand/middleware/immer';
78

89
export type WebsiteTreeNode = Pick<TreeDataType, 'title'> & {
@@ -44,97 +45,103 @@ const defaultTreeData = [
4445
];
4546

4647
export const useTreeStore = create<TreeStoreState>()(
47-
immer((set) => ({
48-
treeData: defaultTreeData,
49-
selectedNode: null,
50-
setSelectedNode: (selectedNode: WebsiteTreeNode) => {
51-
set({
52-
selectedNode,
53-
});
54-
},
55-
56-
setTreeData: (treeData: WebsiteTreeNode[]) => {
57-
set({
58-
treeData,
59-
});
60-
},
61-
addTreeNode: (treeNode: WebsiteTreeNode) => {
62-
set((state) => {
63-
state.treeData.push(treeNode);
64-
});
65-
},
66-
addTreeNodeChildren: (parentKey: string, treeNode: WebsiteTreeNode) => {
67-
set((state) => {
68-
const treeData = state.treeData;
69-
70-
const targetTreeNode = findTreeNode(treeData, parentKey);
71-
if (!targetTreeNode) {
72-
return;
73-
}
74-
75-
if (!targetTreeNode.children) {
76-
targetTreeNode.children = [];
77-
}
78-
targetTreeNode.children.push(treeNode);
79-
});
80-
},
81-
moveTreeNode: (
82-
dragNode: NodeInstance | null,
83-
dropNode: NodeInstance | null,
84-
dropPosition: number
85-
) => {
86-
set((state) => {
87-
if (!dragNode) {
88-
return;
89-
}
90-
91-
if (!dropNode) {
92-
return;
93-
}
94-
95-
const loop = (
96-
data: TreeDataType[],
97-
key: string,
98-
callback: (
99-
item: TreeDataType,
100-
index: number,
101-
arr: TreeDataType[]
102-
) => void
103-
) => {
104-
data.some((item, index, arr) => {
105-
if (item.key === key) {
106-
callback(item, index, arr);
107-
return true;
108-
}
109-
110-
if (item.children) {
111-
return loop(item.children, key, callback);
112-
}
113-
});
114-
};
115-
116-
const data = [...state.treeData];
117-
let dragItem: TreeDataType;
118-
loop(data, dragNode.props._key ?? '', (item, index, arr) => {
119-
arr.splice(index, 1);
120-
dragItem = item;
48+
persist(
49+
immer((set) => ({
50+
treeData: defaultTreeData,
51+
selectedNode: null,
52+
setSelectedNode: (selectedNode: WebsiteTreeNode) => {
53+
set({
54+
selectedNode,
12155
});
56+
},
12257

123-
if (dropPosition === 0) {
124-
loop(data, dropNode.props._key ?? '', (item, index, arr) => {
125-
item.children = item.children || [];
126-
item.children.push(dragItem);
127-
});
128-
} else {
129-
loop(data, dropNode.props._key ?? '', (item, index, arr) => {
130-
arr.splice(dropPosition < 0 ? index : index + 1, 0, dragItem);
58+
setTreeData: (treeData: WebsiteTreeNode[]) => {
59+
set({
60+
treeData,
61+
});
62+
},
63+
addTreeNode: (treeNode: WebsiteTreeNode) => {
64+
set((state) => {
65+
state.treeData.push(treeNode);
66+
});
67+
},
68+
addTreeNodeChildren: (parentKey: string, treeNode: WebsiteTreeNode) => {
69+
set((state) => {
70+
const treeData = state.treeData;
71+
72+
const targetTreeNode = findTreeNode(treeData, parentKey);
73+
if (!targetTreeNode) {
74+
return;
75+
}
76+
77+
if (!targetTreeNode.children) {
78+
targetTreeNode.children = [];
79+
}
80+
targetTreeNode.children.push(treeNode);
81+
});
82+
},
83+
moveTreeNode: (
84+
dragNode: NodeInstance | null,
85+
dropNode: NodeInstance | null,
86+
dropPosition: number
87+
) => {
88+
set((state) => {
89+
if (!dragNode) {
90+
return;
91+
}
92+
93+
if (!dropNode) {
94+
return;
95+
}
96+
97+
const loop = (
98+
data: TreeDataType[],
99+
key: string,
100+
callback: (
101+
item: TreeDataType,
102+
index: number,
103+
arr: TreeDataType[]
104+
) => void
105+
) => {
106+
data.some((item, index, arr) => {
107+
if (item.key === key) {
108+
callback(item, index, arr);
109+
return true;
110+
}
111+
112+
if (item.children) {
113+
return loop(item.children, key, callback);
114+
}
115+
});
116+
};
117+
118+
const data = [...state.treeData];
119+
let dragItem: TreeDataType;
120+
loop(data, dragNode.props._key ?? '', (item, index, arr) => {
121+
arr.splice(index, 1);
122+
dragItem = item;
131123
});
132-
}
133124

134-
state.treeData = [...data];
135-
});
136-
},
137-
}))
125+
if (dropPosition === 0) {
126+
loop(data, dropNode.props._key ?? '', (item, index, arr) => {
127+
item.children = item.children || [];
128+
item.children.push(dragItem);
129+
});
130+
} else {
131+
loop(data, dropNode.props._key ?? '', (item, index, arr) => {
132+
arr.splice(dropPosition < 0 ? index : index + 1, 0, dragItem);
133+
});
134+
}
135+
136+
state.treeData = [...data];
137+
});
138+
},
139+
})),
140+
{
141+
name: 'webbox-tree',
142+
partialize: (state) => ({ treeData: state.treeData }),
143+
}
144+
)
138145
);
139146

140147
function findTreeNode(

0 commit comments

Comments
 (0)