"use client"; import { useEffect, useMemo, useState } from "react"; type EventItem = { id: string; title: string; startAt: string; endAt: string; status: string; }; type ViewItem = { id: string; name: string; token: string; items: { event: EventItem }[]; }; export default function ViewManager() { const [views, setViews] = useState([]); const [events, setEvents] = useState([]); const [selectedView, setSelectedView] = useState(null); const [error, setError] = useState(null); const load = async () => { try { const [viewsRes, eventsRes] = await Promise.all([ fetch("/api/views"), fetch("/api/events?status=APPROVED") ]); if (!viewsRes.ok || !eventsRes.ok) { throw new Error("Daten konnten nicht geladen werden."); } const viewsData = await viewsRes.json(); const eventsData = await eventsRes.json(); setViews(viewsData); setEvents(eventsData); if (viewsData.length > 0 && !selectedView) { setSelectedView(viewsData[0].id); } } catch (err) { setError((err as Error).message); } }; useEffect(() => { load(); }, []); const icalBase = typeof window === "undefined" ? "" : window.location.origin; const activeView = useMemo( () => views.find((view) => view.id === selectedView) || null, [views, selectedView] ); const createView = async (event: React.FormEvent) => { event.preventDefault(); const formData = new FormData(event.currentTarget); const name = formData.get("name"); const response = await fetch("/api/views", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ name }) }); if (response.ok) { event.currentTarget.reset(); load(); } }; const addItem = async (event: React.FormEvent) => { event.preventDefault(); if (!selectedView) return; const formData = new FormData(event.currentTarget); const eventId = formData.get("eventId"); await fetch(`/api/views/${selectedView}/items`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ eventId }) }); load(); }; const removeItem = async (eventId: string) => { if (!selectedView) return; await fetch(`/api/views/${selectedView}/items`, { method: "DELETE", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ eventId }) }); load(); }; return (

Meine Kalenderansichten

Stelle dir eine persoenliche Terminansicht zusammen und abonnieren sie als iCal.

{error &&

{error}

}

Neue Ansicht

{activeView && (

iCal URL

{icalBase}/api/ical/{activeView.token}

)}

Termine hinzufuegen

Inhalte der Ansicht

{activeView?.items.length ? ( activeView.items.map((item) => (
{item.event.title}
)) ) : (

Noch keine Termine.

)}
); }