import { useFocusManager } from '@react-aria/focus'; import { useOverlayTrigger } from '@react-aria/overlays'; import { useOverlayTriggerState } from '@react-stately/overlays'; import { Box, Icon, IconButton, TextInput } from '@rocket.chat/fuselage'; import { useStableCallback, useMergedRefs } from '@rocket.chat/fuselage-hooks'; import { useCallback, useEffect, useRef } from 'react'; import { FormProvider, useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import tinykeys from 'tinykeys'; import NavBarSearchListBox from './NavBarSearchListbox'; import { getShortcutLabel } from './getShortcutLabel'; import { useSearchClick } from './hooks/useSearchClick'; import { useSearchFocus } from './hooks/useSearchFocus'; import { useSearchInputNavigation } from './hooks/useSearchNavigation'; const NavBarSearch = () => { const { t } = useTranslation(); const focusManager = useFocusManager(); const shortcut = getShortcutLabel(); const placeholder = [t('Search_rooms'), shortcut].filter(Boolean).join(' '); const methods = useForm({ defaultValues: { filterText: '' } }); const { formState: { isDirty }, register, resetField, setFocus, } = methods; const { ref: filterRef, ...rest } = register('filterText'); const triggerRef = useRef(null); const mergedRefs = useMergedRefs(filterRef, triggerRef); const state = useOverlayTriggerState({}); const { triggerProps, overlayProps } = useOverlayTrigger({ type: 'listbox' }, state, triggerRef); delete triggerProps.onPress; const handleKeyDown = useSearchInputNavigation(state); const handleFocus = useSearchFocus(state); const handleClick = useSearchClick(state); const handleEscSearch = useCallback(() => { resetField('filterText'); state.close(); }, [resetField, state]); const handleClearText = useStableCallback(() => { resetField('filterText'); setFocus('filterText'); }); useEffect(() => { const unsubscribe = tinykeys(window, { '$mod+K': (event) => { event.preventDefault(); setFocus('filterText'); }, '$mod+P': (event) => { event.preventDefault(); setFocus('filterText'); }, 'Escape': (event) => { event.preventDefault(); handleEscSearch(); }, }); return (): void => { unsubscribe(); }; }, [focusManager, handleEscSearch, setFocus]); return ( ) : ( ) } /> {state.isOpen && } ); }; export default NavBarSearch;