'use client' import React, { useState, useEffect, useCallback } from 'react' import { DSBDashboard, AssignmentOverview, apiFetch } from './_components/types' import { useToast, ToastContainer, DashboardSkeleton, StatCard, ErrorState, EmptyState, IconUsers, IconClock, IconTask, IconAlert, IconShield, IconRefresh, } from './_components/ui-primitives' import { MandantCard } from './_components/MandantCard' import { DetailView } from './_components/DetailView' // ============================================================================= // MAIN PAGE // ============================================================================= export default function DSBPortalPage() { const [dashboard, setDashboard] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState('') const [selectedAssignment, setSelectedAssignment] = useState(null) const { toasts, addToast } = useToast() const fetchDashboard = useCallback(async () => { setLoading(true) setError('') try { const data = await apiFetch('/api/sdk/v1/dsb/dashboard') setDashboard(data) if (selectedAssignment) { const updated = data.assignments.find((a) => a.id === selectedAssignment.id) if (updated) setSelectedAssignment(updated) } } catch (e: unknown) { setError(e instanceof Error ? e.message : 'Fehler beim Laden des Dashboards') } finally { setLoading(false) } }, []) // eslint-disable-line react-hooks/exhaustive-deps useEffect(() => { fetchDashboard() }, [fetchDashboard]) const handleBackToDashboard = () => { setSelectedAssignment(null) fetchDashboard() } return (
{/* Global Header */}

DSB-Portal

Datenschutzbeauftragter Mandanten-Verwaltung

{/* Content */}
{loading && !dashboard ? ( ) : error && !dashboard ? ( ) : selectedAssignment ? ( ) : dashboard ? (
{/* Stats Row */}
} /> } /> } /> } accent={dashboard.urgent_tasks > 0} />
{/* Mandanten Grid */}

Mandanten ({dashboard.total_assignments})

{dashboard.assignments.length === 0 ? ( } title="Keine Mandanten" description="Es sind noch keine Mandanten-Zuweisungen vorhanden." /> ) : (
{dashboard.assignments.map((a) => ( setSelectedAssignment(a)} /> ))}
)}
) : null}
{/* Inline animation styles */}
) }