"use client"; import Link from "next/link"; import { useEffect, useState } from "react"; type Conversation = { id: string; subject: string; name: string; email: string; status: string; lastMessageAt?: string }; type Message = { id: string; senderType: "visitor" | "admin"; senderName?: string; body: string; createdAt: string }; const statusLabel: Record = { open: "Offen", waiting: "Wartet auf Antwort", closed: "Erledigt" }; export function AdminConversationsView() { const [conversations, setConversations] = useState([]); const [selected, setSelected] = useState(null); const [messages, setMessages] = useState([]); const [reply, setReply] = useState(""); const [loading, setLoading] = useState(true); const [busy, setBusy] = useState(false); const [error, setError] = useState(""); async function loadConversations() { const response = await fetch("/api/conversations?limit=100&sort=-lastMessageAt&depth=0", { credentials: "include" }); if (!response.ok) throw new Error("Anfragen konnten nicht geladen werden."); const data = await response.json(); setConversations(data.docs ?? []); } async function loadMessages(conversation: Conversation) { setSelected(conversation); const response = await fetch(`/api/conversation-messages?limit=100&sort=createdAt&where[conversation][equals]=${encodeURIComponent(conversation.id)}`, { credentials: "include" }); const data = await response.json(); setMessages(data.docs ?? []); } useEffect(() => { let cancelled = false; fetch("/api/conversations?limit=100&sort=-lastMessageAt&depth=0", { credentials: "include" }) .then(async (response) => { if (!response.ok) throw new Error("Anfragen konnten nicht geladen werden."); return response.json(); }) .then((data) => { if (!cancelled) setConversations(data.docs ?? []); }) .catch((err: Error) => { if (!cancelled) setError(err.message); }) .finally(() => { if (!cancelled) setLoading(false); }); return () => { cancelled = true; }; }, []); async function sendReply() { if (!selected || !reply.trim()) return; setBusy(true); setError(""); try { const response = await fetch("/api/conversation-messages", { method: "POST", credentials: "include", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ conversation: selected.id, senderType: "admin", senderName: "Anouma", body: reply.trim() }), }); if (!response.ok) throw new Error("Antwort konnte nicht gesendet werden."); setReply(""); await loadMessages(selected); await loadConversations(); } catch (err) { setError(err instanceof Error ? err.message : "Antwort konnte nicht gesendet werden."); } finally { setBusy(false); } } return (
Zur Übersicht

Anfragen und Nachrichten

Kontakt- und Terminanfragen zentral bearbeiten. Antworten werden automatisch per E-Mail verschickt.

{error &&

{error}

}
{loading &&

Anfragen werden geladen …

} {!loading && conversations.length === 0 &&

Noch keine Anfragen.

} {conversations.map((conversation) => ( ))}
{!selected ?

Wähle links eine Anfrage aus.

: <>

{selected.subject}

{selected.name} · {selected.email}

{messages.map((message) =>
{message.senderType === "admin" ? "Anouma" : message.senderName || selected.name} · {new Date(message.createdAt).toLocaleString("de-DE")}
{message.body}
)}