import { useState, useEffect } from "react"; import { useMutation, useQuery } from "@tanstack/react-query"; import { queryClient } from "@/client/rpc-client"; export function AdminAvailability() { const today = new Date().toISOString().split("T")[0]; // Tab-Navigation (Slots entfernt) const [activeSubTab, setActiveSubTab] = useState<"recurring" | "timeoff">("recurring"); // States für Recurring Rules const [selectedDayOfWeek, setSelectedDayOfWeek] = useState(1); // 1=Montag const [ruleStartTime, setRuleStartTime] = useState("13:00"); const [ruleEndTime, setRuleEndTime] = useState("18:00"); const [editingRuleId, setEditingRuleId] = useState(""); // States für Time-Off const [timeOffStartDate, setTimeOffStartDate] = useState(""); const [timeOffEndDate, setTimeOffEndDate] = useState(""); const [timeOffReason, setTimeOffReason] = useState(""); const [editingTimeOffId, setEditingTimeOffId] = useState(""); // Neue Queries für wiederkehrende Verfügbarkeiten (mit Authentifizierung) const { data: recurringRules, refetch: refetchRecurringRules } = useQuery( queryClient.recurringAvailability.live.adminListRules.experimental_liveOptions({ input: { sessionId: localStorage.getItem("sessionId") || "" } }) ); const { data: timeOffPeriods } = useQuery( queryClient.recurringAvailability.live.adminListTimeOff.experimental_liveOptions({ input: { sessionId: localStorage.getItem("sessionId") || "" } }) ); const [errorMsg, setErrorMsg] = useState(""); const [successMsg, setSuccessMsg] = useState(""); // Auto-clear messages after 5 seconds useEffect(() => { if (errorMsg) { const timer = setTimeout(() => setErrorMsg(""), 5000); return () => clearTimeout(timer); } }, [errorMsg]); useEffect(() => { if (successMsg) { const timer = setTimeout(() => setSuccessMsg(""), 5000); return () => clearTimeout(timer); } }, [successMsg]); // Neue Mutations für wiederkehrende Verfügbarkeiten const { mutate: createRule } = useMutation( queryClient.recurringAvailability.createRule.mutationOptions() ); const { mutate: updateRule } = useMutation( queryClient.recurringAvailability.updateRule.mutationOptions() ); const { mutate: deleteRule } = useMutation( queryClient.recurringAvailability.deleteRule.mutationOptions() ); const { mutate: toggleRuleActive } = useMutation( queryClient.recurringAvailability.toggleRuleActive.mutationOptions() ); const { mutate: createTimeOff } = useMutation( queryClient.recurringAvailability.createTimeOff.mutationOptions() ); const { mutate: updateTimeOff } = useMutation( queryClient.recurringAvailability.updateTimeOff.mutationOptions() ); const { mutate: deleteTimeOff } = useMutation( queryClient.recurringAvailability.deleteTimeOff.mutationOptions() ); // Helper-Funktion für Wochentag-Namen const getDayName = (dayOfWeek: number): string => { const days = ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"]; return days[dayOfWeek]; }; return (
{/* Tab-Navigation (Slots entfernt) */}
{/* Slot-Tab und Slot-UI entfernt */} {/* Tab "Wiederkehrende Zeiten" */} {activeSubTab === "recurring" && (
{/* Neue Regel erstellen */}

Neue wiederkehrende Regel erstellen

setRuleStartTime(e.target.value)} className="w-full border border-gray-300 rounded-md px-3 py-2 focus:outline-none focus:ring-2 focus:ring-pink-500" />
setRuleEndTime(e.target.value)} className="w-full border border-gray-300 rounded-md px-3 py-2 focus:outline-none focus:ring-2 focus:ring-pink-500" />
{/* Bestehende Regeln */}

Bestehende Regeln

{recurringRules?.length === 0 && (
Noch keine wiederkehrenden Regeln definiert
Erstellen Sie Ihre erste Regel, um automatisch Slots zu generieren.
)} {recurringRules?.map((rule) => (
{getDayName(rule.dayOfWeek)}
{rule.startTime} - {rule.endTime} Uhr
{rule.isActive ? "Aktiv" : "Inaktiv"}
))}
)} {/* Tab "Urlaubszeiten" */} {activeSubTab === "timeoff" && (
{/* Neue Urlaubszeit erstellen */}

Neue Urlaubszeit erstellen

setTimeOffStartDate(e.target.value)} className="w-full border border-gray-300 rounded-md px-3 py-2 focus:outline-none focus:ring-2 focus:ring-pink-500" />
setTimeOffEndDate(e.target.value)} className="w-full border border-gray-300 rounded-md px-3 py-2 focus:outline-none focus:ring-2 focus:ring-pink-500" />
setTimeOffReason(e.target.value)} className="w-full border border-gray-300 rounded-md px-3 py-2 focus:outline-none focus:ring-2 focus:ring-pink-500" />
{/* Bestehende Urlaubszeiten */}

Bestehende Urlaubszeiten

{timeOffPeriods?.length === 0 && (
Keine Urlaubszeiten eingetragen
Fügen Sie Urlaubszeiten hinzu, um automatisch Slots zu blockieren.
)} {timeOffPeriods?.map((period) => { const today = new Date().toISOString().split("T")[0]; const isPast = period.endDate < today; const isCurrent = period.startDate <= today && period.endDate >= today; const isFuture = period.startDate > today; return (
{new Date(period.startDate).toLocaleDateString('de-DE')} - {new Date(period.endDate).toLocaleDateString('de-DE')}
{period.reason}
{isPast ? "Vergangen" : isCurrent ? "Aktuell" : "Geplant"}
); })}
)}
); }