'use client'; import { motion } from 'framer-motion'; import { useState } from 'react'; import { Wrench, Play, Eye, CheckCircle, XCircle } from 'lucide-react'; export default function RefactorPage() { const [searchPattern, setSearchPattern] = useState(''); const [replacePattern, setReplacePattern] = useState(''); const [filePattern, setFilePattern] = useState('**/*.py'); const [isDryRun, setIsDryRun] = useState(true); const [isRefactoring, setIsRefactoring] = useState(false); const [result, setResult] = useState(null); const commonPatterns = [ { name: 'print → logging', search: 'print\\((.*)\\)', replace: 'logger.info(\\1)' }, { name: 'assertEqual → assert', search: 'assertEqual\\(([^,]+),\\s*([^)]+)\\)', replace: 'assert \\1 == \\2' }, { name: 'Remove trailing whitespace', search: '[ \\t]+$', replace: '' }, ]; const handleRefactor = async (e: React.FormEvent) => { e.preventDefault(); if (!searchPattern.trim() || !replacePattern) return; setIsRefactoring(true); try { const response = await fetch('http://localhost:8000/api/refactor', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ search_pattern: searchPattern, replace_pattern: replacePattern, file_pattern: filePattern, dry_run: isDryRun, }), }); const data = await response.json(); setResult(data); } catch (error) { console.error('Refactor failed:', error); } finally { setIsRefactoring(false); } }; return (
{/* Header */}
🔧

Refactor Mode

Automated code refactoring with regex

{/* Common Patterns */}
{commonPatterns.map((p) => ( { setSearchPattern(p.search); setReplacePattern(p.replace); }} className="px-3 py-1.5 bg-slate-800 rounded-lg text-sm text-slate-300 hover:bg-slate-700 transition-colors" > {p.name} ))}
{/* Form */}
setSearchPattern(e.target.value)} placeholder="e.g., print\((.*)\)" className="w-full px-4 py-3 bg-slate-800/50 border border-slate-700 rounded-xl focus:border-orange-500 focus:outline-none transition-colors font-mono text-sm" />
setReplacePattern(e.target.value)} placeholder="e.g., logger.info(\1)" className="w-full px-4 py-3 bg-slate-800/50 border border-slate-700 rounded-xl focus:border-orange-500 focus:outline-none transition-colors font-mono text-sm" />
setFilePattern(e.target.value)} className="w-full px-4 py-3 bg-slate-800/50 border border-slate-700 rounded-xl focus:border-orange-500 focus:outline-none transition-colors" />
{isRefactoring ? (
) : ( <> {isDryRun ? 'Preview Changes' : 'Apply Refactoring'} )} {/* Results */}
{result && ( {/* Summary */}
{result.success ? ( ) : ( )}

{result.success ? `${isDryRun ? 'Preview:' : 'Applied:'} ${result.files_changed || 0} files, ${result.total_replacements || 0} replacements` : 'Refactoring failed' }

{result.error && (

{result.error}

)}
{/* Changes */} {result.changes?.map((change: any, i: number) => (

📄 {change.file_path} ({change.replacements} changes)

{change.preview && (
{change.preview}
)}
))}
)} {!result && !isRefactoring && (

Configure patterns above to preview or apply refactoring

)}
); }