"use client"; import { useEffect, useState } from "react"; export default function ViewManager() { const [view, setView] = useState<{ id: string; name: string; token: string; icalPastDays?: number; } | null>(null); const [error, setError] = useState(null); const [appName, setAppName] = useState("Vereinskalender"); const load = async () => { try { const viewRes = await fetch("/api/views/default"); if (!viewRes.ok) { throw new Error("Daten konnten nicht geladen werden."); } setView(await viewRes.json()); } catch (err) { setError((err as Error).message); } }; const loadAppName = async () => { try { const nameResponse = await fetch("/api/settings/app-name"); if (nameResponse.ok) { const payload = await nameResponse.json(); setAppName(payload.name || "Vereinskalender"); } } catch { // ignore } }; useEffect(() => { load(); loadAppName(); }, []); useEffect(() => { const handler = () => load(); window.addEventListener("views-updated", handler); return () => window.removeEventListener("views-updated", handler); }, []); const toFilename = (value: string) => value .trim() .toLowerCase() .replace(/[^a-z0-9]+/g, "-") .replace(/(^-|-$)/g, "") || "kalender"; const icalBase = typeof window === "undefined" ? "" : window.location.origin; return (

Persönlich

Meine Terminansicht

Stelle dir eine persönliche Terminansicht zusammen und abonniere sie als iCal.

{error &&

{error}

}

Deine Standardansicht

Diese Ansicht kannst du im Kalender oder in der Listenansicht direkt befüllen.

{view && (

iCal URL

{icalBase}/api/ical/{view.token}/{toFilename(appName)}.ical{ view.icalPastDays && view.icalPastDays > 0 ? `?pastDays=${view.icalPastDays}` : "" }

)}
); }