feat: Instant editor opening with background AI analysis
- Editor opens immediately with placeholder data - AI analyzes label in background while user can already edit - Blue 'KI analysiert...' banner shows when AI is still working - User edits preserved when AI results arrive (dirty field tracking) - Model/provider shown in admin perf overlay - Renamed 'CLOUD' to 'AI' in perf display
This commit is contained in:
@@ -138,8 +138,14 @@ export default function ScanAndTasteFlow({ isOpen, onClose, imageFile, onBottleS
|
||||
|
||||
if (scannerStatus === 'idle') {
|
||||
// Don't change state on idle
|
||||
} else if (scannerStatus === 'compressing' || scannerStatus === 'analyzing') {
|
||||
} else if (scannerStatus === 'compressing') {
|
||||
setState('SCANNING');
|
||||
} else if (scannerStatus === 'editor_ready' || scannerStatus === 'analyzing') {
|
||||
// NEW: Open editor immediately when image is ready!
|
||||
if (scanner.mergedResult) {
|
||||
setBottleMetadata(scanner.mergedResult);
|
||||
}
|
||||
setState('EDITOR');
|
||||
} else if (scannerStatus === 'complete' || scannerStatus === 'queued') {
|
||||
if (scanner.mergedResult) {
|
||||
setBottleMetadata(scanner.mergedResult);
|
||||
@@ -400,6 +406,18 @@ export default function ScanAndTasteFlow({ isOpen, onClose, imageFile, onBottleS
|
||||
exit={{ y: -50, opacity: 0 }}
|
||||
className="flex-1 w-full h-full flex flex-col min-h-0"
|
||||
>
|
||||
{/* AI Analyzing Banner - shows when AI is still processing */}
|
||||
{scanner.isAnalyzing && (
|
||||
<div className="bg-blue-500/10 border-b border-blue-500/20 p-3">
|
||||
<div className="max-w-2xl mx-auto flex items-center gap-3">
|
||||
<Loader2 size={14} className="animate-spin text-blue-500" />
|
||||
<p className="text-xs font-bold text-blue-500 uppercase tracking-wider">
|
||||
KI analysiert Etikett...
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Status banners */}
|
||||
{isOffline && (
|
||||
<div className="bg-orange-500/10 border-b border-orange-500/20 p-4">
|
||||
@@ -429,13 +447,19 @@ export default function ScanAndTasteFlow({ isOpen, onClose, imageFile, onBottleS
|
||||
{isAdmin && scanner.perf && (
|
||||
<div className="fixed bottom-24 left-6 right-6 z-50 p-3 bg-zinc-950/80 backdrop-blur-md rounded-2xl border border-orange-500/20 text-[9px] font-mono text-white/90 shadow-xl overflow-x-auto">
|
||||
<div className="flex items-center justify-between gap-4 whitespace-nowrap">
|
||||
{scanner.perf.model && (
|
||||
<div className="flex items-center gap-2">
|
||||
<span className="text-zinc-500">MODEL:</span>
|
||||
<span className="text-purple-400 font-bold">{scanner.perf.model}</span>
|
||||
</div>
|
||||
)}
|
||||
<div className="flex items-center gap-2">
|
||||
<Clock size={10} className="text-orange-500" />
|
||||
<span className="text-zinc-500">COMPRESS:</span>
|
||||
<span className="text-orange-500 font-bold">{scanner.perf.compression.toFixed(0)}ms</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-2">
|
||||
<span className="text-zinc-500">CLOUD:</span>
|
||||
<span className="text-zinc-500">AI:</span>
|
||||
<span className="text-green-500 font-bold">{scanner.perf.cloudVision.toFixed(0)}ms</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-2">
|
||||
|
||||
Reference in New Issue
Block a user