1- import { get , writable } from 'svelte/store'
1+ import { get } from 'svelte/store'
22
3- import { createNode , recomputeTree , recurseObjectProperties } from '../tree-utils.svelte'
3+ import { createNode , recurseObjectProperties } from '../tree-utils.svelte'
44import type { TreeNode , TreeRecursionOpts } from '../types'
55import type { PropsStore } from './props'
66
77export type TreeStore = ReturnType < typeof createTreeStore >
88
99export const createTreeStore = ( propsStore : PropsStore ) => {
10- const [ defaultRootNode ] = createNode ( 0 , 'root' , [ ] , 0 , null , { } )
11- const tree = writable < TreeNode > ( defaultRootNode )
12- const treeMap = $state < Record < string , TreeNode > > ( { } )
13- const iteratedValues = writable < Map < any , TreeNode > > ( new Map ( ) )
10+ const [ defaultRootNode ] = createNode ( - 1 , 'root' , [ ] , 0 , null , { } )
11+ const treeMap = $state < Record < string , TreeNode > > ( {
12+ [ defaultRootNode . id ] : defaultRootNode
13+ } )
14+ const rootNode = $derived ( treeMap [ defaultRootNode . id ] )
15+ const iteratedValues = new Map < any , TreeNode > ( )
1416
1517 return {
16- tree,
1718 treeMap,
18- defaultRootNode ,
19+ rootNode ,
1920
20- update ( data : unknown , recursionOpts : TreeRecursionOpts < any > , recomputeExpandNode : boolean ) {
21- const recomputed = recomputeTree ( data , treeMap , recursionOpts , recomputeExpandNode )
22- if ( recomputed . tree ) {
23- tree . set ( recomputed . tree )
24- } else {
25- tree . set ( defaultRootNode )
21+ recompute ( data : unknown , recursionOpts : TreeRecursionOpts < any > , recomputeExpandNode : boolean ) {
22+ const oldIds = new Set ( Object . keys ( treeMap ) )
23+ iteratedValues . clear ( )
24+ recurseObjectProperties (
25+ defaultRootNode . index ,
26+ defaultRootNode . key ,
27+ data ,
28+ defaultRootNode . depth ,
29+ true ,
30+ null ,
31+ treeMap ,
32+ oldIds ,
33+ iteratedValues ,
34+ recomputeExpandNode ,
35+ recursionOpts
36+ )
37+ for ( const id of oldIds ) {
38+ delete treeMap [ id ]
2639 }
27- iteratedValues . set ( recomputed . iteratedValues )
2840 get ( propsStore . props ) . onUpdate ?.( treeMap )
2941 } ,
3042
3143 toggleCollapse ( id : string ) {
3244 const node = treeMap [ id ]
3345 if ( ! node ) {
34- console . warn ( `Attempted to collapse non-existent node: ${ id } ` )
35- return
46+ return console . warn ( `Attempted to collapse non-existent node: ${ id } ` )
3647 }
3748 node . collapsed = ! node . collapsed
3849 const recursionOpts = get ( propsStore . recursionOpts )
@@ -50,7 +61,6 @@ export const createTreeStore = (propsStore: PropsStore) => {
5061 // Only root node has no parent and it should not be expandable
5162 throw Error ( 'No parent in expandNodeChildren for node: ' + node )
5263 }
53- const previouslyIterated = get ( iteratedValues )
5464 const nodeWithUpdatedChildren = recurseObjectProperties (
5565 node . index ,
5666 node . key ,
@@ -60,14 +70,13 @@ export const createTreeStore = (propsStore: PropsStore) => {
6070 parent ,
6171 treeMap ,
6272 new Set ( ) ,
63- previouslyIterated ,
73+ iteratedValues ,
6474 false , // Never recompute shouldExpandNode since it may override the collapsing of this node
6575 recursionOpts
6676 )
6777 if ( ! nodeWithUpdatedChildren ) return
6878 treeMap [ nodeWithUpdatedChildren . id ] = nodeWithUpdatedChildren
6979 treeMap [ parent . id ] = parent
70- iteratedValues . set ( previouslyIterated )
7180 get ( propsStore . props ) . onUpdate ?.( treeMap )
7281 } ,
7382
0 commit comments