import { useEffect, useState } from 'react'; import { useSearchParams } from 'react-router'; import { Button, Card, Container, Row, Spinner } from 'react-bootstrap'; import { signedGet, isSuccess } from '@/api/client'; import PageBreadcrumb from '@/components/PageBreadcrumb'; import MetricCard from '@/views/dashboard/MetricCard'; import EmptyState from '@/components/EmptyState'; import { resolveWidget } from '@/views/dashboard/widgets/registry'; function WidgetSlot({ widget }) { const Component = resolveWidget(widget.widget_name); if (!Component) { return ( {widget.title || widget.widget_name} Widget {widget.widget_name} is not configured. ); } return ; } export default function Dashboard() { const [searchParams, setSearchParams] = useSearchParams(); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [metrics, setMetrics] = useState([]); const [widgets, setWidgets] = useState([]); const load = async (refresh) => { setLoading(true); setError(''); try { const params = refresh ? { refresh: 1 } : {}; const [reportRes, widgetRes] = await Promise.all([ signedGet('metric', 'metric_report/list', params), signedGet('wall', 'widgets/list'), ]); if (reportRes?.statusCode === 401 || widgetRes?.statusCode === 401) { setError('Unauthorised'); return; } setMetrics(isSuccess(reportRes) ? reportRes.data?.metrics || [] : []); setWidgets(isSuccess(widgetRes) ? widgetRes.data?.widgets || [] : []); } catch (err) { setError(err.message || 'Unable to load dashboard'); } finally { setLoading(false); } }; useEffect(() => { load(searchParams.get('refresh') === '1'); }, [searchParams]); return ( setSearchParams({ refresh: '1' })}> Refresh Data {error ? {error} : null} {loading ? ( ) : ( <> {metrics.length === 0 && widgets.length === 0 ? : null} {metrics.map((metric) => ( ))} {widgets.map((widget) => ( ))} > )} ); }
Widget {widget.widget_name} is not configured.
{widget.widget_name}