import React, { useState } from 'react'; import { Button } from './ui/Button'; import { Card } from './ui/Card'; import { useVisualOrganizer } from '../hooks/useVisualOrganizer'; import { useDiagramStore } from '../store'; import { Sparkles, Wand2, Scan, CheckCircle2, X } from 'lucide-react'; import type { LayoutSuggestion } from '../types/visualOrganization'; export const VisualOrganizerFAB: React.FC = () => { const { analyzeLayout, generateSuggestions, applySuggestion } = useVisualOrganizer(); const { nodes, edges, setNodes, setEdges } = useDiagramStore(); // UI States const [isOpen, setIsOpen] = useState(false); const [status, setStatus] = useState<'idle' | 'analyzing' | 'ready' | 'applied'>('idle'); const [bestSuggestion, setBestSuggestion] = useState(null); const [snapshot, setSnapshot] = useState<{ nodes: any[], edges: any[] } | null>(null); const handleAIOrganize = async () => { setStatus('analyzing'); setIsOpen(true); analyzeLayout(); try { await new Promise(resolve => setTimeout(resolve, 1500)); const results = await generateSuggestions(); if (results.length > 0) { setBestSuggestion(results[0]); setStatus('ready'); } else { setStatus('idle'); // Could show a generic "No suggestions" toast here setIsOpen(false); } } catch (error) { console.error(error); setStatus('idle'); setIsOpen(false); } }; const handleApply = () => { if (!bestSuggestion) return; setSnapshot({ nodes: [...nodes], edges: [...edges] }); applySuggestion(bestSuggestion); setStatus('applied'); }; const handleUndo = () => { if (snapshot) { setNodes(snapshot.nodes); setEdges(snapshot.edges); setSnapshot(null); setStatus('ready'); } }; const handleClose = () => { setIsOpen(false); if (status === 'applied') { setStatus('idle'); setSnapshot(null); setBestSuggestion(null); } }; // If closed, show just the FAB if (!isOpen) { return ( ); } // Expanded State (Floating Card) return (
{/* Header */}
Organizer
{/* Content */}
{status === 'analyzing' && (

Analyzing structure...

)} {status === 'ready' && bestSuggestion && (

Optimization Ready

{bestSuggestion.description}

)} {status === 'applied' && (

Clean & Organized!

)}
); };