import { useState } from "react" import { useArcadiaClient } from "@crema/arcadia-core-client" import { useToast } from "@crema/notification-ui" import { TenantSection, Field } from "~/components/tenant-detail/section" import { Input } from "~/components/ui/input" import { Textarea } from "~/components/ui/textarea" import { updateBranding } from "~/lib/arcadia/tenants" import type { TenantTabProps } from "~/routes/tenants.$id" /** * Tenant branding: logo/favicon URLs, the three brand colours, and a custom-CSS * override. All fields are optional; clearing one and saving sends `null` so it * clears server-side (the server accepts null and validates any colour it does * get against a `#rrggbb` hex). */ export function BrandingTab({ tenant, reload }: TenantTabProps) { const arcadia = useArcadiaClient() const toast = useToast() const b = tenant.branding const [logoUrl, setLogoUrl] = useState(b.logo_url ?? "") const [faviconUrl, setFaviconUrl] = useState(b.favicon_url ?? "") const [primary, setPrimary] = useState(b.primary_color ?? "") const [secondary, setSecondary] = useState(b.secondary_color ?? "") const [accent, setAccent] = useState(b.accent_color ?? "") const [customCss, setCustomCss] = useState(b.custom_css ?? "") const [saving, setSaving] = useState(false) const [error, setError] = useState(null) const dirty = logoUrl !== (b.logo_url ?? "") || faviconUrl !== (b.favicon_url ?? "") || primary !== (b.primary_color ?? "") || secondary !== (b.secondary_color ?? "") || accent !== (b.accent_color ?? "") || customCss !== (b.custom_css ?? "") const save = async () => { setSaving(true) setError(null) try { await updateBranding(arcadia, tenant.id, { logo_url: emptyToNull(logoUrl), favicon_url: emptyToNull(faviconUrl), primary_color: emptyToNull(primary), secondary_color: emptyToNull(secondary), accent_color: emptyToNull(accent), custom_css: customCss.trim() === "" ? null : customCss, }) await reload() toast.success("Branding updated") } catch (err) { setError(err) } finally { setSaving(false) } } return ( setLogoUrl(e.target.value)} placeholder="https://…" data-action="tenant-detail-branding-logo-url" /> setFaviconUrl(e.target.value)} placeholder="https://…" data-action="tenant-detail-branding-favicon-url" />