@react-stately/data 3.11.1-nightly.4440 → 3.11.1-nightly.4451

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/import.mjs CHANGED
@@ -505,33 +505,38 @@ function $f86e6c1ec7da6ebb$export$bc3384a35de93d66(options) {
505
505
  */
506
506
  function $be2ea0343af54212$export$d14e1352e21f4a16(options) {
507
507
  let { initialItems: initialItems = [], initialSelectedKeys: initialSelectedKeys, getKey: getKey = (item)=>item.id || item.key, getChildren: getChildren = (item)=>item.children } = options;
508
- let map = (0, $d70Aq$useMemo)(()=>new Map(), []);
509
508
  // We only want to compute this on initial render.
510
- // eslint-disable-next-line react-hooks/exhaustive-deps
511
- let initialNodes = (0, $d70Aq$useMemo)(()=>buildTree(initialItems), []);
512
- let [items, setItems] = (0, $d70Aq$useState)(initialNodes);
509
+ let [tree, setItems] = (0, $d70Aq$useState)(()=>buildTree(initialItems, new Map()));
510
+ let { items: items, nodeMap: nodeMap } = tree;
513
511
  let [selectedKeys, setSelectedKeys] = (0, $d70Aq$useState)(new Set(initialSelectedKeys || []));
514
- function buildTree(initialItems = [], parentKey) {
515
- return initialItems.map((item)=>{
516
- let node = {
517
- key: getKey(item),
518
- parentKey: parentKey,
519
- value: item,
520
- children: null
521
- };
522
- node.children = buildTree(getChildren(item), node.key);
523
- map.set(node.key, node);
524
- return node;
525
- });
512
+ function buildTree(initialItems = [], map, parentKey) {
513
+ return {
514
+ items: initialItems.map((item)=>{
515
+ let node = {
516
+ key: getKey(item),
517
+ parentKey: parentKey,
518
+ value: item,
519
+ children: null
520
+ };
521
+ node.children = buildTree(getChildren(item), map, node.key).items;
522
+ map.set(node.key, node);
523
+ return node;
524
+ }),
525
+ nodeMap: map
526
+ };
526
527
  }
527
- function updateTree(items, key, update) {
528
- let node = map.get(key);
529
- if (!node) return items;
528
+ function updateTree(items, key, update, originalMap) {
529
+ let node = originalMap.get(key);
530
+ if (!node) return {
531
+ items: items,
532
+ nodeMap: originalMap
533
+ };
534
+ let map = new Map(originalMap);
530
535
  // Create a new node. If null, then delete the node, otherwise replace.
531
536
  let newNode = update(node);
532
- if (newNode == null) deleteNode(node);
533
- else addNode(newNode);
534
- // Walk up the tree and update each parent to refer to the new chilren.
537
+ if (newNode == null) deleteNode(node, map);
538
+ else addNode(newNode, map);
539
+ // Walk up the tree and update each parent to refer to the new children.
535
540
  while(node.parentKey){
536
541
  let nextParent = map.get(node.parentKey);
537
542
  let copy = {
@@ -551,35 +556,41 @@ function $be2ea0343af54212$export$d14e1352e21f4a16(options) {
551
556
  node = nextParent;
552
557
  }
553
558
  if (newNode == null) items = items.filter((c)=>c !== node);
554
- return items.map((item)=>{
555
- if (item === node) return newNode;
556
- return item;
557
- });
559
+ return {
560
+ items: items.map((item)=>{
561
+ if (item === node) return newNode;
562
+ return item;
563
+ }),
564
+ nodeMap: map
565
+ };
558
566
  }
559
- function addNode(node) {
567
+ function addNode(node, map) {
560
568
  map.set(node.key, node);
561
- for (let child of node.children)addNode(child);
569
+ for (let child of node.children)addNode(child, map);
562
570
  }
563
- function deleteNode(node) {
571
+ function deleteNode(node, map) {
564
572
  map.delete(node.key);
565
- for (let child of node.children)deleteNode(child);
573
+ for (let child of node.children)deleteNode(child, map);
566
574
  }
567
575
  return {
568
576
  items: items,
569
577
  selectedKeys: selectedKeys,
570
578
  setSelectedKeys: setSelectedKeys,
571
579
  getItem (key) {
572
- return map.get(key);
580
+ return nodeMap.get(key);
573
581
  },
574
582
  insert (parentKey, index, ...values) {
575
- setItems((items)=>{
576
- let nodes = buildTree(values, parentKey);
583
+ setItems(({ items: items, nodeMap: originalMap })=>{
584
+ let { items: newNodes, nodeMap: newMap } = buildTree(values, originalMap, parentKey);
577
585
  // If parentKey is null, insert into the root.
578
- if (parentKey == null) return [
579
- ...items.slice(0, index),
580
- ...nodes,
581
- ...items.slice(index)
582
- ];
586
+ if (parentKey == null) return {
587
+ items: [
588
+ ...items.slice(0, index),
589
+ ...newNodes,
590
+ ...items.slice(index)
591
+ ],
592
+ nodeMap: newMap
593
+ };
583
594
  // Otherwise, update the parent node and its ancestors.
584
595
  return updateTree(items, parentKey, (parentNode)=>({
585
596
  key: parentNode.key,
@@ -587,24 +598,24 @@ function $be2ea0343af54212$export$d14e1352e21f4a16(options) {
587
598
  value: parentNode.value,
588
599
  children: [
589
600
  ...parentNode.children.slice(0, index),
590
- ...nodes,
601
+ ...newNodes,
591
602
  ...parentNode.children.slice(index)
592
603
  ]
593
- }));
604
+ }), newMap);
594
605
  });
595
606
  },
596
607
  insertBefore (key, ...values) {
597
- let node = map.get(key);
608
+ let node = nodeMap.get(key);
598
609
  if (!node) return;
599
- let parentNode = map.get(node.parentKey);
610
+ let parentNode = nodeMap.get(node.parentKey);
600
611
  let nodes = parentNode ? parentNode.children : items;
601
612
  let index = nodes.indexOf(node);
602
613
  this.insert(parentNode === null || parentNode === void 0 ? void 0 : parentNode.key, index, ...values);
603
614
  },
604
615
  insertAfter (key, ...values) {
605
- let node = map.get(key);
616
+ let node = nodeMap.get(key);
606
617
  if (!node) return;
607
- let parentNode = map.get(node.parentKey);
618
+ let parentNode = nodeMap.get(node.parentKey);
608
619
  let nodes = parentNode ? parentNode.children : items;
609
620
  let index = nodes.indexOf(node);
610
621
  this.insert(parentNode === null || parentNode === void 0 ? void 0 : parentNode.key, index + 1, ...values);
@@ -615,39 +626,52 @@ function $be2ea0343af54212$export$d14e1352e21f4a16(options) {
615
626
  append (parentKey, ...values) {
616
627
  if (parentKey == null) this.insert(null, items.length, ...values);
617
628
  else {
618
- let parentNode = map.get(parentKey);
629
+ let parentNode = nodeMap.get(parentKey);
619
630
  if (!parentNode) return;
620
631
  this.insert(parentKey, parentNode.children.length, ...values);
621
632
  }
622
633
  },
623
634
  remove (...keys) {
635
+ if (keys.length === 0) return;
624
636
  let newItems = items;
625
- for (let key of keys)newItems = updateTree(newItems, key, ()=>null);
626
- setItems(newItems);
637
+ let prevMap = nodeMap;
638
+ let newTree;
639
+ for (let key of keys){
640
+ newTree = updateTree(newItems, key, ()=>null, prevMap);
641
+ prevMap = newTree.nodeMap;
642
+ newItems = newTree.items;
643
+ }
644
+ setItems(newTree);
627
645
  let selection = new Set(selectedKeys);
628
- for (let key of selectedKeys)if (!map.has(key)) selection.delete(key);
646
+ for (let key of selectedKeys)if (!newTree.nodeMap.has(key)) selection.delete(key);
629
647
  setSelectedKeys(selection);
630
648
  },
631
649
  removeSelectedItems () {
632
650
  this.remove(...selectedKeys);
633
651
  },
634
652
  move (key, toParentKey, index) {
635
- setItems((items)=>{
636
- let node = map.get(key);
637
- if (!node) return items;
638
- items = updateTree(items, key, ()=>null);
653
+ setItems(({ items: items, nodeMap: originalMap })=>{
654
+ let node = originalMap.get(key);
655
+ if (!node) return {
656
+ items: items,
657
+ nodeMap: originalMap
658
+ };
659
+ let { items: newItems, nodeMap: newMap } = updateTree(items, key, ()=>null, originalMap);
639
660
  const movedNode = {
640
661
  ...node,
641
662
  parentKey: toParentKey
642
663
  };
643
664
  // If parentKey is null, insert into the root.
644
- if (toParentKey == null) return [
645
- ...items.slice(0, index),
646
- movedNode,
647
- ...items.slice(index)
648
- ];
665
+ if (toParentKey == null) return {
666
+ items: [
667
+ ...newItems.slice(0, index),
668
+ movedNode,
669
+ ...newItems.slice(index)
670
+ ],
671
+ nodeMap: newMap
672
+ };
649
673
  // Otherwise, update the parent node and its ancestors.
650
- return updateTree(items, toParentKey, (parentNode)=>({
674
+ return updateTree(newItems, toParentKey, (parentNode)=>({
651
675
  key: parentNode.key,
652
676
  parentKey: parentNode.parentKey,
653
677
  value: parentNode.value,
@@ -656,20 +680,21 @@ function $be2ea0343af54212$export$d14e1352e21f4a16(options) {
656
680
  movedNode,
657
681
  ...parentNode.children.slice(index)
658
682
  ]
659
- }));
683
+ }), newMap);
660
684
  });
661
685
  },
662
686
  update (oldKey, newValue) {
663
- setItems((items)=>updateTree(items, oldKey, (oldNode)=>{
687
+ setItems(({ items: items, nodeMap: originalMap })=>updateTree(items, oldKey, (oldNode)=>{
664
688
  let node = {
665
689
  key: oldNode.key,
666
690
  parentKey: oldNode.parentKey,
667
691
  value: newValue,
668
692
  children: null
669
693
  };
670
- node.children = buildTree(getChildren(newValue), node.key);
694
+ let tree = buildTree(getChildren(newValue), originalMap, node.key);
695
+ node.children = tree.items;
671
696
  return node;
672
- }));
697
+ }, originalMap));
673
698
  }
674
699
  };
675
700
  }
package/dist/main.js CHANGED
@@ -513,33 +513,38 @@ function $1cb48366e5c5533f$export$bc3384a35de93d66(options) {
513
513
  */
514
514
  function $2d16d1aab63a81f4$export$d14e1352e21f4a16(options) {
515
515
  let { initialItems: initialItems = [], initialSelectedKeys: initialSelectedKeys, getKey: getKey = (item)=>item.id || item.key, getChildren: getChildren = (item)=>item.children } = options;
516
- let map = (0, $kdbv0$react.useMemo)(()=>new Map(), []);
517
516
  // We only want to compute this on initial render.
518
- // eslint-disable-next-line react-hooks/exhaustive-deps
519
- let initialNodes = (0, $kdbv0$react.useMemo)(()=>buildTree(initialItems), []);
520
- let [items, setItems] = (0, $kdbv0$react.useState)(initialNodes);
517
+ let [tree, setItems] = (0, $kdbv0$react.useState)(()=>buildTree(initialItems, new Map()));
518
+ let { items: items, nodeMap: nodeMap } = tree;
521
519
  let [selectedKeys, setSelectedKeys] = (0, $kdbv0$react.useState)(new Set(initialSelectedKeys || []));
522
- function buildTree(initialItems = [], parentKey) {
523
- return initialItems.map((item)=>{
524
- let node = {
525
- key: getKey(item),
526
- parentKey: parentKey,
527
- value: item,
528
- children: null
529
- };
530
- node.children = buildTree(getChildren(item), node.key);
531
- map.set(node.key, node);
532
- return node;
533
- });
520
+ function buildTree(initialItems = [], map, parentKey) {
521
+ return {
522
+ items: initialItems.map((item)=>{
523
+ let node = {
524
+ key: getKey(item),
525
+ parentKey: parentKey,
526
+ value: item,
527
+ children: null
528
+ };
529
+ node.children = buildTree(getChildren(item), map, node.key).items;
530
+ map.set(node.key, node);
531
+ return node;
532
+ }),
533
+ nodeMap: map
534
+ };
534
535
  }
535
- function updateTree(items, key, update) {
536
- let node = map.get(key);
537
- if (!node) return items;
536
+ function updateTree(items, key, update, originalMap) {
537
+ let node = originalMap.get(key);
538
+ if (!node) return {
539
+ items: items,
540
+ nodeMap: originalMap
541
+ };
542
+ let map = new Map(originalMap);
538
543
  // Create a new node. If null, then delete the node, otherwise replace.
539
544
  let newNode = update(node);
540
- if (newNode == null) deleteNode(node);
541
- else addNode(newNode);
542
- // Walk up the tree and update each parent to refer to the new chilren.
545
+ if (newNode == null) deleteNode(node, map);
546
+ else addNode(newNode, map);
547
+ // Walk up the tree and update each parent to refer to the new children.
543
548
  while(node.parentKey){
544
549
  let nextParent = map.get(node.parentKey);
545
550
  let copy = {
@@ -559,35 +564,41 @@ function $2d16d1aab63a81f4$export$d14e1352e21f4a16(options) {
559
564
  node = nextParent;
560
565
  }
561
566
  if (newNode == null) items = items.filter((c)=>c !== node);
562
- return items.map((item)=>{
563
- if (item === node) return newNode;
564
- return item;
565
- });
567
+ return {
568
+ items: items.map((item)=>{
569
+ if (item === node) return newNode;
570
+ return item;
571
+ }),
572
+ nodeMap: map
573
+ };
566
574
  }
567
- function addNode(node) {
575
+ function addNode(node, map) {
568
576
  map.set(node.key, node);
569
- for (let child of node.children)addNode(child);
577
+ for (let child of node.children)addNode(child, map);
570
578
  }
571
- function deleteNode(node) {
579
+ function deleteNode(node, map) {
572
580
  map.delete(node.key);
573
- for (let child of node.children)deleteNode(child);
581
+ for (let child of node.children)deleteNode(child, map);
574
582
  }
575
583
  return {
576
584
  items: items,
577
585
  selectedKeys: selectedKeys,
578
586
  setSelectedKeys: setSelectedKeys,
579
587
  getItem (key) {
580
- return map.get(key);
588
+ return nodeMap.get(key);
581
589
  },
582
590
  insert (parentKey, index, ...values) {
583
- setItems((items)=>{
584
- let nodes = buildTree(values, parentKey);
591
+ setItems(({ items: items, nodeMap: originalMap })=>{
592
+ let { items: newNodes, nodeMap: newMap } = buildTree(values, originalMap, parentKey);
585
593
  // If parentKey is null, insert into the root.
586
- if (parentKey == null) return [
587
- ...items.slice(0, index),
588
- ...nodes,
589
- ...items.slice(index)
590
- ];
594
+ if (parentKey == null) return {
595
+ items: [
596
+ ...items.slice(0, index),
597
+ ...newNodes,
598
+ ...items.slice(index)
599
+ ],
600
+ nodeMap: newMap
601
+ };
591
602
  // Otherwise, update the parent node and its ancestors.
592
603
  return updateTree(items, parentKey, (parentNode)=>({
593
604
  key: parentNode.key,
@@ -595,24 +606,24 @@ function $2d16d1aab63a81f4$export$d14e1352e21f4a16(options) {
595
606
  value: parentNode.value,
596
607
  children: [
597
608
  ...parentNode.children.slice(0, index),
598
- ...nodes,
609
+ ...newNodes,
599
610
  ...parentNode.children.slice(index)
600
611
  ]
601
- }));
612
+ }), newMap);
602
613
  });
603
614
  },
604
615
  insertBefore (key, ...values) {
605
- let node = map.get(key);
616
+ let node = nodeMap.get(key);
606
617
  if (!node) return;
607
- let parentNode = map.get(node.parentKey);
618
+ let parentNode = nodeMap.get(node.parentKey);
608
619
  let nodes = parentNode ? parentNode.children : items;
609
620
  let index = nodes.indexOf(node);
610
621
  this.insert(parentNode === null || parentNode === void 0 ? void 0 : parentNode.key, index, ...values);
611
622
  },
612
623
  insertAfter (key, ...values) {
613
- let node = map.get(key);
624
+ let node = nodeMap.get(key);
614
625
  if (!node) return;
615
- let parentNode = map.get(node.parentKey);
626
+ let parentNode = nodeMap.get(node.parentKey);
616
627
  let nodes = parentNode ? parentNode.children : items;
617
628
  let index = nodes.indexOf(node);
618
629
  this.insert(parentNode === null || parentNode === void 0 ? void 0 : parentNode.key, index + 1, ...values);
@@ -623,39 +634,52 @@ function $2d16d1aab63a81f4$export$d14e1352e21f4a16(options) {
623
634
  append (parentKey, ...values) {
624
635
  if (parentKey == null) this.insert(null, items.length, ...values);
625
636
  else {
626
- let parentNode = map.get(parentKey);
637
+ let parentNode = nodeMap.get(parentKey);
627
638
  if (!parentNode) return;
628
639
  this.insert(parentKey, parentNode.children.length, ...values);
629
640
  }
630
641
  },
631
642
  remove (...keys) {
643
+ if (keys.length === 0) return;
632
644
  let newItems = items;
633
- for (let key of keys)newItems = updateTree(newItems, key, ()=>null);
634
- setItems(newItems);
645
+ let prevMap = nodeMap;
646
+ let newTree;
647
+ for (let key of keys){
648
+ newTree = updateTree(newItems, key, ()=>null, prevMap);
649
+ prevMap = newTree.nodeMap;
650
+ newItems = newTree.items;
651
+ }
652
+ setItems(newTree);
635
653
  let selection = new Set(selectedKeys);
636
- for (let key of selectedKeys)if (!map.has(key)) selection.delete(key);
654
+ for (let key of selectedKeys)if (!newTree.nodeMap.has(key)) selection.delete(key);
637
655
  setSelectedKeys(selection);
638
656
  },
639
657
  removeSelectedItems () {
640
658
  this.remove(...selectedKeys);
641
659
  },
642
660
  move (key, toParentKey, index) {
643
- setItems((items)=>{
644
- let node = map.get(key);
645
- if (!node) return items;
646
- items = updateTree(items, key, ()=>null);
661
+ setItems(({ items: items, nodeMap: originalMap })=>{
662
+ let node = originalMap.get(key);
663
+ if (!node) return {
664
+ items: items,
665
+ nodeMap: originalMap
666
+ };
667
+ let { items: newItems, nodeMap: newMap } = updateTree(items, key, ()=>null, originalMap);
647
668
  const movedNode = {
648
669
  ...node,
649
670
  parentKey: toParentKey
650
671
  };
651
672
  // If parentKey is null, insert into the root.
652
- if (toParentKey == null) return [
653
- ...items.slice(0, index),
654
- movedNode,
655
- ...items.slice(index)
656
- ];
673
+ if (toParentKey == null) return {
674
+ items: [
675
+ ...newItems.slice(0, index),
676
+ movedNode,
677
+ ...newItems.slice(index)
678
+ ],
679
+ nodeMap: newMap
680
+ };
657
681
  // Otherwise, update the parent node and its ancestors.
658
- return updateTree(items, toParentKey, (parentNode)=>({
682
+ return updateTree(newItems, toParentKey, (parentNode)=>({
659
683
  key: parentNode.key,
660
684
  parentKey: parentNode.parentKey,
661
685
  value: parentNode.value,
@@ -664,20 +688,21 @@ function $2d16d1aab63a81f4$export$d14e1352e21f4a16(options) {
664
688
  movedNode,
665
689
  ...parentNode.children.slice(index)
666
690
  ]
667
- }));
691
+ }), newMap);
668
692
  });
669
693
  },
670
694
  update (oldKey, newValue) {
671
- setItems((items)=>updateTree(items, oldKey, (oldNode)=>{
695
+ setItems(({ items: items, nodeMap: originalMap })=>updateTree(items, oldKey, (oldNode)=>{
672
696
  let node = {
673
697
  key: oldNode.key,
674
698
  parentKey: oldNode.parentKey,
675
699
  value: newValue,
676
700
  children: null
677
701
  };
678
- node.children = buildTree(getChildren(newValue), node.key);
702
+ let tree = buildTree(getChildren(newValue), originalMap, node.key);
703
+ node.children = tree.items;
679
704
  return node;
680
- }));
705
+ }, originalMap));
681
706
  }
682
707
  };
683
708
  }