import { useState, useEffect } from 'react'; import { Container, Box, Fade, } from '@mui/material'; import { useQuery } from '@tanstack/react-query'; import { useAuth } from '../contexts/AuthContext'; import { usePermissionContext } from '../contexts/PermissionContext'; import DashboardLayout from '../components/dashboard/DashboardLayout'; import SkeletonCard from '../components/shared/SkeletonCard'; import UserProfile from '../components/dashboard/UserProfile'; import UpcomingEventsWidget from '../components/dashboard/UpcomingEventsWidget'; import AtemschutzDashboardCard from '../components/atemschutz/AtemschutzDashboardCard'; import EquipmentDashboardCard from '../components/equipment/EquipmentDashboardCard'; import VehicleDashboardCard from '../components/vehicles/VehicleDashboardCard'; import BookStackRecentWidget from '../components/dashboard/BookStackRecentWidget'; import BookStackSearchWidget from '../components/dashboard/BookStackSearchWidget'; import VikunjaMyTasksWidget from '../components/dashboard/VikunjaMyTasksWidget'; import VikunjaQuickAddWidget from '../components/dashboard/VikunjaQuickAddWidget'; import VikunjaOverdueNotifier from '../components/dashboard/VikunjaOverdueNotifier'; import AtemschutzExpiryNotifier from '../components/dashboard/AtemschutzExpiryNotifier'; import AdminStatusWidget from '../components/dashboard/AdminStatusWidget'; import AnnouncementBanner from '../components/dashboard/AnnouncementBanner'; import VehicleBookingQuickAddWidget from '../components/dashboard/VehicleBookingQuickAddWidget'; import VehicleBookingListWidget from '../components/dashboard/VehicleBookingListWidget'; import EventQuickAddWidget from '../components/dashboard/EventQuickAddWidget'; import LinksWidget from '../components/dashboard/LinksWidget'; import BannerWidget from '../components/dashboard/BannerWidget'; import WidgetGroup from '../components/dashboard/WidgetGroup'; import BestellungenWidget from '../components/dashboard/BestellungenWidget'; import ShopWidget from '../components/dashboard/ShopWidget'; import { preferencesApi } from '../services/settings'; import { configApi } from '../services/config'; import { WidgetKey } from '../constants/widgets'; function Dashboard() { const { user } = useAuth(); const { hasPermission } = usePermissionContext(); const [dataLoading, setDataLoading] = useState(true); const { data: preferences } = useQuery({ queryKey: ['user-preferences'], queryFn: preferencesApi.get, }); const { data: externalLinks } = useQuery({ queryKey: ['external-links'], queryFn: () => configApi.getExternalLinks(), staleTime: 10 * 60 * 1000, }); const linkCollections = (externalLinks?.linkCollections ?? []).filter( (c) => c.links.length > 0 ); const widgetVisible = (key: WidgetKey) => { return preferences?.widgets?.[key] !== false; }; useEffect(() => { const timer = setTimeout(() => { setDataLoading(false); }, 800); return () => clearTimeout(timer); }, []); return ( {/* Vikunja — Overdue Notifier (invisible, polling component — outside grid) */} {/* Atemschutz — Expiry Notifier (invisible, polling component — outside grid) */} {/* Announcement Banner — spans full width, renders null when no banners */} {/* User Profile Card — full width, contains welcome greeting */} {user && ( {dataLoading ? ( ) : ( )} )} {/* Status Group */} {hasPermission('fahrzeuge:widget') && widgetVisible('vehicles') && ( )} {hasPermission('ausruestung:widget') && widgetVisible('equipment') && ( )} {hasPermission('atemschutz:widget') && widgetVisible('atemschutz') && ( )} {hasPermission('admin:view') && widgetVisible('adminStatus') && ( )} {hasPermission('bestellungen:widget') && widgetVisible('bestellungen') && ( )} {hasPermission('shop:widget') && widgetVisible('shopRequests') && ( )} {/* Kalender Group */} {hasPermission('kalender:view') && widgetVisible('events') && ( )} {hasPermission('kalender:view_bookings') && widgetVisible('vehicleBookingList') && ( )} {hasPermission('kalender:manage_bookings') && widgetVisible('vehicleBooking') && ( )} {hasPermission('kalender:create') && widgetVisible('eventQuickAdd') && ( )} {/* Dienste Group */} {hasPermission('wissen:widget_recent') && widgetVisible('bookstackRecent') && ( )} {hasPermission('wissen:widget_search') && widgetVisible('bookstackSearch') && ( )} {hasPermission('vikunja:widget_tasks') && widgetVisible('vikunjaTasks') && ( )} {hasPermission('vikunja:widget_quick_add') && widgetVisible('vikunjaQuickAdd') && ( )} {/* Information Group */} {hasPermission('dashboard:widget_links') && widgetVisible('links') && linkCollections.map((collection, idx) => ( ))} {hasPermission('dashboard:widget_banner') && ( )} ); } export default Dashboard;