"use client"; import { useActionState, useRef, useState } from "react"; import { Camera, FileText, Paperclip, X } from "lucide-react"; import { ERLAUBTE_MEDIENTYPEN, groesseText, istBild, maxGroesseBytes } from "@/lib/anhaenge"; import { anhangEntfernenAktion, anhangHochladenAktion, type AktionsErgebnis, } from "@/server/actions/anhaenge"; /** * Anhaenge eines Schritts (#032). * * Zwei Wege zum Anhaengen, weil zwei Geraete gemeint sind: **Foto** oeffnet am * Handy direkt die Kamera (`capture="environment"`), **Datei** den Dateiwaehler. * Am Rechner tun beide dasselbe — dort gibt es keine Kamera-App, und der Browser * zeigt in beiden Faellen den Waehler. * * Abgeschickt wird sofort nach der Wahl, ohne zweiten Knopf: ein Foto, das man * gerade gemacht hat, will man nicht noch bestaetigen. Ein eigener * „Hochladen“-Knopf waere der Schritt, den man vergisst. */ export type SchrittAnhang = { readonly id: string; readonly dateiname: string; readonly medientyp: string; readonly groesse: number; readonly erstelltVon: string | null; }; export function SchrittAnhaenge({ laufId, vorlagenSchrittId, anhaenge, lesend, }: { laufId: string; vorlagenSchrittId: string; anhaenge: readonly SchrittAnhang[]; lesend: boolean; }) { const [hochladen, hochladenAktion, laedt] = useActionState( anhangHochladenAktion, {}, ); const [entfernen, entfernenAktion] = useActionState(anhangEntfernenAktion, {}); const formular = useRef(null); const [zuGross, setzeZuGross] = useState(null); function gewaehlt(ereignis: React.ChangeEvent): void { const datei = ereignis.target.files?.[0]; if (!datei) return; /* * Die Groesse schon hier pruefen. Sonst wandern bei einem Fehlgriff 200 MB * durch die Leitung, nur damit der Server sie ablehnt — am Handy im * Mobilfunk ist das der Unterschied zwischen einer Meldung und einer * Minute Warten. Dienst und Action pruefen es trotzdem noch einmal. */ if (datei.size > maxGroesseBytes()) { setzeZuGross( `„${datei.name}“ ist ${groesseText(datei.size)} groß. Erlaubt sind höchstens ` + `${groesseText(maxGroesseBytes())}.`, ); ereignis.target.value = ""; return; } setzeZuGross(null); formular.current?.requestSubmit(); } const meldung = zuGross ?? hochladen.fehler ?? entfernen.fehler; return (
{anhaenge.length > 0 ? ( ) : null} {lesend ? null : (
{laedt ? wird hochgeladen … : null}
)} {meldung ? (

{meldung}

) : null}
); }