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 { AdsClickIcon } from '../Icons/AdsClickIcon'; import { ArrowDownIcon } from '../Icons/ArrowDownIcon'; export default function BrowseToSource({ sources, selectedSource, onSourceSelect, className = '', }: { sources: ResourceBrowserSource[]; selectedSource: ResourceBrowserSource; onSourceSelect(source: ResourceBrowserSource, mode?: PluginLaunchMode): void; className?: string; }): React.JSX.Element { 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 (
{isOpen && } {sources.length >= 1 && (
    {sources.map((source) => { const { id, name, type } = source; const isSelectedSource = id === selectedSource.id; return (
  • ); })}
)}
); }