fix: Fixed issue where the first item in item link autcomplete would not be correctly focused (skip e2e)
This commit is contained in:
@@ -1,4 +1,12 @@
|
|||||||
import { CSSProperties, forwardRef, KeyboardEventHandler, ReactNode, Ref, useCallback, useRef } from 'react'
|
import {
|
||||||
|
CSSProperties,
|
||||||
|
forwardRef,
|
||||||
|
KeyboardEventHandler,
|
||||||
|
ReactNode,
|
||||||
|
useCallback,
|
||||||
|
useImperativeHandle,
|
||||||
|
useRef,
|
||||||
|
} from 'react'
|
||||||
import { KeyboardKey } from '@standardnotes/ui-services'
|
import { KeyboardKey } from '@standardnotes/ui-services'
|
||||||
import { useListKeyboardNavigation } from '@/Hooks/useListKeyboardNavigation'
|
import { useListKeyboardNavigation } from '@/Hooks/useListKeyboardNavigation'
|
||||||
import { mergeRefs } from '@/Hooks/mergeRefs'
|
import { mergeRefs } from '@/Hooks/mergeRefs'
|
||||||
@@ -27,7 +35,7 @@ const Menu = forwardRef(
|
|||||||
onKeyDown,
|
onKeyDown,
|
||||||
shouldAutoFocus = true,
|
shouldAutoFocus = true,
|
||||||
}: MenuProps,
|
}: MenuProps,
|
||||||
forwardedRef: Ref<HTMLMenuElement>,
|
forwardedRef,
|
||||||
) => {
|
) => {
|
||||||
const menuElementRef = useRef<HTMLMenuElement>(null)
|
const menuElementRef = useRef<HTMLMenuElement>(null)
|
||||||
|
|
||||||
@@ -43,7 +51,13 @@ const Menu = forwardRef(
|
|||||||
[closeMenu, onKeyDown],
|
[closeMenu, onKeyDown],
|
||||||
)
|
)
|
||||||
|
|
||||||
useListKeyboardNavigation(menuElementRef, initialFocus, shouldAutoFocus)
|
const { setInitialFocus } = useListKeyboardNavigation(menuElementRef, initialFocus, shouldAutoFocus)
|
||||||
|
|
||||||
|
useImperativeHandle(forwardedRef, () => ({
|
||||||
|
focus: () => {
|
||||||
|
setInitialFocus()
|
||||||
|
},
|
||||||
|
}))
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<menu
|
<menu
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ export const useListKeyboardNavigation = (
|
|||||||
|
|
||||||
const FIRST_ITEM_FOCUS_TIMEOUT = 20
|
const FIRST_ITEM_FOCUS_TIMEOUT = 20
|
||||||
|
|
||||||
const containerFocusHandler = useCallback(() => {
|
const setInitialFocus = useCallback(() => {
|
||||||
const items = Array.from(container.current?.querySelectorAll('button') as NodeListOf<HTMLButtonElement>)
|
const items = Array.from(container.current?.querySelectorAll('button') as NodeListOf<HTMLButtonElement>)
|
||||||
listItems.current = items
|
listItems.current = items
|
||||||
|
|
||||||
@@ -75,9 +75,9 @@ export const useListKeyboardNavigation = (
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (shouldAutoFocus) {
|
if (shouldAutoFocus) {
|
||||||
containerFocusHandler()
|
setInitialFocus()
|
||||||
}
|
}
|
||||||
}, [containerFocusHandler, shouldAutoFocus])
|
}, [setInitialFocus, shouldAutoFocus])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const containerElement = container.current
|
const containerElement = container.current
|
||||||
@@ -86,5 +86,9 @@ export const useListKeyboardNavigation = (
|
|||||||
return () => {
|
return () => {
|
||||||
containerElement?.removeEventListener('keydown', keyDownHandler)
|
containerElement?.removeEventListener('keydown', keyDownHandler)
|
||||||
}
|
}
|
||||||
}, [container, containerFocusHandler, keyDownHandler])
|
}, [container, setInitialFocus, keyDownHandler])
|
||||||
|
|
||||||
|
return {
|
||||||
|
setInitialFocus,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user