import { useCallback, useMemo, useState } from 'react'; import { Code, Download, Trash2 } from 'lucide-react'; import { useLazyTranslation } from '@/utils/useLazyTranslation'; import PageHeader from '@/components/PageHeader'; import CopyButton from '@/components/CopyButton'; import SwitchButtonGroup from '@/components/SwitchButtonGroup'; import { useStorageState } from '@/utils/useStorageState'; import type { HtmlToMarkdownPreviewMode } from '@/types/storage'; import { htmlToMarkdown, downloadMarkdownFile, SAMPLE_HTML } from '@/utils/htmlToMarkdown'; const isValidPreviewMode = (val: unknown): val is HtmlToMarkdownPreviewMode => typeof val === 'string' && ['split', 'preview', 'markdown'].includes(val); export default function HtmlToMarkdownPage() { const { t } = useLazyTranslation('htmlToMarkdown'); const [previewMode, setPreviewMode] = useStorageState( 'htmlToMarkdown/previewMode', 'split' as HtmlToMarkdownPreviewMode, isValidPreviewMode, ); const [html, setHtml] = useState(SAMPLE_HTML); const result = useMemo(() => htmlToMarkdown(html), [html]); const error = result.hasError ? (result.error ?? null) : null; const handleModeChange = useCallback( (newMode: HtmlToMarkdownPreviewMode) => { setPreviewMode(newMode); }, [setPreviewMode], ); const handleClear = useCallback(() => { setHtml(''); }, []); const handleDownload = useCallback(() => { if (result.markdown) { downloadMarkdownFile(result.markdown, 'converted.md'); } }, [result.markdown]); const showInput = previewMode !== 'preview'; const showOutput = previewMode !== 'markdown'; return (
} />
{/* 工具栏 */}
{/* 错误提示 */} {error && (
{error}
)} {/* 主内容区 */}
{/* HTML 输入区 */} {showInput && (
{t('inputLabel')} {t('charCount', { count: html.length })}