import React, { FC, useState, useEffect } from 'react'; import { Button, Menu, Dropdown, Space, message } from 'antd'; import { CaretDownOutlined, CopyOutlined, VerticalAlignBottomOutlined, } from '@ant-design/icons'; import { useTranslation } from 'react-i18next'; import pallette from '../pallette.json'; import styles from './ThemeSwitcher.module.less'; import AntvLogo from '../images/watermark.svg'; const htmlToImage = require('html-to-image'); interface ThemeSwitcherProps { updateTheme: (val: string) => void; } interface ColorsProps { colorStyle: React.CSSProperties; colors: string[]; } const Colors: FC = ({ colorStyle = {}, colors = [] }) => { if (colors.length === 0) { return null; } return (
{colors.map((color: string, i: number) => (
))}
); }; const ThemeSwitcher: React.FC = ({ updateTheme }) => { const { t, i18n } = useTranslation(); const defaultColorArr = pallette.categorical[0].colors20?.slice(0, 3); const [curColor, updateCurColor] = useState(defaultColorArr); const [curPalette, updateCurPalette] = useState(); const copyToClipboard = (arr: string) => { const el = document.createElement('textarea'); el.value = arr; document.body.appendChild(el); el.select(); document.execCommand('copy'); document.body.removeChild(el); }; const download = () => { const palette = document.getElementById('palette'); if (!palette) return; htmlToImage.toPng(palette).then((dataUrl: any) => { const link = document.createElement('a'); link.download = 'antv-palette.png'; link.href = dataUrl; link.click(); }); }; useEffect(() => { if (curPalette) download(); }, [curPalette]); const menu = ( {pallette.categorical.map( (color: { colors10: string[]; colors20: string[] }, key: number) => { return (
{ updateCurColor(color.colors20.slice(0, 3)); const themeColors = { colors10: color.colors10, colors20: color.colors20, }; updateTheme(JSON.stringify(themeColors)); }} >
updateCurPalette(color.colors20)} /> { copyToClipboard(JSON.stringify(color)); message.success('Copied!'); }} />
); }, )}
{pallette.continuous.map( (color: { colors10: string[]; colors20: string[] }, key: number) => { return (
{ updateCurColor(color.colors20.slice(0, 3)); updateTheme(JSON.stringify(color)); }} >
updateCurPalette(color.colors20)} /> { copyToClipboard(JSON.stringify(color, null, '\t')); message.success('Copied!'); }} />
); }, )}
{pallette.discrete.map( (color: { colors10: string[]; colors20: string[] }, key: number) => { return (
{ updateCurColor(color.colors20.slice(0, 3)); updateTheme(JSON.stringify(color)); }} >
updateCurPalette(color.colors20)} /> { copyToClipboard(JSON.stringify(color)); message.success('Copied!'); }} />
); }, )}
{t('查看更多色板用法')}
); return ( <>
{curPalette && (
)} ); }; export default ThemeSwitcher;