From 656738d00a05a739f58d560900808757e39a6cf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Leroy?= Date: Thu, 11 Apr 2024 17:43:37 +0200 Subject: [PATCH] fix: race conditions with default focus --- packages/lib/src/spatial-navigation/SpatialNavigator.ts | 6 +++++- packages/lib/src/spatial-navigation/components/Node.tsx | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/lib/src/spatial-navigation/SpatialNavigator.ts b/packages/lib/src/spatial-navigation/SpatialNavigator.ts index 81924bd3..fef44083 100644 --- a/packages/lib/src/spatial-navigation/SpatialNavigator.ts +++ b/packages/lib/src/spatial-navigation/SpatialNavigator.ts @@ -92,9 +92,13 @@ export default class SpatialNavigator { * because multiple elements might try to take the focus (DefaultFocus is a context, so all its children * will try to grab it). We only want the first of these element to grab it. */ - public queueDefaultFocus = (id: string) => { + public handleOrQueueDefaultFocus = (id: string) => { if (this.getCurrentFocusNode()) return; if (this.focusQueue) return; + if (this.lrud.getNode(id)) { + this.lrud.assignFocus(id); + return; + } this.focusQueue = id; }; diff --git a/packages/lib/src/spatial-navigation/components/Node.tsx b/packages/lib/src/spatial-navigation/components/Node.tsx index 03b2f3fd..53599266 100644 --- a/packages/lib/src/spatial-navigation/components/Node.tsx +++ b/packages/lib/src/spatial-navigation/components/Node.tsx @@ -173,7 +173,7 @@ export const SpatialNavigationNode = forwardRef useEffect(() => { if (shouldHaveDefaultFocus && isFocusable && !spatialNavigator.hasOneNodeFocused()) { - spatialNavigator.queueDefaultFocus(id); + spatialNavigator.handleOrQueueDefaultFocus(id); } }, [id, isFocusable, shouldHaveDefaultFocus, spatialNavigator]);