"use client"; import { useQuery, useMutation } from "@tanstack/react-query"; import { api } from "@/lib/api"; import type { ProceedingType, CalculateResponse, CalculatedDeadline } from "@/lib/types"; import { format, parseISO, isPast, isThisWeek } from "date-fns"; import { de } from "date-fns/locale"; import { Calculator, Calendar, ArrowRight, AlertTriangle } from "lucide-react"; import { useState } from "react"; function getTimelineUrgency(dueDate: string): "red" | "amber" | "green" { const due = parseISO(dueDate); if (isPast(due)) return "red"; if (isThisWeek(due, { weekStartsOn: 1 })) return "amber"; return "green"; } const dotColors = { red: "bg-red-500", amber: "bg-amber-500", green: "bg-green-500", }; export function DeadlineCalculator() { const [proceedingType, setProceedingType] = useState(""); const [triggerDate, setTriggerDate] = useState(""); const { data: proceedingTypes, isLoading: typesLoading } = useQuery({ queryKey: ["proceeding-types"], queryFn: () => api.get("/api/proceeding-types"), }); const calculateMutation = useMutation({ mutationFn: (params: { proceeding_type: string; trigger_event_date: string }) => api.post("/api/deadlines/calculate", params), }); function handleCalculate(e: React.FormEvent) { e.preventDefault(); if (!proceedingType || !triggerDate) return; calculateMutation.mutate({ proceeding_type: proceedingType, trigger_event_date: triggerDate, }); } const results = calculateMutation.data; return (
{/* Input form */}
Fristenberechnung
setTriggerDate(e.target.value)} className="w-full rounded-md border border-neutral-200 bg-white px-3 py-2 text-sm text-neutral-900" />
{/* Error */} {calculateMutation.isError && (
Fehler bei der Berechnung. Bitte Eingaben prufen.
)} {/* Results */} {results && results.deadlines && (

Berechnete Fristen

{results.deadlines.length} Fristen ab{" "} {format(parseISO(results.trigger_event_date), "dd. MMM yyyy", { locale: de })}
{/* Timeline */}
{results.deadlines.map((d: CalculatedDeadline, i: number) => { const urgency = getTimelineUrgency(d.due_date); const isLast = i === results.deadlines.length - 1; return (
{/* Timeline dot + line */}
{!isLast &&
}
{/* Content */}
{d.title} {format(parseISO(d.due_date), "dd.MM.yyyy")}
{d.rule_code && {d.rule_code}} {d.was_adjusted && ( <> {d.rule_code && ยท} Angepasst (Original: {format(parseISO(d.original_due_date), "dd.MM.yyyy")}) )}
); })}
)} {/* Empty state */} {!results && !calculateMutation.isPending && (

Verfahrensart und Auslosedatum wahlen, um Fristen zu berechnen

)}
); }