'use client' import * as React from 'react' import { useActionState } from 'react' import Link from 'next/link' import { AlertCircle, CheckCircle2, Copy, FileDown, FolderInput, Info, Mail, UserPlus, } from 'lucide-react' import { Alert, AlertDescription } from '@/components/ui/alert' import { Button } from '@/components/ui/button' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { Input } from '@/components/ui/input' import { Textarea } from '@/components/ui/textarea' import { Select } from '@/components/ui/select' import { Feld } from '@/components/feld' import { Absendeknopf } from '@/components/finanzen/eingaben' import { kontaktAusAnschrift, schreibenAblegen, type SchreibenZustand, } from '@/server/actions/schreiben' import type { SchreibenArt } from '@/lib/schreiben/arten' import { emailFassung, mailtoLink, siehtAusWieEmail } from '@/lib/schreiben/email' export type KontaktAuswahl = { id: string name: string organisation: string | null strasse: string | null plz: string | null ort: string | null email: string | null } /** * Schreiben bearbeiten, herunterladen, ablegen. * * Der Text steht in einem gewöhnlichen Textfeld und ist vollständig * bearbeitbar. Das ist Absicht: Jeder Fall hat eine Besonderheit, die in * den Brief gehört. Ein Formulartext, den man nicht mehr ändern kann, * wird früher oder später falsch abgeschickt. */ export function SchreibenEditor({ betreuteId, art, entwurf, kontakte, vertragId, vorgangId, fristBegruendung, warnungen, }: { betreuteId: string art: SchreibenArt entwurf: { betreff: string; text: string; empfaengerName: string; wiedervorlageAm: string } kontakte: KontaktAuswahl[] vertragId: string | null vorgangId: string | null fristBegruendung: string | null warnungen: string[] }) { const [text, setText] = React.useState(entwurf.text) const [betreff, setBetreff] = React.useState(entwurf.betreff) const [empfaengerName, setEmpfaengerName] = React.useState(entwurf.empfaengerName) const [empfaengerAnschrift, setEmpfaengerAnschrift] = React.useState('') const [empfaengerEmail, setEmpfaengerEmail] = React.useState('') const [versandweg, setVersandweg] = React.useState<'BRIEF' | 'EMAIL'>('BRIEF') const [betreffKopiert, setBetreffKopiert] = React.useState(false) const [mailKopiert, setMailKopiert] = React.useState(false) const [versandAm, setVersandAm] = React.useState(new Date().toISOString().slice(0, 10)) const [wiedervorlageAm, setWiedervorlageAm] = React.useState(entwurf.wiedervorlageAm) const [kopiert, setKopiert] = React.useState(false) const [ablageZustand, ablegen] = useActionState( schreibenAblegen, {}, ) const [kontaktZustand, kontaktAnlegen] = useActionState( kontaktAusAnschrift, {}, ) /** Gemeinsame versteckte Felder für beide Formulare und den Download. */ function VersteckteFelder() { return ( <> ) } function kontaktUebernehmen(id: string) { const kontakt = kontakte.find((k) => k.id === id) if (!kontakt) return setEmpfaengerName(kontakt.organisation ?? kontakt.name) setEmpfaengerAnschrift( [kontakt.strasse, [kontakt.plz, kontakt.ort].filter(Boolean).join(' ')] .filter(Boolean) .join('\n'), ) setEmpfaengerEmail(kontakt.email ?? '') } async function textKopieren() { try { await navigator.clipboard.writeText(text) setKopiert(true) window.setTimeout(() => setKopiert(false), 2500) } catch { /* Zwischenablage gesperrt - dann markiert man eben von Hand. */ } } const abgelegt = Boolean(ablageZustand.erfolg) /** * Die E-Mail-Fassung: Betreff und Rumpf getrennt, ohne Briefkopf. * * Abgeleitet aus dem AKTUELLEN Text im Feld - wer den Brief bearbeitet * hat, bekommt die bearbeitete Fassung, nicht den Ursprungsentwurf. */ function EmailAusgabe() { const fassung = emailFassung(text, betreff) const adresseGueltig = siehtAusWieEmail(empfaengerEmail) const mailto = adresseGueltig ? mailtoLink(empfaengerEmail, fassung) : null async function kopieren(inhalt: string, merker: (wert: boolean) => void) { try { await navigator.clipboard.writeText(inhalt) merker(true) window.setTimeout(() => merker(false), 2500) } catch { /* Zwischenablage gesperrt - dann markiert man eben von Hand. */ } } return (