Skip to content
Snippets Groups Projects

add spiner (fetch in memory and download from memory)

Merged Piotr Gawron requested to merge 297-a-loading-button-while-exporting into main
3 files
+ 61
9
Compare changes
  • Side-by-side
  • Inline
Files
3
@@ -2,18 +2,34 @@ import { formatsHandlersSelector } from '@/redux/configuration/configuration.sel
@@ -2,18 +2,34 @@ import { formatsHandlersSelector } from '@/redux/configuration/configuration.sel
import { Button } from '@/shared/Button';
import { Button } from '@/shared/Button';
import { useSelect } from 'downshift';
import { useSelect } from 'downshift';
import { useSelector } from 'react-redux';
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 { SUBMAP_DOWNLOAD_HANDLERS_NAMES } from './DownloadSubmap.constants';
import { SUBMAP_DOWNLOAD_HANDLERS_NAMES } from './DownloadSubmap.constants';
import { useGetSubmapDownloadUrl } from './utils/useGetSubmapDownloadUrl';
import { useGetSubmapDownloadUrl } from './utils/useGetSubmapDownloadUrl';
export const DownloadSubmap = (): JSX.Element => {
export const DownloadSubmap = (): React.ReactNode => {
const formatsHandlers = useSelector(formatsHandlersSelector);
const formatsHandlers = useSelector(formatsHandlersSelector);
const formatsHandlersItems = Object.entries(formatsHandlers);
const formatsHandlersItems = Object.entries(formatsHandlers);
const getSubmapDownloadUrl = useGetSubmapDownloadUrl();
const getSubmapDownloadUrl = useGetSubmapDownloadUrl();
const { isOpen, getToggleButtonProps, getMenuProps } = useSelect({
const [isDownloading, setIsDownloading] = useState<boolean>(false);
 
 
const { isOpen, getToggleButtonProps, getMenuProps, closeMenu } = useSelect({
items: formatsHandlersItems,
items: formatsHandlersItems,
});
});
 
const downloadSubmap = (handler: string) => {
 
return function () {
 
closeMenu();
 
setIsDownloading(true);
 
downloadFileFromUrl(getSubmapDownloadUrl({ handler })).finally(function () {
 
setIsDownloading(false);
 
});
 
};
 
};
 
return (
return (
<div className="relative">
<div className="relative">
<Button
<Button
@@ -22,6 +38,15 @@ export const DownloadSubmap = (): JSX.Element => {
@@ -22,6 +38,15 @@ export const DownloadSubmap = (): JSX.Element => {
className="mr-4"
className="mr-4"
{...getToggleButtonProps()}
{...getToggleButtonProps()}
>
>
 
{isDownloading && (
 
<Image
 
src={spinnerIcon}
 
alt="spinner icon"
 
height={12}
 
width={12}
 
className="mr-5 animate-spin"
 
/>
 
)}
Download
Download
</Button>
</Button>
<ul
<ul
@@ -34,14 +59,13 @@ export const DownloadSubmap = (): JSX.Element => {
@@ -34,14 +59,13 @@ export const DownloadSubmap = (): JSX.Element => {
{isOpen &&
{isOpen &&
formatsHandlersItems.map(([formatId, handler]) => (
formatsHandlersItems.map(([formatId, handler]) => (
<li key={formatId}>
<li key={formatId}>
<a
<Button
className="flex flex-col border-t px-4 py-2 shadow-sm"
variantStyles="ghost"
href={getSubmapDownloadUrl({ handler })}
className="flex w-full flex-col border-t px-4 py-2 shadow-sm"
target="_blank"
onClick={downloadSubmap(handler)}
download
>
>
<span>{SUBMAP_DOWNLOAD_HANDLERS_NAMES[formatId]}</span>
{SUBMAP_DOWNLOAD_HANDLERS_NAMES[formatId]}
</a>
</Button>
</li>
</li>
))}
))}
</ul>
</ul>
Loading