import React, { useRef, useState } from 'react'; import { ResourceBrowserSource, PluginLaunchMode } from '../types'; import { Icon, IconOptions, uuid } from '@squiz/generic-browser-lib'; import { useFocusWithin, useKeyboard } from 'react-aria'; import { ArrowDownIcon } from '../Icons/ArrowDownIcon'; export default function SourceDropdown({ sources, selectedSource, onSourceSelect, }: { sources: ResourceBrowserSource[]; selectedSource: ResourceBrowserSource; onSourceSelect(source: ResourceBrowserSource, mode?: PluginLaunchMode): void; }) { const [uniqueId] = useState(uuid()); const buttonRef = useRef(null); const [isOpen, setIsOpen] = useState(false); // Watch the focus and blur on the menu and close if focus leaves the control const { focusWithinProps } = useFocusWithin({ onBlurWithin: () => { setIsOpen(false); }, }); // Listen for Esc key within this element const { keyboardProps } = useKeyboard({ onKeyDown: (e) => { if (isOpen && e.key === 'Escape') { setIsOpen(false); buttonRef.current?.focus(); // Restore focus to the element which opened the menu } }, }); const handleSourceClick = (source: ResourceBrowserSource) => { setIsOpen(false); buttonRef.current?.focus(); onSourceSelect(source); }; if (!sources.length) { return <>; } return (
); }