import { Button, Checkbox, FormControl, FormLabel, Heading, HStack, Input, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalOverlay, VStack, } from "@hope-ui/solid" import { createMemo, createSignal, For } from "solid-js" import { useManageTitle, useT } from "~/hooks" import { getPreviewSettings } from "~/store" import { notify } from "~/utils" import { ExtensionPicker, useExtensionList } from "./ExtensionPicker" import { PreviewRow } from "./PreviewRow" import { buildRowsForExtension, copyExtensionConfigTo, deleteIframeEntry, previewSettingsVersion, reorderRow, toggleRow, upsertIframeEntry, } from "./store" interface EditDraft { name: string url: string originalName?: string } const PreviewSettings = () => { const t = useT() useManageTitle("manage.sidemenu.preview-settings") const [ext, setExt] = createSignal("pdf") const [userExts, setUserExts] = createSignal([]) const [editing, setEditing] = createSignal(null) const [copying, setCopying] = createSignal(false) const [copyTargets, setCopyTargets] = createSignal>(new Set()) const extList = useExtensionList(userExts) const toggleTarget = (e: string) => { const next = new Set(copyTargets()) if (next.has(e)) next.delete(e) else next.add(e) setCopyTargets(next) } const rows = createMemo(() => { previewSettingsVersion() return buildRowsForExtension(ext(), getPreviewSettings()[ext()]) }) const reportError = (e: unknown) => notify.error(e instanceof Error ? e.message : String(e)) const openAdd = () => setEditing({ name: "", url: "" }) const openEdit = (name: string, url?: string) => setEditing({ name, url: url ?? "", originalName: name }) const saveEdit = async () => { const draft = editing() if (!draft) return const cleanName = draft.name.trim() const cleanUrl = draft.url.trim() if (!cleanName || !cleanUrl) return try { await upsertIframeEntry(ext(), cleanName, cleanUrl, draft.originalName) setEditing(null) } catch (e) { reportError(e) } } return ( {t("manage.sidemenu.preview-settings")} { if (!userExts().includes(e)) setUserExts([...userExts(), e]) setExt(e) }} /> {(row, i) => ( toggleRow(ext(), row.id, next).catch(reportError) } onMoveUp={() => reorderRow(ext(), row.id, -1).catch(reportError)} onMoveDown={() => reorderRow(ext(), row.id, 1).catch(reportError)} onEdit={() => openEdit(row.name, row.url)} onDelete={() => deleteIframeEntry(ext(), row.name).catch(reportError) } isFirst={i() === 0} isLast={i() === rows().length - 1} /> )} setEditing(null)}> {t("preview_settings.add_iframe")} Name { const cur = editing() if (cur) setEditing({ ...cur, name: e.currentTarget.value }) }} /> URL { const cur = editing() if (cur) setEditing({ ...cur, url: e.currentTarget.value }) }} /> setCopying(false)}> {t("preview_settings.copy_to_extensions")} e !== ext())}> {(e) => ( toggleTarget(e)} > {e} )} ) } export default PreviewSettings