datastake-daf 0.6.146 → 0.6.147

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.
@@ -19463,16 +19463,46 @@ const useGlobe = ({
19463
19463
  if (instance) {
19464
19464
  setMapRef(instance);
19465
19465
 
19466
- // Add window resize listener for Mapbox GL JS responsiveness
19466
+ // Add comprehensive resize detection for Mapbox GL JS responsiveness
19467
19467
  const handleResize = () => {
19468
19468
  if (instance && instance.resize) {
19469
- instance.resize();
19469
+ // Add a small delay to ensure DOM has updated
19470
+ setTimeout(() => {
19471
+ instance.resize();
19472
+ }, 100);
19470
19473
  }
19471
19474
  };
19475
+
19476
+ // Listen to window resize
19472
19477
  window.addEventListener('resize', handleResize);
19473
19478
 
19474
- // Store the handler for cleanup
19479
+ // Listen to container size changes using ResizeObserver
19480
+ const resizeObserver = new ResizeObserver(() => {
19481
+ handleResize();
19482
+ });
19483
+ if (container.current) {
19484
+ resizeObserver.observe(container.current);
19485
+ }
19486
+
19487
+ // Store handlers for cleanup
19475
19488
  instance._resizeHandler = handleResize;
19489
+ instance._resizeObserver = resizeObserver;
19490
+
19491
+ // Add IntersectionObserver to detect when globe becomes visible (handles sidenav scenarios)
19492
+ const intersectionObserver = new IntersectionObserver(entries => {
19493
+ entries.forEach(entry => {
19494
+ if (entry.isIntersecting && instance && instance.resize) {
19495
+ // Globe container is visible, force resize after a delay
19496
+ setTimeout(() => {
19497
+ instance.resize();
19498
+ }, 200);
19499
+ }
19500
+ });
19501
+ });
19502
+ if (container.current) {
19503
+ intersectionObserver.observe(container.current);
19504
+ }
19505
+ instance._intersectionObserver = intersectionObserver;
19476
19506
  } else {
19477
19507
  console.log('❌ [GLOBE HOOK] Failed to create map instance');
19478
19508
  }
@@ -19553,6 +19583,33 @@ const useGlobe = ({
19553
19583
  addAllDataToMap();
19554
19584
  }
19555
19585
  }, [data, mapRef, initialMarkerSetIsDone]);
19586
+
19587
+ // Add effect to handle layout changes (like sidenav opening/closing)
19588
+ React.useEffect(() => {
19589
+ if (mapRef) {
19590
+ // Force resize when component becomes visible or layout changes
19591
+ const handleLayoutChange = () => {
19592
+ if (mapRef && mapRef.resize) {
19593
+ setTimeout(() => {
19594
+ mapRef.resize();
19595
+ }, 150);
19596
+ }
19597
+ };
19598
+
19599
+ // Listen for visibility changes
19600
+ document.addEventListener('visibilitychange', handleLayoutChange);
19601
+
19602
+ // Listen for focus events (when user returns to tab)
19603
+ window.addEventListener('focus', handleLayoutChange);
19604
+
19605
+ // Store handlers for cleanup
19606
+ mapRef._layoutChangeHandler = handleLayoutChange;
19607
+ return () => {
19608
+ document.removeEventListener('visibilitychange', handleLayoutChange);
19609
+ window.removeEventListener('focus', handleLayoutChange);
19610
+ };
19611
+ }
19612
+ }, [mapRef]);
19556
19613
  React.useEffect(() => {
19557
19614
  if (activeMarker && mapRef) {
19558
19615
  const marker = mapMarkers.find(m => m.data === activeMarker);
@@ -19568,10 +19625,20 @@ const useGlobe = ({
19568
19625
  return () => {
19569
19626
  isMounted.current = false;
19570
19627
 
19571
- // Cleanup window resize listener for Mapbox GL JS
19628
+ // Cleanup window resize listener and ResizeObserver for Mapbox GL JS
19572
19629
  if (mapRef && mapRef._resizeHandler) {
19573
19630
  window.removeEventListener('resize', mapRef._resizeHandler);
19574
19631
  }
19632
+ if (mapRef && mapRef._resizeObserver) {
19633
+ mapRef._resizeObserver.disconnect();
19634
+ }
19635
+ if (mapRef && mapRef._layoutChangeHandler) {
19636
+ document.removeEventListener('visibilitychange', mapRef._layoutChangeHandler);
19637
+ window.removeEventListener('focus', mapRef._layoutChangeHandler);
19638
+ }
19639
+ if (mapRef && mapRef._intersectionObserver) {
19640
+ mapRef._intersectionObserver.disconnect();
19641
+ }
19575
19642
 
19576
19643
  // Defer unmounting to avoid race conditions
19577
19644
  const rootsToUnmount = [...roots.current];
@@ -19669,12 +19736,22 @@ const useGlobe = ({
19669
19736
  }),
19670
19737
  handler: moveDownHandler
19671
19738
  }], [zoomHandler, zoomOutHandler, recenterMap, moveUpHandler, moveDownHandler]);
19739
+
19740
+ // Expose a manual resize method for external triggers
19741
+ const forceResize = React.useCallback(() => {
19742
+ if (mapRef && mapRef.resize) {
19743
+ setTimeout(() => {
19744
+ mapRef.resize();
19745
+ }, 100);
19746
+ }
19747
+ }, [mapRef]);
19672
19748
  return {
19673
19749
  container,
19674
19750
  activeMarker,
19675
19751
  mapOptionsButtonsConfig,
19676
19752
  emptyStateIsVisible,
19677
- setEmptyStateIsVisible
19753
+ setEmptyStateIsVisible,
19754
+ forceResize
19678
19755
  };
19679
19756
  };
19680
19757
 
@@ -19722,7 +19799,8 @@ function Globe(_ref) {
19722
19799
  const {
19723
19800
  container,
19724
19801
  activeMarker,
19725
- mapOptionsButtonsConfig
19802
+ mapOptionsButtonsConfig,
19803
+ forceResize
19726
19804
  } = useGlobe({
19727
19805
  data: mappedData,
19728
19806
  user,
@@ -19749,6 +19827,17 @@ function Globe(_ref) {
19749
19827
  React.useEffect(() => {
19750
19828
  onRender === null || onRender === void 0 || onRender();
19751
19829
  }, [onRender]);
19830
+
19831
+ // Force resize when component becomes visible (handles sidenav open/close scenarios)
19832
+ React.useEffect(() => {
19833
+ if (forceResize) {
19834
+ // Trigger resize after component mounts
19835
+ const timer = setTimeout(() => {
19836
+ forceResize();
19837
+ }, 300);
19838
+ return () => clearTimeout(timer);
19839
+ }
19840
+ }, [forceResize]);
19752
19841
  return /*#__PURE__*/jsxRuntime.jsx(ComponentWithFocus, {
19753
19842
  children: /*#__PURE__*/jsxRuntime.jsxs(Style$z, {
19754
19843
  className: formatClassname([showSider && activeMarker && "with-sider"]),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "datastake-daf",
3
- "version": "0.6.146",
3
+ "version": "0.6.147",
4
4
  "dependencies": {
5
5
  "@ant-design/icons": "^5.2.5",
6
6
  "@antv/g2": "^5.1.1",
@@ -466,17 +466,49 @@ export const useGlobe = ({
466
466
  if (instance) {
467
467
  setMapRef(instance);
468
468
 
469
- // Add window resize listener for Mapbox GL JS responsiveness
469
+ // Add comprehensive resize detection for Mapbox GL JS responsiveness
470
470
  const handleResize = () => {
471
471
  if (instance && instance.resize) {
472
- instance.resize();
472
+ // Add a small delay to ensure DOM has updated
473
+ setTimeout(() => {
474
+ instance.resize();
475
+ }, 100);
473
476
  }
474
477
  };
475
478
 
479
+ // Listen to window resize
476
480
  window.addEventListener('resize', handleResize);
477
481
 
478
- // Store the handler for cleanup
482
+ // Listen to container size changes using ResizeObserver
483
+ const resizeObserver = new ResizeObserver(() => {
484
+ handleResize();
485
+ });
486
+
487
+ if (container.current) {
488
+ resizeObserver.observe(container.current);
489
+ }
490
+
491
+ // Store handlers for cleanup
479
492
  instance._resizeHandler = handleResize;
493
+ instance._resizeObserver = resizeObserver;
494
+
495
+ // Add IntersectionObserver to detect when globe becomes visible (handles sidenav scenarios)
496
+ const intersectionObserver = new IntersectionObserver((entries) => {
497
+ entries.forEach((entry) => {
498
+ if (entry.isIntersecting && instance && instance.resize) {
499
+ // Globe container is visible, force resize after a delay
500
+ setTimeout(() => {
501
+ instance.resize();
502
+ }, 200);
503
+ }
504
+ });
505
+ });
506
+
507
+ if (container.current) {
508
+ intersectionObserver.observe(container.current);
509
+ }
510
+
511
+ instance._intersectionObserver = intersectionObserver;
480
512
  } else {
481
513
  console.log('❌ [GLOBE HOOK] Failed to create map instance');
482
514
  }
@@ -565,6 +597,34 @@ export const useGlobe = ({
565
597
  }
566
598
  }, [data, mapRef, initialMarkerSetIsDone]);
567
599
 
600
+ // Add effect to handle layout changes (like sidenav opening/closing)
601
+ useEffect(() => {
602
+ if (mapRef) {
603
+ // Force resize when component becomes visible or layout changes
604
+ const handleLayoutChange = () => {
605
+ if (mapRef && mapRef.resize) {
606
+ setTimeout(() => {
607
+ mapRef.resize();
608
+ }, 150);
609
+ }
610
+ };
611
+
612
+ // Listen for visibility changes
613
+ document.addEventListener('visibilitychange', handleLayoutChange);
614
+
615
+ // Listen for focus events (when user returns to tab)
616
+ window.addEventListener('focus', handleLayoutChange);
617
+
618
+ // Store handlers for cleanup
619
+ mapRef._layoutChangeHandler = handleLayoutChange;
620
+
621
+ return () => {
622
+ document.removeEventListener('visibilitychange', handleLayoutChange);
623
+ window.removeEventListener('focus', handleLayoutChange);
624
+ };
625
+ }
626
+ }, [mapRef]);
627
+
568
628
  useEffect(() => {
569
629
  if (activeMarker && mapRef) {
570
630
  const marker = mapMarkers.find((m) => m.data === activeMarker);
@@ -580,11 +640,24 @@ export const useGlobe = ({
580
640
  return () => {
581
641
  isMounted.current = false;
582
642
 
583
- // Cleanup window resize listener for Mapbox GL JS
643
+ // Cleanup window resize listener and ResizeObserver for Mapbox GL JS
584
644
  if (mapRef && mapRef._resizeHandler) {
585
645
  window.removeEventListener('resize', mapRef._resizeHandler);
586
646
  }
587
647
 
648
+ if (mapRef && mapRef._resizeObserver) {
649
+ mapRef._resizeObserver.disconnect();
650
+ }
651
+
652
+ if (mapRef && mapRef._layoutChangeHandler) {
653
+ document.removeEventListener('visibilitychange', mapRef._layoutChangeHandler);
654
+ window.removeEventListener('focus', mapRef._layoutChangeHandler);
655
+ }
656
+
657
+ if (mapRef && mapRef._intersectionObserver) {
658
+ mapRef._intersectionObserver.disconnect();
659
+ }
660
+
588
661
  // Defer unmounting to avoid race conditions
589
662
  const rootsToUnmount = [...roots.current];
590
663
  roots.current = [];
@@ -669,11 +742,21 @@ export const useGlobe = ({
669
742
  [zoomHandler, zoomOutHandler, recenterMap, moveUpHandler, moveDownHandler],
670
743
  );
671
744
 
745
+ // Expose a manual resize method for external triggers
746
+ const forceResize = useCallback(() => {
747
+ if (mapRef && mapRef.resize) {
748
+ setTimeout(() => {
749
+ mapRef.resize();
750
+ }, 100);
751
+ }
752
+ }, [mapRef]);
753
+
672
754
  return {
673
755
  container,
674
756
  activeMarker,
675
757
  mapOptionsButtonsConfig,
676
758
  emptyStateIsVisible,
677
759
  setEmptyStateIsVisible,
760
+ forceResize,
678
761
  };
679
762
  };
@@ -130,7 +130,7 @@ function Globe({
130
130
  );
131
131
 
132
132
  // Use custom hook to configure globe functionality
133
- const { container, activeMarker, mapOptionsButtonsConfig } = useGlobe({
133
+ const { container, activeMarker, mapOptionsButtonsConfig, forceResize } = useGlobe({
134
134
  data: mappedData,
135
135
  user,
136
136
  polygon,
@@ -159,6 +159,18 @@ function Globe({
159
159
  onRender?.();
160
160
  }, [onRender]);
161
161
 
162
+ // Force resize when component becomes visible (handles sidenav open/close scenarios)
163
+ useEffect(() => {
164
+ if (forceResize) {
165
+ // Trigger resize after component mounts
166
+ const timer = setTimeout(() => {
167
+ forceResize();
168
+ }, 300);
169
+
170
+ return () => clearTimeout(timer);
171
+ }
172
+ }, [forceResize]);
173
+
162
174
  return (
163
175
  <ComponentWithFocus>
164
176
  <Style className={formatClassname([showSider && activeMarker && "with-sider"])}>