diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index c43ddcf..68fb595 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -1,5 +1,5 @@ import { useState, useEffect, useRef } from 'react' -import { FileText, Upload, Loader2, Download, CheckCircle2, XCircle, FileDown, Github, Clock, Repeat2 } from 'lucide-react' +import { FileText, Upload, Loader2, Download, CheckCircle2, XCircle, FileDown, Github, Clock, Repeat2, Trash2 } from 'lucide-react' import { Button } from './components/ui/button' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from './components/ui/card' import { Select } from './components/ui/select' @@ -23,17 +23,18 @@ function App() { const [toastMessage, setToastMessage] = useState(null) const [timeTaken, setTimeTaken] = useState(null) const [startTime, setStartTime] = useState(null) - + // Comparison states const [showCompareModal, setShowCompareModal] = useState(false) const [recentTasks, setRecentTasks] = useState([]) const [currentComparisonTask, setCurrentComparisonTask] = useState(null) const [comparisonComparisons, setComparisonComparisons] = useState([]) const [isComparingLoading, setIsComparingLoading] = useState(false) - + const toastTimerRef = useRef(null) const timerIntervalRef = useRef(null) const comparisonProgressInterval = useRef(null) + const [togglingLibrary, setTogglingLibrary] = useState(null) useEffect(() => { loadLibraries() @@ -59,6 +60,34 @@ function App() { } } + const toggleLibrary = async (libraryName, isEnabled) => { + setTogglingLibrary(libraryName) + try { + const formData = new FormData() + formData.append('library_name', libraryName) + formData.append('is_enabled', isEnabled) + + const response = await fetch('/libraries/status', { + method: 'POST', + body: formData, + }) + + if (response.ok) { + // Refresh libraries list + await loadLibraries() + setToastMessage(`Library ${libraryName} ${isEnabled ? 'enabled' : 'disabled'}`) + setTimeout(() => setToastMessage(null), 3000) + } else { + const data = await response.json() + setError(data.detail || 'Failed to update library status') + } + } catch (err) { + setError('Failed to update library status: ' + err.message) + } finally { + setTogglingLibrary(null) + } + } + const showGPUToast = (message) => { if (toastTimerRef.current) { clearTimeout(toastTimerRef.current) @@ -134,11 +163,11 @@ function App() { setError(null) setResult(null) setTimeTaken(null) - + // Start timer const start = Date.now() setStartTime(start) - + // Update timer every 100ms if (timerIntervalRef.current) { clearInterval(timerIntervalRef.current) @@ -278,7 +307,7 @@ function App() { if (response.ok) { setCurrentComparisonTask(data.task) - + // Fetch content for each comparison const comparisonsWithContent = await Promise.all( data.comparisons.map(async (comp) => { @@ -294,7 +323,7 @@ function App() { return comp }) ) - + setComparisonComparisons(comparisonsWithContent) } } catch (err) { @@ -321,7 +350,7 @@ function App() { // Download single library result const response = await fetch(`/compare/${taskId}/content/${library}`) const data = await response.json() - + const content = typeof data.content === 'string' ? data.content : JSON.stringify(data.content, null, 2) const blob = new Blob([content], { type: outputFormat === 'json' ? 'application/json' : 'text/markdown' }) const url = URL.createObjectURL(blob) @@ -336,7 +365,7 @@ function App() { // Download all results as zip const response = await fetch(`/compare/${taskId}/download`) if (!response.ok) throw new Error('Download failed') - + const blob = await response.blob() const url = URL.createObjectURL(blob) const a = document.createElement('a') @@ -447,13 +476,12 @@ function App() { onDragOver={handleDragOver} onDragLeave={handleDragLeave} onDrop={handleDrop} - className={`border-2 border-dashed rounded-lg transition-all ${ - isDragging - ? 'border-blue-500 bg-blue-50 dark:bg-blue-950/20' - : selectedFile + className={`border-2 border-dashed rounded-lg transition-all ${isDragging + ? 'border-blue-500 bg-blue-50 dark:bg-blue-950/20' + : selectedFile ? 'border-green-300 dark:border-green-800 bg-green-50 dark:bg-green-950/20' : 'border-slate-300 dark:border-slate-700 hover:border-slate-400 dark:hover:border-slate-600' - }`} + }`} > Configuration - + {/* Library Selection */}