import { useEffect, useRef, useState } from "react"; import { api } from "../api"; import { brandingUrl, hasBranding } from "../branding"; import Icon from "./Icon"; /** * Ein Bild der Installation setzen oder wieder entfernen (Logo bzw. Favicon). * Ohne eigenes Bild bleibt das eingebaute Zeichen der Oberfläche stehen. */ export default function BrandingUpload({ kind, title, hint, empfehlung, onChanged }) { const [vorhanden, setVorhanden] = useState(false); const [version, setVersion] = useState(0); const [busy, setBusy] = useState(false); const [fehler, setFehler] = useState(null); // Tatsaechliche Bildgroesse - damit man sieht, ob sie zur Empfehlung passt. const [groesse, setGroesse] = useState(null); const dateiFeld = useRef(null); useEffect(() => { hasBranding(kind).then(setVorhanden); }, [kind]); async function auswaehlen(event) { const datei = event.target.files?.[0]; if (!datei) return; setFehler(null); setBusy(true); try { await api.uploadBranding(kind, datei); setVorhanden(true); setVersion(Date.now()); onChanged?.(); } catch (err) { setFehler(err.message); } finally { setBusy(false); // Zuruecksetzen, damit dieselbe Datei erneut gewaehlt werden kann. if (dateiFeld.current) dateiFeld.current.value = ""; } } async function entfernen() { setFehler(null); setBusy(true); try { await api.deleteBranding(kind); setVorhanden(false); setVersion(Date.now()); onChanged?.(); } catch (err) { setFehler(err.message); } finally { setBusy(false); } } return (
{empfehlung && (

Empfohlen: {empfehlung}

)}
{vorhanden ? ( {title} setGroesse({ w: e.currentTarget.naturalWidth, h: e.currentTarget.naturalHeight, })} /> ) : ( Kein eigenes Bild – Standard wird verwendet )}
{vorhanden && groesse?.w > 0 && (

Hochgeladen: {groesse.w} × {groesse.h} px

)}

{hint}

{fehler &&
{fehler}
}
{vorhanden && ( )}
); }