import { formatsHandlersSelector } from '@/redux/configuration/configuration.selectors'; import { Button } from '@/shared/Button'; import { useSelect } from 'downshift'; import { useSelector } from 'react-redux'; import Image from 'next/image'; import spinnerIcon from '@/assets/vectors/icons/spinner.svg'; import { useState } from 'react'; import { downloadFileFromUrl } from '@/redux/export/export.utils'; import { Icon } from '@/shared/Icon'; import { SUBMAP_DOWNLOAD_HANDLERS_NAMES } from './DownloadSubmap.constants'; import { useGetSubmapDownloadUrl } from './utils/useGetSubmapDownloadUrl'; export const DownloadSubmap = (): React.ReactNode => { const formatsHandlers = useSelector(formatsHandlersSelector); const formatsHandlersItems = Object.entries(formatsHandlers); const getSubmapDownloadUrl = useGetSubmapDownloadUrl(); const [isDownloading, setIsDownloading] = useState<boolean>(false); const { isOpen, getToggleButtonProps, getMenuProps, closeMenu } = useSelect({ items: formatsHandlersItems, }); const downloadSubmap = (handler: string) => { return function () { closeMenu(); setIsDownloading(true); downloadFileFromUrl(getSubmapDownloadUrl({ handler })).finally(function () { setIsDownloading(false); }); }; }; return ( <div className="relative"> <Button data-testid="download-submap-button" variantStyles="quiet" className="mr-4 p-0" {...getToggleButtonProps()} title="Download" disabled={isDownloading} > {isDownloading && ( <Image src={spinnerIcon} alt="spinner icon" height={12} width={12} className="mr-5 animate-spin" /> )} {!isDownloading && <Icon name="download" className="h-6 w-6 fill-font-500" />} </Button> <ul data-testid="download-submap-list" className={`absolute right-[-50%] z-10 max-h-80 w-48 overflow-scroll rounded-sm border bg-white p-0 ps-0 ${ !isOpen && 'hidden' }`} {...getMenuProps()} > {isOpen && formatsHandlersItems.map(([formatId, handler]) => ( <li key={formatId}> <Button variantStyles="ghost" className="flex w-full flex-col border-t px-4 py-2 shadow-sm" onClick={downloadSubmap(handler)} > {SUBMAP_DOWNLOAD_HANDLERS_NAMES[formatId]} </Button> </li> ))} </ul> </div> ); };