"use client" import { useCallback, useEffect, useState } from "react" import { toast } from "sonner" import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from "@/components/ui/card" import { Field, FieldDescription, FieldLabel } from "@/components/ui/field" import { Input } from "@/components/ui/input" import { fetchDashboardBranding, saveDashboardBranding, type DashboardBranding, } from "@/lib/api/admin" import { useI18n } from "@/i18n/provider" /** * Renames the deployment. * * The name applies to the visitor portal, the dashboard chrome and the widget, * because all three read the same resolved branding. Clearing a field hands * control back to configuration rather than blanking the name, so a deployment * that sets COMPANY_NAME in its environment never ends up nameless. */ export default function DashboardSettingsPage() { const t = useI18n() const [branding, setBranding] = useState(null) const [companyName, setCompanyName] = useState("") const [companyLogoUrl, setCompanyLogoUrl] = useState("") const [loading, setLoading] = useState(true) const [saving, setSaving] = useState(false) const [loadError, setLoadError] = useState("") const load = useCallback(async () => { setLoading(true) setLoadError("") try { const result = await fetchDashboardBranding() setBranding(result) setCompanyName(result.companyName ?? "") setCompanyLogoUrl(result.companyLogoUrl ?? "") } catch (error) { setLoadError(error instanceof Error ? error.message : t("settings.brandingLoadFailed")) } finally { setLoading(false) } }, [t]) useEffect(() => { void load() }, [load]) async function handleSave() { if (saving) { return } setSaving(true) try { const result = await saveDashboardBranding({ companyName, companyLogoUrl, }) setBranding(result) setCompanyName(result.companyName ?? "") setCompanyLogoUrl(result.companyLogoUrl ?? "") toast.success(t("settings.brandingSaved")) // The name appears in the portal header too, which caches the public config // for the session, so a reload is the honest way to show the new value. window.location.reload() } catch (error) { toast.error(error instanceof Error ? error.message : t("settings.brandingSaveFailed")) } finally { setSaving(false) } } return (
{t("settings.brandingTitle")} {t("settings.brandingDescription")} {loadError ? (
{loadError}
) : null} {t("systemConfig.branding.companyName.title")} setCompanyName(event.target.value)} /> {t("systemConfig.branding.companyName.description")} {t("systemConfig.branding.companyLogoUrl.title")} setCompanyLogoUrl(event.target.value)} /> {t("systemConfig.branding.companyLogoUrl.description")} {branding?.usesConfiguredFallback ? (

{t("settings.brandingConfiguredFallback", { name: branding.configuredCompanyName, })}

) : null}
) }