/** * „Beleg hochladen" — Vorlage: `vBelegPopup()` im Panel. * * Bis 2026-08-31 öffnete der Beleg-Knopf in der App direkt die Dateiauswahl. * Auf dem iPhone landete man damit im Dateispeicher, und ein aus der Mail * kopiertes PDF war überhaupt nicht einzufügen — im Panel gab es diesen Weg * längst. Geteilt zwischen dem Anlegen (Tanken.tsx) und dem Nachtragen * (TankDetail.tsx), damit beide nicht auseinanderlaufen. * * Ein Auswahlblatt, kein Popup: es ist eine kurze Liste von Wegen zum selben * Ziel, und genau dafür sieht Apple das Aktionsblatt vor. „Abbrechen" steht * abgesetzt in eigener Karte — das macht es zum Ausweg statt zur vierten * Wahlmöglichkeit. * * Welche Wege angeboten werden, entscheidet das Gerät, nicht der Geschmack: * am Telefon ist Einfügen der Hauptweg, am Rechner Ziehen bzw. Dateiauswahl. * Begründung in daten/zwischenablage.ts. */ import { useRef, useState } from "react" import { ActionSheet } from "@audi-dash/ui" import { ZwischenablageFehler, pdfAusDateiliste, pdfAusZwischenablage, zwischenablageKnopfSinnvoll, } from "../daten/zwischenablage" export function BelegPopup({ offen, beiAbbruch, beiDatei, }: { offen: boolean beiAbbruch: () => void /** Bekommt das PDF. Das Blatt schließt sich vorher selbst. */ beiDatei: (datei: File) => void }) { const dateiwahl = useRef(null) const [fehler, setzeFehler] = useState(null) const [darueber, setzeDarueber] = useState(false) // Einmal beim Aufbau bestimmt: ein Gerätewechsel mitten im Dialog gibt es // nicht, und ein bei jedem Rendern neu befragtes matchMedia wäre nur Aufwand. const [telefon] = useState(zwischenablageKnopfSinnvoll) const uebernehmen = (datei: File) => { setzeFehler(null) beiDatei(datei) } const einfuegen = async () => { try { uebernehmen(await pdfAusZwischenablage()) } catch (f) { setzeFehler( f instanceof ZwischenablageFehler ? f.message : 'Die Zwischenablage ließ sich nicht lesen - bitte "Datei auswählen".', ) } } const aktionen = [ ...(telefon ? [{ label: "Aus Zwischenablage einfügen", onClick: () => void einfuegen() }] : []), { label: "Datei auswählen", onClick: () => dateiwahl.current?.click() }, ] // Nur wenn es wirklich etwas zu zeigen gibt - sonst entstuende im Blatt // eine leere Zeile samt Trennlinie. const zusatz = !telefon || fehler ? ( <> {!telefon && (
{ e.preventDefault() setzeDarueber(true) }} onDragLeave={() => setzeDarueber(false)} onDrop={(e) => { e.preventDefault() setzeDarueber(false) const datei = pdfAusDateiliste(e.dataTransfer?.files) if (datei) uebernehmen(datei) else setzeFehler("Das war kein PDF - der Beleg muss als PDF vorliegen.") }} > PDF hierher ziehen oder unten auswählen
)} {fehler && (

{fehler}

)} ) : undefined return ( <> {/* Ausserhalb des Blattes: unsichtbar, muss aber im Baum stehen, damit der Verweis darauf zeigt. */} { const datei = e.target.files?.[0] e.target.value = "" if (datei) uebernehmen(datei) }} /> {/* Ohne Ueberschrift und ohne Erklaerzeile: wer den Knopf 'Beleg hochladen' gedrueckt hat, weiss bereits, was hier passiert - der Kopf haette es nur wiederholt (Nutzerhinweis 2026-08-31). Die beiden Wege benennen sich selbst. */} {zusatz} ) }