import React, { useState } from 'react'; import { Camera, History, Trash2, RotateCcw, GitCompare } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from '@/components/ui/dialog'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { Input } from '@/components/ui/input'; import { ScrollArea } from '@/components/ui/scroll-area'; import { useDashboardSnapshots, DashboardSnapshot } from '@/hooks/useDashboardSnapshots'; import { DashboardWidget } from '@/pages/Dashboard'; import { format } from 'date-fns'; interface SnapshotManagerProps { currentWidgets: DashboardWidget[]; onRestoreSnapshot: (widgets: DashboardWidget[]) => void; } export function SnapshotManager({ currentWidgets, onRestoreSnapshot }: SnapshotManagerProps) { const { snapshots, createSnapshot, removeSnapshot, restoreSnapshot, compareSnapshots } = useDashboardSnapshots(); const [saveDialogOpen, setSaveDialogOpen] = useState(false); const [snapshotName, setSnapshotName] = useState(''); const [compareMode, setCompareMode] = useState(false); const [selectedForCompare, setSelectedForCompare] = useState([]); const handleSave = async () => { if (!snapshotName.trim()) return; await createSnapshot(snapshotName, currentWidgets); setSnapshotName(''); setSaveDialogOpen(false); }; const handleRestore = (snapshotId: string) => { const widgets = restoreSnapshot(snapshotId); if (widgets) { onRestoreSnapshot(widgets); } }; const handleCompareSelect = (snapshotId: string) => { setSelectedForCompare(prev => { if (prev.includes(snapshotId)) { return prev.filter(id => id !== snapshotId); } if (prev.length >= 2) { return [prev[1], snapshotId]; } return [...prev, snapshotId]; }); }; const comparison = selectedForCompare.length === 2 ? compareSnapshots(selectedForCompare[0], selectedForCompare[1]) : null; return ( e.preventDefault()}> Save Current State Save Snapshot Save the current dashboard state for later restoration.
setSnapshotName(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && handleSave()} />
{ e.preventDefault(); setCompareMode(!compareMode); setSelectedForCompare([]); }}> {compareMode ? 'Exit Compare Mode' : 'Compare Snapshots'} {snapshots.length === 0 ? (
No snapshots saved yet
) : ( {compareMode && comparison && (
Comparison Result:
+ {comparison.added.length} added
- {comparison.removed.length} removed
{comparison.unchanged.length} unchanged
)} {snapshots.map((snapshot) => ( handleRestore(snapshot.id)} onDelete={() => removeSnapshot(snapshot.id)} onCompareSelect={() => handleCompareSelect(snapshot.id)} /> ))}
)}
); } interface SnapshotItemProps { snapshot: DashboardSnapshot; compareMode: boolean; isSelected: boolean; onRestore: () => void; onDelete: () => void; onCompareSelect: () => void; } function SnapshotItem({ snapshot, compareMode, isSelected, onRestore, onDelete, onCompareSelect }: SnapshotItemProps) { return (
{snapshot.name}
{format(snapshot.createdAt, 'MMM d, HH:mm')} ยท {snapshot.data.widgets.length} widgets
{!compareMode && (
)}
); }