diff --git a/src/components/UploadQueue.tsx b/src/components/UploadQueue.tsx index 6c0ab0f..5df12e0 100644 --- a/src/components/UploadQueue.tsx +++ b/src/components/UploadQueue.tsx @@ -9,7 +9,8 @@ import { saveBottle } from '@/services/save-bottle'; import { saveTasting } from '@/services/save-tasting'; import { createClient } from '@/lib/supabase/client'; -import { RefreshCw, CheckCircle2, AlertCircle, Loader2, Info, Send } from 'lucide-react'; +import { RefreshCw, CheckCircle2, AlertCircle, Loader2, Info, Send, X } from 'lucide-react'; +import { motion, AnimatePresence } from 'framer-motion'; import TastingNoteForm from './TastingNoteForm'; // Helper to convert base64 to FormData @@ -32,7 +33,7 @@ export default function UploadQueue() { const supabase = createClient(); const [isSyncing, setIsSyncing] = useState(false); const [currentProgress, setCurrentProgress] = useState<{ id: string, status: string } | null>(null); - const [isCollapsed, setIsCollapsed] = useState(false); + const [isCollapsed, setIsCollapsed] = useState(true); const [completedItems, setCompletedItems] = useState<{ id: string; name: string; bottleId?: string; type: 'scan' | 'tasting' }[]>([]); const [activeNoteScanId, setActiveNoteScanId] = useState(null); @@ -270,163 +271,165 @@ export default function UploadQueue() { if (totalInQueue === 0) return null; return ( -
-
- {/* Header */} -
setIsCollapsed(!isCollapsed)} - > -
-
- - {totalInQueue > 0 && !isSyncing && ( -
- )} -
-
- Sync Warteschlange - - {isSyncing ? 'Synchronisiere...' : navigator.onLine ? 'Warten auf Upload' : 'Offline - Lokal gespeichert'} - -
-
-
- - {totalInQueue} - -
-
- - {/* Content */} - {!isCollapsed && ( -
-
- {/* Completed Items (The "Results") */} - {completedItems.length > 0 && ( -
-
- - Synchronisierte Items -
- {completedItems.map((item) => ( -
-
- - {item.type === 'scan' ? 'Neu im Vault' : 'Tasting gespeichert'} - - - {item.name} - -
- {item.bottleId && ( - - Ansehen - - - )} -
- ))} -
- )} - - {/* Scans */} - {pendingScans.map((item) => ( -
-
-
-
- -
-
- Magic Shot - - {currentProgress?.id === `scan-${item.id}` ? ( - - - {currentProgress.status} - - ) : 'Wartet auf Verbindung...'} - -
-
-
- {new Date(item.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })} -
-
- - {/* Link for adding tasting notes to pending scan */} - - - {activeNoteScanId === item.temp_id && ( -
- setActiveNoteScanId(null)} - /> -
+
+ + {!isCollapsed ? ( + + {/* Header */} +
setIsCollapsed(true)} + > +
+
+ + {totalInQueue > 0 && !isSyncing && ( +
)}
- ))} - - {/* Tastings */} - {pendingTastings.map((item) => ( -
-
-
-
{item.data.rating}
-
-
- - {item.pending_bottle_id ? 'Draft Notiz' : 'Tasting Note'} - - - {item.pending_bottle_id ? ( - Wartet auf Scan... - ) : currentProgress?.id === `tasting-${item.id}` ? ( - - - {currentProgress.status} - - ) : 'Wartet auf Sync...'} - -
-
-
- {new Date(item.tasted_at).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })} -
+
+ Sync status + + {isSyncing ? 'Synchronisiere...' : navigator.onLine ? 'Warten auf Upload' : 'Offline'} +
- ))} +
+
+ + {totalInQueue} + + +
- {navigator.onLine && !isSyncing && ( - - )} + {/* Content */} +
+
+ {/* Completed Items */} + {completedItems.length > 0 && ( +
+
+ + Fertig +
+ {completedItems.map((item) => ( +
+
+ + {item.type === 'scan' ? 'Scan bereit' : 'Tasting bereit'} + + + {item.name} + +
+ {item.bottleId && ( + + Details + + )} +
+ ))} +
+ )} - {!navigator.onLine && ( -
- - Keine Internetverbindung + {/* Scans */} + {pendingScans.map((item) => ( +
+
+
+
+ +
+
+ Flaschen-Scan + + {currentProgress?.id === `scan-${item.id}` ? ( + + + {currentProgress.status} + + ) : 'In Warteschlange...'} + +
+
+
+ + + + {activeNoteScanId === item.temp_id && ( +
+ setActiveNoteScanId(null)} + /> +
+ )} +
+ ))} + + {/* Tastings */} + {pendingTastings.map((item) => ( +
+
+
+
{item.data.rating}
+
+
+ Tasting Note + + {item.pending_bottle_id ? 'Wartet auf Scan...' : currentProgress?.id === `tasting-${item.id}` ? currentProgress.status : 'Wartet auf Sync...'} + +
+
+
+ ))}
+ + {navigator.onLine && !isSyncing && ( + + )} +
+ + ) : ( + setIsCollapsed(false)} + className="relative w-14 h-14 bg-zinc-900 border border-white/10 rounded-full shadow-2xl flex items-center justify-center text-white hover:bg-zinc-800 transition-all group" + > + +
+ {totalInQueue} +
+ {isSyncing && ( +
)} -
+
)} -
+
); }