'use client'; import { useCallback, useEffect, useState } from 'react'; import { useTranslations } from 'next-intl'; import { DashboardGrid } from '@/components/dashboard/dashboard-grid'; import { EditModeToggle } from '@/components/dashboard/edit-mode-toggle'; import { WidgetCatalogModal } from '@/components/dashboard/widget-catalog-modal'; import { registerWidget } from '@/components/dashboard/widget-registry'; import { ClockWidget } from '@/components/dashboard/widgets/clock-widget'; import { SearchWidget } from '@/components/dashboard/widgets/search-widget'; import { CalendarWidget } from '@/components/dashboard/widgets/calendar-widget'; import { NoteWidget } from '@/components/dashboard/widgets/note-widget'; import { CalculatorWidget } from '@/components/dashboard/widgets/calculator-widget'; import { StopwatchWidget } from '@/components/dashboard/widgets/stopwatch-widget'; import { FavoritesWidget } from '@/components/dashboard/widgets/favorites-widget'; import { PictureFrameWidget } from '@/components/dashboard/widgets/picture-frame-widget'; import { XframeWidget } from '@/components/dashboard/widgets/xframe-widget'; import { useDashboardStore } from '@/lib/stores/dashboard-store'; import type { WidgetType } from '@/components/dashboard/widget-registry'; const API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3001'; // Anmeldung der Kachel-Komponenten an der Registry. Steht hier und nicht in // der Registry selbst, weil die Komponenten ueber den Wrapper wieder die // Registry importieren — ein Import aus der Registry heraus waere ein // Zirkelimport. Seit quick-260922-m1h EINE Funktion statt neun `wireXWidget`. registerWidget('clock', ClockWidget); registerWidget('search', SearchWidget); registerWidget('calendar', CalendarWidget); registerWidget('note', NoteWidget); registerWidget('calculator', CalculatorWidget); registerWidget('stopwatch', StopwatchWidget); registerWidget('favorites', FavoritesWidget); registerWidget('picture-frame', PictureFrameWidget); registerWidget('xframe', XframeWidget); /** Modul-Eintrag aus `GET /modules/active` — hier zaehlt nur der Slug. */ interface ActiveModule { slug: string; } export default function DashboardPage() { const t = useTranslations('widgets'); const [catalogOpen, setCatalogOpen] = useState(false); // quick-260922-m1h: Slugs der Module, die dieser Benutzer nutzen darf — // der Katalog blendet Kacheln gesperrter Module damit aus. `null` heisst // "noch unbekannt oder Abruf fehlgeschlagen" und ist fail-closed. const [accessibleModuleSlugs, setAccessibleModuleSlugs] = useState(null); const { layouts, widgets, isEditMode, isLoading, error, setEditMode, updateLayouts, addWidget, removeWidget, loadDashboard, } = useDashboardStore(); // Load dashboard data on mount useEffect(() => { loadDashboard(); }, [loadDashboard]); // Zugaengliche Module holen — gleiches Muster wie die Seitenleiste // (`components/layout/sidebar.tsx`): derselbe Endpunkt, derselbe // Sitzungs-Keks, Fehler still. Der Abruf steht hier und nicht im Dialog, // damit der Dialog ein reines Anzeige-Bauteil bleibt. const fetchAccessibleModules = useCallback(async () => { try { const res = await fetch(`${API_URL}/modules/active`, { credentials: 'include', }); if (!res.ok) return; const modules: ActiveModule[] = await res.json(); setAccessibleModuleSlugs(modules.map((m) => m.slug)); } catch { // still: die Liste bleibt null, der Katalog zeigt dann nur // Plattform-Kacheln (fail-closed). } }, []); useEffect(() => { fetchAccessibleModules(); }, [fetchAccessibleModules]); if (isLoading) { return (

Loading...

); } if (error) { return (

{t('layoutLoadError')}

); } return (
{/* Dashboard grid — direkt im Container, ohne Abstands-Wrapper. */} {/* Feste Aktionsleiste unten rechts. quick-260916-dyv: Umschalter unten rechts statt oben rechts, damit das Grid direkt unter der Kopfzeile beginnt (12 + 8 + 8 = 28 px statt 60 px). Im Bearbeitungsmodus steht "Widget hinzufuegen" links neben dem Haekchen. */}
{isEditMode && ( )} setEditMode(!isEditMode)} />
{/* Widget catalog modal */} setCatalogOpen(false)} accessibleModuleSlugs={accessibleModuleSlugs} onAddWidget={(type: WidgetType) => { addWidget(type); }} />
); }