/** MessagingTab — compose email to Authentik users via the mail queue. */ import { useState } from "react"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { useAuthentikUsers, useSendAuthentikMessage, } from "../../hooks/useAuthentik"; import type { ServiceInstance } from "../../types"; const DEFAULT_BODY = "

Hello,

Best,
Manage

"; export function MessagingTab({ instance }: { instance: ServiceInstance }) { const [search, setSearch] = useState(""); const [selectedEmails, setSelectedEmails] = useState>(new Set()); const [subject, setSubject] = useState(""); const [htmlBody, setHtmlBody] = useState(DEFAULT_BODY); const { data } = useAuthentikUsers(instance.id, { search, page: 1, page_size: 100, }); const sendMessage = useSendAuthentikMessage(instance.id); const users = (data?.items ?? []).filter((u) => u.email); const error = data?.error; function toggleEmail(email: string) { setSelectedEmails((prev) => { const next = new Set(prev); if (next.has(email)) next.delete(email); else next.add(email); return next; }); } function handleSend() { if (!subject.trim() || selectedEmails.size === 0) return; sendMessage.mutate({ recipient_emails: Array.from(selectedEmails), subject: subject.trim(), html_body: htmlBody, }); } const canSend = subject.trim() !== "" && selectedEmails.size > 0 && !sendMessage.isPending; return (
{error ? ( {error} ) : null} {sendMessage.data ? ( {sendMessage.data.status === "queued" ? `Message queued (${sendMessage.data.recipient_count ?? 0} recipients, request ${sendMessage.data.request_id?.slice(0, 8) ?? ""}).` : `Error: ${sendMessage.data.error ?? "unknown"}`} ) : null}
setSearch(e.target.value)} className="max-w-md" /> {users.length > 0 ? (
{users.slice(0, 20).map((user) => ( ))}
) : null} {selectedEmails.size > 0 ? (

{selectedEmails.size} recipient {selectedEmails.size === 1 ? "" : "s"} selected.

) : null}
setSubject(e.target.value)} />