import { useState } from "react"; import { Button, ContentSwitcher, InlineLoading, Select, SelectItem, Switch, Toggle } from "@carbon/react"; import { Catalog } from "@carbon/icons-react"; import { api } from "../lib/api"; import type { Settings } from "../lib/types"; import type { MarginPreset, PageId } from "../pdf/engine/geometry"; import { parsePrefs, prefsToJson, type RenderPrefsV1 } from "../pdf/model/prefs"; import { catalogEntry } from "../pdf/templates/catalog"; import TemplatePicker from "./TemplatePicker"; const PAGES: { id: PageId; label: string }[] = [ { id: "A4", label: "A4" }, { id: "LETTER", label: "US Letter" }, ]; const MARGINS: { id: MarginPreset; label: string }[] = [ { id: "template", label: "Template default" }, { id: "narrow", label: "Narrow (0.5″)" }, { id: "normal", label: "Normal (0.75″)" }, ]; interface Props { prefs: RenderPrefsV1; onChange: (prefs: RenderPrefsV1) => void; /** Live settings; `renderPrefs` is the saved default. */ settings: Settings; /** Called after the default was saved so the app reloads its settings. */ onSaved: () => void; disabled?: boolean; } /** Page size and margins for the invoice being edited, plus "Save as default" for new invoices. */ export default function PageSetupControls({ prefs, onChange, settings, onSaved, disabled }: Props) { const [saving, setSaving] = useState(false); const [pickerOpen, setPickerOpen] = useState(false); const [error, setError] = useState(null); const saved = prefsToJson(parsePrefs(settings.renderPrefs)); const isDefault = prefsToJson(prefs) === saved; const template = catalogEntry(prefs.templateId); const saveDefault = async () => { setSaving(true); setError(null); try { await api.saveSettings({ ...settings, renderPrefs: prefsToJson(prefs) }); onSaved(); } catch (e) { setError(String(e)); } finally { setSaving(false); } }; return (
Template
Page size p.id === prefs.pageSize))} onChange={(e) => !disabled && onChange({ ...prefs, pageSize: PAGES[e.index ?? 0].id })} > {PAGES.map((p) => ( ))}
{template.logoOptIn ? (
onChange({ ...prefs, logo: { ...prefs.logo, show: on } })} />
) : null} setPickerOpen(false)} selectedId={template.id} onSelect={(id) => onChange({ ...prefs, templateId: id })} isDefault={isDefault} saving={saving} error={error} onSaveDefault={() => void saveDefault()} disabled={disabled} />
{saving ? ( ) : ( )} {error ?? "This choice is frozen into each invoice when it is issued."}
); }