| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- import type { MouseEvent } from 'react';
- import { useTranslation } from 'react-i18next';
- import { Button, Collapse, Popover, Tag, Tooltip, message } from 'antd';
- import { CopyOutlined, DownloadOutlined, QrcodeOutlined } from '@ant-design/icons';
- import { ClipboardManager, FileManager } from '@/utils';
- import { QrPanel } from '@/pages/inbounds/qr';
- import './ConfigBlock.css';
- interface ConfigBlockProps {
- label: string;
- text: string;
- fileName: string;
- qrRemark?: string;
- showQr?: boolean;
- tagColor?: string;
- defaultOpen?: boolean;
- }
- export default function ConfigBlock({
- label,
- text,
- fileName,
- qrRemark = '',
- showQr = true,
- tagColor = 'gold',
- defaultOpen = false,
- }: ConfigBlockProps) {
- const { t } = useTranslation();
- const [messageApi, messageContextHolder] = message.useMessage();
- async function copy() {
- const ok = await ClipboardManager.copyText(text);
- if (ok) messageApi.success(t('copied'));
- }
- const actions = (
- <div className="config-block-actions" onClick={(e: MouseEvent) => e.stopPropagation()}>
- <Tooltip title={t('copy')}>
- <Button size="small" icon={<CopyOutlined />} onClick={copy} />
- </Tooltip>
- <Tooltip title={t('download')}>
- <Button
- size="small"
- icon={<DownloadOutlined />}
- onClick={() => FileManager.downloadTextFile(text, fileName)}
- />
- </Tooltip>
- {showQr && (
- <Popover
- trigger="click"
- placement="left"
- destroyOnHidden
- content={<QrPanel value={text} remark={qrRemark || label} size={220} />}
- >
- <Tooltip title={t('pages.clients.qrCode')}>
- <Button size="small" icon={<QrcodeOutlined />} />
- </Tooltip>
- </Popover>
- )}
- </div>
- );
- return (
- <>
- {messageContextHolder}
- <Collapse
- className="config-block"
- defaultActiveKey={defaultOpen ? ['cfg'] : []}
- items={[{
- key: 'cfg',
- label: <Tag color={tagColor} style={{ margin: 0, fontWeight: 600, letterSpacing: '0.3px' }}>{label}</Tag>,
- extra: actions,
- children: <code className="config-block-text">{text}</code>,
- }]}
- />
- </>
- );
- }
|