Skip to content

Commit f2af760

Browse files
committed
fix(Picking): guard against unmounted state
1 parent a1297f7 commit f2af760

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

src/core/Picking.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
import deletionRegistry from '../utils/DeletionRegistry';
1414
import useDebounce from '../utils/useDebounce';
1515
import useGetterRef from '../utils/useGetterRef';
16+
import { useIsMounted } from '../utils/useIsMounted';
1617
import useMount from '../utils/useMount';
1718
import useUnmount from '../utils/useUnmount';
1819
import {
@@ -136,6 +137,8 @@ export default forwardRef(function ViewPicking(props: PickingProps, fwdRef) {
136137
};
137138
});
138139

140+
const isMounted = useIsMounted();
141+
139142
// --- Props --- //
140143

141144
const {
@@ -152,6 +155,8 @@ export default forwardRef(function ViewPicking(props: PickingProps, fwdRef) {
152155

153156
const pickClosest = useCallback(
154157
(xp: number, yp: number, tolerance: number): PickResult[] => {
158+
if (!isMounted.current) return [];
159+
155160
const x1 = Math.floor(xp - tolerance);
156161
const y1 = Math.floor(yp - tolerance);
157162
const x2 = Math.ceil(xp + tolerance);
@@ -218,11 +223,13 @@ export default forwardRef(function ViewPicking(props: PickingProps, fwdRef) {
218223
},
219224
] as PickResult[];
220225
},
221-
[rendererAPI, openGLRenderWindowAPI, getSelector]
226+
[rendererAPI, openGLRenderWindowAPI, isMounted, getSelector]
222227
);
223228

224229
const pick = useCallback(
225230
(x1: number, y1: number, x2: number, y2: number): PickResult[] => {
231+
if (!isMounted.current) return [];
232+
226233
const selector = getSelector();
227234
const openGLRenderWindow = openGLRenderWindowAPI.get();
228235
const renderer = rendererAPI.get();
@@ -277,7 +284,7 @@ export default forwardRef(function ViewPicking(props: PickingProps, fwdRef) {
277284
})
278285
.filter(Boolean) as PickResult[];
279286
},
280-
[rendererAPI, openGLRenderWindowAPI, getSelector]
287+
[rendererAPI, openGLRenderWindowAPI, isMounted, getSelector]
281288
);
282289

283290
const pickWithFrustum = useCallback(
@@ -287,6 +294,8 @@ export default forwardRef(function ViewPicking(props: PickingProps, fwdRef) {
287294
x2: number,
288295
y2: number
289296
): FrustumPickResult | null => {
297+
if (!isMounted.current) return null;
298+
290299
const selector = getSelector();
291300
const openGLRenderWindow = openGLRenderWindowAPI.get();
292301
const renderer = rendererAPI.get();
@@ -324,7 +333,7 @@ export default forwardRef(function ViewPicking(props: PickingProps, fwdRef) {
324333
});
325334
return { frustum, representationIds };
326335
},
327-
[rendererAPI, openGLRenderWindowAPI, getSelector]
336+
[rendererAPI, openGLRenderWindowAPI, isMounted, getSelector]
328337
);
329338

330339
const api = useMemo(

src/utils/useIsMounted.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { useRef } from 'react';
2+
import useMount from './useMount';
3+
import useUnmount from './useUnmount';
4+
5+
export function useIsMounted() {
6+
const isMounted = useRef(false);
7+
8+
useMount(() => {
9+
isMounted.current = true;
10+
});
11+
12+
useUnmount(() => {
13+
isMounted.current = false;
14+
});
15+
16+
return isMounted;
17+
}

0 commit comments

Comments
 (0)