@fayz-ai/admin 0.22.0 → 0.23.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.
Files changed (129) hide show
  1. package/dist/{CommandPalette-GQ6SPITD.js → CommandPalette-ANZWU27U.js} +5 -5
  2. package/dist/CommandPalette-ANZWU27U.js.map +1 -0
  3. package/dist/ScheduleEditor-KU4UUG6Q.js +7 -0
  4. package/dist/ScheduleEditor-KU4UUG6Q.js.map +1 -0
  5. package/dist/SubscriptionPage-4EJCCS4I.js +8 -0
  6. package/dist/{SubscriptionPage-KYMUCZRW.js.map → SubscriptionPage-4EJCCS4I.js.map} +1 -1
  7. package/dist/app/AdminShell.d.ts +2 -0
  8. package/dist/app/AdminShell.d.ts.map +1 -1
  9. package/dist/app/WrongAppGate.d.ts +46 -0
  10. package/dist/app/WrongAppGate.d.ts.map +1 -0
  11. package/dist/app/admin-app.d.ts.map +1 -1
  12. package/dist/app/app-config-cache.d.ts +13 -0
  13. package/dist/app/app-config-cache.d.ts.map +1 -0
  14. package/dist/app/contextual-nav.store.d.ts +11 -0
  15. package/dist/app/contextual-nav.store.d.ts.map +1 -1
  16. package/dist/app/nav-serving.d.ts +40 -0
  17. package/dist/app/nav-serving.d.ts.map +1 -0
  18. package/dist/app/nav-waiting.d.ts +23 -0
  19. package/dist/app/nav-waiting.d.ts.map +1 -0
  20. package/dist/app/rail-preset.d.ts +38 -0
  21. package/dist/app/rail-preset.d.ts.map +1 -0
  22. package/dist/app/scaffold.d.ts.map +1 -1
  23. package/dist/app/useAppPreset.d.ts +81 -0
  24. package/dist/app/useAppPreset.d.ts.map +1 -0
  25. package/dist/app/useDomainTenant.d.ts +32 -0
  26. package/dist/app/useDomainTenant.d.ts.map +1 -0
  27. package/dist/app/useTenantShell.d.ts +35 -0
  28. package/dist/app/useTenantShell.d.ts.map +1 -0
  29. package/dist/billing/TrialWidget.d.ts +1 -1
  30. package/dist/billing/TrialWidget.d.ts.map +1 -1
  31. package/dist/billing/index.js +2 -2
  32. package/dist/{chunk-CRB4ZUFH.js → chunk-LB5SV4ZZ.js} +6 -6
  33. package/dist/{chunk-CRB4ZUFH.js.map → chunk-LB5SV4ZZ.js.map} +1 -1
  34. package/dist/{ScheduleEditor-B7PLFGVM.js → chunk-NXFFJY2X.js} +44 -8
  35. package/dist/chunk-NXFFJY2X.js.map +1 -0
  36. package/dist/{chunk-NB6X5O5L.js → chunk-R4HQ2HS2.js} +22 -6
  37. package/dist/chunk-R4HQ2HS2.js.map +1 -0
  38. package/dist/{chunk-SHHWE7R2.js → chunk-U3VX52SE.js} +5 -6
  39. package/dist/chunk-U3VX52SE.js.map +1 -0
  40. package/dist/{chunk-WJ3H3RJN.js → chunk-UQ2NTFQC.js} +4 -2
  41. package/dist/chunk-UQ2NTFQC.js.map +1 -0
  42. package/dist/{chunk-5GWUM4SM.js → chunk-W5IBKM3K.js} +3 -2
  43. package/dist/chunk-W5IBKM3K.js.map +1 -0
  44. package/dist/{chunk-ZKOWNGZT.js → chunk-XJB76FHA.js} +216 -72
  45. package/dist/chunk-XJB76FHA.js.map +1 -0
  46. package/dist/components/RightRail.d.ts.map +1 -1
  47. package/dist/components/chat/AgentAvatar.d.ts +6 -1
  48. package/dist/components/chat/AgentAvatar.d.ts.map +1 -1
  49. package/dist/components/chat/AssistantInvite.d.ts.map +1 -1
  50. package/dist/components/chat/ChatConversation.d.ts.map +1 -1
  51. package/dist/components/chat/ChatFab.d.ts.map +1 -1
  52. package/dist/components/layout/CommandPalette.d.ts +5 -1
  53. package/dist/components/layout/CommandPalette.d.ts.map +1 -1
  54. package/dist/components/layout/PrintChrome.d.ts.map +1 -1
  55. package/dist/components/right-rail.d.ts +2 -0
  56. package/dist/components/right-rail.d.ts.map +1 -1
  57. package/dist/components/settings/AddModulesPanel.d.ts +45 -0
  58. package/dist/components/settings/AddModulesPanel.d.ts.map +1 -0
  59. package/dist/components/settings/BrandingSettings.d.ts.map +1 -1
  60. package/dist/components/settings/ConnectedModulesSettings.d.ts +5 -0
  61. package/dist/components/settings/ConnectedModulesSettings.d.ts.map +1 -0
  62. package/dist/components/settings/ModuleCard.d.ts +26 -0
  63. package/dist/components/settings/ModuleCard.d.ts.map +1 -0
  64. package/dist/components/settings/ModulesSettings.d.ts +48 -0
  65. package/dist/components/settings/ModulesSettings.d.ts.map +1 -0
  66. package/dist/components/settings/SettingsPage.d.ts.map +1 -1
  67. package/dist/components/settings/module-catalog.d.ts +58 -0
  68. package/dist/components/settings/module-catalog.d.ts.map +1 -0
  69. package/dist/crud/CrudFormPage.d.ts.map +1 -1
  70. package/dist/crud/archetypes/OrderDetailRail.d.ts.map +1 -1
  71. package/dist/crud/archetypes/OrderDetailView.d.ts +44 -0
  72. package/dist/crud/archetypes/OrderDetailView.d.ts.map +1 -1
  73. package/dist/directory/AppSwitcher.d.ts +6 -2
  74. package/dist/directory/AppSwitcher.d.ts.map +1 -1
  75. package/dist/handbook/NotebookPanel.d.ts.map +1 -1
  76. package/dist/hooks/useAppConfig.d.ts +8 -0
  77. package/dist/hooks/useAppConfig.d.ts.map +1 -1
  78. package/dist/hooks/useChat.d.ts.map +1 -1
  79. package/dist/hooks/useLayout.d.ts +4 -1
  80. package/dist/hooks/useLayout.d.ts.map +1 -1
  81. package/dist/index.d.ts +4 -1
  82. package/dist/index.d.ts.map +1 -1
  83. package/dist/index.js +2171 -1030
  84. package/dist/index.js.map +1 -1
  85. package/dist/lib/agent-surface.d.ts +8 -1
  86. package/dist/lib/agent-surface.d.ts.map +1 -1
  87. package/dist/lib/ai-tool-handlers.d.ts.map +1 -1
  88. package/dist/lib/brand.d.ts +45 -0
  89. package/dist/lib/brand.d.ts.map +1 -1
  90. package/dist/lib/search-targets.d.ts.map +1 -1
  91. package/dist/org/OrgMark.d.ts +41 -0
  92. package/dist/org/OrgMark.d.ts.map +1 -0
  93. package/dist/org/WorkspaceChooser.d.ts +1 -0
  94. package/dist/org/WorkspaceChooser.d.ts.map +1 -1
  95. package/dist/org/WorkspaceChooserGate.d.ts.map +1 -1
  96. package/dist/org/WorkspaceSwitching.d.ts.map +1 -1
  97. package/dist/org/context.d.ts +13 -1
  98. package/dist/org/context.d.ts.map +1 -1
  99. package/dist/org/index.d.ts +2 -0
  100. package/dist/org/index.d.ts.map +1 -1
  101. package/dist/org/index.js +4 -4
  102. package/dist/org/switching.store.d.ts.map +1 -1
  103. package/dist/org/workspace-search.d.ts +27 -0
  104. package/dist/org/workspace-search.d.ts.map +1 -0
  105. package/dist/permissions/index.js +1 -1
  106. package/dist/permissions/store.d.ts +12 -0
  107. package/dist/permissions/store.d.ts.map +1 -1
  108. package/dist/setup/SetupAgentSurface.d.ts.map +1 -1
  109. package/dist/stores/app-config.store.d.ts +5 -1
  110. package/dist/stores/app-config.store.d.ts.map +1 -1
  111. package/dist/tasks/components/TasksFilterBar.d.ts.map +1 -1
  112. package/dist/theme/dark.d.ts.map +1 -1
  113. package/dist/theme/light.d.ts.map +1 -1
  114. package/dist/theme/tokens.d.ts +13 -0
  115. package/dist/theme/tokens.d.ts.map +1 -1
  116. package/dist/theme/utils.d.ts.map +1 -1
  117. package/dist/units/UnitSwitcher.d.ts +10 -1
  118. package/dist/units/UnitSwitcher.d.ts.map +1 -1
  119. package/package.json +6 -6
  120. package/dist/CommandPalette-GQ6SPITD.js.map +0 -1
  121. package/dist/ScheduleEditor-B7PLFGVM.js.map +0 -1
  122. package/dist/SubscriptionPage-KYMUCZRW.js +0 -8
  123. package/dist/chunk-5GWUM4SM.js.map +0 -1
  124. package/dist/chunk-NB6X5O5L.js.map +0 -1
  125. package/dist/chunk-RKXZ7RUG.js +0 -20
  126. package/dist/chunk-RKXZ7RUG.js.map +0 -1
  127. package/dist/chunk-SHHWE7R2.js.map +0 -1
  128. package/dist/chunk-WJ3H3RJN.js.map +0 -1
  129. package/dist/chunk-ZKOWNGZT.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/data/client.ts","../src/org/team-rows.ts","../src/directory/app-id.ts","../src/org/adapters/supabase.ts","../src/org/adapters/mock.ts","../src/org/WorkspaceChooser.tsx","../src/org/WorkspaceChooserGate.tsx","../src/org/switching.store.ts","../src/org/WorkspaceSwitching.tsx","../src/org/WorkspaceSwitchingHost.tsx"],"names":["capitalize","slugify","React","jsx","useTranslation","jsxs","WorkspaceMark","Check","cn","Building2"],"mappings":"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","file":"chunk-ZKOWNGZT.js","sourcesContent":["import { createClient, type SupabaseClient } from '@supabase/supabase-js'\nimport { setGlobalSupabaseClient, getActiveUnitId, getActiveTenantId } from '@fayz-ai/core'\nimport { createDedupedFetch } from '@fayz-ai/sdk'\n\nlet _client: SupabaseClient | null = null\n\n/**\n * Para onde a requisição vai, nos três formatos que `fetch` aceita.\n *\n * `input` pode ser uma string, uma URL ou um Request — e ler `.url` de uma\n * string devolve `undefined` em silêncio, que é como um filtro destes deixa\n * passar exatamente o que devia barrar.\n */\nexport function requestUrl(input: RequestInfo | URL): string {\n if (typeof input === 'string') return input\n if (input instanceof URL) return input.toString()\n return input?.url ?? ''\n}\n\n/** O caminho que o Supabase dá a toda função de borda. Exportada para o teste. */\nexport function isEdgeFunctionCall(input: RequestInfo | URL): boolean {\n return requestUrl(input).includes('/functions/v1/')\n}\n\n/**\n * Create (and cache) the Supabase client for the Fayz app.\n * Also registers it as the global client in @fayz-ai/core so data providers\n * can resolve it without prop-drilling.\n *\n * Idempotent — subsequent calls with the same URL return the cached client.\n */\nexport function createFayzSupabaseClient(url: string, anonKey: string): SupabaseClient {\n if (_client) return _client\n\n if (!url || !anonKey) {\n throw new Error(\n '[@fayz-ai/admin] Supabase URL and anon key are required. ' +\n 'Pass supabaseUrl and supabaseAnonKey to createFayzApp.',\n )\n }\n\n // Every read goes through this client — the one place that can see two\n // components asking the same thing at the same instant.\n const deduped = createDedupedFetch()\n\n _client = createClient(url, anonKey, {\n auth: { autoRefreshToken: true, persistSession: true },\n global: {\n // The active unit rides on every request so the DATABASE can stamp a\n // write with it (041's trigger reads this header). Reads are narrowed by\n // an explicit filter, not by this — a header cannot be trusted to narrow,\n // and it must never be able to widen: the policies resolve unit access\n // through `public.user_unit_ids()`, never through what was sent here.\n //\n // `x-fayz-unit` is in the dedupe vary list. Without that, two identical\n // URLs under different units collapse into one response.\n fetch: (input: RequestInfo | URL, init: RequestInit = {}) => {\n // Estes cabeçalhos são para o BANCO, e só para ele. Uma função de borda\n // recebe o tenant no corpo (`tenantId`) e nunca leu nenhum dos dois — o\n // que ela faz com um cabeçalho desconhecido é RECUSAR O PREFLIGHT, e o\n // navegador então bloqueia o POST antes de ele sair. Nenhuma requisição\n // chega ao log, e quem está usando vê a palavra \"CORS\".\n //\n // As vinte funções deste repositório declaram listas fixas de\n // `Access-Control-Allow-Headers` e nenhuma delas cita `x-fayz-tenant`.\n // Mandar o cabeçalho para lá não compra nada e derruba todas de uma vez.\n if (isEdgeFunctionCall(input)) return deduped(input, init)\n\n const unit = getActiveUnitId()\n // `x-fayz-tenant` rides the same way, for the reason 145 spells out:\n // the archetype policies resolve tenant through app.current_tenant_id(),\n // which knew only the signed JWT claim (nobody mints one) or \"your only\n // account\". A user with two accounts therefore read NOTHING from\n // public.people / orders / products — silently, and long before any\n // screen moved. This is the app finally saying which account it is in.\n //\n // Same rule as the unit header, and 145 enforces it: the value only\n // CHOOSES among the accounts the user already belongs to, validated\n // against app.memberships. It narrows; it can never widen.\n const tenant = getActiveTenantId()\n if (!unit && !tenant) return deduped(input, init)\n const headers = new Headers(init.headers)\n if (unit) headers.set('x-fayz-unit', unit)\n if (tenant) headers.set('x-fayz-tenant', tenant)\n return deduped(input, { ...init, headers })\n },\n },\n })\n\n // Register globally so @fayz-ai/core data providers can use it\n setGlobalSupabaseClient(_client)\n\n return _client\n}\n\n/** Get the cached client — throws if not initialised */\nexport function getFayzSupabaseClient(): SupabaseClient {\n if (!_client) {\n throw new Error(\n '[@fayz-ai/admin] Supabase client not initialised. Call createFayzApp with supabaseUrl and supabaseAnonKey first.',\n )\n }\n return _client\n}\n\n/** Safe getter — returns null if not initialised (mock/offline mode) */\nexport function getFayzSupabaseClientOptional(): SupabaseClient | null {\n return _client\n}\n","import type { TeamPerson } from '@fayz-ai/core'\n\n/** A `people` row as the team query selects it. */\nexport interface TeamPeopleRow {\n id: string\n name?: string | null\n kind?: string | null\n email?: string | null\n avatar_url?: string | null\n is_active?: boolean | null\n}\n\n/** A `tenant_members` row as the team query selects it. */\nexport interface TeamMemberRow {\n id: string\n user_id: string\n role?: string | null\n person_id?: string | null\n created_at?: string | null\n}\n\n/** A `profiles` row for a member's login. */\nexport interface TeamProfileRow {\n id: string\n full_name?: string | null\n email?: string | null\n avatar_url?: string | null\n}\n\n/** The signed-in user, used to name their own row when `profiles` has no row for them. */\nexport interface TeamCurrentUser {\n id: string\n email?: string | null\n fullName?: string | null\n}\n\nconst capitalize = (s: string) => (s ? s.charAt(0).toUpperCase() + s.slice(1) : s)\n\n/**\n * Fallback display name for a login with no person record. `profiles` is not\n * guaranteed to have a row (accounts created before the trigger, seeded demos),\n * and its RLS only ever exposes your own — so the session is the last resort for\n * your own row, and the email handle the one after that.\n */\nfunction loginName(profile: TeamProfileRow | undefined, session: TeamCurrentUser | undefined): string {\n const candidates = [profile?.full_name, session?.fullName, profile?.email, session?.email]\n for (const candidate of candidates) {\n const value = candidate?.trim()\n if (value) return value.includes('@') ? value.split('@')[0] : value\n }\n return ''\n}\n\n/**\n * Merges the two halves of the team into one list.\n *\n * People of the configured kinds are the roster; `tenant_members` is the access\n * overlay linked by `person_id`. But a login is not required to have a person\n * record — the owner who created the workspace never gets one — and dropping\n * those rows left the Team screen empty for every account that had not staffed\n * itself as a person. So memberships that match no listed person come back as\n * rows of their own, named from their login profile and carrying no `personId`.\n * Logins come first: whoever holds access is the answer to \"who is my team?\"\n * before the roster of people who may never sign in.\n */\nexport function buildTeamRows(\n people: TeamPeopleRow[],\n members: TeamMemberRow[],\n profiles: TeamProfileRow[],\n currentUser?: TeamCurrentUser | null,\n): TeamPerson[] {\n const personIds = new Set(people.map((p) => p.id))\n const byPerson = new Map<string, TeamMemberRow>()\n const unlinked: TeamMemberRow[] = []\n\n for (const m of members) {\n if (m.person_id && personIds.has(m.person_id)) byPerson.set(m.person_id, m)\n else unlinked.push(m)\n }\n\n const profileById = new Map(profiles.map((p) => [p.id, p]))\n\n const toMembership = (m: TeamMemberRow) => ({\n memberId: m.id,\n userId: m.user_id,\n profileId: (m.role as string) ?? '',\n profileName: capitalize((m.role as string) ?? ''),\n joinedAt: m.created_at ?? undefined,\n })\n\n const loginRows: TeamPerson[] = unlinked.map((m) => {\n const profile = profileById.get(m.user_id)\n const session = currentUser && currentUser.id === m.user_id ? currentUser : undefined\n return {\n name: loginName(profile, session),\n email: profile?.email ?? session?.email ?? undefined,\n avatarUrl: profile?.avatar_url ?? undefined,\n isActive: true,\n membership: toMembership(m),\n }\n })\n\n const personRows: TeamPerson[] = people.map((p) => {\n const m = byPerson.get(p.id)\n return {\n personId: p.id,\n name: p.name ?? '',\n kind: p.kind ?? undefined,\n email: p.email ?? undefined,\n avatarUrl: p.avatar_url ?? undefined,\n isActive: p.is_active ?? true,\n membership: m ? toMembership(m) : undefined,\n }\n })\n\n return [...loginRows, ...personRows]\n}\n","/**\n * Which application THIS bundle is.\n *\n * The switcher needs it for one thing only: to know which tile is the one you\n * are already looking at. Everything else about an app — its name, icon, colour\n * and URL — comes from the `app.apps` registry, so a rename is a row and not a\n * release.\n *\n * Until now the only identity an app carried was `VITE_FAYZ_PROJECT_ID`, a\n * platform project uuid. That is a poor answer to \"which product is this\": the\n * ids for the shop already disagree between the app's own `.env` and the\n * platform's seed script, and nothing would have caught it, because a uuid does\n * not look wrong. `VITE_APP_ID` is the registry key instead — it matches\n * `app.apps.id`, and a typo shows up as \"nothing is highlighted\" on the first\n * run rather than as a wrong tile months later.\n *\n * Unset is a legitimate answer: the switcher lists every app the account runs\n * and highlights none, which is right for a bundle nobody has claimed yet.\n */\nexport function resolveAppId(): string | null {\n const env = (import.meta as unknown as { env?: Record<string, string | undefined> }).env\n const id = env?.VITE_APP_ID ?? env?.PUBLIC_APP_ID\n const trimmed = id?.trim()\n return trimmed ? trimmed : null\n}\n","import type {\n OrgAdapter,\n Organization,\n OrgMember,\n OrgMembership,\n TeamPerson,\n CreateOrgOptions,\n Location,\n Invite,\n} from '@fayz-ai/core'\nimport type { PermissionProfile, SystemPermission, AuthAdapter } from '@fayz-ai/core'\nimport { getFayzSupabaseClient } from '../../data/client'\nimport { buildTeamRows } from '../team-rows'\nimport { resolveAppId } from '../../directory/app-id'\nimport type { TeamMemberRow, TeamPeopleRow, TeamProfileRow } from '../team-rows'\n\n// ---------------------------------------------------------------------------\n// Request dedup — prevents duplicate in-flight requests (React StrictMode etc.)\n// ---------------------------------------------------------------------------\n\nconst inflightRequests = new Map<string, Promise<unknown>>()\n\nfunction dedup<T>(key: string, fn: () => Promise<T>): Promise<T> {\n const existing = inflightRequests.get(key)\n if (existing) return existing as Promise<T>\n\n const promise = fn().finally(() => {\n inflightRequests.delete(key)\n })\n inflightRequests.set(key, promise)\n return promise\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction slugify(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '')\n}\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n\nfunction mapTenantToOrg(row: Record<string, unknown>): Organization {\n return {\n id: row['id'] as string,\n name: row['name'] as string,\n slug: row['slug'] as string,\n logoUrl: (row['logo_url'] as string | null) ?? undefined,\n verticalId: (row['vertical_id'] as string | null) ?? undefined,\n plan: (row['plan'] as string | null) ?? undefined,\n trialEndsAt: (row['trial_ends_at'] as string | null) ?? undefined,\n settings: (row['settings'] as Record<string, unknown> | null) ?? undefined,\n createdAt: row['created_at'] as string,\n updatedAt: row['updated_at'] as string,\n }\n}\n\n/**\n * Como um login ganha nome.\n *\n * Era só `public.profiles` — e num pool onde essa tabela está VAZIA (nenhum\n * gatilho a preencheu) a tela de Equipe inteira aparecia sem nome nenhum: seis\n * linhas com \"?\" no avatar e a coluna do membro em branco. Quem é a pessoa por\n * trás de um acesso é a pergunta que essa tela existe para responder.\n *\n * A ficha ligada à associação (`person_id`, sempre preenchida desde a #120)\n * responde melhor e é dado da própria conta: nome e e-mail que a equipe\n * mantém, não uma cópia do provedor de identidade. `profiles` fica como\n * complemento — é de lá que vem o avatar.\n */\nasync function namesForLogins(\n rows: Array<Record<string, unknown>>,\n db: { from: (table: string) => any },\n): Promise<Map<string, Record<string, unknown>>> {\n const out = new Map<string, Record<string, unknown>>()\n if (rows.length === 0) return out\n\n const userIds = rows.map((r) => r['user_id'] as string).filter(Boolean)\n const personIds = rows.map((r) => r['person_id'] as string | null).filter(Boolean) as string[]\n\n const [profilesResult, peopleResult] = await Promise.all([\n userIds.length ? db.from('profiles').select('id, full_name, avatar_url, email').in('id', userIds) : Promise.resolve({ data: [] }),\n personIds.length ? db.from('people').select('id, name, email, avatar_url, kind').in('id', personIds) : Promise.resolve({ data: [] }),\n ])\n\n const byProfile = new Map(\n ((profilesResult?.data ?? []) as Array<Record<string, unknown>>).map((p) => [p['id'] as string, p]),\n )\n const byPerson = new Map(\n ((peopleResult?.data ?? []) as Array<Record<string, unknown>>).map((p) => [p['id'] as string, p]),\n )\n\n for (const row of rows) {\n const userId = row['user_id'] as string\n const profile = byProfile.get(userId)\n const person = byPerson.get(row['person_id'] as string)\n out.set(userId, {\n id: userId,\n full_name: person?.['name'] ?? profile?.['full_name'] ?? '',\n email: person?.['email'] ?? profile?.['email'] ?? '',\n avatar_url: profile?.['avatar_url'] ?? person?.['avatar_url'] ?? null,\n // Viaja junto para a tela poder RESOLVER a rota da ficha: o registro de\n // rotas é indexado por `arquétipo:kind`, e sem o kind o \"abrir a ficha\"\n // não sabe para onde ir.\n kind: person?.['kind'] ?? null,\n })\n }\n return out\n}\n\nfunction mapMemberRow(row: Record<string, unknown>): OrgMember {\n const profile = (row['profile'] as Record<string, unknown>) ?? {}\n return {\n id: row['id'] as string,\n userId: row['user_id'] as string,\n orgId: row['tenant_id'] as string,\n profileId: row['role'] as string,\n profileName: capitalize(row['role'] as string),\n personId: (row['person_id'] as string | null) ?? undefined,\n personKind: (profile['kind'] as string | null) ?? undefined,\n user: {\n id: row['user_id'] as string,\n email: (profile['email'] as string) ?? '',\n fullName: (profile['full_name'] as string) ?? '',\n avatarUrl: (profile['avatar_url'] as string | null) ?? undefined,\n },\n // tenant_members has no `joined_at` column — it's `created_at`.\n joinedAt: (row['joined_at'] ?? row['created_at']) as string,\n }\n}\n\nfunction mapLocationRow(row: Record<string, unknown>): Location {\n return {\n id: row['id'] as string,\n tenantId: row['tenant_id'] as string,\n name: row['name'] as string,\n address: (row['address'] as string | null) ?? undefined,\n city: (row['city'] as string | null) ?? undefined,\n state: (row['state'] as string | null) ?? undefined,\n country: (row['country'] as string | null) ?? undefined,\n phone: (row['phone'] as string | null) ?? undefined,\n isHeadquarters: (row['is_headquarters'] as boolean) ?? false,\n isActive: (row['is_active'] as boolean) ?? true,\n createdAt: row['created_at'] as string,\n updatedAt: row['updated_at'] as string,\n }\n}\n\nfunction mapInviteRow(row: Record<string, unknown>): Invite {\n return {\n id: row['id'] as string,\n orgId: row['tenant_id'] as string,\n email: row['email'] as string,\n profileId: row['role'] as string,\n profileName: capitalize(row['role'] as string),\n invitedBy: row['invited_by'] as string,\n token: row['token'] as string,\n status: (row['status'] as Invite['status']) ?? 'pending',\n createdAt: row['created_at'] as string,\n expiresAt: row['expires_at'] as string,\n }\n}\n\n/** Minimal role identity the adapter needs to build profiles. Grants come from\n * the DB catalog; id/name/order/description come from what the app declares. */\nexport interface RoleIdentity {\n id: string\n name: string\n description?: string\n /** System roles are app-defined and static (not user-editable). Custom roles\n * (duplicated by users, stored in app.roles) are false. Defaults true. */\n isSystem?: boolean\n}\n\n// Matrix emits read/create/edit/delete; map back to DB action verbs.\nconst DB_ACTION: Record<string, string> = {\n read: 'read', create: 'create', edit: 'update', write: 'create', manage: 'manage', delete: 'delete',\n}\n\nfunction slugifyRole(name: string): string {\n return name.toLowerCase().normalize('NFD').replace(/[\\u0300-\\u036f]/g, '')\n .replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '') || 'role'\n}\n\n// Fallback role set when the host app declares none. The SDK is domain-agnostic:\n// each app defines its OWN business roles (a salon's roles ≠ an agency's) via\n// config.permissions.defaultProfiles. These five are only a back-compat default.\nconst DEFAULT_ROLES: RoleIdentity[] = [\n { id: 'owner', name: 'Owner' },\n { id: 'admin', name: 'Admin' },\n { id: 'manager', name: 'Manager' },\n { id: 'staff', name: 'Staff' },\n { id: 'viewer', name: 'Viewer' },\n]\n\n// DB permission ids that confer an org-management system permission.\nconst SYSTEM_PERMISSION_MAP: Record<string, SystemPermission> = {\n 'team.read': 'manage_team',\n 'team.invite': 'manage_team',\n 'team.manage': 'manage_team',\n 'team.manage_roles': 'manage_permissions',\n 'billing.read': 'manage_billing',\n 'billing.manage': 'manage_billing',\n 'settings.read': 'manage_settings',\n 'settings.update': 'manage_settings',\n}\nconst ALL_SYSTEM_PERMISSIONS: SystemPermission[] = ['manage_team', 'manage_billing', 'manage_settings', 'manage_permissions']\n\n// Map DB permission ids to feature action grants\nfunction buildPermissionProfiles(\n roles: RoleIdentity[],\n permissions: Array<{ id: string; category: string }>,\n rolePerms: Array<{ role: string; permission_id: string }>,\n overrides: Array<{ role: string; permission_id: string; granted: boolean }>,\n): PermissionProfile[] {\n const overrideMap = new Map<string, boolean>()\n for (const o of overrides) {\n overrideMap.set(`${o.role}:${o.permission_id}`, o.granted)\n }\n\n // The role SET comes from what the app declares — the SDK no longer bakes it in.\n const rolePermMap = new Map<string, Set<string>>()\n for (const r of roles) {\n rolePermMap.set(r.id, new Set())\n }\n // Convention: an 'owner' role (if declared) gets every permission implicitly.\n if (rolePermMap.has('owner')) {\n for (const p of permissions) rolePermMap.get('owner')!.add(p.id)\n }\n for (const rp of rolePerms) {\n rolePermMap.get(rp.role)?.add(rp.permission_id)\n }\n\n // Apply overrides\n for (const [key, granted] of overrideMap) {\n const colonIdx = key.indexOf(':')\n const role = key.slice(0, colonIdx)\n const permId = key.slice(colonIdx + 1)\n const perms = rolePermMap.get(role)\n if (!perms) continue\n if (granted) {\n perms.add(permId)\n } else {\n perms.delete(permId)\n }\n }\n\n // Align DB actions with the matrix's action vocabulary (read/create/edit/delete).\n //\n // `manage` IS KEPT, not folded into `edit`. profileHasPermission answers\n // `actions.includes(action) || actions.includes('manage')` — manage is the\n // wildcard that implies the rest. Collapsing it here destroyed that meaning\n // BEFORE the engine ever saw it: a role granted `financial.manage` stored\n // `['edit']`, which contains neither `read` nor `manage`, so the Financeiro\n // role could not open the Financeiro module — the nav gates on `read`. Same\n // for every other `X.manage` grant in the catalog.\n const actionMap: Record<string, string> = {\n read: 'read',\n create: 'create',\n update: 'edit',\n manage: 'manage',\n delete: 'delete',\n configure: 'edit',\n invite: 'create',\n }\n\n return roles.map(({ id: role, name, description, isSystem }) => {\n const permIds = rolePermMap.get(role)!\n const features: Record<string, string[]> = {}\n\n for (const permId of permIds) {\n // LAST dot, not the first: a feature id may contain dots (plugin-crm\n // declares `crm.leads`), an action never does. Splitting on the first one\n // read `crm.leads.read` as feature `crm` + action `leads.read`, which no\n // action map knows — so every dotted feature the matrix granted came back\n // empty on the next load, silently.\n const dotIdx = permId.lastIndexOf('.')\n if (dotIdx <= 0) continue\n const category = permId.slice(0, dotIdx)\n const action = permId.slice(dotIdx + 1)\n const mappedAction = actionMap[action]\n if (!mappedAction) continue\n\n if (!features[category]) features[category] = []\n if (!features[category].includes(mappedAction)) {\n features[category].push(mappedAction)\n }\n }\n\n // Org-management system permissions, derived from team/billing/settings\n // grants (owner gets all four). These gate the Equipe/Permissões tabs.\n const systemPermissions: SystemPermission[] = []\n const source = role === 'owner' ? ALL_SYSTEM_PERMISSIONS : [...permIds].map((id) => SYSTEM_PERMISSION_MAP[id])\n for (const sp of source) {\n if (sp && !systemPermissions.includes(sp)) systemPermissions.push(sp)\n }\n\n return {\n id: role,\n name: name || capitalize(role),\n description,\n isSystem: isSystem ?? true,\n systemPermissions,\n grants: features,\n }\n })\n}\n\n// ---------------------------------------------------------------------------\n// Adapter factory\n// ---------------------------------------------------------------------------\n\nexport interface SupabaseOrgAdapterConfig {\n /** Deprecated — core tables now live in the public schema; this field is ignored. */\n coreSchema?: string\n /** Business roles the host app declares (config.permissions.defaultProfiles).\n * Falls back to the generic five when omitted. */\n roles?: RoleIdentity[]\n /** Auth adapter used to actually DELIVER invites (send the e-mail + create the\n * auth user) — the org adapter only records the audit row. Injected by the app;\n * when omitted, invites are recorded but not delivered. */\n authAdapter?: AuthAdapter\n /** Canonical, deployment-fixed origin baked into invite/magic-link redirects\n * (e.g. https://beauty-saas.live.fayz.ai). The container injects it as\n * VITE_APP_URL; the app wiring passes it here. Falls back to\n * window.location.origin, which is wrong when an admin invites from a preview\n * or localhost origin. Note: whatever origin ends up here must ALSO be in the\n * Supabase project's Redirect URLs allow-list, or Supabase silently swaps it\n * for its Site URL (default http://localhost:3000). */\n siteUrl?: string\n}\n\nexport function createSupabaseOrgAdapter(config?: SupabaseOrgAdapterConfig): OrgAdapter {\n const roles: RoleIdentity[] = config?.roles && config.roles.length > 0 ? config.roles : DEFAULT_ROLES\n const authAdapter = config?.authAdapter\n const originBase =\n config?.siteUrl?.replace(/\\/+$/, '') ??\n (typeof window !== 'undefined' ? window.location.origin : undefined)\n const inviteRedirectTo = originBase ? `${originBase}/` : undefined\n\n function supabase() {\n return getFayzSupabaseClient()\n }\n\n function core() {\n return supabase()\n }\n\n return {\n async acceptPendingInvites(): Promise<number> {\n const { data, error } = await supabase().rpc('accept_pending_invitations')\n if (error) {\n // A pool still on the pre-022 spine has no such function. Not fatal —\n // the user just lands org-less, exactly as before this shipped.\n console.warn('[org] accept_pending_invitations failed:', error.message)\n return 0\n }\n return typeof data === 'number' ? data : 0\n },\n\n async listUserOrgs(userId: string): Promise<OrgMembership[]> {\n return dedup(`listUserOrgs:${userId}`, async () => {\n const { data, error } = await core()\n .from('v_team_members')\n .select('tenant_id, role, tenant:tenants(id, name, slug, logo_url)')\n .eq('user_id', userId)\n\n if (error) throw error\n\n let rows = (data ?? []) as Array<Record<string, unknown>>\n\n // Narrow to the accounts that run THIS app (008). A beauty account\n // listed inside the restaurant product is not a shortcut — it opens a\n // rail whose screens its data cannot fill. The app you are looking at\n // is the bundle's own fact (VITE_APP_ID); the database cannot infer it,\n // because one account may run several apps at once.\n //\n // Best-effort on purpose: no app id, no view (a pool predating 008), or\n // any error at all leaves the list exactly as it was. Hiding an account\n // because a filter failed is worse than showing one too many.\n const appId = resolveAppId()\n if (appId && rows.length > 1) {\n const { data: scoped, error: scopeError } = await core()\n .from('v_tenant_apps')\n .select('tenant_id')\n .eq('app_id', appId)\n if (!scopeError && Array.isArray(scoped)) {\n const runsThisApp = new Set(scoped.map((r) => (r as { tenant_id: string }).tenant_id))\n const kept = rows.filter((row) => runsThisApp.has(row['tenant_id'] as string))\n // An empty result would leave the person with no workspace at all\n // and no way to say so; the unfiltered list is the safer answer.\n if (kept.length > 0) rows = kept\n }\n }\n\n // Every field here is nullable in practice and none of them is worth\n // the whole list. A pool on the pre-014 spine answers this query with\n // `tenant` and `role` NULL — the workspace picker has to read across\n // accounts, and until 014 the policies on public.tenants and app.roles\n // were scoped to the account you had not chosen yet. `capitalize(null)`\n // threw, took listUserOrgs with it, and left a seven-workspace account\n // looking at \"you belong to none\". A missing name is a bad row; it is\n // not a reason to lose the six good ones next to it.\n return rows.map((row) => {\n const tenant = (row['tenant'] as Record<string, unknown> | null) ?? {}\n const role = (row['role'] as string | null) ?? ''\n return {\n orgId: row['tenant_id'] as string,\n orgName: (tenant['name'] as string) ?? '',\n orgSlug: (tenant['slug'] as string) ?? '',\n orgLogoUrl: (tenant['logo_url'] as string | null) ?? undefined,\n profileId: role,\n profileName: capitalize(role),\n }\n })\n })\n },\n\n async getOrg(orgId: string): Promise<Organization> {\n const { data, error } = await core()\n .from('tenants')\n .select('*')\n .eq('id', orgId)\n .single()\n\n if (error) throw error\n return mapTenantToOrg(data as Record<string, unknown>)\n },\n\n async createOrg(name: string, userId: string, options?: CreateOrgOptions): Promise<Organization> {\n const { data: tenant, error } = await supabase()\n .rpc('create_tenant_with_owner', {\n p_name: name,\n p_slug: slugify(name),\n p_user_id: userId,\n p_vertical_id: options?.verticalId ?? null,\n p_plan: 'free',\n p_settings: {\n timezone: options?.timezone ?? 'America/Sao_Paulo',\n currency: options?.currency ?? 'BRL',\n locale: options?.locale ?? 'pt-BR',\n teamSize: options?.teamSize ?? undefined,\n branding: options?.branding ?? {},\n },\n })\n\n if (error) throw error\n return mapTenantToOrg(tenant as Record<string, unknown>)\n },\n\n async updateOrg(orgId: string, updates: Partial<Organization>): Promise<Organization> {\n const row: Record<string, unknown> = {}\n if (updates.name !== undefined) row['name'] = updates.name\n if (updates.slug !== undefined) row['slug'] = updates.slug\n if (updates.logoUrl !== undefined) row['logo_url'] = updates.logoUrl\n if (updates.verticalId !== undefined) row['vertical_id'] = updates.verticalId\n if (updates.plan !== undefined) row['plan'] = updates.plan\n if (updates.settings !== undefined) row['settings'] = updates.settings\n\n const { data, error } = await core()\n .from('tenants')\n .update(row)\n .eq('id', orgId)\n .select()\n .single()\n\n if (error) throw error\n return mapTenantToOrg(data as Record<string, unknown>)\n },\n\n async listMembers(orgId: string): Promise<OrgMember[]> {\n const { data, error } = await core()\n .from('v_team_members')\n .select('*')\n .eq('tenant_id', orgId)\n\n if (error) throw error\n\n const rows = (data ?? []) as Array<Record<string, unknown>>\n const profileMap = await namesForLogins(rows, core())\n\n return rows.map((row) => {\n const profile = profileMap.get(row['user_id'] as string) ?? {}\n return mapMemberRow({ ...row, profile })\n })\n },\n\n // Person-first team list: people of `personKinds` are the roster and\n // `tenant_members` (login + role) is the overlay linked by person_id — plus\n // every membership that links to no listed person, so an account with access\n // is never missing from its own Team screen. See buildTeamRows.\n async listTeam(orgId: string, personKinds: string[]): Promise<TeamPerson[]> {\n if (!personKinds || personKinds.length === 0) return []\n\n const [peopleResult, membersResult] = await Promise.all([\n core()\n .from('people')\n .select('id, name, kind, email, avatar_url, is_active')\n .eq('tenant_id', orgId)\n .in('kind', personKinds)\n // Only people still on the roster. `not is false` rather than\n // `eq true` so a row that never set the flag stays visible — the\n // same `?? true` reading buildTeamRows applies. A deactivated\n // person who still holds a login does not vanish: their membership\n // stops matching a listed person and comes back as a login row,\n // which is the invariant that keeps access auditable.\n .not('is_active', 'is', false),\n core()\n .from('v_team_members')\n .select('id, user_id, role, person_id, created_at')\n .eq('tenant_id', orgId),\n ])\n if (peopleResult.error) throw peopleResult.error\n\n const people = (peopleResult.data ?? []) as TeamPeopleRow[]\n const members = (membersResult.data ?? []) as TeamMemberRow[]\n\n // Login-only rows are named from the person their membership points at,\n // falling back to the auth profile (see namesForLogins — `profiles` is\n // empty in some pools, which left this whole screen nameless). The\n // session is the last fallback, and only for your own row.\n const [nameMap, sessionResult] = await Promise.all([\n namesForLogins(members as unknown as Array<Record<string, unknown>>, core()),\n core().auth.getSession(),\n ])\n\n const sessionUser = sessionResult?.data?.session?.user\n const currentUser = sessionUser\n ? {\n id: sessionUser.id,\n email: sessionUser.email,\n fullName: (sessionUser.user_metadata?.['full_name'] as string | undefined) ?? undefined,\n }\n : null\n\n return buildTeamRows(people, members, [...nameMap.values()] as unknown as TeamProfileRow[], currentUser)\n },\n\n // Verbs, not writes into the projection: v_team_members is a JOINed view\n // and accepts neither UPDATE nor DELETE, and each RPC checks the permission\n // in one place. `_orgId` stays in the signature for the adapter contract —\n // the RPCs take the tenant from the session, not from a parameter.\n async updateMemberProfile(_orgId: string, memberId: string, profileId: string): Promise<void> {\n // member_set_role refuses to demote the last owner. This screen cannot\n // know it was the last one, which is exactly why the check moved.\n const { error } = await core().rpc('member_set_role', { p_membership: memberId, p_role: profileId })\n if (error) throw error\n },\n\n async removeMember(_orgId: string, memberId: string): Promise<void> {\n const { error } = await core().rpc('member_remove', { p_membership: memberId })\n if (error) throw error\n },\n\n // #136 moved authorization into app.*, reachable through the v_authz_*\n // views (security_invoker, so RLS still decides what a caller sees) and a\n // small set of RPCs. The four public mirrors this used to read and write —\n // permissions, role_permissions, tenant_roles, tenant_role_overrides — are\n // dropped by @fayz-ai/db 003.\n //\n // The RPCs take the tenant from the SESSION, not a parameter, so orgId is\n // asserted against the active tenant rather than passed down: writing to\n // one org while another is active was never possible and should fail\n // loudly rather than silently touch the wrong one.\n async listProfiles(orgId: string): Promise<PermissionProfile[]> {\n const [permsResult, rolesResult, grantsResult] = await Promise.all([\n core().from('v_authz_permissions').select('key, plugin'),\n core().from('v_authz_roles').select('id, key, name, description, is_system').eq('tenant_id', orgId),\n core().from('v_authz_role_permissions').select('role_id, permission').eq('tenant_id', orgId),\n ])\n\n if (permsResult.error) throw permsResult.error\n if (rolesResult.error) throw rolesResult.error\n if (grantsResult.error) throw grantsResult.error\n\n const dbRoles = (rolesResult.data ?? []) as Array<{\n id: string; key: string; name: string; description: string | null; is_system: boolean\n }>\n const keyOf = new Map(dbRoles.map((r) => [r.id, r.key]))\n\n // The app still declares its own role SET; the database now supplies the\n // custom ones a tenant created. A system role the DB knows and the app\n // does not is still shown — it holds grants either way.\n const declared: RoleIdentity[] = roles.map((r) => ({ ...r, isSystem: true }))\n const declaredIds = new Set(declared.map((r) => r.id))\n const fromDb: RoleIdentity[] = dbRoles\n .filter((r) => !declaredIds.has(r.key))\n .map((r) => ({ id: r.key, name: r.name, description: r.description ?? undefined, isSystem: r.is_system }))\n\n // app.role_permissions is per TENANT, so every grant is that tenant's own.\n // The global defaults table this used to read was documented as always\n // empty and measured empty in every pool, so there is no third source to\n // merge — the grants go in as overrides and the base layer is bare.\n const overrides = ((grantsResult.data ?? []) as Array<{ role_id: string; permission: string }>)\n .flatMap((g) => {\n const role = keyOf.get(g.role_id)\n return role ? [{ role, permission_id: g.permission, granted: true }] : []\n })\n\n return buildPermissionProfiles(\n [...declared, ...fromDb],\n ((permsResult.data ?? []) as Array<{ key: string; plugin: string }>)\n .map((p) => ({ id: p.key, category: p.plugin })),\n [],\n overrides,\n )\n },\n\n async createProfile(\n orgId: string,\n profile: Omit<PermissionProfile, 'id' | 'isSystem'>,\n ): Promise<PermissionProfile> {\n const existingRoles = await core().from('v_authz_roles').select('key, is_system').eq('tenant_id', orgId)\n if (existingRoles.error) throw existingRoles.error\n const rows = (existingRoles.data ?? []) as Array<{ key: string; is_system: boolean }>\n const existing = new Set(rows.map((r) => r.key))\n\n let key = slugifyRole(profile.name)\n if (existing.has(key) || roles.some((r) => r.id === key)) {\n let n = 2\n while (existing.has(`${key}-${n}`) || roles.some((r) => r.id === `${key}-${n}`)) n++\n key = `${key}-${n}`\n }\n\n // role_create_from_template always clones something — there is no \"empty\n // role\" verb. Cloning the narrowest role available and then setting the\n // grants explicitly lands on exactly the requested set either way, and\n // never on a role that briefly held more than it should.\n const seed = rows.find((r) => r.is_system && r.key === 'viewer')?.key\n ?? rows.find((r) => r.is_system)?.key\n ?? rows[0]?.key\n if (!seed) throw new Error('createProfile: the tenant has no role to clone from')\n\n const created = await core().rpc('role_create_from_template', {\n p_role_key: key,\n p_name: profile.name,\n p_template_role: seed,\n p_template: null,\n p_description: profile.description ?? null,\n })\n if (created.error) throw created.error\n const roleId = created.data as string\n\n const keys = Object.entries(profile.grants ?? {}).flatMap(([category, actions]) =>\n actions.map((action) => `${category}.${DB_ACTION[action] ?? action}`),\n )\n const set = await core().rpc('role_set_permissions', { p_role_id: roleId, p_keys: keys })\n if (set.error) throw set.error\n\n const profiles = await this.listProfiles(orgId)\n return profiles.find((p) => p.id === key) ?? {\n id: key, name: profile.name, description: profile.description, isSystem: false,\n systemPermissions: profile.systemPermissions ?? [], grants: profile.grants ?? {},\n }\n },\n\n async updateProfile(\n orgId: string,\n profileId: string,\n data: Partial<PermissionProfile>,\n ): Promise<PermissionProfile> {\n // The RPCs address a role by its uuid; the matrix addresses it by key.\n const found = await core()\n .from('v_authz_roles').select('id, name, description, is_system')\n .eq('tenant_id', orgId).eq('key', profileId).maybeSingle()\n if (found.error) throw found.error\n if (!found.data) throw new Error(`Profile not found: ${profileId}`)\n const role = found.data as { id: string; name: string; description: string | null; is_system: boolean }\n\n if (data.name !== undefined || data.description !== undefined) {\n const { error } = await core().rpc('role_rename', {\n p_role_id: role.id,\n p_name: data.name ?? role.name,\n // Explicit, not coalesced: role_rename treats NULL as \"clear it\", so\n // an untouched description has to be sent back as it was.\n p_description: data.description !== undefined ? (data.description ?? null) : role.description,\n })\n if (error) throw error\n }\n\n if (data.grants) {\n const keys = Object.entries(data.grants).flatMap(([category, actions]) =>\n actions.map((action) => `${category}.${DB_ACTION[action] ?? action}`),\n )\n // One call, not delete-then-insert: role_set_permissions reconciles to\n // the given set inside one transaction, so the role is never briefly\n // holding nothing.\n const { error } = await core().rpc('role_set_permissions', { p_role_id: role.id, p_keys: keys })\n if (error) throw error\n }\n\n const profiles = await this.listProfiles(orgId)\n const updated = profiles.find((p) => p.id === profileId)\n if (!updated) throw new Error(`Profile not found: ${profileId}`)\n return updated\n },\n\n async deleteProfile(orgId: string, profileId: string): Promise<void> {\n const found = await core()\n .from('v_authz_roles').select('id, is_system')\n .eq('tenant_id', orgId).eq('key', profileId).maybeSingle()\n if (found.error) throw found.error\n if (!found.data) throw new Error('System roles cannot be deleted.')\n const role = found.data as { id: string; is_system: boolean }\n if (role.is_system) throw new Error('System roles cannot be deleted.')\n\n // role_delete refuses a role an active member still holds, and says how\n // many. That refusal is the point: it used to demote them silently.\n const { error } = await core().rpc('role_delete', { p_role_id: role.id })\n if (error) throw error\n },\n\n async listInvites(orgId: string): Promise<Invite[]> {\n const { data, error } = await core()\n .from('invitations')\n .select('*')\n .eq('tenant_id', orgId)\n .order('created_at', { ascending: false })\n\n if (error) throw error\n return ((data ?? []) as Array<Record<string, unknown>>).map(mapInviteRow)\n },\n\n async createInvite(orgId: string, email: string, profileId: string, invitedBy: string): Promise<Invite> {\n const { data, error } = await core()\n .from('invitations')\n .insert({\n tenant_id: orgId,\n email,\n role: profileId,\n invited_by: invitedBy,\n })\n .select()\n .single()\n\n if (error) throw error\n // Deliver via the auth abstraction (sends the e-mail + creates the auth user,\n // stamping tenant_id/role on its metadata for the accept-time membership trigger).\n await authAdapter?.inviteUser?.(email, {\n redirectTo: inviteRedirectTo,\n data: { tenant_id: orgId, role: profileId, invited_by: invitedBy },\n })\n return mapInviteRow(data as Record<string, unknown>)\n },\n\n async bulkInvite(orgId: string, emails: string[], profileId: string, invitedBy: string): Promise<Invite[]> {\n const rows = emails.map((email) => ({\n tenant_id: orgId,\n email,\n role: profileId,\n invited_by: invitedBy,\n }))\n\n const { data, error } = await core().from('invitations').insert(rows).select()\n if (error) throw error\n await Promise.all(\n emails.map((email) =>\n authAdapter?.inviteUser?.(email, {\n redirectTo: inviteRedirectTo,\n data: { tenant_id: orgId, role: profileId, invited_by: invitedBy },\n }),\n ),\n )\n return ((data ?? []) as Array<Record<string, unknown>>).map(mapInviteRow)\n },\n\n async revokeInvite(orgId: string, inviteId: string): Promise<void> {\n const { error } = await core()\n .from('invitations')\n .update({ status: 'revoked' })\n .eq('id', inviteId)\n .eq('tenant_id', orgId)\n\n if (error) throw error\n },\n\n async resendInvite(orgId: string, inviteId: string): Promise<Invite> {\n const { data, error } = await core()\n .from('invitations')\n .update({\n status: 'pending',\n expires_at: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(),\n })\n .eq('id', inviteId)\n .eq('tenant_id', orgId)\n .select()\n .single()\n\n if (error) throw error\n const row = data as Record<string, unknown>\n // Re-send the invite e-mail through the auth abstraction.\n await authAdapter?.inviteUser?.(row.email as string, {\n redirectTo: inviteRedirectTo,\n data: { tenant_id: orgId, role: row.role as string, invited_by: row.invited_by as string },\n })\n return mapInviteRow(row)\n },\n\n async listLocations(orgId: string): Promise<Location[]> {\n const { data, error } = await core()\n .from('v_units')\n .select('*')\n .eq('tenant_id', orgId)\n .order('is_headquarters', { ascending: false })\n .order('name')\n\n if (error) throw error\n return ((data ?? []) as Array<Record<string, unknown>>).map(mapLocationRow)\n },\n\n async createLocation(\n orgId: string,\n input: {\n name: string\n address?: string\n city?: string\n state?: string\n country?: string\n phone?: string\n isHeadquarters?: boolean\n },\n ): Promise<Location> {\n const { data, error } = await core()\n .rpc('unit_create', {\n p_name: input.name,\n p_kind: input.isHeadquarters ? 'hq' : 'branch',\n p_parent_unit: null,\n // app.units keeps a unit's contact details in metadata; v_units reads\n // them back out under the flat names this screen already uses.\n p_metadata: {\n address: input.address ?? null,\n city: input.city ?? null,\n state: input.state ?? null,\n country: input.country ?? 'BR',\n phone: input.phone ?? null,\n },\n })\n\n if (error) throw error\n const created = await core().from('v_units').select('*').eq('id', data as string).single()\n if (created.error) throw created.error\n return mapLocationRow(created.data as Record<string, unknown>)\n },\n }\n}\n","import type {\n OrgAdapter,\n Organization,\n OrgMember,\n OrgMembership,\n CreateOrgOptions,\n Location,\n Invite,\n} from '@fayz-ai/core'\nimport type { PermissionProfile } from '@fayz-ai/core'\n\nconst STORAGE_KEY = 'fayz:mock-orgs'\n\ninterface MockOrgData {\n orgs: Organization[]\n members: OrgMember[]\n profiles: Record<string, PermissionProfile[]>\n invites: Record<string, Invite[]>\n userOrgMap: Record<string, string[]>\n}\n\nfunction getStored(): MockOrgData {\n try {\n if (typeof localStorage === 'undefined') return empty()\n const raw = localStorage.getItem(STORAGE_KEY)\n if (raw) return JSON.parse(raw) as MockOrgData\n } catch {\n // ignore\n }\n return empty()\n}\n\nfunction empty(): MockOrgData {\n return { orgs: [], members: [], profiles: {}, invites: {}, userOrgMap: {} }\n}\n\nfunction setStored(data: MockOrgData): void {\n try {\n if (typeof localStorage === 'undefined') return\n localStorage.setItem(STORAGE_KEY, JSON.stringify(data))\n } catch {\n // ignore\n }\n}\n\nfunction slugify(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '')\n}\n\nexport function createMockOrgAdapter(defaultProfiles?: PermissionProfile[]): OrgAdapter {\n function seedOrgForUser(userId: string, userName?: string): MockOrgData {\n const data = getStored()\n if (data.userOrgMap[userId]?.length) return data\n\n const orgId = crypto.randomUUID()\n const memberId = crypto.randomUUID()\n const firstProfile = defaultProfiles?.[0]\n\n const org: Organization = {\n id: orgId,\n name: 'My Organization',\n slug: 'my-organization',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n\n const member: OrgMember = {\n id: memberId,\n userId,\n orgId,\n profileId: firstProfile?.id ?? 'owner',\n profileName: firstProfile?.name ?? 'Owner',\n user: {\n id: userId,\n email: userName\n ? `${userName.toLowerCase().replace(/\\s+/g, '.')}@example.com`\n : 'user@example.com',\n fullName: userName ?? 'Current User',\n },\n joinedAt: new Date().toISOString(),\n }\n\n data.orgs.push(org)\n data.members.push(member)\n data.userOrgMap[userId] = [orgId]\n if (defaultProfiles) {\n data.profiles[orgId] = [...defaultProfiles]\n }\n data.invites[orgId] = []\n\n setStored(data)\n return data\n }\n\n return {\n async listUserOrgs(userId: string): Promise<OrgMembership[]> {\n const data = seedOrgForUser(userId)\n const orgIds = data.userOrgMap[userId] ?? []\n return orgIds.map((orgId) => {\n const org = data.orgs.find((o) => o.id === orgId)!\n const member = data.members.find((m) => m.orgId === orgId && m.userId === userId)\n return {\n orgId,\n orgName: org.name,\n orgSlug: org.slug,\n orgLogoUrl: org.logoUrl,\n profileId: member?.profileId ?? 'owner',\n profileName: member?.profileName ?? 'Owner',\n }\n })\n },\n\n async getOrg(orgId: string): Promise<Organization> {\n const data = getStored()\n const org = data.orgs.find((o) => o.id === orgId)\n if (!org) throw new Error(`Org not found: ${orgId}`)\n return org\n },\n\n async createOrg(name: string, userId: string, options?: CreateOrgOptions): Promise<Organization> {\n const data = getStored()\n const orgId = crypto.randomUUID()\n const firstProfile = defaultProfiles?.[0]\n\n const org: Organization = {\n id: orgId,\n name,\n slug: slugify(name),\n verticalId: options?.verticalId,\n plan: 'free',\n settings: {\n timezone: options?.timezone ?? 'America/Sao_Paulo',\n currency: options?.currency ?? 'BRL',\n locale: options?.locale ?? 'pt-BR',\n },\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n\n const member: OrgMember = {\n id: crypto.randomUUID(),\n userId,\n orgId,\n profileId: firstProfile?.id ?? 'owner',\n profileName: firstProfile?.name ?? 'Owner',\n user: {\n id: userId,\n email: 'user@example.com',\n fullName: 'Current User',\n },\n joinedAt: new Date().toISOString(),\n }\n\n data.orgs.push(org)\n data.members.push(member)\n if (!data.userOrgMap[userId]) data.userOrgMap[userId] = []\n data.userOrgMap[userId].push(orgId)\n if (defaultProfiles) {\n data.profiles[orgId] = [...defaultProfiles]\n }\n data.invites[orgId] = []\n\n setStored(data)\n return org\n },\n\n async updateOrg(orgId: string, updates: Partial<Organization>): Promise<Organization> {\n const data = getStored()\n const idx = data.orgs.findIndex((o) => o.id === orgId)\n if (idx === -1) throw new Error(`Org not found: ${orgId}`)\n data.orgs[idx] = { ...data.orgs[idx], ...updates, updatedAt: new Date().toISOString() }\n setStored(data)\n return data.orgs[idx]\n },\n\n async listMembers(orgId: string): Promise<OrgMember[]> {\n const data = getStored()\n return data.members.filter((m) => m.orgId === orgId)\n },\n\n async updateMemberProfile(orgId: string, memberId: string, profileId: string): Promise<void> {\n const data = getStored()\n const member = data.members.find((m) => m.id === memberId && m.orgId === orgId)\n if (!member) throw new Error(`Member not found: ${memberId}`)\n const profiles = data.profiles[orgId] ?? []\n const profile = profiles.find((p) => p.id === profileId)\n member.profileId = profileId\n member.profileName = profile?.name ?? profileId\n setStored(data)\n },\n\n async removeMember(orgId: string, memberId: string): Promise<void> {\n const data = getStored()\n const memberIdx = data.members.findIndex((m) => m.id === memberId && m.orgId === orgId)\n if (memberIdx === -1) return\n const member = data.members[memberIdx]\n data.members.splice(memberIdx, 1)\n const userOrgs = data.userOrgMap[member.userId]\n if (userOrgs) {\n const orgIdx = userOrgs.indexOf(orgId)\n if (orgIdx !== -1) userOrgs.splice(orgIdx, 1)\n }\n setStored(data)\n },\n\n async listProfiles(orgId: string): Promise<PermissionProfile[]> {\n const data = getStored()\n return data.profiles[orgId] ?? defaultProfiles ?? []\n },\n\n async createProfile(\n orgId: string,\n profile: Omit<PermissionProfile, 'id' | 'isSystem'>,\n ): Promise<PermissionProfile> {\n const data = getStored()\n const newProfile: PermissionProfile = {\n ...profile,\n id: crypto.randomUUID(),\n isSystem: false,\n }\n if (!data.profiles[orgId]) {\n data.profiles[orgId] = defaultProfiles ? [...defaultProfiles] : []\n }\n data.profiles[orgId].push(newProfile)\n setStored(data)\n return newProfile\n },\n\n async updateProfile(\n orgId: string,\n profileId: string,\n updates: Partial<PermissionProfile>,\n ): Promise<PermissionProfile> {\n const data = getStored()\n const profiles = data.profiles[orgId] ?? []\n const idx = profiles.findIndex((p) => p.id === profileId)\n if (idx === -1) throw new Error(`Profile not found: ${profileId}`)\n profiles[idx] = { ...profiles[idx], ...updates }\n data.profiles[orgId] = profiles\n setStored(data)\n return profiles[idx]\n },\n\n async deleteProfile(orgId: string, profileId: string): Promise<void> {\n const data = getStored()\n const profiles = data.profiles[orgId] ?? []\n const profile = profiles.find((p) => p.id === profileId)\n if (profile?.isSystem) throw new Error('Cannot delete system profile')\n data.profiles[orgId] = profiles.filter((p) => p.id !== profileId)\n setStored(data)\n },\n\n async listInvites(orgId: string): Promise<Invite[]> {\n const data = getStored()\n return data.invites[orgId] ?? []\n },\n\n async createInvite(\n orgId: string,\n email: string,\n profileId: string,\n invitedBy: string,\n ): Promise<Invite> {\n const data = getStored()\n const profiles = data.profiles[orgId] ?? defaultProfiles ?? []\n const profile = profiles.find((p) => p.id === profileId)\n\n const invite: Invite = {\n id: crypto.randomUUID(),\n orgId,\n email,\n profileId,\n profileName: profile?.name ?? profileId,\n invitedBy,\n token: crypto.randomUUID(),\n status: 'pending',\n createdAt: new Date().toISOString(),\n expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(),\n }\n\n if (!data.invites[orgId]) data.invites[orgId] = []\n data.invites[orgId].push(invite)\n setStored(data)\n return invite\n },\n\n async bulkInvite(\n orgId: string,\n emails: string[],\n profileId: string,\n invitedBy: string,\n ): Promise<Invite[]> {\n const results: Invite[] = []\n for (const email of emails) {\n results.push(await this.createInvite(orgId, email, profileId, invitedBy))\n }\n return results\n },\n\n async revokeInvite(orgId: string, inviteId: string): Promise<void> {\n const data = getStored()\n const invites = data.invites[orgId] ?? []\n const invite = invites.find((i) => i.id === inviteId)\n if (invite) {\n invite.status = 'expired'\n setStored(data)\n }\n },\n\n async resendInvite(orgId: string, inviteId: string): Promise<Invite> {\n const data = getStored()\n const invites = data.invites[orgId] ?? []\n const invite = invites.find((i) => i.id === inviteId)\n if (!invite) throw new Error(`Invite not found: ${inviteId}`)\n invite.expiresAt = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString()\n invite.status = 'pending'\n setStored(data)\n return invite\n },\n\n async listLocations(_orgId: string): Promise<Location[]> {\n return []\n },\n\n async createLocation(\n orgId: string,\n input: {\n name: string\n address?: string\n city?: string\n state?: string\n country?: string\n phone?: string\n isHeadquarters?: boolean\n },\n ): Promise<Location> {\n return {\n id: crypto.randomUUID(),\n tenantId: orgId,\n name: input.name,\n address: input.address,\n city: input.city,\n state: input.state,\n country: input.country ?? 'BR',\n phone: input.phone,\n isHeadquarters: input.isHeadquarters ?? false,\n isActive: true,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n },\n }\n}\n","import * as React from 'react'\nimport type { OrgMembership } from '@fayz-ai/core'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Button, Checkbox, cn } from '@fayz-ai/ui'\nimport { Building2, Check } from 'lucide-react'\nimport { useTenant } from './context'\nimport { setAutoPick } from './choice'\n\nexport interface WorkspaceChooserProps {\n /** Every workspace this account can open in THIS app. */\n memberships: OrgMembership[]\n /** The last one this browser was in — pre-selected, not auto-entered. */\n suggestedId: string | null\n /** Present only when there is a workspace to go back to (the switcher route). */\n onCancel?: () => void\n}\n\n/**\n * \"Which of your workspaces?\" — asked once, on the way in.\n *\n * Deliberately a full screen rather than a dialog. Behind it the shell would be\n * rendering an account nobody has chosen yet, and every plugin on it would be\n * firing tenant-scoped requests against that guess; a dialog implies there is\n * something valid underneath, and there is not.\n */\nexport function WorkspaceChooser({ memberships, suggestedId, onCancel }: WorkspaceChooserProps) {\n const t = useTranslation()\n const tr = (key: string, fallback: string) => {\n const v = t(key)\n return !v || v === key ? fallback : v\n }\n\n const { switchOrg } = useTenant()\n const [selected, setSelected] = React.useState<string | null>(\n suggestedId ?? memberships[0]?.orgId ?? null,\n )\n // Off by default, deliberately, for as long as this flow is being validated:\n // asking every time is a second of friction, and silently opening the wrong\n // account is a support ticket. Opting out stays available; it is just not\n // something anyone gets handed without choosing it.\n const [remember, setRemember] = React.useState(false)\n const [entering, setEntering] = React.useState(false)\n\n const enter = async (orgId: string) => {\n if (entering) return\n setEntering(true)\n // The preference is written BEFORE the switch: switchOrg re-renders this\n // component out of existence, so anything queued after it may never run.\n setAutoPick(remember)\n try {\n await switchOrg(orgId)\n } finally {\n setEntering(false)\n }\n }\n\n return (\n <div className=\"flex min-h-screen items-center justify-center bg-background p-4\">\n <div className=\"w-full max-w-md\">\n <div className=\"mb-6 text-center\">\n <h1 className=\"text-xl font-semibold text-foreground\">\n {tr('organization.chooseWorkspace', 'Escolha uma área de trabalho')}\n </h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {tr(\n 'organization.chooseWorkspaceDescription',\n 'Você tem acesso a mais de uma. Selecione em qual deseja entrar.',\n )}\n </p>\n </div>\n\n <div\n role=\"radiogroup\"\n aria-label={tr('organization.workspaces', 'Workspaces')}\n className=\"space-y-2\"\n >\n {memberships.map((m) => {\n const isSelected = m.orgId === selected\n const isSuggested = m.orgId === suggestedId\n return (\n <button\n key={m.orgId}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n disabled={entering}\n onClick={() => setSelected(m.orgId)}\n // A double click should not have to become a click and a\n // journey down to the button.\n onDoubleClick={() => void enter(m.orgId)}\n className={cn(\n 'flex w-full items-center gap-3 rounded-lg border p-3 text-left transition-colors',\n 'disabled:opacity-60',\n isSelected\n ? 'border-primary bg-primary/5'\n : 'border-border hover:border-primary/50 hover:bg-muted/50',\n )}\n >\n <WorkspaceMark name={m.orgName} logoUrl={m.orgLogoUrl} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-medium text-foreground\">\n {m.orgName || m.orgSlug || m.orgId}\n </span>\n <span className=\"block truncate text-xs text-muted-foreground\">\n {m.profileName}\n {isSuggested && ` · ${tr('organization.lastUsed', 'último acesso')}`}\n </span>\n </span>\n {isSelected && <Check className=\"h-4 w-4 shrink-0 text-primary\" />}\n </button>\n )\n })}\n </div>\n\n {/* Not a <label>: Checkbox renders a <button>, and a label does not\n forward its click to one. The text carries its own handler instead,\n outside the button, so neither click double-toggles the other. */}\n <div className=\"mt-5 flex items-center gap-2.5 text-sm text-muted-foreground\">\n <Checkbox\n checked={remember}\n onChange={setRemember}\n disabled={entering}\n aria-label={tr('organization.rememberChoice', 'Não perguntar novamente neste dispositivo')}\n />\n <span className=\"cursor-pointer select-none\" onClick={() => !entering && setRemember(!remember)}>\n {tr('organization.rememberChoice', 'Não perguntar novamente neste dispositivo')}\n </span>\n </div>\n\n <div className=\"mt-5 flex gap-2\">\n {onCancel && (\n <Button variant=\"outline\" className=\"flex-1\" onClick={onCancel} disabled={entering}>\n {tr('common.cancel', 'Cancelar')}\n </Button>\n )}\n <Button\n className=\"flex-1\"\n disabled={!selected || entering}\n onClick={() => selected && void enter(selected)}\n >\n {entering ? tr('common.loading', 'Entrando…') : tr('organization.enter', 'Entrar')}\n </Button>\n </div>\n\n {/* The escape hatch for the checkbox above: somebody who ticked it and\n later needs a different workspace has to be told where the question\n went, or \"do not ask again\" reads as \"never again\". */}\n <p className=\"mt-4 text-center text-xs text-muted-foreground\">\n {tr(\n 'organization.switchLaterHint',\n 'Você pode trocar a qualquer momento pelo seletor no topo da tela.',\n )}\n </p>\n </div>\n </div>\n )\n}\n\n/** The workspace's face, at picker size: its logo, or its initials. */\nfunction WorkspaceMark({ name, logoUrl }: { name: string; logoUrl?: string }) {\n if (logoUrl) {\n return <img src={logoUrl} alt=\"\" className=\"h-9 w-9 shrink-0 rounded-lg object-cover\" />\n }\n const initials = name\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((w) => w[0])\n .join('')\n .toUpperCase()\n return (\n <span className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-primary/10 text-xs font-semibold text-primary\">\n {initials || <Building2 className=\"h-4 w-4\" />}\n </span>\n )\n}\n","import * as React from 'react'\nimport { getPersistedOrgId } from './store'\nimport { useTenantOptional } from './context'\nimport { WorkspaceChooser } from './WorkspaceChooser'\n\nexport interface WorkspaceChooserGateProps {\n /** Held on screen while the membership list is still in flight. */\n fallback?: React.ReactNode\n children: React.ReactNode\n}\n\n/**\n * Puts the workspace picker in front of the shell when this account owes a\n * choice, and gets out of the way when it does not.\n *\n * There is no new state to keep: `decideWorkspaceChoice` already refuses to\n * pick for the provider in exactly this case, so \"a list we have read, more\n * than one row in it, and no active workspace\" IS the question being open.\n * A separate flag would be a second copy of that fact, free to disagree.\n *\n * Mounted between the setup gate and the shell: an account with NO workspace\n * belongs to the setup flow (there is nothing to choose from), and an account\n * with one never sees this at all.\n */\nexport function WorkspaceChooserGate({ fallback, children }: WorkspaceChooserGateProps) {\n const tenant = useTenantOptional()\n if (!tenant) return <>{children}</>\n\n const { org, userOrgs, orgsKnown, settled } = tenant\n\n // Already in a workspace — nothing to ask.\n if (org) return <>{children}</>\n\n // Hold rather than hand over, for the same reason the setup gate does: the\n // shell would paint an account-shaped app and fire every plugin's\n // tenant-scoped request against no tenant, then be replaced.\n if (!settled) return <>{fallback ?? null}</>\n\n // \"We asked and could not tell\" is not \"you have several\". Only a list we\n // actually read can raise this screen; anything else falls through to the\n // shell, which is where the existing empty-switcher behaviour already lives.\n if (!orgsKnown || userOrgs.length <= 1) return <>{children}</>\n\n return (\n <WorkspaceChooser\n memberships={userOrgs}\n suggestedId={\n userOrgs.some((m) => m.orgId === getPersistedOrgId()) ? getPersistedOrgId() : null\n }\n />\n )\n}\n","import { create } from 'zustand'\nimport { clearOrgSnapshot } from './cache'\nimport { markWorkspaceSwitch } from './choice'\nimport { persistOrgId } from './store'\n\nexport interface SwitchTarget {\n orgId: string\n orgName: string\n /** So the transition shows the same mark the switcher row did. */\n orgLogoUrl?: string\n}\n\nexport interface WorkspaceSwitchingStore {\n /** The workspace being entered, while the transition is on screen. */\n target: SwitchTarget | null\n /** Commit to a workspace and raise the transition. Ends in a reload. */\n begin: (target: SwitchTarget) => void\n cancel: () => void\n}\n\n/**\n * Changing workspace, as a two-phase move: commit now, rebuild on the far side\n * of a reload.\n *\n * Switching in place was the alternative and it does not work. `switchOrg`\n * swaps the active tenant and re-hydrates the org, but every plugin store, the\n * offline cache and whatever screen is open still hold the PREVIOUS tenant's\n * rows, and nothing invalidates them centrally. The result is a shell that says\n * one workspace while the table under it lists another's — a tenant boundary\n * failure as far as anyone reading the screen is concerned, even though the\n * database never leaked a row.\n */\nexport const useWorkspaceSwitchingStore = create<WorkspaceSwitchingStore>((set) => ({\n target: null,\n\n begin: (target) => {\n // Order matters, and all three have to happen BEFORE the reload:\n // the marker — so the picker does not re-ask what was just answered\n // the pin — so \"last used\" is the workspace being entered\n // the snapshot— or the cached bootstrap of the OLD workspace paints\n // first on the far side and the switch silently undoes\n // itself.\n markWorkspaceSwitch(target.orgId)\n persistOrgId(target.orgId)\n clearOrgSnapshot()\n set({ target })\n },\n\n cancel: () => set({ target: null }),\n}))\n","import * as React from 'react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Check, ShieldCheck, Building2 } from 'lucide-react'\nimport { cn } from '@fayz-ai/ui'\n\n/** How long each step holds before the next one starts. */\nconst STEP_MS = 850\n\nexport interface WorkspaceSwitchingProps {\n /** The workspace being entered, named — the one fact that makes this concrete. */\n orgName: string\n /** Its logo, when it has one. */\n orgLogoUrl?: string\n /** Runs once the last step has been shown. Reloads the page, in practice. */\n onDone: () => void\n}\n\n/**\n * The screen between two workspaces.\n *\n * Changing tenant ends in a full reload, because half the app holds the old\n * tenant's rows in plugin stores and caches that nothing else invalidates. A\n * reload with no cover reads as a crash — the app blanks, comes back, and the\n * numbers are different. This covers it and says what is happening, so the\n * second it costs is spent visibly rather than suspiciously.\n *\n * Sized like a moment, not a toast: the workspace name is the largest thing on\n * screen because it is the answer to the only question anyone has here — where\n * am I about to be. The steps are honest about the order of operations, and the\n * last one is a security claim, so it gets an icon rather than another dot.\n */\nexport function WorkspaceSwitching({ orgName, orgLogoUrl, onDone }: WorkspaceSwitchingProps) {\n const t = useTranslation()\n const tr = (key: string, fallback: string) => {\n const v = t(key)\n return !v || v === key ? fallback : v\n }\n\n const steps = React.useMemo(\n () => [\n tr('organization.switching.step1', 'Alterando organização'),\n tr('organization.switching.step2', 'Garantindo segurança dos dados'),\n tr('organization.switching.step3', 'Carregando suas informações'),\n ],\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n )\n\n const [step, setStep] = React.useState(0)\n\n // One timer that advances, then hands over — not one timer per step, which\n // would leak a reload if the component unmounted between two of them.\n const doneRef = React.useRef(onDone)\n doneRef.current = onDone\n React.useEffect(() => {\n const id = window.setInterval(() => {\n setStep((s) => {\n if (s < steps.length - 1) return s + 1\n window.clearInterval(id)\n // Out of the interval callback: the reload tears down this tree, and\n // React does not want that happening inside a state updater.\n window.setTimeout(() => doneRef.current(), STEP_MS)\n return s\n })\n }, STEP_MS)\n return () => window.clearInterval(id)\n }, [steps.length])\n\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label={`${steps[step]} — ${orgName}`}\n className=\"saas-switch-veil fixed inset-0 z-[100] flex items-center justify-center bg-background px-6\"\n >\n <div className=\"saas-switch-rise flex w-full max-w-sm flex-col items-center\">\n {/* The mark, with the loading indicator as a ring around it rather than\n a spinner beside it — one object doing both jobs. */}\n <div className=\"relative flex h-20 w-20 items-center justify-center\">\n <span\n aria-hidden\n className=\"saas-switch-pulse absolute inset-0 rounded-2xl bg-primary/25\"\n />\n <WorkspaceMark name={orgName} logoUrl={orgLogoUrl} />\n </div>\n\n <p className=\"mt-7 text-xs font-medium uppercase tracking-[0.14em] text-muted-foreground\">\n {tr('organization.switching.eyebrow', 'Entrando em')}\n </p>\n {/* The largest thing here on purpose. Balanced leading and a wrap\n rather than an ellipsis: a truncated workspace name is exactly the\n reassurance this screen exists to give, cut in half. */}\n <h1 className=\"mt-1.5 text-pretty text-center text-3xl font-semibold leading-tight tracking-tight text-foreground sm:text-4xl\">\n {orgName}\n </h1>\n\n {/* Reserved height, top-aligned: the rows are written one at a time,\n and without a floor for the full list each arrival would shove the\n name and mark upward. The block stays put; only the list fills. */}\n <ul className=\"mt-9 flex w-full min-h-[7.5rem] flex-col items-start sm:min-h-[8.5rem]\">\n {steps.slice(0, step + 1).map((label, i) => {\n const done = i < step\n const isSecurity = i === 1\n return (\n <li key={label} className=\"saas-switch-step flex w-full gap-3\">\n {/* The rail: a thread down from the step above, then this\n step's own marker. */}\n <span className=\"flex w-6 shrink-0 flex-col items-center\">\n {i > 0 && (\n // Tinted, not `bg-border`: on a light surface the border\n // token is invisible at 1px, and this thread is the part\n // that makes three rows read as one advancing sequence\n // rather than three unrelated lines.\n <span aria-hidden className=\"saas-switch-link h-5 w-0.5 rounded-full bg-primary/30\" />\n )}\n <span className=\"flex h-7 w-6 items-center justify-center\">\n {done ? (\n <Check className=\"h-5 w-5 text-primary\" strokeWidth={2.5} />\n ) : isSecurity ? (\n <ShieldCheck className=\"saas-switch-dot h-5 w-5 text-primary\" strokeWidth={2} />\n ) : (\n <span className=\"saas-switch-dot h-2 w-2 rounded-full bg-primary\" />\n )}\n </span>\n </span>\n <span\n className={cn(\n 'flex h-7 items-center text-base transition-colors duration-300 sm:text-lg',\n // Only ever two states now — done, or happening. Nothing is\n // on screen before its turn, so there is no \"ahead\" tone.\n done ? 'text-muted-foreground' : 'font-medium text-foreground',\n // Push the label down past the connector so it stays level\n // with its own marker rather than with the thread above it.\n i > 0 && 'mt-5',\n )}\n >\n {label}\n </span>\n </li>\n )\n })}\n </ul>\n </div>\n </div>\n )\n}\n\n/** The workspace's face, at hero size: its logo, or its initials. */\nfunction WorkspaceMark({ name, logoUrl }: { name: string; logoUrl?: string }) {\n if (logoUrl) {\n return (\n <img\n src={logoUrl}\n alt=\"\"\n className=\"relative h-16 w-16 rounded-2xl object-cover shadow-sm\"\n />\n )\n }\n const initials = name\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((w) => w[0])\n .join('')\n .toUpperCase()\n return (\n <span className=\"relative flex h-16 w-16 items-center justify-center rounded-2xl bg-primary text-xl font-semibold text-primary-foreground shadow-sm\">\n {initials || <Building2 className=\"h-7 w-7\" />}\n </span>\n )\n}\n","import * as React from 'react'\nimport { useWorkspaceSwitchingStore } from './switching.store'\nimport { WorkspaceSwitching } from './WorkspaceSwitching'\n\n/**\n * Renders the workspace transition over whatever is on screen, and performs the\n * reload it exists to cover.\n *\n * Mounted once, high in the shell: the switch can be started from the topbar\n * picker or from anywhere else that grows one, and none of those places should\n * own a full-screen overlay.\n */\nexport function WorkspaceSwitchingHost() {\n const target = useWorkspaceSwitchingStore((s) => s.target)\n if (!target) return null\n\n return (\n <WorkspaceSwitching\n orgName={target.orgName}\n orgLogoUrl={target.orgLogoUrl}\n // A full reload, not a router navigation: the point is to discard every\n // plugin store and cache still holding the previous tenant's rows, and\n // only a fresh document does that. `reload()` keeps the current URL, so\n // whoever switched lands on the same screen in the new workspace.\n onDone={() => window.location.reload()}\n />\n )\n}\n"]}