@fayz-ai/admin 0.61.0 → 0.63.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{CommandPalette-B5PMQFDG.js → CommandPalette-XDJJ5E3O.js} +3 -3
- package/dist/{CommandPalette-B5PMQFDG.js.map → CommandPalette-XDJJ5E3O.js.map} +1 -1
- package/dist/ConnectedBrandingSettings-43ZM3HCI.js +680 -0
- package/dist/ConnectedBrandingSettings-43ZM3HCI.js.map +1 -0
- package/dist/ConnectedCompanySettings-I4MALI2Q.js +197 -0
- package/dist/ConnectedCompanySettings-I4MALI2Q.js.map +1 -0
- package/dist/ConnectedModulesSettings-A2VJ5BMJ.js +563 -0
- package/dist/ConnectedModulesSettings-A2VJ5BMJ.js.map +1 -0
- package/dist/ConnectedSecuritySettings-25AHA4HJ.js +189 -0
- package/dist/ConnectedSecuritySettings-25AHA4HJ.js.map +1 -0
- package/dist/ConnectedUserProfile-E7USJRUE.js +424 -0
- package/dist/ConnectedUserProfile-E7USJRUE.js.map +1 -0
- package/dist/FieldRulesEditor-YGIPKI5T.js +129 -0
- package/dist/FieldRulesEditor-YGIPKI5T.js.map +1 -0
- package/dist/GettingStartedWidget-HMIJ3Y24.js +12 -0
- package/dist/GettingStartedWidget-HMIJ3Y24.js.map +1 -0
- package/dist/PermissionProfilesTab-3ZPRCHMZ.js +548 -0
- package/dist/PermissionProfilesTab-3ZPRCHMZ.js.map +1 -0
- package/dist/PersonTimeline-HQZT527S.js +3 -0
- package/dist/{PersonTimeline-X7JTPUWJ.js.map → PersonTimeline-HQZT527S.js.map} +1 -1
- package/dist/ProjectsSettings-7O2F27MD.js +5 -0
- package/dist/ProjectsSettings-7O2F27MD.js.map +1 -0
- package/dist/ScheduleEditor-54ELWR45.js +8 -0
- package/dist/{ScheduleEditor-L2UJXKMY.js.map → ScheduleEditor-54ELWR45.js.map} +1 -1
- package/dist/SeuSiteWidget-QLSUVC63.js +6 -0
- package/dist/SeuSiteWidget-QLSUVC63.js.map +1 -0
- package/dist/SubscriptionPage-5GE5HFJK.js +17 -0
- package/dist/{SubscriptionPage-IDVEFLZ5.js.map → SubscriptionPage-5GE5HFJK.js.map} +1 -1
- package/dist/TeamTab-6RAULFLW.js +502 -0
- package/dist/TeamTab-6RAULFLW.js.map +1 -0
- package/dist/TrialWidget-Z6CLUCU3.js +7 -0
- package/dist/TrialWidget-Z6CLUCU3.js.map +1 -0
- package/dist/app/AdminShell.d.ts.map +1 -1
- package/dist/app/admin-app.d.ts.map +1 -1
- package/dist/app/config.d.ts +14 -0
- package/dist/app/config.d.ts.map +1 -1
- package/dist/app/routing.d.ts +6 -0
- package/dist/app/routing.d.ts.map +1 -1
- package/dist/app/scaffold.d.ts.map +1 -1
- package/dist/billing/index.js +9 -4
- package/dist/chunk-2H46WDG5.js +53 -0
- package/dist/chunk-2H46WDG5.js.map +1 -0
- package/dist/chunk-3HLX7YB2.js +94 -0
- package/dist/chunk-3HLX7YB2.js.map +1 -0
- package/dist/chunk-3OUD4XBK.js +3 -0
- package/dist/chunk-3OUD4XBK.js.map +1 -0
- package/dist/{chunk-IXSY4GPK.js → chunk-5D5QLMOQ.js} +5 -3
- package/dist/chunk-5D5QLMOQ.js.map +1 -0
- package/dist/chunk-5WR62X2R.js +1081 -0
- package/dist/chunk-5WR62X2R.js.map +1 -0
- package/dist/{chunk-KPYRTOCK.js → chunk-6CQFGMEO.js} +4 -140
- package/dist/chunk-6CQFGMEO.js.map +1 -0
- package/dist/chunk-6MMSYC2I.js +116 -0
- package/dist/chunk-6MMSYC2I.js.map +1 -0
- package/dist/chunk-6QFOE3UD.js +1466 -0
- package/dist/chunk-6QFOE3UD.js.map +1 -0
- package/dist/chunk-6UUFVQ2E.js +283 -0
- package/dist/chunk-6UUFVQ2E.js.map +1 -0
- package/dist/chunk-7WNLL3F6.js +7889 -0
- package/dist/chunk-7WNLL3F6.js.map +1 -0
- package/dist/chunk-A74IHAQE.js +439 -0
- package/dist/chunk-A74IHAQE.js.map +1 -0
- package/dist/{chunk-JOBRLBIQ.js → chunk-AFA6IO23.js} +4 -3
- package/dist/chunk-AFA6IO23.js.map +1 -0
- package/dist/{chunk-P5UIGQFY.js → chunk-ALCSIN3Z.js} +5 -5
- package/dist/chunk-ALCSIN3Z.js.map +1 -0
- package/dist/chunk-AWM4AMBS.js +39 -0
- package/dist/chunk-AWM4AMBS.js.map +1 -0
- package/dist/{chunk-OQARLKZN.js → chunk-BG5Z6KLN.js} +6 -18
- package/dist/chunk-BG5Z6KLN.js.map +1 -0
- package/dist/chunk-DPNFZONC.js +19 -0
- package/dist/chunk-DPNFZONC.js.map +1 -0
- package/dist/chunk-DRCV643L.js +193 -0
- package/dist/chunk-DRCV643L.js.map +1 -0
- package/dist/chunk-E6DF3VR6.js +206 -0
- package/dist/chunk-E6DF3VR6.js.map +1 -0
- package/dist/chunk-ENHCVGXZ.js +120 -0
- package/dist/chunk-ENHCVGXZ.js.map +1 -0
- package/dist/chunk-FK6RHGI7.js +56 -0
- package/dist/chunk-FK6RHGI7.js.map +1 -0
- package/dist/chunk-G5HNA5QK.js +233 -0
- package/dist/chunk-G5HNA5QK.js.map +1 -0
- package/dist/chunk-HCFO4Z6A.js +53 -0
- package/dist/chunk-HCFO4Z6A.js.map +1 -0
- package/dist/chunk-JFIU6NQP.js +51 -0
- package/dist/chunk-JFIU6NQP.js.map +1 -0
- package/dist/chunk-JRZJBMOY.js +3 -0
- package/dist/chunk-JRZJBMOY.js.map +1 -0
- package/dist/{chunk-3YP7KW47.js → chunk-JVVOL4BB.js} +41 -512
- package/dist/chunk-JVVOL4BB.js.map +1 -0
- package/dist/chunk-KAQ3UIAA.js +415 -0
- package/dist/chunk-KAQ3UIAA.js.map +1 -0
- package/dist/{chunk-P6XUDT2P.js → chunk-KJELMULA.js} +4 -51
- package/dist/chunk-KJELMULA.js.map +1 -0
- package/dist/chunk-KLO7DKXX.js +1651 -0
- package/dist/chunk-KLO7DKXX.js.map +1 -0
- package/dist/chunk-M2CMDWUI.js +75 -0
- package/dist/chunk-M2CMDWUI.js.map +1 -0
- package/dist/chunk-PQ47MLTH.js +255 -0
- package/dist/chunk-PQ47MLTH.js.map +1 -0
- package/dist/{chunk-VX3WJLKK.js → chunk-QD7BMUDF.js} +17 -8
- package/dist/chunk-QD7BMUDF.js.map +1 -0
- package/dist/{chunk-E4MESMNR.js → chunk-QTSKCPSW.js} +7 -10
- package/dist/chunk-QTSKCPSW.js.map +1 -0
- package/dist/chunk-S56FQKPL.js +186 -0
- package/dist/chunk-S56FQKPL.js.map +1 -0
- package/dist/chunk-SGAFPNMA.js +75 -0
- package/dist/chunk-SGAFPNMA.js.map +1 -0
- package/dist/{chunk-OD7P4L3D.js → chunk-SOKCLVM4.js} +3 -3
- package/dist/{chunk-OD7P4L3D.js.map → chunk-SOKCLVM4.js.map} +1 -1
- package/dist/chunk-TL42NKTH.js +3 -0
- package/dist/chunk-TL42NKTH.js.map +1 -0
- package/dist/chunk-U6ZCO2PS.js +2964 -0
- package/dist/chunk-U6ZCO2PS.js.map +1 -0
- package/dist/chunk-VSXNROYH.js +16 -0
- package/dist/chunk-VSXNROYH.js.map +1 -0
- package/dist/chunk-WPFZCYZL.js +619 -0
- package/dist/chunk-WPFZCYZL.js.map +1 -0
- package/dist/chunk-XFTNIBDW.js +23 -0
- package/dist/chunk-XFTNIBDW.js.map +1 -0
- package/dist/chunk-Y66JDL6I.js +1020 -0
- package/dist/chunk-Y66JDL6I.js.map +1 -0
- package/dist/chunk-YEHIBPIX.js +137 -0
- package/dist/chunk-YEHIBPIX.js.map +1 -0
- package/dist/chunk-YKPPCV2Z.js +53 -0
- package/dist/chunk-YKPPCV2Z.js.map +1 -0
- package/dist/components/chat/markdown.d.ts.map +1 -1
- package/dist/components/plugins/PluginSettingsPanel.d.ts.map +1 -1
- package/dist/components/settings/SettingsPage.d.ts.map +1 -1
- package/dist/components/shared/ConnectionIndicator.d.ts.map +1 -1
- package/dist/connect-XKQJOWR7.js +18 -0
- package/dist/connect-XKQJOWR7.js.map +1 -0
- package/dist/crud/CrudDetailPage.d.ts.map +1 -1
- package/dist/crud/CrudListView.d.ts.map +1 -1
- package/dist/crud/CrudPage.d.ts.map +1 -1
- package/dist/crud/RelatedListTab.d.ts.map +1 -1
- package/dist/crud/archetypes/EntityLink.d.ts +1 -1
- package/dist/crud/archetypes/EntityLink.d.ts.map +1 -1
- package/dist/crud/record-chrome.d.ts.map +1 -1
- package/dist/entity-routes-PGU7EHAD.js +4 -0
- package/dist/{entity-routes-LXOBW5IB.js.map → entity-routes-PGU7EHAD.js.map} +1 -1
- package/dist/hooks/useModuleNavigation.d.ts.map +1 -1
- package/dist/impersonation/ImpersonateDialog.d.ts.map +1 -1
- package/dist/impersonation/session.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11922 -33564
- package/dist/index.js.map +1 -1
- package/dist/lib/connection.d.ts +14 -0
- package/dist/lib/connection.d.ts.map +1 -1
- package/dist/lib/entity-routes.d.ts.map +1 -1
- package/dist/org/index.js +4 -2
- package/dist/plugins/PluginRegistryManager.d.ts.map +1 -1
- package/dist/settings/MessageTemplateRow.d.ts.map +1 -1
- package/dist/timeline/PersonTimeline.d.ts.map +1 -1
- package/dist/timeline/TimelineList.d.ts.map +1 -1
- package/dist/units/UnitRailPage.d.ts.map +1 -1
- package/dist/units/useUnitFilter.d.ts.map +1 -1
- package/package.json +5 -5
- package/dist/PersonTimeline-X7JTPUWJ.js +0 -3
- package/dist/ScheduleEditor-L2UJXKMY.js +0 -6
- package/dist/SubscriptionPage-IDVEFLZ5.js +0 -8
- package/dist/chunk-3YP7KW47.js.map +0 -1
- package/dist/chunk-E4MESMNR.js.map +0 -1
- package/dist/chunk-IXSY4GPK.js.map +0 -1
- package/dist/chunk-JOBRLBIQ.js.map +0 -1
- package/dist/chunk-KPYRTOCK.js.map +0 -1
- package/dist/chunk-OQARLKZN.js.map +0 -1
- package/dist/chunk-P5UIGQFY.js.map +0 -1
- package/dist/chunk-P6XUDT2P.js.map +0 -1
- package/dist/chunk-VX3WJLKK.js.map +0 -1
- package/dist/entity-routes-LXOBW5IB.js +0 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/settings/BrandingSettings.tsx","../src/components/settings/ConnectedBrandingSettings.tsx"],"names":["brand","React2","jsx"],"mappings":"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","file":"ConnectedBrandingSettings-43ZM3HCI.js","sourcesContent":["import * as React from 'react'\nimport { Upload, Save, X } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { Button } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport { Badge, SegmentedControl, Separator } from '@fayz-ai/ui'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { EMPTY_BRAND, brandGuidesTheAgent, type TenantBrand } from '../../lib/brand'\nimport { OrgMark } from '../../org/OrgMark'\nimport { UpgradeOverlay } from '../billing/UpgradeOverlay'\nimport { useAccessOptional } from '../billing/access-contract'\n\n// ---------------------------------------------------------------------------\n// A marca da casa — um conjunto de tokens em três camadas.\n//\n// Esta tela editava só cor e logo. As outras duas camadas viviam noutro lugar:\n// nome, tom de voz e palavras proibidas estavam numa tabela de plugin, com tela\n// própria em Marketing. Duas marcas para uma casa é pior que nenhuma — mudar a\n// cor num lugar não mudava no outro, e ninguém sabia qual das duas o site usava.\n//\n// A camada que costuma faltar é a VERBAL. Um sistema de design que descreve a\n// cor do botão e não descreve o que o produto pode DIZER descreve metade da\n// marca — e num produto onde parte do texto é escrita por um agente, essa\n// metade é tão token quanto a cor.\n// ---------------------------------------------------------------------------\n\ninterface BrandingSettingsProps {\n brand?: TenantBrand | null\n /** Recebe um PATCH por camada, não a marca inteira: salvar cores não pode\n * apagar o tom de voz que outra pessoa escreveu. */\n onSave?: (patch: Partial<TenantBrand>, assets?: {\n logoFile?: File | null\n faviconFile?: File | null\n }) => void\n}\n\n/** Campo de lista: uma linha, vírgulas. Um editor de chips seria mais bonito e\n * faria o lojista clicar dez vezes para escrever cinco palavras. */\nfunction ListField({ label, hint, value, onChange, placeholder, danger }: {\n label: string; hint?: string; value: string[]\n onChange: (v: string[]) => void; placeholder?: string; danger?: boolean\n}) {\n return (\n <div className=\"space-y-2\">\n <label className={cn('text-sm font-medium', danger && 'text-destructive')}>{label}</label>\n <Input\n value={value.join(', ')}\n placeholder={placeholder}\n onChange={(e) => onChange(e.target.value.split(',').map((x) => x.trim()).filter(Boolean))}\n />\n {hint && <p className=\"text-xs text-muted-foreground\">{hint}</p>}\n </div>\n )\n}\n\ninterface FileUploadProps {\n label: string\n accept: string\n currentUrl?: string\n onFileSelect: (file: File) => void\n onClear?: () => void\n hint?: string\n}\n\nfunction FileUploadField({\n label,\n accept,\n currentUrl,\n onFileSelect,\n onClear,\n hint,\n}: FileUploadProps) {\n const { t } = useTranslation()\n const inputRef = React.useRef<HTMLInputElement>(null)\n const [preview, setPreview] = React.useState<string | null>(null)\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (file) {\n onFileSelect(file)\n const url = URL.createObjectURL(file)\n setPreview(url)\n }\n if (e.target) {\n e.target.value = ''\n }\n }\n\n const displayUrl = preview ?? currentUrl\n\n return (\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{label}</label>\n <div className=\"flex items-center gap-4\">\n {displayUrl ? (\n <div className=\"relative\">\n <img\n src={displayUrl}\n alt={label}\n className=\"h-16 w-16 rounded-md border object-contain p-1\"\n />\n {onClear && (\n <Button\n variant=\"bare\"\n size=\"bare\"\n type=\"button\"\n onClick={() => {\n onClear()\n setPreview(null)\n }}\n className=\"absolute -right-1.5 -top-1.5 flex h-5 w-5 items-center justify-center rounded-full bg-destructive text-destructive-foreground\"\n aria-label={`Remove ${label.toLowerCase()}`}\n >\n <X className=\"h-3 w-3\" />\n </Button>\n )}\n </div>\n ) : (\n <div className=\"flex h-16 w-16 items-center justify-center rounded-md border border-dashed\">\n <Upload className=\"h-5 w-5 text-muted-foreground/50\" />\n </div>\n )}\n\n <div>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => inputRef.current?.click()}\n >\n {t('settings.branding.chooseFile')}\n </Button>\n {hint && (\n <p className=\"mt-1 text-xs text-muted-foreground\">{hint}</p>\n )}\n </div>\n </div>\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n className=\"hidden\"\n onChange={handleChange}\n />\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// A tela.\n//\n// Refeita, não herdada. A anterior era um formulário de cor e logo com um botão\n// no rodapé; esta é o editor de um conjunto de tokens, e o desenho vem de três\n// lugares que resolveram o mesmo problema:\n//\n// • STRIPE (branding do Checkout) — o painel da direita mostra o ARTEFATO, não\n// a descrição dele, e muda enquanto se digita. Aqui são dois artefatos,\n// porque a marca tem duas metades: a interface pintada com os tokens e o\n// TEXTO que o assistente escreveria com a voz. Ninguém aprova um tom de voz\n// lendo um campo chamado \"tom de voz\".\n//\n// • LINEAR / VERCEL (configurações) — seções em vez de rolagem infinita, e uma\n// barra de salvar que só existe quando há o que salvar, dizendo QUANTAS\n// mudanças. Um botão \"Salvar\" sempre aceso não informa se há trabalho\n// pendente.\n//\n// • TOKENS DE DESIGN — cor não é enfeite, é um valor com uso e com regra. Daí\n// o contraste WCAG do par: uma cor primária que não passa em AA vira botão\n// ilegível, e isso é conferível aqui em vez de descoberto depois.\n//\n// E uma checagem que só este produto pode fazer: a marca é conferida contra as\n// PRÓPRIAS palavras proibidas. Uma assinatura que usa a palavra que a casa\n// baniu é uma contradição invisível — ninguém relê o cadastro procurando.\n// ---------------------------------------------------------------------------\n\ntype Section = 'identity' | 'color' | 'type' | 'voice'\n\n/** Luminância relativa (WCAG 2.1). */\nfunction luminance(hex: string): number | null {\n const m = /^#?([0-9a-f]{6})$/i.exec(hex.trim())\n if (!m) return null\n const n = parseInt(m[1], 16)\n const ch = [(n >> 16) & 255, (n >> 8) & 255, n & 255].map((v) => {\n const c = v / 255\n return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4)\n })\n return 0.2126 * ch[0]! + 0.7152 * ch[1]! + 0.0722 * ch[2]!\n}\n\n/** Razão de contraste entre duas cores. Nulo quando alguma não é um hex. */\nfunction contrastRatio(a: string, b: string): number | null {\n const la = luminance(a)\n const lb = luminance(b)\n if (la === null || lb === null) return null\n const [hi, lo] = la > lb ? [la, lb] : [lb, la]\n return Math.round(((hi + 0.05) / (lo + 0.05)) * 100) / 100\n}\n\n/** Onde a marca se contradiz: um termo banido usado pela própria marca. */\nfunction selfContradictions(brand: TenantBrand): string[] {\n const banned = (brand.voice?.avoid ?? []).map((w) => w.toLowerCase()).filter(Boolean)\n if (banned.length === 0) return []\n const haystack = [\n brand.identity?.tagline, brand.identity?.mission, brand.voice?.tone,\n ...(brand.voice?.ctas ?? []), ...(brand.voice?.lexicon ?? []),\n ].filter(Boolean).join(' ').toLowerCase()\n return banned.filter((w) => haystack.includes(w))\n}\n\n/** Quantos campos mudaram. O número importa mais que o booleano: \"salvar\" sem\n * dizer o que faz um lojista salvar por medo. */\nfunction countChanges(a: TenantBrand, b: TenantBrand): number {\n const flat = (x: TenantBrand) => ({\n name: x.identity?.name ?? '', tagline: x.identity?.tagline ?? '', mission: x.identity?.mission ?? '',\n logoUrl: x.identity?.logoUrl ?? '', faviconUrl: x.identity?.faviconUrl ?? '',\n primary: x.tokens?.color?.primary ?? '', accent: x.tokens?.color?.accent ?? '',\n heading: x.tokens?.font?.heading ?? '', body: x.tokens?.font?.body ?? '',\n // Sem estas duas o botão Salvar não acorda quando só a trilha muda.\n rail: JSON.stringify(x.tokens?.rail ?? {}), surface: JSON.stringify(x.tokens?.surface ?? {}),\n tone: x.voice?.tone ?? '', lexicon: (x.voice?.lexicon ?? []).join(','),\n avoid: (x.voice?.avoid ?? []).join(','), ctas: (x.voice?.ctas ?? []).join(','),\n hashtags: (x.voice?.hashtags ?? []).join(','),\n })\n const fa = flat(a) as Record<string, string>\n const fb = flat(b) as Record<string, string>\n return Object.keys(fa).filter((k) => fa[k] !== fb[k]).length\n}\n\n/**\n * O artefato, não a descrição dele.\n *\n * À esquerda a interface pintada com os tokens escolhidos; embaixo, uma frase\n * na voz da marca com os termos banidos marcados. É o movimento do Stripe\n * aplicado às duas metades: o lojista aprova o que vai ver e o que vai ler.\n */\n/**\n * A cor do TEXTO em cima do botão, derivada da cor do botão.\n *\n * A mesma regra que `brandThemeLayers` aplica no shell (ver\n * ../../app/admin-app.tsx). Repetida aqui de propósito: a pré-visualização tem\n * de mentir o MENOS possível, e importar do shell puxaria a árvore inteira de\n * tema para dentro de uma tela de configurações.\n */\nfunction readableOn(hex: string): string {\n const m = /^#?([0-9a-f]{6})$/i.exec(hex.trim())\n if (!m) return '#ffffff'\n const n = parseInt(m[1]!, 16)\n const lin = (c: number) => {\n const v = c / 255\n return v <= 0.03928 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4\n }\n const L = 0.2126 * lin((n >> 16) & 255) + 0.7152 * lin((n >> 8) & 255) + 0.0722 * lin(n & 255)\n return L > 0.45 ? '#1a1a1a' : '#ffffff'\n}\n\nfunction BrandPreview({ brand, t }: { brand: TenantBrand; t: (k: string, v?: any) => string }) {\n const primary = brand.tokens?.color?.primary || '#111827'\n const accent = brand.tokens?.color?.accent || '#6366f1'\n // A trilha é `rail.background`, NÃO a primária.\n //\n // A pré-visualização pintava a barra lateral com a cor primária e o conteúdo\n // de branco fixo — e nenhuma das duas coisas é verdade desde a 075, quando a\n // marca passou a carregar o tema inteiro. O Espaço Renova mostrava um bloco\n // terracota ao lado de um painel branco, e a casa dele é trilha marrom-escura\n // com papel creme. Uma prévia que não é a tela é pior que nenhuma: ela é\n // consultada exatamente por quem não pode conferir.\n const railBg = brand.tokens?.rail?.background || primary\n const railFg = brand.tokens?.rail?.foreground || '#ffffff'\n const railActive = brand.tokens?.rail?.accent || 'rgba(255,255,255,0.14)'\n const pageBg = brand.tokens?.surface?.background || '#ffffff'\n const cardBg = brand.tokens?.surface?.card || '#ffffff'\n const pageFg = brand.tokens?.surface?.foreground || '#111827'\n const radius = brand.tokens?.radius || '0.75rem'\n const ctaFg = readableOn(primary)\n // `markUrl` primeiro: o slot é QUADRADO, e um wordmark horizontal cortado\n // nele vira um pedaço do meio da palavra — o mesmo motivo da 089.\n const mark = brand.identity?.markUrl || brand.identity?.logoUrl || ''\n const heading = brand.tokens?.font?.heading\n const body = brand.tokens?.font?.body\n const name = brand.identity?.name || t('settings.brand.previewFallbackName')\n const cta = brand.voice?.ctas?.[0] || t('settings.brand.previewFallbackCta')\n // Mede a cor que o shell REALMENTE vai pôr em cima, não branco fixo.\n const onPrimary = contrastRatio(primary, readableOn(primary))\n const banned = brand.voice?.avoid ?? []\n const clashes = selfContradictions(brand)\n\n const sample = [\n brand.voice?.tone ? t('settings.brand.sampleWithTone', { name }) : t('settings.brand.sampleNoTone', { name }),\n brand.voice?.lexicon?.length ? t('settings.brand.sampleLexicon', { word: brand.voice.lexicon[0]! }) : '',\n `${cta}.`,\n ].filter(Boolean).join(' ')\n\n return (\n <div className=\"space-y-3 lg:sticky lg:top-4\" data-testid=\"brand-preview\">\n <p className=\"text-xs font-medium text-muted-foreground\">{t('settings.brand.previewTitle')}</p>\n\n {/* A interface, pintada — com a MESMA anatomia do shell: trilha rente à\n borda, conteúdo numa carta embutida e arredondada. A moldura é o que\n faz a prévia parecer o produto em vez de dois retângulos coloridos. */}\n <div className=\"overflow-hidden rounded-xl border shadow-sm\" style={{ backgroundColor: railBg }}>\n <div className=\"flex\">\n <div className=\"w-16 shrink-0 space-y-2 p-2\">\n {/* O MESMO componente do rail de verdade — marca quando há, iniciais\n quando não há. Era a quarta cópia dessa regra que eu ia escrever\n aqui, e a OrgMark existe justamente porque as três anteriores\n aprenderam regras diferentes e duas cortavam o wordmark. */}\n <OrgMark name={name} logoUrl={mark || undefined} className=\"h-5 w-5\" />\n {/* A linha ATIVA usa o realce da trilha; as outras, o texto dela\n esmaecido. É o que separa \"onde estou\" de \"para onde posso ir\". */}\n <div className=\"flex h-3 items-center rounded px-1\" style={{ backgroundColor: railActive }}>\n <span className=\"h-1.5 w-7 rounded\" style={{ backgroundColor: railFg, opacity: 0.85 }} />\n </div>\n <div className=\"h-1.5 w-7 rounded\" style={{ backgroundColor: railFg, opacity: 0.3 }} />\n <div className=\"h-1.5 w-8 rounded\" style={{ backgroundColor: railFg, opacity: 0.3 }} />\n </div>\n <div className=\"flex-1 p-2 pl-0\">\n <div\n className=\"space-y-3 p-3\"\n style={{ backgroundColor: pageBg, color: pageFg, borderRadius: radius }}\n >\n <p className=\"text-sm font-semibold\" style={heading ? { fontFamily: heading } : undefined}>{name}</p>\n <p className=\"text-[11px] leading-relaxed opacity-70\" style={body ? { fontFamily: body } : undefined}>\n {brand.identity?.tagline || t('settings.brand.previewFallbackTagline')}\n </p>\n <div\n className=\"flex items-center gap-2 p-2\"\n style={{ backgroundColor: cardBg, borderRadius: radius }}\n >\n <span\n className=\"px-2.5 py-1 text-[11px] font-medium\"\n style={{ backgroundColor: primary, color: ctaFg, borderRadius: `calc(${radius} - 0.25rem)` }}\n >\n {cta}\n </span>\n <span\n className=\"px-2 py-1 text-[11px]\"\n style={{ backgroundColor: `${accent}22`, color: accent, borderRadius: `calc(${radius} - 0.25rem)` }}\n >\n {t('settings.brand.previewChip')}\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* O contraste, porque cor é token com regra. 4.5 é o piso de AA para\n texto normal — abaixo disso o botão acima é ilegível para muita gente\n e ninguém descobre olhando o swatch. */}\n {onPrimary !== null && (\n <div className=\"flex items-center gap-2 rounded-lg border px-3 py-2\" data-testid=\"brand-contrast\">\n <span className=\"text-[11px] text-muted-foreground\">{t('settings.brand.contrast')}</span>\n <span className=\"text-xs font-medium tabular-nums\">{onPrimary}:1</span>\n <Badge variant={onPrimary >= 4.5 ? 'success' : 'destructive'}>\n {onPrimary >= 7 ? 'AAA' : onPrimary >= 4.5 ? 'AA' : t('settings.brand.contrastFail')}\n </Badge>\n </div>\n )}\n\n {/* A outra metade do artefato: o que o assistente escreveria. */}\n <div className=\"rounded-xl border bg-muted/20 p-3\">\n <p className=\"mb-1.5 text-[11px] font-medium text-muted-foreground\">{t('settings.brand.voicePreview')}</p>\n <p className=\"text-xs leading-relaxed\" style={body ? { fontFamily: body } : undefined}>{sample}</p>\n {banned.length > 0 && (\n <p className=\"mt-2 text-[10px] text-muted-foreground\">\n {t('settings.brand.neverSays', { words: banned.join(', ') })}\n </p>\n )}\n </div>\n\n {/* A marca contra si mesma. Só este produto consegue conferir isso, porque\n só aqui as duas metades moram juntas. */}\n {clashes.length > 0 && (\n <div className=\"rounded-lg border border-destructive/40 bg-destructive/5 px-3 py-2\" data-testid=\"brand-clash\">\n <p className=\"text-[11px] text-destructive\">\n {t('settings.brand.clash', { words: clashes.join(', ') })}\n </p>\n </div>\n )}\n </div>\n )\n}\n\n/**\n * A PELE É DE QUEM PAGA POR ELA (138).\n *\n * `UpgradeOverlay` sozinho NÃO decide nada — ele é a moldura que a shell\n * desenha DEPOIS de já ter concluído `reason: 'plan'`. Usá-lo cru aqui pôs um\n * preço na frente do Espaço Facial, que assina o plano que justamente dá esse\n * direito. Quem decide é a entitlement, e é ela que este componente consulta.\n *\n * `useAccessOptional` e não `useAccess`: esta tela também abre em superfícies\n * sem AccessProvider, e lá `ALLOW_ALL` responde — o recuo certo, porque um teto\n * que não pôde ser lido não é um teto.\n */\nfunction SkinGate({ children }: { children: React.ReactNode }) {\n const access = useAccessOptional()\n if (access.entitled('branding.theme')) return <>{children}</>\n return (\n <UpgradeOverlay feature=\"branding.theme\" overlayClassName=\"min-h-[22rem]\">\n {children}\n </UpgradeOverlay>\n )\n}\n\nexport function BrandingSettings({ brand, onSave }: BrandingSettingsProps) {\n const { t } = useTranslation()\n const [section, setSection] = React.useState<Section>('identity')\n const [saved, setSaved] = React.useState<TenantBrand>(brand ?? EMPTY_BRAND)\n const [draft, setDraft] = React.useState<TenantBrand>(brand ?? EMPTY_BRAND)\n const [logoFile, setLogoFile] = React.useState<File | null>(null)\n const [faviconFile, setFaviconFile] = React.useState<File | null>(null)\n const [saving, setSaving] = React.useState(false)\n\n React.useEffect(() => {\n if (brand) { setSaved(brand); setDraft(brand) }\n }, [brand])\n\n const identity = draft.identity ?? {}\n const color = draft.tokens?.color ?? {}\n const font = draft.tokens?.font ?? {}\n const voice = draft.voice ?? {}\n const rail = (draft.tokens?.rail ?? {}) as Record<string, string>\n const surface = (draft.tokens?.surface ?? {}) as Record<string, string>\n\n const changes = countChanges(saved, draft) + (logoFile ? 1 : 0) + (faviconFile ? 1 : 0)\n const dirty = changes > 0\n\n const patchIdentity = (v: Partial<typeof identity>) => setDraft((d) => ({ ...d, identity: { ...d.identity, ...v } }))\n const patchColor = (v: Partial<typeof color>) => setDraft((d) => ({ ...d, tokens: { ...d.tokens, color: { ...d.tokens?.color, ...v } } }))\n const patchFont = (v: Partial<typeof font>) => setDraft((d) => ({ ...d, tokens: { ...d.tokens, font: { ...d.tokens?.font, ...v } } }))\n // O documento da marca guarda a TRILHA e a SUPERFÍCIE desde a 075, e a tela\n // só expunha primária e destaque. Ficava assim: o cliente \"pode ajustar a\n // marca\", e metade dela só mudava por SQL — que foi como pintei sete contas\n // nesta sessão. Uma capacidade sem porta é uma capacidade que não existe.\n //\n // Vazio APAGA a chave em vez de gravar string vazia: sem `surface` a marca\n // não opina sobre a superfície e o app usa o tema dele, que é diferente de\n // gravar um branco escolhido à mão. Ver a 091.\n const patchLayer = (layer: 'rail' | 'surface') => (v: Record<string, string>) =>\n setDraft((d) => {\n const next = { ...(d.tokens?.[layer] as Record<string, string> | undefined) }\n for (const [k, val] of Object.entries(v)) {\n if (val) next[k] = val\n else delete next[k]\n }\n const tokens = { ...d.tokens, [layer]: next }\n if (!Object.keys(next).length) delete (tokens as Record<string, unknown>)[layer]\n return { ...d, tokens }\n })\n const patchRail = patchLayer('rail')\n const patchSurface = patchLayer('surface')\n const patchVoice = (v: Partial<typeof voice>) => setDraft((d) => ({ ...d, voice: { ...d.voice, ...v } }))\n\n const discard = () => { setDraft(saved); setLogoFile(null); setFaviconFile(null) }\n\n const submit = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!onSave) return\n setSaving(true)\n try {\n await onSave({ identity: draft.identity, tokens: draft.tokens, voice: draft.voice }, { logoFile, faviconFile })\n setSaved(draft)\n setLogoFile(null)\n setFaviconFile(null)\n } finally { setSaving(false) }\n }\n\n const Swatch = ({ value, onChange, id, label, fallback }: {\n value?: string; onChange: (v: string) => void; id: string; label: string; fallback: string\n }) => (\n <div className=\"space-y-2\">\n <label htmlFor={id} className=\"text-sm font-medium\">{label}</label>\n <div className=\"flex items-center gap-2\">\n {/* `type=color` não aceita vazio — sem um ponto de partida o seletor\n nativo abre em preto e parece que a conta já escolheu preto. */}\n <input type=\"color\" id={id} value={value || fallback || '#808080'} onChange={(e) => onChange(e.target.value)}\n className=\"h-9 w-9 shrink-0 cursor-pointer rounded-lg border bg-transparent p-1\" />\n <Input value={value ?? ''} onChange={(e) => onChange(e.target.value)}\n placeholder={fallback} maxLength={7} className=\"font-mono text-sm\" />\n </div>\n </div>\n )\n\n return (\n <form onSubmit={submit} className=\"pb-24\">\n <div className=\"mb-4 flex flex-wrap items-center justify-between gap-3\">\n {/* Sem título aqui: a trilha acima já diz \"Configurações / Marca\", e\n repetir o nome da página logo abaixo dela é ruído — o cabeçalho\n nomeia uma vez. */}\n <p className=\"max-w-xl text-sm text-muted-foreground\">{t('settings.brand.subtitle')}</p>\n <SegmentedControl<Section>\n value={section}\n onChange={setSection}\n options={[\n { value: 'identity', label: t('settings.brand.identity') },\n { value: 'color', label: t('settings.brand.colors') },\n { value: 'type', label: t('settings.brand.typography') },\n { value: 'voice', label: t('settings.brand.voice') },\n ]}\n />\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-[minmax(0,1fr)_320px]\">\n <div className=\"space-y-5\" data-testid={`brand-section-${section}`}>\n {section === 'identity' && (\n <>\n <p className=\"text-sm text-muted-foreground\">{t('settings.brand.identityHint')}</p>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{t('settings.brand.name')}</label>\n <Input value={identity.name ?? ''} onChange={(e) => patchIdentity({ name: e.target.value })} />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{t('settings.brand.tagline')}</label>\n <Input value={identity.tagline ?? ''} onChange={(e) => patchIdentity({ tagline: e.target.value })} />\n </div>\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{t('settings.brand.mission')}</label>\n <Input value={identity.mission ?? ''} onChange={(e) => patchIdentity({ mission: e.target.value })} />\n </div>\n <Separator />\n <FileUploadField label=\"Logo\" accept=\"image/png,image/jpeg,image/svg+xml,image/webp\"\n currentUrl={identity.logoUrl || undefined} onFileSelect={setLogoFile}\n onClear={() => { patchIdentity({ logoUrl: '' }); setLogoFile(null) }}\n hint=\"200x50px, PNG ou SVG\" />\n <FileUploadField label=\"Favicon\" accept=\"image/png,image/x-icon,image/svg+xml\"\n currentUrl={identity.faviconUrl || undefined} onFileSelect={setFaviconFile}\n onClear={() => { patchIdentity({ faviconUrl: '' }); setFaviconFile(null) }}\n hint=\"32x32px, PNG ou ICO\" />\n </>\n )}\n\n {/* ── A PELE É DE QUEM PAGA POR ELA (138) ────────────────────────\n A identidade — nome, assinatura, logo, favicon — fica na aba ao\n lado e é de TODA conta: ninguém abre um sistema sem a própria\n marca no alto. A cor é outra coisa. Sem esta trava a conta\n sobrescrevia o produto sempre, e um restaurante do ChefControl\n abria azul-marinho porque o formulário de cadastro gravou uma\n paleta que ninguém escolheu.\n\n `UpgradeOverlay` e não uma tela vazia: o desfoque mostra os\n controles REAIS por trás do preço. Quem não assina precisa ver o\n que está comprando, e um paywall que esconde o produto vende pior\n que um que o entrega embaçado. */}\n {section === 'color' && (\n <SkinGate>\n <p className=\"text-sm text-muted-foreground\">{t('settings.brand.colorsHint')}</p>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <Swatch value={color.primary} onChange={(v) => patchColor({ primary: v })}\n id=\"primary-color\" label={t('settings.branding.primaryColor')} fallback=\"#111827\" />\n <Swatch value={color.accent} onChange={(v) => patchColor({ accent: v })}\n id=\"accent-color\" label={t('settings.branding.accentColor')} fallback=\"#6366f1\" />\n </div>\n <p className=\"text-xs text-muted-foreground\">{t('settings.brand.colorsWhere')}</p>\n\n {/* A TRILHA — a decisão que a cor primária sozinha não expressa.\n O Espaço Facial é preto no rail com bege no item ativo; só com\n `color.primary` atravessando, a marca chegava pela metade. */}\n <div className=\"space-y-3 border-t border-border pt-4\">\n <div>\n <h4 className=\"text-sm font-medium\">Barra lateral</h4>\n <p className=\"text-xs text-muted-foreground\">\n Com a moldura ligada, esta cor pinta a trilha E o fundo atrás do conteúdo.\n </p>\n </div>\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <Swatch value={rail.background} onChange={(v) => patchRail({ background: v })}\n id=\"rail-bg\" label=\"Fundo\" fallback=\"#111827\" />\n <Swatch value={rail.foreground} onChange={(v) => patchRail({ foreground: v })}\n id=\"rail-fg\" label=\"Texto\" fallback=\"#FFFFFF\" />\n <Swatch value={rail.accent} onChange={(v) => patchRail({ accent: v })}\n id=\"rail-accent\" label=\"Item ativo\" fallback=\"#1F2937\" />\n </div>\n </div>\n\n {/* A SUPERFÍCIE. Vazio devolve o tema do aplicativo — não é o\n mesmo que escolher um branco. */}\n <div className=\"space-y-3 border-t border-border pt-4\">\n <div>\n <h4 className=\"text-sm font-medium\">Superfície</h4>\n <p className=\"text-xs text-muted-foreground\">\n Apague o campo para devolver a decisão ao tema do sistema.\n </p>\n </div>\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <Swatch value={surface.background} onChange={(v) => patchSurface({ background: v })}\n id=\"surface-bg\" label=\"Página\" fallback=\"#FFFFFF\" />\n <Swatch value={surface.card} onChange={(v) => patchSurface({ card: v })}\n id=\"surface-card\" label=\"Cartas\" fallback=\"#FFFFFF\" />\n <Swatch value={surface.foreground} onChange={(v) => patchSurface({ foreground: v })}\n id=\"surface-fg\" label=\"Texto\" fallback=\"#111827\" />\n </div>\n </div>\n </SkinGate>\n )}\n\n {section === 'type' && (\n <>\n <p className=\"text-sm text-muted-foreground\">{t('settings.brand.typographyHint')}</p>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{t('settings.brand.headingFont')}</label>\n <Input value={font.heading ?? ''} onChange={(e) => patchFont({ heading: e.target.value })} placeholder=\"Hanken Grotesk\" />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{t('settings.brand.bodyFont')}</label>\n <Input value={font.body ?? ''} onChange={(e) => patchFont({ body: e.target.value })} placeholder=\"Inter\" />\n </div>\n </div>\n </>\n )}\n\n {section === 'voice' && (\n <>\n <p className=\"text-sm text-muted-foreground\">{t('settings.brand.voiceHint')}</p>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{t('settings.brand.tone')}</label>\n <Input value={voice.tone ?? ''} onChange={(e) => patchVoice({ tone: e.target.value })}\n placeholder={t('settings.brand.tonePlaceholder')} />\n </div>\n <ListField label={t('settings.brand.lexicon')} value={voice.lexicon ?? []}\n onChange={(v) => patchVoice({ lexicon: v })} placeholder=\"acolhimento, cuidado\" />\n <ListField label={t('settings.brand.ctas')} value={voice.ctas ?? []}\n onChange={(v) => patchVoice({ ctas: v })} placeholder={t('settings.brand.ctasPlaceholder')} />\n <ListField label={t('settings.brand.hashtags')} value={voice.hashtags ?? []}\n onChange={(v) => patchVoice({ hashtags: v })} placeholder=\"#suamarca\" />\n\n {/* Separado e com moldura: é o único campo cujo esquecimento é\n invisível — ninguém relê um texto procurando a palavra banida. */}\n <div className=\"rounded-xl border border-destructive/30 bg-destructive/[0.03] p-4\" data-testid=\"brand-avoid\">\n <p className=\"text-sm font-medium text-destructive\">{t('settings.brand.avoid')}</p>\n <p className=\"mb-3 mt-0.5 text-xs text-muted-foreground\">{t('settings.brand.avoidHint')}</p>\n <ListField label={t('settings.brand.avoidWords')} value={voice.avoid ?? []}\n onChange={(v) => patchVoice({ avoid: v })} placeholder={t('settings.brand.avoidPlaceholder')} danger />\n </div>\n </>\n )}\n </div>\n\n <BrandPreview brand={draft} t={t as any} />\n </div>\n\n {/* A barra só existe quando há o que salvar, e diz QUANTAS mudanças.\n Um \"Salvar\" sempre aceso não informa se há trabalho pendente — e faz\n gente salvar por medo de ter mexido em algo. */}\n {dirty && (\n <div className=\"fixed inset-x-0 bottom-0 z-30 border-t bg-background/95 px-4 py-3 backdrop-blur sm:px-6\"\n data-testid=\"brand-dirty-bar\">\n <div className=\"mx-auto flex max-w-5xl flex-wrap items-center justify-between gap-3\">\n <p className=\"text-sm\">\n {/* Singular e plural de verdade. \"1 alteração(ões)\" é o tipo de\n coisa que faz uma tela boa parecer inacabada. */}\n {changes === 1\n ? t('settings.brand.unsavedOne')\n : t('settings.brand.unsaved', { count: String(changes) })}\n </p>\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" variant=\"ghost\" onClick={discard} disabled={saving}>\n {t('settings.brand.discard')}\n </Button>\n <Button type=\"submit\" disabled={saving}>\n <Save className=\"mr-2 h-4 w-4\" />\n {saving ? t('common.saving') : t('settings.branding.saveBranding')}\n </Button>\n </div>\n </div>\n </div>\n )}\n </form>\n )\n}\n","import * as React from 'react'\nimport { BrandingSettings } from './BrandingSettings'\nimport { useOrganizationStore } from '../../stores/organization.store'\nimport { toast } from '../notifications/ToastProvider'\nimport { getSupabaseClient } from '../../lib/supabase'\nimport { normalizeBrand, type TenantBrand } from '../../lib/brand'\nimport { useAppConfigStore } from '../../stores/app-config.store'\n\nexport function ConnectedBrandingSettings() {\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const setCurrentOrg = useOrganizationStore((s) => s.setCurrentOrg)\n\n const handleSave = async (\n patch: Partial<TenantBrand>,\n assets?: { logoFile?: File | null; faviconFile?: File | null },\n ) => {\n if (!currentOrg) return\n\n try {\n const supabase = getSupabaseClient()\n const next: Partial<TenantBrand> = {\n ...patch,\n identity: { ...patch.identity },\n }\n\n // O caminho COMEÇA pelo tenant: a política `core_avatars_insert` do bucket\n // só aceita a primeira pasta igual a um dos tenants do usuário (ou\n // `avatars`). `branding/<tenant>/…` era recusado com \"new row violates\n // row-level security policy\" — a tela nunca conseguiu salvar uma logo.\n //\n // Um nome NOVO a cada envio. Sobrescrever `logo.png` deixava a URL igual:\n // o navegador e o CDN do Storage (max-age 3600) seguiam servindo a imagem\n // antiga, e a guarda `logoUrl !== currentOrg.logoUrl` abaixo pulava a\n // gravação da coluna — a troca de logo \"não pegava\".\n const stamp = Date.now().toString(36)\n if (assets?.logoFile) {\n const ext = assets.logoFile.name.split('.').pop() ?? 'png'\n const path = `${currentOrg.id}/branding/logo-${stamp}.${ext}`\n const { error } = await supabase.storage.from('avatars').upload(path, assets.logoFile, { upsert: true })\n if (error) throw error\n next.identity!.logoUrl = supabase.storage.from('avatars').getPublicUrl(path).data.publicUrl\n // A marca quadrada (`markUrl`) vence o logo no avatar da conta, no\n // seletor e na prévia — e esta tela não tem campo para ela. Uma marca\n // antiga ficava valendo para sempre por cima do logo novo. Trocar o logo\n // solta a marca: sem ela, todos esses lugares caem no logo que acabou de\n // ser enviado.\n delete next.identity!.markUrl\n }\n\n if (assets?.faviconFile) {\n const ext = assets.faviconFile.name.split('.').pop() ?? 'png'\n const path = `${currentOrg.id}/branding/favicon-${stamp}.${ext}`\n const { error } = await supabase.storage.from('avatars').upload(path, assets.faviconFile, { upsert: true })\n if (error) throw error\n next.identity!.faviconUrl = supabase.storage.from('avatars').getPublicUrl(path).data.publicUrl\n }\n\n // FUNDE POR CAMADA, no servidor. A versão anterior montava\n // `settings = { ...settings, branding: novo }` e gravava o objeto inteiro:\n // duas pessoas editando abas diferentes, ou uma superfície que só mexe na\n // voz, apagariam o trabalho da outra. `tenant_brand_patch` funde e devolve\n // a marca normalizada.\n const { data: brand, error: patchError } = await supabase.rpc('tenant_brand_patch', { p_patch: next })\n if (patchError) throw patchError\n\n // `tenants.logo_url` continua sendo a coluna que o switcher e a loja\n // pública leem primeiro — mantê-la em dia é o que impede a logo nova de\n // aparecer no admin e não no site.\n const logoUrl = (brand as any)?.identity?.logoUrl ?? currentOrg.logoUrl ?? null\n if (logoUrl !== currentOrg.logoUrl) {\n await supabase.from('tenants').update({ logo_url: logoUrl }).eq('id', currentOrg.id)\n }\n\n const settings = {\n ...((currentOrg.settings ?? {}) as Record<string, unknown>),\n branding: {\n ...(((currentOrg.settings ?? {}) as any).branding ?? {}),\n ...next,\n },\n }\n setCurrentOrg({ ...currentOrg, logoUrl: logoUrl ?? undefined, settings })\n // O avatar da conta e o trilho leem a marca do app_config, não do org.\n // Sem isto o cabeçalho só mudava quando o polling de versão notasse a\n // troca, ou num reload.\n const appConfig = useAppConfigStore.getState()\n if (brand && appConfig.tenantId === currentOrg.id) {\n appConfig.setConfig({ ...appConfig.config, branding: brand as never }, appConfig.tenantId)\n }\n toast.success('Marca salva')\n } catch (err: any) {\n toast.error('Não foi possível salvar a marca', { description: err?.message })\n }\n }\n\n // LÊ DO SERVIDOR, não do `settings` que veio no login.\n //\n // `currentOrg.settings` é uma cópia em cache da sessão. Uma marca escrita por\n // outra aba, por um script ou por uma migration não aparece aqui até alguém\n // sair e entrar — foi assim que as palavras proibidas migradas não apareceram\n // no primeiro teste desta tela. O cache serve de primeira pintura; o servidor\n // é quem manda.\n const [brand, setBrand] = React.useState(() => normalizeBrand(\n ((currentOrg?.settings ?? {}) as any).branding,\n { name: currentOrg?.name, logoUrl: currentOrg?.logoUrl },\n ))\n\n React.useEffect(() => {\n let alive = true\n void (async () => {\n try {\n const { data } = await getSupabaseClient().rpc('tenant_brand')\n if (alive && data) setBrand(normalizeBrand(data, { name: currentOrg?.name, logoUrl: currentOrg?.logoUrl }))\n } catch {\n // Fica com o cache: melhor a marca de ontem que uma tela vazia.\n }\n })()\n return () => { alive = false }\n }, [currentOrg?.id, currentOrg?.name, currentOrg?.logoUrl])\n\n return <BrandingSettings brand={brand} onSave={handleSave} />\n}\n"]}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { CompanyTypeSettings, useLocaleStore, SUPPORTED_LOCALES } from './chunk-KAQ3UIAA.js';
|
|
2
|
+
import { UnitModeCard } from './chunk-YEHIBPIX.js';
|
|
3
|
+
import './chunk-2H46WDG5.js';
|
|
4
|
+
import './chunk-ENHCVGXZ.js';
|
|
5
|
+
import './chunk-DPNFZONC.js';
|
|
6
|
+
import { useTranslation } from './chunk-YUHCC7JY.js';
|
|
7
|
+
import { toast } from './chunk-3OUD4XBK.js';
|
|
8
|
+
import './chunk-TL42NKTH.js';
|
|
9
|
+
import { useOrgAdapterOptional } from './chunk-5D5QLMOQ.js';
|
|
10
|
+
import './chunk-UQ2NTFQC.js';
|
|
11
|
+
import './chunk-KJELMULA.js';
|
|
12
|
+
import './chunk-JRZJBMOY.js';
|
|
13
|
+
import { useOrganizationStore } from './chunk-YKPPCV2Z.js';
|
|
14
|
+
import * as React from 'react';
|
|
15
|
+
import { Save, Check } from 'lucide-react';
|
|
16
|
+
import { Card, CardHeader, CardTitle, CardDescription, CardContent, Input, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, CardFooter, Button } from '@fayz-ai/ui';
|
|
17
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
18
|
+
|
|
19
|
+
var TIMEZONES = [
|
|
20
|
+
{ value: "America/Sao_Paulo", label: "Brasilia (BRT)" },
|
|
21
|
+
{ value: "America/New_York", label: "Eastern (US)" },
|
|
22
|
+
{ value: "America/Chicago", label: "Central (US)" },
|
|
23
|
+
{ value: "America/Denver", label: "Mountain (US)" },
|
|
24
|
+
{ value: "America/Los_Angeles", label: "Pacific (US)" },
|
|
25
|
+
{ value: "America/Mexico_City", label: "Mexico City" },
|
|
26
|
+
{ value: "America/Buenos_Aires", label: "Buenos Aires" },
|
|
27
|
+
{ value: "Europe/London", label: "London" },
|
|
28
|
+
{ value: "Europe/Paris", label: "Paris" },
|
|
29
|
+
{ value: "Europe/Berlin", label: "Berlin" },
|
|
30
|
+
{ value: "Europe/Madrid", label: "Madrid" },
|
|
31
|
+
{ value: "Europe/Lisbon", label: "Lisbon" },
|
|
32
|
+
{ value: "Asia/Tokyo", label: "Tokyo" },
|
|
33
|
+
{ value: "Asia/Shanghai", label: "Shanghai" },
|
|
34
|
+
{ value: "Australia/Sydney", label: "Sydney" },
|
|
35
|
+
{ value: "UTC", label: "UTC" }
|
|
36
|
+
];
|
|
37
|
+
var CURRENCIES = [
|
|
38
|
+
{ value: "BRL", label: "BRL - Real" },
|
|
39
|
+
{ value: "USD", label: "USD - US Dollar" },
|
|
40
|
+
{ value: "EUR", label: "EUR - Euro" },
|
|
41
|
+
{ value: "GBP", label: "GBP - British Pound" },
|
|
42
|
+
{ value: "JPY", label: "JPY - Japanese Yen" },
|
|
43
|
+
{ value: "CAD", label: "CAD - Canadian Dollar" },
|
|
44
|
+
{ value: "AUD", label: "AUD - Australian Dollar" },
|
|
45
|
+
{ value: "MXN", label: "MXN - Mexican Peso" },
|
|
46
|
+
{ value: "ARS", label: "ARS - Argentine Peso" }
|
|
47
|
+
];
|
|
48
|
+
function CompanySettings({ tenant, onSave }) {
|
|
49
|
+
const { t } = useTranslation();
|
|
50
|
+
const { locale: uiLocale, setLocale: setUiLocale } = useLocaleStore();
|
|
51
|
+
const [name, setName] = React.useState(tenant?.name ?? "");
|
|
52
|
+
const [timezone, setTimezone] = React.useState(tenant?.settings?.timezone ?? "UTC");
|
|
53
|
+
const [currency, setCurrency] = React.useState(tenant?.settings?.currency ?? "USD");
|
|
54
|
+
const [saving, setSaving] = React.useState(false);
|
|
55
|
+
React.useEffect(() => {
|
|
56
|
+
if (tenant) {
|
|
57
|
+
setName(tenant.name);
|
|
58
|
+
setTimezone(tenant.settings?.timezone ?? "UTC");
|
|
59
|
+
setCurrency(tenant.settings?.currency ?? "USD");
|
|
60
|
+
}
|
|
61
|
+
}, [tenant]);
|
|
62
|
+
const handleSubmit = async (e) => {
|
|
63
|
+
e.preventDefault();
|
|
64
|
+
if (!onSave) return;
|
|
65
|
+
setSaving(true);
|
|
66
|
+
try {
|
|
67
|
+
await onSave({ name, timezone, currency });
|
|
68
|
+
} finally {
|
|
69
|
+
setSaving(false);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
|
|
73
|
+
/* @__PURE__ */ jsx("form", { onSubmit: handleSubmit, children: /* @__PURE__ */ jsxs(Card, { children: [
|
|
74
|
+
/* @__PURE__ */ jsxs(CardHeader, { children: [
|
|
75
|
+
/* @__PURE__ */ jsx(CardTitle, { className: "text-lg", children: t("settings.company.title") }),
|
|
76
|
+
/* @__PURE__ */ jsx(CardDescription, { children: t("settings.company.subtitle") })
|
|
77
|
+
] }),
|
|
78
|
+
/* @__PURE__ */ jsxs(CardContent, { className: "space-y-4", children: [
|
|
79
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
80
|
+
/* @__PURE__ */ jsx("label", { htmlFor: "company-name", className: "text-sm font-medium", children: t("settings.company.name") }),
|
|
81
|
+
/* @__PURE__ */ jsx(
|
|
82
|
+
Input,
|
|
83
|
+
{
|
|
84
|
+
id: "company-name",
|
|
85
|
+
value: name,
|
|
86
|
+
onChange: (e) => setName(e.target.value),
|
|
87
|
+
placeholder: "Acme Inc."
|
|
88
|
+
}
|
|
89
|
+
)
|
|
90
|
+
] }),
|
|
91
|
+
/* @__PURE__ */ jsxs("div", { className: "grid gap-4 sm:grid-cols-3", children: [
|
|
92
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
93
|
+
/* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: t("settings.company.timezone") }),
|
|
94
|
+
/* @__PURE__ */ jsxs(Select, { value: timezone, onValueChange: setTimezone, children: [
|
|
95
|
+
/* @__PURE__ */ jsx(SelectTrigger, { children: /* @__PURE__ */ jsx(SelectValue, { placeholder: t("settings.company.timezonePlaceholder") }) }),
|
|
96
|
+
/* @__PURE__ */ jsx(SelectContent, { children: TIMEZONES.map((tz) => /* @__PURE__ */ jsx(SelectItem, { value: tz.value, children: tz.label }, tz.value)) })
|
|
97
|
+
] })
|
|
98
|
+
] }),
|
|
99
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
100
|
+
/* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: t("settings.company.currency") }),
|
|
101
|
+
/* @__PURE__ */ jsxs(Select, { value: currency, onValueChange: setCurrency, children: [
|
|
102
|
+
/* @__PURE__ */ jsx(SelectTrigger, { children: /* @__PURE__ */ jsx(SelectValue, { placeholder: t("settings.company.currencyPlaceholder") }) }),
|
|
103
|
+
/* @__PURE__ */ jsx(SelectContent, { children: CURRENCIES.map((c) => /* @__PURE__ */ jsx(SelectItem, { value: c.value, children: c.label }, c.value)) })
|
|
104
|
+
] })
|
|
105
|
+
] })
|
|
106
|
+
] })
|
|
107
|
+
] }),
|
|
108
|
+
/* @__PURE__ */ jsx(CardFooter, { className: "justify-end", children: /* @__PURE__ */ jsxs(Button, { type: "submit", disabled: saving, children: [
|
|
109
|
+
/* @__PURE__ */ jsx(Save, { className: "mr-2 h-4 w-4" }),
|
|
110
|
+
saving ? t("common.saving") : t("settings.save")
|
|
111
|
+
] }) })
|
|
112
|
+
] }) }),
|
|
113
|
+
/* @__PURE__ */ jsxs(Card, { children: [
|
|
114
|
+
/* @__PURE__ */ jsxs(CardHeader, { children: [
|
|
115
|
+
/* @__PURE__ */ jsx(CardTitle, { className: "text-base", children: t("settings.uiLanguage") }),
|
|
116
|
+
/* @__PURE__ */ jsx(CardDescription, { children: t("settings.uiLanguageDescription") })
|
|
117
|
+
] }),
|
|
118
|
+
/* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx("div", { className: "grid gap-2 sm:grid-cols-2", children: SUPPORTED_LOCALES.map((loc) => /* @__PURE__ */ jsxs(
|
|
119
|
+
Button,
|
|
120
|
+
{
|
|
121
|
+
variant: "bare",
|
|
122
|
+
size: "bare",
|
|
123
|
+
onClick: () => {
|
|
124
|
+
setUiLocale(loc.code);
|
|
125
|
+
window.location.reload();
|
|
126
|
+
},
|
|
127
|
+
className: `gap-0 font-normal flex items-center justify-between rounded-button border-2 px-4 py-3 text-sm transition-all ${uiLocale === loc.code ? "border-primary bg-primary/5" : "border-transparent bg-muted/30 hover:bg-muted/50"}`,
|
|
128
|
+
children: [
|
|
129
|
+
/* @__PURE__ */ jsxs("span", { className: "flex items-center gap-3", children: [
|
|
130
|
+
/* @__PURE__ */ jsx("span", { className: "text-xl", children: loc.flag }),
|
|
131
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: loc.label })
|
|
132
|
+
] }),
|
|
133
|
+
uiLocale === loc.code && /* @__PURE__ */ jsx(Check, { className: "h-4 w-4 text-primary" })
|
|
134
|
+
]
|
|
135
|
+
},
|
|
136
|
+
loc.code
|
|
137
|
+
)) }) })
|
|
138
|
+
] })
|
|
139
|
+
] });
|
|
140
|
+
}
|
|
141
|
+
function toTenantSettings(settings) {
|
|
142
|
+
const source = settings && typeof settings === "object" ? settings : {};
|
|
143
|
+
const branding = source.branding && typeof source.branding === "object" ? source.branding : {};
|
|
144
|
+
return {
|
|
145
|
+
timezone: source.timezone ?? "America/Sao_Paulo",
|
|
146
|
+
currency: source.currency ?? "BRL",
|
|
147
|
+
locale: source.locale ?? "pt-BR",
|
|
148
|
+
branding: {
|
|
149
|
+
primaryColor: branding.primaryColor,
|
|
150
|
+
accentColor: branding.accentColor,
|
|
151
|
+
logoUrl: branding.logoUrl,
|
|
152
|
+
faviconUrl: branding.faviconUrl
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
function ConnectedCompanySettings() {
|
|
157
|
+
const currentOrg = useOrganizationStore((s) => s.currentOrg);
|
|
158
|
+
const setCurrentOrg = useOrganizationStore((s) => s.setCurrentOrg);
|
|
159
|
+
const adapter = useOrgAdapterOptional();
|
|
160
|
+
const tenant = currentOrg ? {
|
|
161
|
+
id: currentOrg.id,
|
|
162
|
+
name: currentOrg.name,
|
|
163
|
+
slug: currentOrg.slug,
|
|
164
|
+
logoUrl: currentOrg.logoUrl,
|
|
165
|
+
plan: currentOrg.plan ?? "free",
|
|
166
|
+
settings: toTenantSettings(currentOrg.settings),
|
|
167
|
+
createdAt: currentOrg.createdAt,
|
|
168
|
+
updatedAt: currentOrg.updatedAt
|
|
169
|
+
} : null;
|
|
170
|
+
const handleSave = async (data) => {
|
|
171
|
+
if (!adapter || !currentOrg) return;
|
|
172
|
+
try {
|
|
173
|
+
const raw = currentOrg.settings && typeof currentOrg.settings === "object" ? currentOrg.settings : {};
|
|
174
|
+
const updated = await adapter.updateOrg(currentOrg.id, {
|
|
175
|
+
name: data.name,
|
|
176
|
+
settings: {
|
|
177
|
+
...raw,
|
|
178
|
+
timezone: data.timezone,
|
|
179
|
+
currency: data.currency
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
setCurrentOrg(updated);
|
|
183
|
+
toast.success("Settings saved");
|
|
184
|
+
} catch (err) {
|
|
185
|
+
toast.error("Failed to save", { description: err?.message });
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
|
|
189
|
+
/* @__PURE__ */ jsx(CompanySettings, { tenant, onSave: handleSave }),
|
|
190
|
+
/* @__PURE__ */ jsx(UnitModeCard, {}),
|
|
191
|
+
/* @__PURE__ */ jsx(CompanyTypeSettings, {})
|
|
192
|
+
] });
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export { ConnectedCompanySettings };
|
|
196
|
+
//# sourceMappingURL=ConnectedCompanySettings-I4MALI2Q.js.map
|
|
197
|
+
//# sourceMappingURL=ConnectedCompanySettings-I4MALI2Q.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/settings/CompanySettings.tsx","../src/components/settings/ConnectedCompanySettings.tsx"],"names":["jsxs","jsx"],"mappings":"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","file":"ConnectedCompanySettings-I4MALI2Q.js","sourcesContent":["import * as React from 'react'\nimport { Save, Check } from 'lucide-react'\nimport { Button } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@fayz-ai/ui'\nimport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@fayz-ai/ui'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { useLocaleStore } from '../../stores/locale.store'\nimport { SUPPORTED_LOCALES } from '../../lib/locale-config'\nimport type { Tenant } from '../../types/tenant'\n\ninterface CompanySettingsProps {\n tenant?: Tenant | null\n onSave?: (settings: {\n name: string\n timezone: string\n currency: string\n }) => void\n}\n\nconst TIMEZONES = [\n { value: 'America/Sao_Paulo', label: 'Brasilia (BRT)' },\n { value: 'America/New_York', label: 'Eastern (US)' },\n { value: 'America/Chicago', label: 'Central (US)' },\n { value: 'America/Denver', label: 'Mountain (US)' },\n { value: 'America/Los_Angeles', label: 'Pacific (US)' },\n { value: 'America/Mexico_City', label: 'Mexico City' },\n { value: 'America/Buenos_Aires', label: 'Buenos Aires' },\n { value: 'Europe/London', label: 'London' },\n { value: 'Europe/Paris', label: 'Paris' },\n { value: 'Europe/Berlin', label: 'Berlin' },\n { value: 'Europe/Madrid', label: 'Madrid' },\n { value: 'Europe/Lisbon', label: 'Lisbon' },\n { value: 'Asia/Tokyo', label: 'Tokyo' },\n { value: 'Asia/Shanghai', label: 'Shanghai' },\n { value: 'Australia/Sydney', label: 'Sydney' },\n { value: 'UTC', label: 'UTC' },\n]\n\nconst CURRENCIES = [\n { value: 'BRL', label: 'BRL - Real' },\n { value: 'USD', label: 'USD - US Dollar' },\n { value: 'EUR', label: 'EUR - Euro' },\n { value: 'GBP', label: 'GBP - British Pound' },\n { value: 'JPY', label: 'JPY - Japanese Yen' },\n { value: 'CAD', label: 'CAD - Canadian Dollar' },\n { value: 'AUD', label: 'AUD - Australian Dollar' },\n { value: 'MXN', label: 'MXN - Mexican Peso' },\n { value: 'ARS', label: 'ARS - Argentine Peso' },\n]\n\nexport function CompanySettings({ tenant, onSave }: CompanySettingsProps) {\n const { t } = useTranslation()\n const { locale: uiLocale, setLocale: setUiLocale } = useLocaleStore()\n const [name, setName] = React.useState(tenant?.name ?? '')\n const [timezone, setTimezone] = React.useState(tenant?.settings?.timezone ?? 'UTC')\n const [currency, setCurrency] = React.useState(tenant?.settings?.currency ?? 'USD')\n const [saving, setSaving] = React.useState(false)\n\n React.useEffect(() => {\n if (tenant) {\n setName(tenant.name)\n setTimezone(tenant.settings?.timezone ?? 'UTC')\n setCurrency(tenant.settings?.currency ?? 'USD')\n }\n }, [tenant])\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!onSave) return\n\n setSaving(true)\n try {\n await onSave({ name, timezone, currency })\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <div className=\"space-y-6\">\n <form onSubmit={handleSubmit}>\n <Card>\n <CardHeader>\n <CardTitle className=\"text-lg\">{t('settings.company.title')}</CardTitle>\n <CardDescription>\n {t('settings.company.subtitle')}\n </CardDescription>\n </CardHeader>\n\n <CardContent className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label htmlFor=\"company-name\" className=\"text-sm font-medium\">\n {t('settings.company.name')}\n </label>\n <Input\n id=\"company-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Acme Inc.\"\n />\n </div>\n\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{t('settings.company.timezone')}</label>\n <Select value={timezone} onValueChange={setTimezone}>\n <SelectTrigger>\n <SelectValue placeholder={t('settings.company.timezonePlaceholder')} />\n </SelectTrigger>\n <SelectContent>\n {TIMEZONES.map((tz) => (\n <SelectItem key={tz.value} value={tz.value}>\n {tz.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{t('settings.company.currency')}</label>\n <Select value={currency} onValueChange={setCurrency}>\n <SelectTrigger>\n <SelectValue placeholder={t('settings.company.currencyPlaceholder')} />\n </SelectTrigger>\n <SelectContent>\n {CURRENCIES.map((c) => (\n <SelectItem key={c.value} value={c.value}>\n {c.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n </div>\n </CardContent>\n\n <CardFooter className=\"justify-end\">\n <Button type=\"submit\" disabled={saving}>\n <Save className=\"mr-2 h-4 w-4\" />\n {saving ? t('common.saving') : t('settings.save')}\n </Button>\n </CardFooter>\n </Card>\n </form>\n\n {/* UI Language */}\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">{t('settings.uiLanguage')}</CardTitle>\n <CardDescription>{t('settings.uiLanguageDescription')}</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid gap-2 sm:grid-cols-2\">\n {SUPPORTED_LOCALES.map((loc) => (\n <Button\n variant=\"bare\"\n size=\"bare\"\n key={loc.code}\n onClick={() => {\n setUiLocale(loc.code)\n window.location.reload()\n }}\n className={`gap-0 font-normal flex items-center justify-between rounded-button border-2 px-4 py-3 text-sm transition-all ${\n uiLocale === loc.code\n ? 'border-primary bg-primary/5'\n : 'border-transparent bg-muted/30 hover:bg-muted/50'\n }`}\n >\n <span className=\"flex items-center gap-3\">\n <span className=\"text-xl\">{loc.flag}</span>\n <span className=\"font-medium\">{loc.label}</span>\n </span>\n {uiLocale === loc.code && <Check className=\"h-4 w-4 text-primary\" />}\n </Button>\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )\n}\n","import { CompanySettings } from './CompanySettings'\nimport { useOrganizationStore } from '../../stores/organization.store'\n// Native org adapter — the shell's lib/org-context provider is never mounted,\n// so importing from there returned a null adapter and every save was a no-op.\n// The native <OrgProvider> (packages/saas/src/org) is the one actually mounted.\nimport { useOrgAdapterOptional } from '../../org'\nimport { toast } from '../notifications/ToastProvider'\nimport type { Tenant, TenantSettings } from '../../types/tenant'\nimport { UnitModeCard } from '../../units/UnitModeCard'\nimport { CompanyTypeSettings } from '../../settings/core-v1-tabs'\n\nfunction toTenantSettings(settings: unknown): TenantSettings {\n const source = (settings && typeof settings === 'object' ? settings : {}) as Partial<TenantSettings>\n const branding = (source.branding && typeof source.branding === 'object' ? source.branding : {}) as TenantSettings['branding']\n\n return {\n timezone: source.timezone ?? 'America/Sao_Paulo',\n currency: source.currency ?? 'BRL',\n locale: source.locale ?? 'pt-BR',\n branding: {\n primaryColor: branding.primaryColor,\n accentColor: branding.accentColor,\n logoUrl: branding.logoUrl,\n faviconUrl: branding.faviconUrl,\n },\n }\n}\n\nexport function ConnectedCompanySettings() {\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const setCurrentOrg = useOrganizationStore((s) => s.setCurrentOrg)\n const adapter = useOrgAdapterOptional()\n // Map Organization to Tenant shape for the component\n const tenant: Tenant | null = currentOrg\n ? {\n id: currentOrg.id,\n name: currentOrg.name,\n slug: currentOrg.slug,\n logoUrl: currentOrg.logoUrl,\n plan: currentOrg.plan ?? 'free',\n settings: toTenantSettings(currentOrg.settings),\n createdAt: currentOrg.createdAt,\n updatedAt: currentOrg.updatedAt,\n }\n : null\n\n const handleSave = async (data: { name: string; timezone: string; currency: string }) => {\n if (!adapter || !currentOrg) return\n\n try {\n // Onto the RAW settings, not the typed view of them: that view keeps four\n // keys, and writing it back erased the brand tokens and every plugin\n // setting the tenant had.\n const raw = (currentOrg.settings && typeof currentOrg.settings === 'object' ? currentOrg.settings : {}) as Record<string, unknown>\n const updated = await adapter.updateOrg(currentOrg.id, {\n name: data.name,\n settings: {\n ...raw,\n timezone: data.timezone,\n currency: data.currency,\n } as never,\n })\n setCurrentOrg(updated)\n toast.success('Settings saved')\n } catch (err: any) {\n toast.error('Failed to save', { description: err?.message })\n }\n }\n\n return (\n <div className=\"space-y-6\">\n <CompanySettings tenant={tenant} onSave={handleSave} />\n {/* How this business is SHAPED sits with name, timezone and currency.\n Renders nothing until there is at least one unit to switch on. */}\n <UnitModeCard />\n <CompanyTypeSettings />\n </div>\n )\n}\n"]}
|