"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { formatDate } from "@/lib/utils"; import { Input, Label, Textarea, FieldError } from "@/components/ui/Input"; import { Button } from "@/components/ui/Button"; interface ApartmentLite { id: string; slug: string; name: string; } export interface BlockRow { id: string; apartmentId: string; apartmentName: string; startDate: string; endDate: string; reason: string; source: string; note: string | null; } export function CalendarManager({ apartments, blocks, }: { apartments: ApartmentLite[]; blocks: BlockRow[]; }) { const router = useRouter(); const [apartmentId, setApartmentId] = useState(apartments[0]?.id ?? ""); const [startDate, setStartDate] = useState(""); const [endDate, setEndDate] = useState(""); const [note, setNote] = useState(""); const [reason, setReason] = useState<"manual" | "maintenance" | "booking">("manual"); const [error, setError] = useState(null); const [saving, setSaving] = useState(false); // iCal sync state const [icalApartmentId, setIcalApartmentId] = useState(apartments[0]?.id ?? ""); const [icalUrl, setIcalUrl] = useState(""); const [icalSource, setIcalSource] = useState<"airbnb" | "booking">("airbnb"); const [icalSyncing, setIcalSyncing] = useState(false); const [icalMessage, setIcalMessage] = useState<{ kind: "ok" | "err"; text: string } | null>(null); async function onSubmit(e: React.FormEvent) { e.preventDefault(); setSaving(true); setError(null); try { const res = await fetch("/api/admin/blocks", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ apartmentId, startDate, endDate, note, reason }), }); if (!res.ok) { const data = await res.json().catch(() => ({})); throw new Error(data.error ?? "Konnte Zeitraum nicht sperren."); } setStartDate(""); setEndDate(""); setNote(""); router.refresh(); } catch (err) { setError(err instanceof Error ? err.message : "Unbekannter Fehler."); } finally { setSaving(false); } } async function removeBlock(id: string) { if (!confirm("Zeitraum freigeben?")) return; const res = await fetch(`/api/admin/blocks/${id}`, { method: "DELETE" }); if (res.ok) router.refresh(); } async function syncIcal(e: React.FormEvent) { e.preventDefault(); if (!icalUrl.trim()) return; setIcalSyncing(true); setIcalMessage(null); try { const res = await fetch("/api/admin/sync-ical", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ apartmentId: icalApartmentId, icalUrl: icalUrl.trim(), source: icalSource }), }); const data = await res.json().catch(() => ({})); if (!res.ok) throw new Error(data.error ?? "Synchronisation fehlgeschlagen."); setIcalMessage({ kind: "ok", text: `✓ ${data.imported} Buchungen importiert, ${data.deleted} alte entfernt.`, }); setIcalUrl(""); router.refresh(); } catch (err) { setIcalMessage({ kind: "err", text: err instanceof Error ? err.message : "Fehler." }); } finally { setIcalSyncing(false); } } return (
{/* Formular */}

Zeitraum sperren

Für externe Buchungen, eigene Nutzung oder Wartung.

setStartDate(e.target.value)} required />
setEndDate(e.target.value)} required />