Skip to content

Commit 97f86a1

Browse files
authored
Fix globe drag not ending when pointer released outside element (#1447)
1 parent 5dbfb1e commit 97f86a1

1 file changed

Lines changed: 25 additions & 0 deletions

File tree

  • apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/(overview)

apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/(overview)/globe.tsx

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1024,6 +1024,31 @@ function GlobeSectionInner({ countryData, totalUsers, activeUsersByCountry, sate
10241024
};
10251025
}, [globeReady, mounted, liveAvatars]);
10261026

1027+
// When the pointer leaves the globe canvas and the button is released
1028+
// outside, OrbitControls may miss the pointerup (pointer capture can be
1029+
// lost intermittently). Listen on window and forward the event to the
1030+
// canvas so the controls properly end the drag.
1031+
useEffect(() => {
1032+
if (!globeReady) return;
1033+
const domElement = globeRef.current?.renderer().domElement;
1034+
if (!domElement) return;
1035+
1036+
const handleWindowPointerUp = (e: PointerEvent) => {
1037+
if (e.target !== domElement && !domElement.contains(e.target as Node)) {
1038+
domElement.dispatchEvent(new PointerEvent('pointerup', {
1039+
pointerId: e.pointerId,
1040+
pointerType: e.pointerType,
1041+
bubbles: true,
1042+
}));
1043+
}
1044+
};
1045+
1046+
window.addEventListener('pointerup', handleWindowPointerUp);
1047+
return () => {
1048+
window.removeEventListener('pointerup', handleWindowPointerUp);
1049+
};
1050+
}, [globeReady]);
1051+
10271052
// set globeReady to true after a bit in case onGlobeReady was not called
10281053
useEffect(() => {
10291054
const timeout = setTimeout(() => {

0 commit comments

Comments
 (0)