import { useState, useCallback, useEffect } from 'react'; import { invoke } from '@tauri-apps/api/core'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { CodeHighlighter } from '@/components/ui/code-highlighter'; import { Copy, Check, Code, Sparkles, CheckCircle2, XCircle, Upload, ChevronLeft, ChevronRight } from 'lucide-react'; import type { CodeFormatConfig, CodeFormatResult, CodeValidateResult, CodeLanguage } from '@/types/code'; const LANGUAGES: { value: CodeLanguage; label: string }[] = [ { value: 'java', label: 'Java' }, { value: 'cpp', label: 'C++' }, { value: 'rust', label: 'Rust' }, { value: 'python', label: 'Python' }, { value: 'sql', label: 'SQL' }, { value: 'javascript', label: 'JavaScript' }, { value: 'typescript', label: 'TypeScript' }, { value: 'html', label: 'HTML' }, { value: 'css', label: 'CSS' }, { value: 'json', label: 'JSON' }, { value: 'xml', label: 'XML' }, ]; export function CodeFormatterPage() { const [input, setInput] = useState(''); const [output, setOutput] = useState(''); const [validation, setValidation] = useState(null); const [config, setConfig] = useState({ language: 'javascript', indent: 4, useTabs: false, mode: 'pretty', }); const [copied, setCopied] = useState(false); const [isProcessing, setIsProcessing] = useState(false); const [isInputCollapsed, setIsInputCollapsed] = useState(false); useEffect(() => { if (input.trim()) { validateCode(); } else { setValidation(null); } }, [input, config.language]); const validateCode = useCallback(async () => { if (!input.trim()) { setValidation(null); return; } try { const result = await invoke('validate_code', { input, language: config.language, }); setValidation(result); } catch (error) { console.error('验证失败:', error); } }, [input, config.language]); const formatCode = useCallback(async () => { if (!input.trim()) return; setIsProcessing(true); try { const result = await invoke('format_code', { input, config, }); if (result.success) { setOutput(result.result); // 格式化成功后自动收起输入区域 setIsInputCollapsed(true); } else { setOutput(result.error || '格式化失败'); } } catch (error) { console.error('格式化失败:', error); setOutput('错误: ' + String(error)); } finally { setIsProcessing(false); } }, [input, config]); const copyToClipboard = useCallback(async () => { if (!output) return; try { await navigator.clipboard.writeText(output); setCopied(true); setTimeout(() => setCopied(false), 2000); } catch (error) { console.error('复制失败:', error); } }, [output]); const clearInput = useCallback(() => { setInput(''); setOutput(''); setValidation(null); }, []); const loadExample = useCallback(() => { const examples: Record = { javascript: 'function test(){const x=1;return x*2;}', typescript: 'function test():number{const x:number=1;return x*2;}', java: 'public class Test{public int test(){int x=1;return x*2;}}', cpp: 'int test(){int x=1;return x*2;}', rust: 'fn test()->i32{let x=1;x*2}', python: 'def test():\n\tx=1\n\treturn x*2', sql: 'SELECT*FROM users WHERE id=1', html: '
test
', css: '.test{color:red;font-size:14px}', json: '{"name":"test","value":123}', xml: 'test', }; setInput(examples[config.language] || examples.javascript); }, [config.language]); return (

代码格式化工具

配置选项 自定义代码格式化行为
{LANGUAGES.map((lang) => ( ))}
{[2, 4, 8].map((spaces) => ( ))}
{/* 收起/展开切换按钮 */} {!isInputCollapsed && (
输入代码 粘贴或输入代码
{input && ( )}