fix: Fixed issue where the first item in item link autcomplete would not be correctly focused (skip e2e)

This commit is contained in:
Aman Harwara
2022-12-19 14:44:34 +05:30
parent abdaec89b7
commit df4148f824
2 changed files with 25 additions and 7 deletions

View File

@@ -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

View File

@@ -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,
}
} }