From d1161f390ffea10b74fdb3c09246800783953aa4 Mon Sep 17 00:00:00 2001 From: "Samuel Egbajie (MAJ0R)" <49847624+CodePapi@users.noreply.github.com> Date: Sat, 7 Feb 2026 14:15:03 +0100 Subject: [PATCH] ft: added file upload feature --- frontend/src/App.tsx | 196 ++++++++++++++++++++--- frontend/src/components/FileUploader.tsx | 86 ++++++++++ frontend/src/constants/languages.ts | 1 - 3 files changed, 257 insertions(+), 26 deletions(-) create mode 100644 frontend/src/components/FileUploader.tsx diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index cd071d4..9e70de4 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -2,6 +2,7 @@ import Editor, { DiffEditor } from '@monaco-editor/react'; import { Bug, Check, + Clipboard, Code2, Copy, RotateCcw, @@ -11,6 +12,7 @@ import { } from 'lucide-react'; import { useEffect, useState } from 'react'; import { fixBugs, reviewCode, translateCode } from './api/client'; +import FileUploader from './components/FileUploader'; import { LanguageSelector } from './components/LanguageSelector'; type Mode = 'translate' | 'review' | 'fix'; @@ -24,6 +26,7 @@ function App() { const [mode, setMode] = useState('translate'); const [isProcessing, setIsProcessing] = useState(false); const [copied, setCopied] = useState(false); + const [mobileNavOpen, setMobileNavOpen] = useState(false); // --- Logic: Syncing & Placeholders --- useEffect(() => { @@ -37,7 +40,6 @@ function App() { else setTargetLang('typescript'); // Default for most modern migrations } else { // If user switches back to a plain language, force them to pick a new target - setTargetLang(''); setOutputCode(''); } } @@ -73,6 +75,31 @@ function App() { .trim(); }; + // --- Input helpers (upload / paste / clear) --- + const handleFileRead = (content: string, _filename?: string) => { + setSourceCode(content); + setOutputCode(''); + }; + + const handlePasteFromClipboard = async () => { + try { + const text = await navigator.clipboard.readText(); + if (!text) { + alert('Clipboard is empty'); + return; + } + setSourceCode(text); + setOutputCode(''); + } catch (err) { + alert('Unable to read clipboard'); + } + }; + + const handleClearInput = () => { + setSourceCode('// Your code here...'); + setOutputCode(''); + }; + const handleAction = async () => { if (!sourceCode.trim() || sourceCode === '// Your code here...') return; if (mode === 'translate' && !targetLang) { @@ -112,7 +139,7 @@ function App() { className={`min-h-screen bg-[#0b0e14] text-slate-200 font-sans antialiased ${isProcessing ? 'cursor-wait' : ''}`} > {/* Navbar */} -