import React, { useEffect, useState } from "react"; import { api } from "../api/client"; import { PageHeader } from "../components/PageHeader"; import { FormField, inputStyle, Btn } from "../components/FormField"; interface Vendor { id: string; name: string; businessNum: string | null; taxSettings: string | null; createdAt: string; updatedAt: string; } export default function VendorPage() { const [vendor, setVendor] = useState(null); const [loading, setLoading] = useState(true); const [editing, setEditing] = useState(false); const [saving, setSaving] = useState(false); const [error, setError] = useState(""); const [form, setForm] = useState({ name: "", businessNum: "" }); useEffect(() => { api .get<{ data: Vendor[] }>("/vendors") .then((res) => { const v = res.data[0] ?? null; setVendor(v); if (v) setForm({ name: v.name, businessNum: v.businessNum ?? "" }); }) .catch(console.error) .finally(() => setLoading(false)); }, []); const handleSave = async (e: React.FormEvent) => { e.preventDefault(); if (!vendor) return; setSaving(true); setError(""); try { const updated = await api.put(`/vendors/${vendor.id}`, form); setVendor(updated); setEditing(false); } catch (err) { setError(err instanceof Error ? err.message : "Save failed"); } finally { setSaving(false); } }; if (loading) return
Loading…
; if (!vendor) return
No vendor found.
; return (
setEditing(true)}>Edit ) } /> {editing ? (
{error &&
{error}
} setForm((f) => ({ ...f, name: e.target.value }))} required /> setForm((f) => ({ ...f, businessNum: e.target.value }))} />
{saving ? "Saving…" : "Save changes"} setEditing(false)}> Cancel
) : (
)}
); } function Row({ label, value }: { label: string; value: string }) { return (
{label}
{value}
); } const card: React.CSSProperties = { background: "var(--color-surface)", border: "1px solid var(--color-border)", borderRadius: "var(--radius)", padding: "20px", }; const errStyle: React.CSSProperties = { background: "#fef2f2", border: "1px solid #fecaca", color: "var(--color-danger)", borderRadius: "var(--radius)", padding: "10px 12px", fontSize: 13, marginBottom: 16, };