@fayz-ai/saas 0.6.0 → 0.7.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/README.md +1 -1
- package/dist/app/AdminShell.d.ts +14 -1
- package/dist/app/AdminShell.d.ts.map +1 -1
- package/dist/app/LoginPage.d.ts +2 -16
- package/dist/app/LoginPage.d.ts.map +1 -1
- package/dist/app/admin-app.d.ts +21 -0
- package/dist/app/admin-app.d.ts.map +1 -0
- package/dist/app/config.d.ts +40 -3
- package/dist/app/config.d.ts.map +1 -1
- package/dist/app/scaffold.d.ts +1 -2
- package/dist/app/scaffold.d.ts.map +1 -1
- package/dist/{chunk-DJW67TCY.js → chunk-DCRT47W4.js} +155 -28
- package/dist/chunk-DCRT47W4.js.map +1 -0
- package/dist/{chunk-QGMDVLLW.cjs → chunk-SRIUD35R.cjs} +155 -28
- package/dist/chunk-SRIUD35R.cjs.map +1 -0
- package/dist/crud/CrudDetailPage.d.ts.map +1 -1
- package/dist/hooks/useModuleNavigation.d.ts.map +1 -1
- package/dist/index.cjs +1131 -5792
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +844 -5510
- package/dist/index.js.map +1 -1
- package/dist/org/adapters/supabase.d.ts +18 -0
- package/dist/org/adapters/supabase.d.ts.map +1 -1
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/index.cjs +11 -10
- package/dist/org/index.js +2 -1
- package/dist/shell/components/crud/archetypes/ClientOrdersTab.d.ts +4 -2
- package/dist/shell/components/crud/archetypes/ClientOrdersTab.d.ts.map +1 -1
- package/dist/shell/components/layout/BottomNav.d.ts.map +1 -1
- package/dist/shell/components/layout/CommandPalette.d.ts.map +1 -1
- package/dist/shell/components/organization/InviteMemberDialog.d.ts.map +1 -1
- package/dist/shell/components/organization/PermissionMatrixEditor.d.ts +6 -1
- package/dist/shell/components/organization/PermissionMatrixEditor.d.ts.map +1 -1
- package/dist/shell/components/organization/PermissionProfilesTab.d.ts.map +1 -1
- package/dist/shell/components/organization/TeamTab.d.ts.map +1 -1
- package/dist/shell/components/plugins/PluginSettingsPanel.d.ts.map +1 -1
- package/dist/shell/components/settings/ConnectedUserProfile.d.ts +2 -1
- package/dist/shell/components/settings/ConnectedUserProfile.d.ts.map +1 -1
- package/dist/shell/components/settings/SettingsPage.d.ts +8 -1
- package/dist/shell/components/settings/SettingsPage.d.ts.map +1 -1
- package/dist/shell/config/theme/tokens.d.ts +12 -1
- package/dist/shell/config/theme/tokens.d.ts.map +1 -1
- package/dist/shell/config/theme/utils.d.ts +8 -0
- package/dist/shell/config/theme/utils.d.ts.map +1 -1
- package/dist/shell/hooks/useModuleNavigation.d.ts.map +1 -1
- package/dist/shell/lib/i18n.d.ts.map +1 -1
- package/dist/shell/types/client-orders.d.ts +4 -0
- package/dist/shell/types/client-orders.d.ts.map +1 -1
- package/dist/shell/types/crud.d.ts +4 -0
- package/dist/shell/types/crud.d.ts.map +1 -1
- package/package.json +6 -5
- package/src/app/AdminShell.tsx +103 -35
- package/src/app/LoginPage.tsx +2 -264
- package/src/app/{createFayzApp.tsx → admin-app.tsx} +98 -40
- package/src/app/config.ts +44 -2
- package/src/app/scaffold.tsx +13 -26
- package/src/crud/CrudDetailPage.tsx +43 -9
- package/src/crud/CrudPage.tsx +1 -1
- package/src/hooks/useModuleNavigation.ts +7 -1
- package/src/index.ts +12 -5
- package/src/org/adapters/supabase.ts +176 -28
- package/src/org/context.tsx +33 -2
- package/src/shell/components/crud/archetypes/ClientOrdersTab.tsx +12 -4
- package/src/shell/components/layout/BottomNav.tsx +39 -4
- package/src/shell/components/layout/CommandPalette.tsx +14 -10
- package/src/shell/components/organization/InviteMemberDialog.tsx +14 -3
- package/src/shell/components/organization/PermissionMatrixEditor.tsx +48 -10
- package/src/shell/components/organization/PermissionProfilesTab.tsx +65 -23
- package/src/shell/components/organization/TeamTab.tsx +36 -9
- package/src/shell/components/plugins/PluginSettingsPanel.tsx +5 -3
- package/src/shell/components/settings/ConnectedUserProfile.tsx +68 -25
- package/src/shell/components/settings/SettingsPage.tsx +12 -3
- package/src/shell/config/theme/tokens.ts +13 -1
- package/src/shell/config/theme/utils.ts +76 -15
- package/src/shell/hooks/useModuleNavigation.ts +7 -1
- package/src/shell/lib/i18n.ts +4 -0
- package/src/shell/types/client-orders.ts +5 -0
- package/src/shell/types/crud.ts +4 -0
- package/dist/app/createFayzApp.d.ts +0 -11
- package/dist/app/createFayzApp.d.ts.map +0 -1
- package/dist/chunk-DJW67TCY.js.map +0 -1
- package/dist/chunk-QGMDVLLW.cjs.map +0 -1
- package/dist/shell/components/organization/ImpersonationBanner.d.ts +0 -3
- package/dist/shell/components/organization/ImpersonationBanner.d.ts.map +0 -1
- package/dist/shell/components/settings/ConnectedHolidaysSettings.d.ts +0 -3
- package/dist/shell/components/settings/ConnectedHolidaysSettings.d.ts.map +0 -1
- package/dist/shell/components/settings/ConnectedLocationsOverview.d.ts +0 -3
- package/dist/shell/components/settings/ConnectedLocationsOverview.d.ts.map +0 -1
- package/dist/shell/createSaasApp.d.ts +0 -145
- package/dist/shell/createSaasApp.d.ts.map +0 -1
- package/src/shell/components/organization/ImpersonationBanner.tsx +0 -29
- package/src/shell/components/settings/ConnectedHolidaysSettings.tsx +0 -99
- package/src/shell/components/settings/ConnectedLocationsOverview.tsx +0 -57
- package/src/shell/createSaasApp.tsx +0 -943
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/supabase/client.ts","../src/org/adapters/supabase.ts","../src/org/adapters/mock.ts","../src/org/store.ts","../src/org/context.tsx"],"names":["slugify","STORAGE_KEY"],"mappings":"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","file":"chunk-DCRT47W4.js","sourcesContent":["import { createClient, type SupabaseClient } from '@supabase/supabase-js'\nimport { setGlobalSupabaseClient } from '@fayz-ai/core'\n\n/** Schema name for core platform tables */\nexport const CORE_SCHEMA = 'saas_core'\n\nlet _client: SupabaseClient | null = null\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/saas] Supabase URL and anon key are required. ' +\n 'Pass supabaseUrl and supabaseAnonKey to createFayzApp.',\n )\n }\n\n _client = createClient(url, anonKey, {\n auth: { autoRefreshToken: true, persistSession: true },\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/saas] 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\n/** Get a client scoped to the core platform schema */\nexport function getCoreSchemaClient(): ReturnType<SupabaseClient['schema']> {\n return getFayzSupabaseClient().schema(CORE_SCHEMA)\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, SystemPermission, AuthAdapter } from '@fayz-ai/core'\nimport { getFayzSupabaseClient, CORE_SCHEMA } from '../../supabase/client'\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 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\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 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 tenant_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 const actionMap: Record<string, string> = {\n read: 'read',\n create: 'create',\n update: 'edit',\n manage: 'edit',\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 const dotIdx = permId.indexOf('.')\n if (dotIdx === -1) 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 /** Override the core schema name (default: 'saas_core') */\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}\n\nexport function createSupabaseOrgAdapter(config?: SupabaseOrgAdapterConfig): OrgAdapter {\n const schema = config?.coreSchema ?? CORE_SCHEMA\n const roles: RoleIdentity[] = config?.roles && config.roles.length > 0 ? config.roles : DEFAULT_ROLES\n const authAdapter = config?.authAdapter\n const inviteRedirectTo = typeof window !== 'undefined' ? `${window.location.origin}/` : undefined\n\n function supabase() {\n return getFayzSupabaseClient()\n }\n\n function core() {\n return supabase().schema(schema)\n }\n\n return {\n async listUserOrgs(userId: string): Promise<OrgMembership[]> {\n return dedup(`listUserOrgs:${userId}`, async () => {\n const { data, error } = await core()\n .from('tenant_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 return ((data ?? []) as Array<Record<string, unknown>>).map((row) => ({\n orgId: row['tenant_id'] as string,\n orgName: ((row['tenant'] as Record<string, unknown>)?.['name'] as string) ?? '',\n orgSlug: ((row['tenant'] as Record<string, unknown>)?.['slug'] as string) ?? '',\n orgLogoUrl: ((row['tenant'] as Record<string, unknown>)?.['logo_url'] as string | null) ?? undefined,\n profileId: row['role'] as string,\n profileName: capitalize(row['role'] as string),\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: {},\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('tenant_members')\n .select('*')\n .eq('tenant_id', orgId)\n\n if (error) throw error\n\n const userIds = ((data ?? []) as Array<Record<string, unknown>>).map((m) => m['user_id'] as string)\n const { data: profiles } = userIds.length > 0\n ? await core().from('profiles').select('id, full_name, avatar_url, email').in('id', userIds)\n : { data: [] }\n\n const profileMap = new Map(\n ((profiles ?? []) as Array<Record<string, unknown>>).map((p) => [p['id'], p]),\n )\n\n return ((data ?? []) as Array<Record<string, unknown>>).map((row) => {\n const profile = profileMap.get(row['user_id'] as string) ?? {}\n return mapMemberRow({ ...row, profile })\n })\n },\n\n async updateMemberProfile(orgId: string, memberId: string, profileId: string): Promise<void> {\n const { error } = await core()\n .from('tenant_members')\n .update({ role: profileId })\n .eq('id', memberId)\n .eq('tenant_id', orgId)\n\n if (error) throw error\n },\n\n async removeMember(orgId: string, memberId: string): Promise<void> {\n const { error } = await core()\n .from('tenant_members')\n .delete()\n .eq('id', memberId)\n .eq('tenant_id', orgId)\n\n if (error) throw error\n },\n\n async listProfiles(orgId: string): Promise<PermissionProfile[]> {\n const [permsResult, rolePermsResult, overridesResult, customResult] = await Promise.all([\n core().from('permissions').select('id, category'),\n core().from('role_permissions').select('role, permission_id'),\n core().from('tenant_role_overrides').select('role, permission_id, granted').eq('tenant_id', orgId),\n // Custom roles the tenant created by duplicating a system role. Tolerate a\n // missing table (pre-seed) — just show the system roles in that case.\n core().from('tenant_roles').select('key, name, description').eq('tenant_id', orgId),\n ])\n\n if (permsResult.error) throw permsResult.error\n if (rolePermsResult.error) throw rolePermsResult.error\n if (overridesResult.error) throw overridesResult.error\n\n const systemRoles: RoleIdentity[] = roles.map((r) => ({ ...r, isSystem: true }))\n const customRoles: RoleIdentity[] = customResult.error\n ? []\n : ((customResult.data ?? []) as Array<{ key: string; name: string; description: string | null }>).map((r) => ({\n id: r.key,\n name: r.name,\n description: r.description ?? undefined,\n isSystem: false,\n }))\n\n return buildPermissionProfiles(\n [...systemRoles, ...customRoles],\n (permsResult.data ?? []) as Array<{ id: string; category: string }>,\n (rolePermsResult.data ?? []) as Array<{ role: string; permission_id: string }>,\n (overridesResult.data ?? []) as Array<{ role: string; permission_id: string; granted: boolean }>,\n )\n },\n\n async createProfile(\n orgId: string,\n profile: Omit<PermissionProfile, 'id' | 'isSystem'>,\n ): Promise<PermissionProfile> {\n // Custom roles live in tenant_roles (identity/name) + tenant_role_overrides\n // (their grants). System roles stay app-defined and untouched.\n const existing = new Set(\n ((await core().from('tenant_roles').select('key').eq('tenant_id', orgId)).data ?? [])\n .map((r: { key: string }) => 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 const insertRole = await core()\n .from('tenant_roles')\n .insert({ tenant_id: orgId, key, name: profile.name, description: profile.description ?? null })\n if (insertRole.error) throw insertRole.error\n\n const overrides = Object.entries(profile.grants ?? {}).flatMap(([category, actions]) =>\n actions.map((action) => ({\n tenant_id: orgId,\n role: key,\n permission_id: `${category}.${DB_ACTION[action] ?? action}`,\n granted: true,\n })),\n )\n if (overrides.length > 0) {\n const { error } = await core().from('tenant_role_overrides').insert(overrides)\n if (error) throw error\n }\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 if (data.grants) {\n await core()\n .from('tenant_role_overrides')\n .delete()\n .eq('tenant_id', orgId)\n .eq('role', profileId)\n\n const overrides: Array<{\n tenant_id: string\n role: string\n permission_id: string\n granted: boolean\n }> = []\n\n for (const [category, actions] of Object.entries(data.grants)) {\n for (const action of actions) {\n // Matrix emits read/create/edit/delete; map back to DB action verbs.\n const dbActionMap: Record<string, string> = {\n read: 'read',\n create: 'create',\n edit: 'update',\n write: 'create',\n manage: 'manage',\n delete: 'delete',\n }\n const dbAction = dbActionMap[action] ?? action\n overrides.push({\n tenant_id: orgId,\n role: profileId,\n permission_id: `${category}.${dbAction}`,\n granted: true,\n })\n }\n }\n\n if (overrides.length > 0) {\n const { error } = await core().from('tenant_role_overrides').insert(overrides)\n if (error) throw error\n }\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 // Only custom roles (present in tenant_roles) can be deleted; system roles\n // are app-defined and static.\n const found = await core()\n .from('tenant_roles')\n .select('key')\n .eq('tenant_id', orgId)\n .eq('key', profileId)\n .maybeSingle()\n if (found.error) throw found.error\n if (!found.data) throw new Error('System roles cannot be deleted.')\n\n await core().from('tenant_role_overrides').delete().eq('tenant_id', orgId).eq('role', profileId)\n const { error } = await core().from('tenant_roles').delete().eq('tenant_id', orgId).eq('key', profileId)\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('locations')\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 .from('locations')\n .insert({\n tenant_id: orgId,\n name: input.name,\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 is_headquarters: input.isHeadquarters ?? false,\n })\n .select()\n .single()\n\n if (error) throw error\n return mapLocationRow(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 { create } from 'zustand'\nimport { setActiveTenantId, type Organization, type OrgMember, type OrgMembership } from '@fayz-ai/core'\n\nconst STORAGE_KEY = 'fayz:current-org'\n\n// ---------------------------------------------------------------------------\n// Persistence helpers\n// ---------------------------------------------------------------------------\n\nfunction getPersistedOrgId(): string | null {\n try {\n if (typeof localStorage === 'undefined') return null\n return localStorage.getItem(STORAGE_KEY)\n } catch {\n return null\n }\n}\n\nfunction persistOrgId(orgId: string | null): void {\n try {\n if (typeof localStorage === 'undefined') return\n if (orgId) {\n localStorage.setItem(STORAGE_KEY, orgId)\n } else {\n localStorage.removeItem(STORAGE_KEY)\n }\n } catch {\n // ignore\n }\n}\n\n// ---------------------------------------------------------------------------\n// Store interface\n// ---------------------------------------------------------------------------\n\nexport interface OrgStore {\n currentOrg: Organization | null\n userOrgs: OrgMembership[]\n members: OrgMember[]\n loading: boolean\n\n setCurrentOrg: (org: Organization | null) => void\n setUserOrgs: (orgs: OrgMembership[]) => void\n setMembers: (members: OrgMember[]) => void\n setLoading: (loading: boolean) => void\n reset: () => void\n}\n\nexport const useOrganizationStore = create<OrgStore>((set) => ({\n currentOrg: null,\n userOrgs: [],\n members: [],\n loading: false,\n\n setCurrentOrg: (org) => {\n setActiveTenantId(org?.id)\n persistOrgId(org?.id ?? null)\n set({ currentOrg: org })\n },\n setUserOrgs: (orgs) => set({ userOrgs: orgs }),\n setMembers: (members) => set({ members }),\n setLoading: (loading) => set({ loading }),\n reset: () => {\n setActiveTenantId(undefined)\n persistOrgId(null)\n set({ currentOrg: null, userOrgs: [], members: [], loading: false })\n },\n}))\n\nexport { getPersistedOrgId }\n","import * as React from 'react'\nimport type { OrgAdapter, Organization, OrgMembership } from '@fayz-ai/core'\nimport { useAuthStore } from '@fayz-ai/auth'\nimport { useOrganizationStore, getPersistedOrgId } from './store'\nimport { usePermissionsStore } from '../permissions'\n\n// ---------------------------------------------------------------------------\n// Adapter context\n// ---------------------------------------------------------------------------\n\nconst OrgAdapterContext = React.createContext<OrgAdapter | null>(null)\n\nexport function useOrgAdapter(): OrgAdapter {\n const adapter = React.useContext(OrgAdapterContext)\n if (!adapter) {\n throw new Error('useOrgAdapter must be used within an <OrgProvider>')\n }\n return adapter\n}\n\nexport function useOrgAdapterOptional(): OrgAdapter | null {\n return React.useContext(OrgAdapterContext)\n}\n\n// ---------------------------------------------------------------------------\n// Tenant / org hook\n// ---------------------------------------------------------------------------\n\nexport interface TenantContext {\n /** The currently active organization */\n org: Organization | null\n /** All orgs the current user belongs to */\n userOrgs: OrgMembership[]\n loading: boolean\n /** Switch the active org */\n switchOrg: (orgId: string) => Promise<void>\n /** Refresh the current org from the adapter */\n refreshOrg: () => Promise<void>\n}\n\nconst TenantContext = React.createContext<TenantContext | null>(null)\n\n/**\n * Access the current tenant / organization.\n * Must be used inside <OrgProvider>.\n */\nexport function useTenant(): TenantContext {\n const ctx = React.useContext(TenantContext)\n if (!ctx) {\n throw new Error('useTenant must be used inside <OrgProvider>')\n }\n return ctx\n}\n\nexport function useTenantOptional(): TenantContext | null {\n return React.useContext(TenantContext)\n}\n\n// ---------------------------------------------------------------------------\n// Provider\n// ---------------------------------------------------------------------------\n\nexport interface OrgProviderProps {\n adapter: OrgAdapter\n /** When true, automatically creates an org if the user has none */\n autoCreate?: boolean\n children: React.ReactNode\n}\n\nexport function OrgProvider({ adapter, autoCreate = false, children }: OrgProviderProps) {\n const { user } = useAuthStore()\n const { currentOrg, userOrgs, loading, setCurrentOrg, setUserOrgs, setMembers, setLoading, reset } =\n useOrganizationStore()\n const setProfiles = usePermissionsStore((s) => s.setProfiles)\n const setCurrentProfile = usePermissionsStore((s) => s.setCurrentProfile)\n\n const adapterRef = React.useRef(adapter)\n adapterRef.current = adapter\n\n // Load the org's members + permission profiles into the shared stores whenever\n // an org resolves. This is what makes the role list, the invite dialog's role\n // dropdown, and permission checks work — previously nothing loaded them here,\n // so those surfaces came up empty. Also resolves the signed-in user's own role.\n const hydrateOrg = React.useCallback(\n async (orgId: string, uid: string | undefined) => {\n try {\n const [members, profiles] = await Promise.all([\n adapterRef.current.listMembers(orgId),\n adapterRef.current.listProfiles(orgId),\n ])\n setMembers(members)\n setProfiles(profiles)\n const myMembership = uid ? members.find((m) => m.userId === uid) : undefined\n setCurrentProfile(profiles.find((p) => p.id === myMembership?.profileId) ?? null)\n } catch {\n // Non-fatal — leave stores as-is if the load fails.\n }\n },\n [setMembers, setProfiles, setCurrentProfile],\n )\n\n // Load orgs when user is authenticated\n React.useEffect(() => {\n if (!user) {\n reset()\n return\n }\n\n let cancelled = false\n\n async function loadOrgs() {\n setLoading(true)\n try {\n const memberships = await adapterRef.current.listUserOrgs(user!.id)\n\n if (cancelled) return\n\n setUserOrgs(memberships)\n\n // Auto-create org if user has none\n if (memberships.length === 0 && autoCreate) {\n const newOrg = await adapterRef.current.createOrg(\n user!.fullName ? `${user!.fullName}'s Organization` : 'My Organization',\n user!.id,\n )\n if (!cancelled) {\n setUserOrgs([\n {\n orgId: newOrg.id,\n orgName: newOrg.name,\n orgSlug: newOrg.slug,\n profileId: 'owner',\n profileName: 'Owner',\n },\n ])\n setCurrentOrg(newOrg)\n await hydrateOrg(newOrg.id, user!.id)\n }\n return\n }\n\n // Restore previously selected org or default to first\n const persistedId = getPersistedOrgId()\n const target =\n memberships.find((m) => m.orgId === persistedId) ?? memberships[0]\n\n if (target && !cancelled) {\n const org = await adapterRef.current.getOrg(target.orgId)\n if (!cancelled) {\n setCurrentOrg(org)\n await hydrateOrg(org.id, user!.id)\n }\n }\n } finally {\n if (!cancelled) setLoading(false)\n }\n }\n\n void loadOrgs()\n\n return () => {\n cancelled = true\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [user?.id])\n\n async function switchOrg(orgId: string): Promise<void> {\n setLoading(true)\n try {\n const org = await adapterRef.current.getOrg(orgId)\n setCurrentOrg(org)\n await hydrateOrg(org.id, user?.id)\n } finally {\n setLoading(false)\n }\n }\n\n async function refreshOrg(): Promise<void> {\n if (!currentOrg) return\n setLoading(true)\n try {\n const org = await adapterRef.current.getOrg(currentOrg.id)\n setCurrentOrg(org)\n await hydrateOrg(org.id, user?.id)\n } finally {\n setLoading(false)\n }\n }\n\n const tenantValue: TenantContext = {\n org: currentOrg,\n userOrgs,\n loading,\n switchOrg,\n refreshOrg,\n }\n\n return (\n <OrgAdapterContext.Provider value={adapter}>\n <TenantContext.Provider value={tenantValue}>\n {children}\n </TenantContext.Provider>\n </OrgAdapterContext.Provider>\n )\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var chunk4XTQ4V5L_cjs = require('./chunk-4XTQ4V5L.cjs');
|
|
3
4
|
var supabaseJs = require('@supabase/supabase-js');
|
|
4
5
|
var core = require('@fayz-ai/core');
|
|
5
6
|
var zustand = require('zustand');
|
|
@@ -27,7 +28,6 @@ function _interopNamespace(e) {
|
|
|
27
28
|
|
|
28
29
|
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
29
30
|
|
|
30
|
-
// src/supabase/client.ts
|
|
31
31
|
var CORE_SCHEMA = "saas_core";
|
|
32
32
|
var _client = null;
|
|
33
33
|
function createFayzSupabaseClient(url, anonKey) {
|
|
@@ -102,7 +102,8 @@ function mapMemberRow(row) {
|
|
|
102
102
|
fullName: profile["full_name"] ?? "",
|
|
103
103
|
avatarUrl: profile["avatar_url"] ?? void 0
|
|
104
104
|
},
|
|
105
|
-
|
|
105
|
+
// tenant_members has no `joined_at` column — it's `created_at`.
|
|
106
|
+
joinedAt: row["joined_at"] ?? row["created_at"]
|
|
106
107
|
};
|
|
107
108
|
}
|
|
108
109
|
function mapLocationRow(row) {
|
|
@@ -135,18 +136,46 @@ function mapInviteRow(row) {
|
|
|
135
136
|
expiresAt: row["expires_at"]
|
|
136
137
|
};
|
|
137
138
|
}
|
|
138
|
-
var
|
|
139
|
-
|
|
139
|
+
var DB_ACTION = {
|
|
140
|
+
read: "read",
|
|
141
|
+
create: "create",
|
|
142
|
+
edit: "update",
|
|
143
|
+
write: "create",
|
|
144
|
+
manage: "manage",
|
|
145
|
+
delete: "delete"
|
|
146
|
+
};
|
|
147
|
+
function slugifyRole(name) {
|
|
148
|
+
return name.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") || "role";
|
|
149
|
+
}
|
|
150
|
+
var DEFAULT_ROLES = [
|
|
151
|
+
{ id: "owner", name: "Owner" },
|
|
152
|
+
{ id: "admin", name: "Admin" },
|
|
153
|
+
{ id: "manager", name: "Manager" },
|
|
154
|
+
{ id: "staff", name: "Staff" },
|
|
155
|
+
{ id: "viewer", name: "Viewer" }
|
|
156
|
+
];
|
|
157
|
+
var SYSTEM_PERMISSION_MAP = {
|
|
158
|
+
"team.read": "manage_team",
|
|
159
|
+
"team.invite": "manage_team",
|
|
160
|
+
"team.manage": "manage_team",
|
|
161
|
+
"team.manage_roles": "manage_permissions",
|
|
162
|
+
"billing.read": "manage_billing",
|
|
163
|
+
"billing.manage": "manage_billing",
|
|
164
|
+
"settings.read": "manage_settings",
|
|
165
|
+
"settings.update": "manage_settings"
|
|
166
|
+
};
|
|
167
|
+
var ALL_SYSTEM_PERMISSIONS = ["manage_team", "manage_billing", "manage_settings", "manage_permissions"];
|
|
168
|
+
function buildPermissionProfiles(roles, permissions, rolePerms, overrides) {
|
|
140
169
|
const overrideMap = /* @__PURE__ */ new Map();
|
|
141
170
|
for (const o of overrides) {
|
|
142
171
|
overrideMap.set(`${o.role}:${o.permission_id}`, o.granted);
|
|
143
172
|
}
|
|
144
173
|
const rolePermMap = /* @__PURE__ */ new Map();
|
|
145
|
-
for (const
|
|
146
|
-
rolePermMap.set(
|
|
174
|
+
for (const r of roles) {
|
|
175
|
+
rolePermMap.set(r.id, /* @__PURE__ */ new Set());
|
|
147
176
|
}
|
|
148
|
-
|
|
149
|
-
rolePermMap.get("owner").add(p.id);
|
|
177
|
+
if (rolePermMap.has("owner")) {
|
|
178
|
+
for (const p of permissions) rolePermMap.get("owner").add(p.id);
|
|
150
179
|
}
|
|
151
180
|
for (const rp of rolePerms) {
|
|
152
181
|
rolePermMap.get(rp.role)?.add(rp.permission_id);
|
|
@@ -165,14 +194,14 @@ function buildPermissionProfiles(permissions, rolePerms, overrides) {
|
|
|
165
194
|
}
|
|
166
195
|
const actionMap = {
|
|
167
196
|
read: "read",
|
|
168
|
-
create: "
|
|
169
|
-
update: "
|
|
170
|
-
manage: "
|
|
197
|
+
create: "create",
|
|
198
|
+
update: "edit",
|
|
199
|
+
manage: "edit",
|
|
171
200
|
delete: "delete",
|
|
172
|
-
configure: "
|
|
173
|
-
invite: "
|
|
201
|
+
configure: "edit",
|
|
202
|
+
invite: "create"
|
|
174
203
|
};
|
|
175
|
-
return
|
|
204
|
+
return roles.map(({ id: role, name, description, isSystem }) => {
|
|
176
205
|
const permIds = rolePermMap.get(role);
|
|
177
206
|
const features = {};
|
|
178
207
|
for (const permId of permIds) {
|
|
@@ -187,16 +216,26 @@ function buildPermissionProfiles(permissions, rolePerms, overrides) {
|
|
|
187
216
|
features[category].push(mappedAction);
|
|
188
217
|
}
|
|
189
218
|
}
|
|
219
|
+
const systemPermissions = [];
|
|
220
|
+
const source = role === "owner" ? ALL_SYSTEM_PERMISSIONS : [...permIds].map((id) => SYSTEM_PERMISSION_MAP[id]);
|
|
221
|
+
for (const sp of source) {
|
|
222
|
+
if (sp && !systemPermissions.includes(sp)) systemPermissions.push(sp);
|
|
223
|
+
}
|
|
190
224
|
return {
|
|
191
225
|
id: role,
|
|
192
|
-
name: capitalize(role),
|
|
193
|
-
|
|
226
|
+
name: name || capitalize(role),
|
|
227
|
+
description,
|
|
228
|
+
isSystem: isSystem ?? true,
|
|
229
|
+
systemPermissions,
|
|
194
230
|
grants: features
|
|
195
231
|
};
|
|
196
232
|
});
|
|
197
233
|
}
|
|
198
234
|
function createSupabaseOrgAdapter(config) {
|
|
199
235
|
const schema = config?.coreSchema ?? CORE_SCHEMA;
|
|
236
|
+
const roles = config?.roles && config.roles.length > 0 ? config.roles : DEFAULT_ROLES;
|
|
237
|
+
const authAdapter = config?.authAdapter;
|
|
238
|
+
const inviteRedirectTo = typeof window !== "undefined" ? `${window.location.origin}/` : void 0;
|
|
200
239
|
function supabase() {
|
|
201
240
|
return getFayzSupabaseClient();
|
|
202
241
|
}
|
|
@@ -275,24 +314,64 @@ function createSupabaseOrgAdapter(config) {
|
|
|
275
314
|
if (error) throw error;
|
|
276
315
|
},
|
|
277
316
|
async listProfiles(orgId) {
|
|
278
|
-
const [permsResult, rolePermsResult, overridesResult] = await Promise.all([
|
|
317
|
+
const [permsResult, rolePermsResult, overridesResult, customResult] = await Promise.all([
|
|
279
318
|
core().from("permissions").select("id, category"),
|
|
280
319
|
core().from("role_permissions").select("role, permission_id"),
|
|
281
|
-
core().from("tenant_role_overrides").select("role, permission_id, granted").eq("tenant_id", orgId)
|
|
320
|
+
core().from("tenant_role_overrides").select("role, permission_id, granted").eq("tenant_id", orgId),
|
|
321
|
+
// Custom roles the tenant created by duplicating a system role. Tolerate a
|
|
322
|
+
// missing table (pre-seed) — just show the system roles in that case.
|
|
323
|
+
core().from("tenant_roles").select("key, name, description").eq("tenant_id", orgId)
|
|
282
324
|
]);
|
|
283
325
|
if (permsResult.error) throw permsResult.error;
|
|
284
326
|
if (rolePermsResult.error) throw rolePermsResult.error;
|
|
285
327
|
if (overridesResult.error) throw overridesResult.error;
|
|
328
|
+
const systemRoles = roles.map((r) => ({ ...r, isSystem: true }));
|
|
329
|
+
const customRoles = customResult.error ? [] : (customResult.data ?? []).map((r) => ({
|
|
330
|
+
id: r.key,
|
|
331
|
+
name: r.name,
|
|
332
|
+
description: r.description ?? void 0,
|
|
333
|
+
isSystem: false
|
|
334
|
+
}));
|
|
286
335
|
return buildPermissionProfiles(
|
|
336
|
+
[...systemRoles, ...customRoles],
|
|
287
337
|
permsResult.data ?? [],
|
|
288
338
|
rolePermsResult.data ?? [],
|
|
289
339
|
overridesResult.data ?? []
|
|
290
340
|
);
|
|
291
341
|
},
|
|
292
|
-
async createProfile(
|
|
293
|
-
|
|
294
|
-
"
|
|
342
|
+
async createProfile(orgId, profile) {
|
|
343
|
+
const existing = new Set(
|
|
344
|
+
((await core().from("tenant_roles").select("key").eq("tenant_id", orgId)).data ?? []).map((r) => r.key)
|
|
295
345
|
);
|
|
346
|
+
let key = slugifyRole(profile.name);
|
|
347
|
+
if (existing.has(key) || roles.some((r) => r.id === key)) {
|
|
348
|
+
let n = 2;
|
|
349
|
+
while (existing.has(`${key}-${n}`) || roles.some((r) => r.id === `${key}-${n}`)) n++;
|
|
350
|
+
key = `${key}-${n}`;
|
|
351
|
+
}
|
|
352
|
+
const insertRole = await core().from("tenant_roles").insert({ tenant_id: orgId, key, name: profile.name, description: profile.description ?? null });
|
|
353
|
+
if (insertRole.error) throw insertRole.error;
|
|
354
|
+
const overrides = Object.entries(profile.grants ?? {}).flatMap(
|
|
355
|
+
([category, actions]) => actions.map((action) => ({
|
|
356
|
+
tenant_id: orgId,
|
|
357
|
+
role: key,
|
|
358
|
+
permission_id: `${category}.${DB_ACTION[action] ?? action}`,
|
|
359
|
+
granted: true
|
|
360
|
+
}))
|
|
361
|
+
);
|
|
362
|
+
if (overrides.length > 0) {
|
|
363
|
+
const { error } = await core().from("tenant_role_overrides").insert(overrides);
|
|
364
|
+
if (error) throw error;
|
|
365
|
+
}
|
|
366
|
+
const profiles = await this.listProfiles(orgId);
|
|
367
|
+
return profiles.find((p) => p.id === key) ?? {
|
|
368
|
+
id: key,
|
|
369
|
+
name: profile.name,
|
|
370
|
+
description: profile.description,
|
|
371
|
+
isSystem: false,
|
|
372
|
+
systemPermissions: profile.systemPermissions ?? [],
|
|
373
|
+
grants: profile.grants ?? {}
|
|
374
|
+
};
|
|
296
375
|
},
|
|
297
376
|
async updateProfile(orgId, profileId, data) {
|
|
298
377
|
if (data.grants) {
|
|
@@ -302,6 +381,8 @@ function createSupabaseOrgAdapter(config) {
|
|
|
302
381
|
for (const action of actions) {
|
|
303
382
|
const dbActionMap = {
|
|
304
383
|
read: "read",
|
|
384
|
+
create: "create",
|
|
385
|
+
edit: "update",
|
|
305
386
|
write: "create",
|
|
306
387
|
manage: "manage",
|
|
307
388
|
delete: "delete"
|
|
@@ -325,8 +406,13 @@ function createSupabaseOrgAdapter(config) {
|
|
|
325
406
|
if (!updated) throw new Error(`Profile not found: ${profileId}`);
|
|
326
407
|
return updated;
|
|
327
408
|
},
|
|
328
|
-
async deleteProfile(
|
|
329
|
-
|
|
409
|
+
async deleteProfile(orgId, profileId) {
|
|
410
|
+
const found = await core().from("tenant_roles").select("key").eq("tenant_id", orgId).eq("key", profileId).maybeSingle();
|
|
411
|
+
if (found.error) throw found.error;
|
|
412
|
+
if (!found.data) throw new Error("System roles cannot be deleted.");
|
|
413
|
+
await core().from("tenant_role_overrides").delete().eq("tenant_id", orgId).eq("role", profileId);
|
|
414
|
+
const { error } = await core().from("tenant_roles").delete().eq("tenant_id", orgId).eq("key", profileId);
|
|
415
|
+
if (error) throw error;
|
|
330
416
|
},
|
|
331
417
|
async listInvites(orgId) {
|
|
332
418
|
const { data, error } = await core().from("invitations").select("*").eq("tenant_id", orgId).order("created_at", { ascending: false });
|
|
@@ -341,6 +427,10 @@ function createSupabaseOrgAdapter(config) {
|
|
|
341
427
|
invited_by: invitedBy
|
|
342
428
|
}).select().single();
|
|
343
429
|
if (error) throw error;
|
|
430
|
+
await authAdapter?.inviteUser?.(email, {
|
|
431
|
+
redirectTo: inviteRedirectTo,
|
|
432
|
+
data: { tenant_id: orgId, role: profileId, invited_by: invitedBy }
|
|
433
|
+
});
|
|
344
434
|
return mapInviteRow(data);
|
|
345
435
|
},
|
|
346
436
|
async bulkInvite(orgId, emails, profileId, invitedBy) {
|
|
@@ -352,6 +442,14 @@ function createSupabaseOrgAdapter(config) {
|
|
|
352
442
|
}));
|
|
353
443
|
const { data, error } = await core().from("invitations").insert(rows).select();
|
|
354
444
|
if (error) throw error;
|
|
445
|
+
await Promise.all(
|
|
446
|
+
emails.map(
|
|
447
|
+
(email) => authAdapter?.inviteUser?.(email, {
|
|
448
|
+
redirectTo: inviteRedirectTo,
|
|
449
|
+
data: { tenant_id: orgId, role: profileId, invited_by: invitedBy }
|
|
450
|
+
})
|
|
451
|
+
)
|
|
452
|
+
);
|
|
355
453
|
return (data ?? []).map(mapInviteRow);
|
|
356
454
|
},
|
|
357
455
|
async revokeInvite(orgId, inviteId) {
|
|
@@ -364,7 +462,12 @@ function createSupabaseOrgAdapter(config) {
|
|
|
364
462
|
expires_at: new Date(Date.now() + 7 * 24 * 60 * 60 * 1e3).toISOString()
|
|
365
463
|
}).eq("id", inviteId).eq("tenant_id", orgId).select().single();
|
|
366
464
|
if (error) throw error;
|
|
367
|
-
|
|
465
|
+
const row = data;
|
|
466
|
+
await authAdapter?.inviteUser?.(row.email, {
|
|
467
|
+
redirectTo: inviteRedirectTo,
|
|
468
|
+
data: { tenant_id: orgId, role: row.role, invited_by: row.invited_by }
|
|
469
|
+
});
|
|
470
|
+
return mapInviteRow(row);
|
|
368
471
|
},
|
|
369
472
|
async listLocations(orgId) {
|
|
370
473
|
const { data, error } = await core().from("locations").select("*").eq("tenant_id", orgId).order("is_headquarters", { ascending: false }).order("name");
|
|
@@ -720,9 +823,27 @@ function useTenantOptional() {
|
|
|
720
823
|
}
|
|
721
824
|
function OrgProvider({ adapter, autoCreate = false, children }) {
|
|
722
825
|
const { user } = auth.useAuthStore();
|
|
723
|
-
const { currentOrg, userOrgs, loading, setCurrentOrg, setUserOrgs, setLoading, reset } = useOrganizationStore();
|
|
826
|
+
const { currentOrg, userOrgs, loading, setCurrentOrg, setUserOrgs, setMembers, setLoading, reset } = useOrganizationStore();
|
|
827
|
+
const setProfiles = chunk4XTQ4V5L_cjs.usePermissionsStore((s) => s.setProfiles);
|
|
828
|
+
const setCurrentProfile = chunk4XTQ4V5L_cjs.usePermissionsStore((s) => s.setCurrentProfile);
|
|
724
829
|
const adapterRef = React__namespace.useRef(adapter);
|
|
725
830
|
adapterRef.current = adapter;
|
|
831
|
+
const hydrateOrg = React__namespace.useCallback(
|
|
832
|
+
async (orgId, uid) => {
|
|
833
|
+
try {
|
|
834
|
+
const [members, profiles] = await Promise.all([
|
|
835
|
+
adapterRef.current.listMembers(orgId),
|
|
836
|
+
adapterRef.current.listProfiles(orgId)
|
|
837
|
+
]);
|
|
838
|
+
setMembers(members);
|
|
839
|
+
setProfiles(profiles);
|
|
840
|
+
const myMembership = uid ? members.find((m) => m.userId === uid) : void 0;
|
|
841
|
+
setCurrentProfile(profiles.find((p) => p.id === myMembership?.profileId) ?? null);
|
|
842
|
+
} catch {
|
|
843
|
+
}
|
|
844
|
+
},
|
|
845
|
+
[setMembers, setProfiles, setCurrentProfile]
|
|
846
|
+
);
|
|
726
847
|
React__namespace.useEffect(() => {
|
|
727
848
|
if (!user) {
|
|
728
849
|
reset();
|
|
@@ -751,6 +872,7 @@ function OrgProvider({ adapter, autoCreate = false, children }) {
|
|
|
751
872
|
}
|
|
752
873
|
]);
|
|
753
874
|
setCurrentOrg(newOrg);
|
|
875
|
+
await hydrateOrg(newOrg.id, user.id);
|
|
754
876
|
}
|
|
755
877
|
return;
|
|
756
878
|
}
|
|
@@ -758,7 +880,10 @@ function OrgProvider({ adapter, autoCreate = false, children }) {
|
|
|
758
880
|
const target = memberships.find((m) => m.orgId === persistedId) ?? memberships[0];
|
|
759
881
|
if (target && !cancelled) {
|
|
760
882
|
const org = await adapterRef.current.getOrg(target.orgId);
|
|
761
|
-
if (!cancelled)
|
|
883
|
+
if (!cancelled) {
|
|
884
|
+
setCurrentOrg(org);
|
|
885
|
+
await hydrateOrg(org.id, user.id);
|
|
886
|
+
}
|
|
762
887
|
}
|
|
763
888
|
} finally {
|
|
764
889
|
if (!cancelled) setLoading(false);
|
|
@@ -774,6 +899,7 @@ function OrgProvider({ adapter, autoCreate = false, children }) {
|
|
|
774
899
|
try {
|
|
775
900
|
const org = await adapterRef.current.getOrg(orgId);
|
|
776
901
|
setCurrentOrg(org);
|
|
902
|
+
await hydrateOrg(org.id, user?.id);
|
|
777
903
|
} finally {
|
|
778
904
|
setLoading(false);
|
|
779
905
|
}
|
|
@@ -784,6 +910,7 @@ function OrgProvider({ adapter, autoCreate = false, children }) {
|
|
|
784
910
|
try {
|
|
785
911
|
const org = await adapterRef.current.getOrg(currentOrg.id);
|
|
786
912
|
setCurrentOrg(org);
|
|
913
|
+
await hydrateOrg(org.id, user?.id);
|
|
787
914
|
} finally {
|
|
788
915
|
setLoading(false);
|
|
789
916
|
}
|
|
@@ -812,5 +939,5 @@ exports.useOrgAdapterOptional = useOrgAdapterOptional;
|
|
|
812
939
|
exports.useOrganizationStore = useOrganizationStore;
|
|
813
940
|
exports.useTenant = useTenant;
|
|
814
941
|
exports.useTenantOptional = useTenantOptional;
|
|
815
|
-
//# sourceMappingURL=chunk-
|
|
816
|
-
//# sourceMappingURL=chunk-
|
|
942
|
+
//# sourceMappingURL=chunk-SRIUD35R.cjs.map
|
|
943
|
+
//# sourceMappingURL=chunk-SRIUD35R.cjs.map
|