-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathexport-dialog.tsx
More file actions
79 lines (72 loc) · 2.09 KB
/
export-dialog.tsx
File metadata and controls
79 lines (72 loc) · 2.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import React, { useState } from 'react';
import { Button, Modal, Tabs } from '@tiny-design/react';
import { generateCSS, generateJSON } from '../utils/export-theme';
interface ExportDialogProps {
visible: boolean;
onClose: () => void;
seeds: Record<string, string>;
appliedTokens: Record<string, string>;
}
function downloadFile(content: string, filename: string, mime: string): void {
const blob = new Blob([content], { type: mime });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = filename;
a.click();
URL.revokeObjectURL(url);
}
export const ExportDialog = ({
visible,
onClose,
seeds,
appliedTokens,
}: ExportDialogProps): React.ReactElement => {
const [copied, setCopied] = useState(false);
const cssCode = generateCSS(appliedTokens);
const jsonCode = generateJSON(seeds);
const handleCopy = (code: string) => {
navigator.clipboard.writeText(code).then(() => {
setCopied(true);
setTimeout(() => setCopied(false), 2000);
});
};
const renderBlock = (code: string, filename: string, mime: string) => (
<div className="theme-editor__export-block">
<pre className="theme-editor__export-code">{code}</pre>
<div className="theme-editor__export-actions">
<Button
size="sm"
btnType="primary"
onClick={() => handleCopy(code)}
>
{copied ? 'Copied!' : 'Copy'}
</Button>
<Button
size="sm"
onClick={() => downloadFile(code, filename, mime)}
>
Download
</Button>
</div>
</div>
);
return (
<Modal
visible={visible}
header="Export Theme"
onClose={onClose}
width={640}
footer={null}
>
<Tabs defaultActiveKey="css">
<Tabs.Panel tab="CSS Variables" tabKey="css">
{renderBlock(cssCode, 'tiny-theme.css', 'text/css')}
</Tabs.Panel>
<Tabs.Panel tab="JSON Tokens" tabKey="json">
{renderBlock(jsonCode, 'tiny-theme.json', 'application/json')}
</Tabs.Panel>
</Tabs>
</Modal>
);
};