'use client'; import { Plus, RefreshCw, Download, Upload, LayoutDashboard, Layers, List, } from 'lucide-react'; import { useState, useEffect, useRef } from 'react'; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from '@/components/ui/card'; import WidgetConfigModal from '@/components/dashboard/WidgetConfigModal'; import WidgetDisplay from '@/components/dashboard/WidgetDisplay'; import { useDashboard } from '@/lib/hooks/useDashboard'; import { Widget, WidgetConfig } from '@/lib/types'; import { toast } from 'sonner'; const DashboardPage = () => { const { widgets, isLoading, addWidget, updateWidget, deleteWidget, refreshWidget, refreshAllWidgets, exportDashboard, importDashboard, settings, updateSettings, } = useDashboard(); const [showAddModal, setShowAddModal] = useState(false); const [editingWidget, setEditingWidget] = useState(null); const hasAutoRefreshed = useRef(false); // Auto-refresh stale widgets when dashboard loads (only once) useEffect(() => { if (!isLoading && widgets.length > 0 && !hasAutoRefreshed.current) { hasAutoRefreshed.current = true; refreshAllWidgets(); } }, [isLoading, widgets, refreshAllWidgets]); const handleAddWidget = () => { setEditingWidget(null); setShowAddModal(true); }; const handleEditWidget = (widget: Widget) => { setEditingWidget(widget); setShowAddModal(true); }; const handleSaveWidget = (widgetConfig: WidgetConfig) => { if (editingWidget) { // Update existing widget updateWidget(editingWidget.id, widgetConfig); } else { // Add new widget addWidget(widgetConfig); } setShowAddModal(false); setEditingWidget(null); }; const handleCloseModal = () => { setShowAddModal(false); setEditingWidget(null); }; const handleDeleteWidget = (widgetId: string) => { deleteWidget(widgetId); }; const handleRefreshWidget = (widgetId: string) => { refreshWidget(widgetId, true); // Force refresh when manually triggered }; const handleRefreshAll = () => { refreshAllWidgets(true); }; const handleExport = async () => { try { const configJson = await exportDashboard(); await navigator.clipboard.writeText(configJson); toast.success('Dashboard configuration copied to clipboard'); console.log('Dashboard configuration copied to clipboard'); } catch (error) { console.error('Export failed:', error); toast.error('Failed to copy dashboard configuration'); } }; const handleImport = async () => { try { const configJson = await navigator.clipboard.readText(); await importDashboard(configJson); toast.success('Dashboard configuration imported successfully'); console.log('Dashboard configuration imported successfully'); } catch (error) { console.error('Import failed:', error); toast.error('Failed to import dashboard configuration'); } }; const handleToggleProcessingMode = () => { updateSettings({ parallelLoading: !settings.parallelLoading }); }; // Empty state component const EmptyDashboard = () => (
Welcome to your Dashboard Create your first widget to get started with personalized information

Widgets let you fetch content from any URL and process it with AI to show exactly what you need.

); return (
{/* Header matching other pages */}

Dashboard


{/* Main content area */}
{isLoading ? (

Loading dashboard...

) : widgets.length === 0 ? ( ) : (
{widgets.map((widget) => ( ))}
)}
{/* Widget Configuration Modal */}
); }; export default DashboardPage;