import { useEffect, useState } from 'react' import { Link2, Plus, Trash2 } from 'lucide-react' import { api, type Vorlage } from '../api' import { run, useStore } from '../store' import { Feld, Karte, Knopf } from './Bausteine' /** Adressvorlagen verwalten. * * Eine Vorlage ist der Bauplan einer öffentlichen Adresse: * `vehicles/{model}.webp` wird zu `https://…/f/vehicles/adder.webp`. * * Wozu speichern? Weil genau diese Zeichenkette auf der anderen Seite * gebraucht wird — im Handy, im Skript, im Fotostudio — und weil sie sich * sonst jemand aus Ordnername plus Endung zusammenreimt. Einmal falsch * zusammengereimt heißt: das Bild fehlt, und gesucht wird an der falschen * Stelle. */ export function VorlagenKarte({ publicUrl, filePrefix }: { publicUrl: string; filePrefix: string }) { const note = useStore((s) => s.note) const [liste, setListe] = useState(null) const [speichert, setSpeichert] = useState(false) const [name, setName] = useState('') const [muster, setMuster] = useState('') useEffect(() => { api.einstellungen() .then((e) => setListe(e.vorlagen)) .catch((err) => note('fehler', err instanceof Error ? err.message : 'Unbekannt')) }, [note]) async function sichern(neu: Vorlage[]) { setSpeichert(true) const r = await run(() => api.vorlagenSpeichern(neu), 'Vorlagen gespeichert.') setSpeichert(false) if (r) setListe(r.vorlagen) return Boolean(r) } if (!liste) return null return (
{liste.length === 0 ? (

Noch keine. Eine Vorlage sagt, wie die öffentliche Adresse aussieht — etwa vehicles/{model}.webp.

) : (
    {liste.map((v, i) => (
  • {v.name} {publicUrl} {filePrefix}/{v.muster}
  • ))}
)}
setName(e.target.value)} /> setMuster(e.target.value)} /> { if ( await sichern([ ...liste, { name: name.trim(), muster: muster.trim() }, ]) ) { setName('') setMuster('') } }} kind={ <> Hinzufügen } />
) }