aboutsummaryrefslogtreecommitdiff
path: root/src/components/input/DownloadButton.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/input/DownloadButton.tsx')
-rw-r--r--src/components/input/DownloadButton.tsx42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/components/input/DownloadButton.tsx b/src/components/input/DownloadButton.tsx
new file mode 100644
index 0000000..5df3305
--- /dev/null
+++ b/src/components/input/DownloadButton.tsx
@@ -0,0 +1,42 @@
+import { Button, Icon, Tooltip, TooltipTrigger } from '@umami/react-zen';
+import Papa from 'papaparse';
+import { useMessages } from '@/components/hooks';
+import { Download } from '@/components/icons';
+
+export function DownloadButton({
+ filename = 'data',
+ data,
+}: {
+ filename?: string;
+ data?: any;
+ onClick?: () => void;
+}) {
+ const { formatMessage, labels } = useMessages();
+
+ const handleClick = async () => {
+ downloadCsv(`${filename}.csv`, Papa.unparse(data));
+ };
+
+ return (
+ <TooltipTrigger delay={0}>
+ <Button variant="quiet" onClick={handleClick} isDisabled={!data || data.length === 0}>
+ <Icon>
+ <Download />
+ </Icon>
+ </Button>
+ <Tooltip>{formatMessage(labels.download)}</Tooltip>
+ </TooltipTrigger>
+ );
+}
+
+function downloadCsv(filename: string, data: any) {
+ const blob = new Blob([data], { type: 'text/csv' });
+ const url = URL.createObjectURL(blob);
+
+ const a = document.createElement('a');
+ a.href = url;
+ a.download = filename;
+ a.click();
+
+ URL.revokeObjectURL(url);
+}