"use client"; import { Icon } from "@/components/icons"; import type { QrFormProps } from "@/components/qr-forms/types"; import { Button, Field, TextArea, TextInput } from "@/components/ui"; import { MAX_LINKS, type LinkEntry } from "@/lib/qr/types/links"; /** * Liest die Linkliste aus den Formulardaten heraus. * * Die Daten kommen als `QrFormData` — ein flaches Objekt ohne Garantien. * Beim Bearbeiten eines gespeicherten Codes stammen sie aus der Datenbank und * können nach einer Schema-Änderung unvollständig sein; deshalb hier prüfen * statt annehmen. */ function readLinks(value: unknown): LinkEntry[] { if (!Array.isArray(value)) return [{ label: "", url: "" }]; const entries = value.map((entry) => { const record = (entry ?? {}) as Record; return { label: typeof record.label === "string" ? record.label : "", url: typeof record.url === "string" ? record.url : "", }; }); return entries.length > 0 ? entries : [{ label: "", url: "" }]; } export function LinksForm({ value, onChange, error, disabled }: QrFormProps) { const title = typeof value.title === "string" ? value.title : ""; const description = typeof value.description === "string" ? value.description : ""; const links = readLinks(value.links); const setLinks = (next: LinkEntry[]) => onChange({ ...value, links: next }); const updateLink = (index: number, patch: Partial) => setLinks(links.map((link, i) => (i === index ? { ...link, ...patch } : link))); const move = (index: number, direction: -1 | 1) => { const target = index + direction; if (target < 0 || target >= links.length) return; const next = [...links]; [next[index], next[target]] = [next[target], next[index]]; setLinks(next); }; return (
onChange({ ...value, title: event.target.value })} />