@famgia/omnify-react-sso 2.2.1 → 2.2.3
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 +404 -113
- package/dist/@omnify-base/schemas/Branch.ts +12 -12
- package/dist/@omnify-base/schemas/BranchCache.ts +131 -0
- package/dist/@omnify-base/schemas/OrganizationCache.ts +117 -0
- package/dist/@omnify-base/schemas/Permission.ts +10 -10
- package/dist/@omnify-base/schemas/Role.ts +19 -12
- package/dist/@omnify-base/schemas/RolePermission.ts +6 -6
- package/dist/@omnify-base/schemas/Team.ts +6 -6
- package/dist/@omnify-base/schemas/TeamCache.ts +110 -0
- package/dist/@omnify-base/schemas/TeamPermission.ts +6 -6
- package/dist/@omnify-base/schemas/User.ts +13 -13
- package/dist/@omnify-base/schemas/UserCache.ts +142 -0
- package/dist/index.cjs +1846 -427
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +623 -14
- package/dist/index.d.ts +623 -14
- package/dist/index.js +1790 -400
- package/dist/index.js.map +1 -1
- package/dist/schemas/index.cjs +245 -167
- package/dist/schemas/index.cjs.map +1 -1
- package/dist/schemas/index.d.cts +67 -28
- package/dist/schemas/index.d.ts +67 -28
- package/dist/schemas/index.js +217 -146
- package/dist/schemas/index.js.map +1 -1
- package/dist/testing/index.d.cts +1 -1
- package/dist/testing/index.d.ts +1 -1
- package/dist/{types-BCBSfJJr.d.cts → types-bD5deLxs.d.cts} +102 -1
- package/dist/{types-BCBSfJJr.d.ts → types-bD5deLxs.d.ts} +102 -1
- package/package.json +121 -106
- package/scripts/build-schemas.ts +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../node_modules/@omnify-base/schemas/i18n.ts","../node_modules/@omnify-base/schemas/Branch.ts","../src/schemas/Branch.ts","../node_modules/@omnify-base/schemas/Permission.ts","../src/schemas/Permission.ts","../node_modules/@omnify-base/schemas/Role.ts","../src/schemas/Role.ts","../node_modules/@omnify-base/schemas/RolePermission.ts","../src/schemas/RolePermission.ts","../node_modules/@omnify-base/schemas/Team.ts","../src/schemas/Team.ts","../node_modules/@omnify-base/schemas/TeamPermission.ts","../src/schemas/TeamPermission.ts","../node_modules/@omnify-base/schemas/User.ts","../src/schemas/User.ts","../src/context/SsoContext.tsx","../src/context/SsoProvider.tsx","../src/hooks/useAuth.ts","../src/hooks/useOrganization.ts","../src/hooks/useSso.ts","../src/components/SsoCallback.tsx","../src/components/OrganizationSwitcher.tsx","../src/components/ProtectedRoute.tsx","../src/services/utils.ts","../src/services/authService.ts","../src/services/tokenService.ts","../src/services/roleService.ts","../src/services/permissionService.ts","../src/services/teamService.ts","../src/services/userRoleService.ts","../src/services/branchService.ts","../src/services/ssoService.ts","../src/queryKeys.ts"],"sourcesContent":["/**\n * @famgia/omnify-react-sso\n *\n * SSO (Single Sign-On) schemas, types, components, and utilities for Omnify.\n */\n\n// =============================================================================\n// Schemas (auto-generated from Omnify)\n// =============================================================================\n\nexport * from './schemas';\n\n// =============================================================================\n// Context & Provider\n// =============================================================================\n\nexport { SsoContext } from './context/SsoContext';\nexport { SsoProvider } from './context/SsoProvider';\n\n// =============================================================================\n// Hooks\n// =============================================================================\n\nexport { useAuth } from './hooks/useAuth';\nexport { useOrganization } from './hooks/useOrganization';\nexport { useSso } from './hooks/useSso';\n\n// Hook return types\nexport type { UseAuthReturn } from './hooks/useAuth';\nexport type { UseOrganizationReturn } from './hooks/useOrganization';\nexport type { UseSsoReturn } from './hooks/useSso';\n\n// =============================================================================\n// Components\n// =============================================================================\n\nexport { SsoCallback } from './components/SsoCallback';\nexport { OrganizationSwitcher } from './components/OrganizationSwitcher';\nexport { ProtectedRoute } from './components/ProtectedRoute';\n\n// =============================================================================\n// Services - Individual services (recommended)\n// =============================================================================\n\n// Auth Service\nexport { createAuthService } from './services';\nexport type {\n AuthService,\n SsoUser as AuthUser,\n Organization,\n AuthCallbackInput,\n AuthCallbackResponse,\n AuthUserResponse,\n} from './services';\n\n// Token Service\nexport { createTokenService } from './services';\nexport type { TokenService, ApiToken } from './services';\n\n// Role Service\nexport { createRoleService } from './services';\nexport type {\n RoleService,\n Role,\n RoleWithPermissions,\n CreateRoleInput,\n UpdateRoleInput,\n SyncPermissionsInput,\n SyncPermissionsResponse,\n} from './services';\n\n// Permission Service\nexport { createPermissionService } from './services';\nexport type {\n PermissionService,\n Permission,\n PermissionMatrix,\n PermissionListParams,\n CreatePermissionInput,\n UpdatePermissionInput,\n} from './services';\n\n// Team Service\nexport { createTeamService } from './services';\nexport type {\n TeamService,\n TeamWithPermissions,\n TeamPermissionDetail,\n OrphanedTeam,\n SyncTeamPermissionsInput,\n CleanupOrphanedInput,\n} from './services';\n\n// User Role Service (Scoped Role Assignments)\nexport { createUserRoleService, getScopeLabel, getEffectivePermissions } from './services';\nexport type {\n UserRoleService,\n RoleScope,\n RoleAssignment,\n AssignRoleInput,\n AssignRoleResponse,\n SyncRolesInput,\n SyncRolesResponse,\n RemoveRoleResponse,\n} from './services';\n\n// Branch Service\nexport { createBranchService } from './services';\nexport type { BranchService, Branch, BranchesResponse } from './services';\n\n// Service Config\nexport type { ServiceConfig } from './services';\n\n// =============================================================================\n// Legacy: ssoService (deprecated - use individual services)\n// =============================================================================\n\n/**\n * @deprecated Use individual services instead:\n * - createAuthService() for auth\n * - createTokenService() for tokens\n * - createRoleService() for roles\n * - createPermissionService() for permissions\n * - createTeamService() for teams\n * - createUserRoleService() for user role assignments\n * - createBranchService() for branches\n */\nexport { createSsoService } from './services';\nexport type { SsoService, SsoServiceConfig } from './services';\n\n// Legacy type aliases for backward compatibility\nexport type { SsoUser as SsoServiceUser } from './services';\nexport type { Role as ServiceRole } from './services';\nexport type { Permission as ServicePermission } from './services';\n\n// =============================================================================\n// Types (camelCase - for React components)\n// =============================================================================\n\nexport type {\n SsoUser,\n SsoOrganization,\n SsoConfig,\n SsoContextValue,\n SsoCallbackResponse,\n SsoProviderProps,\n SsoCallbackProps,\n OrganizationSwitcherProps,\n ProtectedRouteProps,\n} from './types';\n\n// =============================================================================\n// Query Keys (for TanStack Query / React Query)\n// =============================================================================\n\nexport { ssoQueryKeys } from './queryKeys';\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\n\nimport type { LocaleMap } from '@omnify-base/schemas/common';\n\n/**\n * Default locale for this project.\n */\nexport const defaultLocale = 'ja' as const;\n\n/**\n * Fallback locale when requested locale is not found.\n */\nexport const fallbackLocale = 'en' as const;\n\n/**\n * Supported locales in this project.\n */\nexport const supportedLocales = [\"ja\",\"en\"] as const;\n\n/**\n * Validation messages for all supported locales.\n * Use getMessage(key, locale, params) to get formatted message.\n */\nexport const validationMessages = {\n \"required\": {\n \"ja\": \"${displayName}は必須です\",\n \"en\": \"${displayName} is required\"\n },\n \"minLength\": {\n \"ja\": \"${displayName}は${min}文字以上で入力してください\",\n \"en\": \"${displayName} must be at least ${min} characters\"\n },\n \"maxLength\": {\n \"ja\": \"${displayName}は${max}文字以内で入力してください\",\n \"en\": \"${displayName} must be at most ${max} characters\"\n },\n \"min\": {\n \"ja\": \"${displayName}は${min}以上で入力してください\",\n \"en\": \"${displayName} must be at least ${min}\"\n },\n \"max\": {\n \"ja\": \"${displayName}は${max}以下で入力してください\",\n \"en\": \"${displayName} must be at most ${max}\"\n },\n \"email\": {\n \"ja\": \"有効なメールアドレスを入力してください\",\n \"en\": \"Please enter a valid email address\"\n },\n \"url\": {\n \"ja\": \"有効なURLを入力してください\",\n \"en\": \"Please enter a valid URL\"\n },\n \"pattern\": {\n \"ja\": \"${displayName}の形式が正しくありません\",\n \"en\": \"${displayName} format is invalid\"\n }\n} as const;\n\n/**\n * Get validation message for a specific key and locale.\n * Supports template placeholders: ${displayName}, ${min}, ${max}, etc.\n *\n * @param key - Message key (e.g., 'required', 'minLength')\n * @param locale - Locale code (e.g., 'ja', 'en')\n * @param params - Template parameters to replace\n * @returns Formatted message string\n *\n * @example\n * getMessage('required', 'ja', { displayName: '氏名' })\n * // => '氏名は必須です'\n */\nexport function getMessage(\n key: string,\n locale: string,\n params: Record<string, string | number> = {}\n): string {\n const messages = validationMessages[key as keyof typeof validationMessages];\n if (!messages) return key;\n\n let message = (messages as LocaleMap)[locale]\n ?? (messages as LocaleMap)[fallbackLocale]\n ?? (messages as LocaleMap)[defaultLocale]\n ?? key;\n\n // Replace template placeholders\n for (const [param, value] of Object.entries(params)) {\n message = message.replace(new RegExp(`\\\\$\\{${param}\\}`, 'g'), String(value));\n }\n\n return message;\n}\n\n/**\n * Get all validation messages for a specific locale.\n *\n * @param locale - Locale code\n * @returns Object with all messages for the locale\n */\nexport function getMessages(locale: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const [key, messages] of Object.entries(validationMessages)) {\n result[key] = (messages as LocaleMap)[locale]\n ?? (messages as LocaleMap)[fallbackLocale]\n ?? (messages as LocaleMap)[defaultLocale]\n ?? key;\n }\n return result;\n}\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\n\n/**\n * Branch\n */\nexport interface Branch {\n /** Primary key */\n id: string;\n /** Console Branch ID */\n console_branch_id: unknown;\n /** Console Organization ID */\n console_org_id: unknown;\n /** Branch Code */\n code: string;\n /** Branch Name */\n name: string;\n /** Is Headquarters */\n is_headquarters: boolean;\n /** Active */\n is_active: boolean;\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n /** Soft delete timestamp */\n deleted_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for Branch\n * Contains model label and all field labels/placeholders\n */\nexport const branchI18n = {\n /** Model display name */\n label: {\"en\":\"Branch\"},\n /** Field labels and placeholders */\n fields: {\n console_branch_id: {\n label: {\"en\":\"Console Branch ID\"},\n },\n console_org_id: {\n label: {\"en\":\"Console Organization ID\"},\n },\n code: {\n label: {\"en\":\"Branch Code\"},\n },\n name: {\n label: {\"en\":\"Branch Name\"},\n },\n is_headquarters: {\n label: {\"en\":\"Is Headquarters\"},\n },\n is_active: {\n label: {\"en\":\"Active\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for Branch */\nexport const baseBranchSchemas = {\n console_branch_id: z.string(),\n console_org_id: z.string(),\n code: z.string().min(1).max(20),\n name: z.string().min(1).max(100),\n is_headquarters: z.boolean(),\n is_active: z.boolean(),\n} as const;\n\n/** Create schema for Branch (POST requests) */\nexport const baseBranchCreateSchema = z.object({\n console_branch_id: baseBranchSchemas.console_branch_id,\n console_org_id: baseBranchSchemas.console_org_id,\n code: baseBranchSchemas.code,\n name: baseBranchSchemas.name,\n is_headquarters: baseBranchSchemas.is_headquarters,\n is_active: baseBranchSchemas.is_active,\n});\n\n/** Update schema for Branch (PUT/PATCH requests) */\nexport const baseBranchUpdateSchema = baseBranchCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseBranchCreate = z.infer<typeof baseBranchCreateSchema>;\nexport type BaseBranchUpdate = z.infer<typeof baseBranchUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getBranchLabel(locale: string): string {\n return branchI18n.label[locale as keyof typeof branchI18n.label] ?? branchI18n.label['en'] ?? 'Branch';\n}\n\n/** Get field label for a specific locale */\nexport function getBranchFieldLabel(field: string, locale: string): string {\n const fieldI18n = branchI18n.fields[field as keyof typeof branchI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getBranchFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = branchI18n.fields[field as keyof typeof branchI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * Branch Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { Branch as BranchBase } from '@omnify-base/schemas/Branch';\nimport {\n baseBranchSchemas,\n baseBranchCreateSchema,\n baseBranchUpdateSchema,\n branchI18n,\n getBranchLabel,\n getBranchFieldLabel,\n getBranchFieldPlaceholder,\n} from '@omnify-base/schemas/Branch';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface Branch extends BranchBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const branchSchemas = { ...baseBranchSchemas };\nexport const branchCreateSchema = baseBranchCreateSchema;\nexport const branchUpdateSchema = baseBranchUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type BranchCreate = z.infer<typeof branchCreateSchema>;\nexport type BranchUpdate = z.infer<typeof branchUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n branchI18n,\n getBranchLabel,\n getBranchFieldLabel,\n getBranchFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { BranchBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\nimport type { Role } from './Role';\n\n/**\n * Permission\n */\nexport interface Permission {\n /** Primary key */\n id: string;\n /** Permission Name */\n name: string;\n /** Slug */\n slug: string;\n /** Group */\n group?: string;\n /** Roles */\n roles: Role[];\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for Permission\n * Contains model label and all field labels/placeholders\n */\nexport const permissionI18n = {\n /** Model display name */\n label: {\"en\":\"Permission\"},\n /** Field labels and placeholders */\n fields: {\n name: {\n label: {\"en\":\"Permission Name\"},\n },\n slug: {\n label: {\"en\":\"Slug\"},\n },\n group: {\n label: {\"en\":\"Group\"},\n },\n roles: {\n label: {\"en\":\"Roles\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for Permission */\nexport const basePermissionSchemas = {\n name: z.string().min(1).max(100),\n slug: z.string().min(1).max(100),\n group: z.string().max(50).optional().nullable(),\n} as const;\n\n/** Create schema for Permission (POST requests) */\nexport const basePermissionCreateSchema = z.object({\n name: basePermissionSchemas.name,\n slug: basePermissionSchemas.slug,\n group: basePermissionSchemas.group,\n});\n\n/** Update schema for Permission (PUT/PATCH requests) */\nexport const basePermissionUpdateSchema = basePermissionCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BasePermissionCreate = z.infer<typeof basePermissionCreateSchema>;\nexport type BasePermissionUpdate = z.infer<typeof basePermissionUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getPermissionLabel(locale: string): string {\n return permissionI18n.label[locale as keyof typeof permissionI18n.label] ?? permissionI18n.label['en'] ?? 'Permission';\n}\n\n/** Get field label for a specific locale */\nexport function getPermissionFieldLabel(field: string, locale: string): string {\n const fieldI18n = permissionI18n.fields[field as keyof typeof permissionI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getPermissionFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = permissionI18n.fields[field as keyof typeof permissionI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * Permission Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { Permission as PermissionBase } from '@omnify-base/schemas/Permission';\nimport {\n basePermissionSchemas,\n basePermissionCreateSchema,\n basePermissionUpdateSchema,\n permissionI18n,\n getPermissionLabel,\n getPermissionFieldLabel,\n getPermissionFieldPlaceholder,\n} from '@omnify-base/schemas/Permission';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface Permission extends PermissionBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const permissionSchemas = { ...basePermissionSchemas };\nexport const permissionCreateSchema = basePermissionCreateSchema;\nexport const permissionUpdateSchema = basePermissionUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type PermissionCreate = z.infer<typeof permissionCreateSchema>;\nexport type PermissionUpdate = z.infer<typeof permissionUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n permissionI18n,\n getPermissionLabel,\n getPermissionFieldLabel,\n getPermissionFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { PermissionBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\nimport type { Permission } from './Permission';\n\n/**\n * Role\n */\nexport interface Role {\n /** Primary key */\n id: string;\n /** Role Name */\n name: string;\n /** Slug */\n slug: string;\n /** Description */\n description?: string;\n /** Level */\n level: number;\n /** Permissions */\n permissions: Permission[];\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for Role\n * Contains model label and all field labels/placeholders\n */\nexport const roleI18n = {\n /** Model display name */\n label: {\"en\":\"Role\"},\n /** Field labels and placeholders */\n fields: {\n name: {\n label: {\"en\":\"Role Name\"},\n },\n slug: {\n label: {\"en\":\"Slug\"},\n },\n description: {\n label: {\"en\":\"Description\"},\n },\n level: {\n label: {\"en\":\"Level\"},\n },\n permissions: {\n label: {\"en\":\"Permissions\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for Role */\nexport const baseRoleSchemas = {\n name: z.string().min(1).max(100),\n slug: z.string().min(1).max(100),\n description: z.string().optional().nullable(),\n level: z.number().int(),\n} as const;\n\n/** Create schema for Role (POST requests) */\nexport const baseRoleCreateSchema = z.object({\n name: baseRoleSchemas.name,\n slug: baseRoleSchemas.slug,\n description: baseRoleSchemas.description,\n level: baseRoleSchemas.level,\n});\n\n/** Update schema for Role (PUT/PATCH requests) */\nexport const baseRoleUpdateSchema = baseRoleCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseRoleCreate = z.infer<typeof baseRoleCreateSchema>;\nexport type BaseRoleUpdate = z.infer<typeof baseRoleUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getRoleLabel(locale: string): string {\n return roleI18n.label[locale as keyof typeof roleI18n.label] ?? roleI18n.label['en'] ?? 'Role';\n}\n\n/** Get field label for a specific locale */\nexport function getRoleFieldLabel(field: string, locale: string): string {\n const fieldI18n = roleI18n.fields[field as keyof typeof roleI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getRoleFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = roleI18n.fields[field as keyof typeof roleI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * Role Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { Role as RoleBase } from '@omnify-base/schemas/Role';\nimport {\n baseRoleSchemas,\n baseRoleCreateSchema,\n baseRoleUpdateSchema,\n roleI18n,\n getRoleLabel,\n getRoleFieldLabel,\n getRoleFieldPlaceholder,\n} from '@omnify-base/schemas/Role';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface Role extends RoleBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const roleSchemas = { ...baseRoleSchemas };\nexport const roleCreateSchema = baseRoleCreateSchema;\nexport const roleUpdateSchema = baseRoleUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type RoleCreate = z.infer<typeof roleCreateSchema>;\nexport type RoleUpdate = z.infer<typeof roleUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n roleI18n,\n getRoleLabel,\n getRoleFieldLabel,\n getRoleFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { RoleBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\nimport type { Permission } from './Permission';\nimport type { Role } from './Role';\n\n/**\n * Role Permission\n */\nexport interface RolePermission {\n /** Role */\n role: Role;\n /** Permission */\n permission: Permission;\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for RolePermission\n * Contains model label and all field labels/placeholders\n */\nexport const rolePermissionI18n = {\n /** Model display name */\n label: {\"en\":\"Role Permission\"},\n /** Field labels and placeholders */\n fields: {\n role: {\n label: {\"en\":\"Role\"},\n },\n permission: {\n label: {\"en\":\"Permission\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for RolePermission */\nexport const baseRolePermissionSchemas = {\n} as const;\n\n/** Create schema for RolePermission (POST requests) */\nexport const baseRolePermissionCreateSchema = z.object({\n});\n\n/** Update schema for RolePermission (PUT/PATCH requests) */\nexport const baseRolePermissionUpdateSchema = baseRolePermissionCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseRolePermissionCreate = z.infer<typeof baseRolePermissionCreateSchema>;\nexport type BaseRolePermissionUpdate = z.infer<typeof baseRolePermissionUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getRolePermissionLabel(locale: string): string {\n return rolePermissionI18n.label[locale as keyof typeof rolePermissionI18n.label] ?? rolePermissionI18n.label['en'] ?? 'RolePermission';\n}\n\n/** Get field label for a specific locale */\nexport function getRolePermissionFieldLabel(field: string, locale: string): string {\n const fieldI18n = rolePermissionI18n.fields[field as keyof typeof rolePermissionI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getRolePermissionFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = rolePermissionI18n.fields[field as keyof typeof rolePermissionI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * RolePermission Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { RolePermission as RolePermissionBase } from '@omnify-base/schemas/RolePermission';\nimport {\n baseRolePermissionSchemas,\n baseRolePermissionCreateSchema,\n baseRolePermissionUpdateSchema,\n rolePermissionI18n,\n getRolePermissionLabel,\n getRolePermissionFieldLabel,\n getRolePermissionFieldPlaceholder,\n} from '@omnify-base/schemas/RolePermission';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface RolePermission extends RolePermissionBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const rolePermissionSchemas = { ...baseRolePermissionSchemas };\nexport const rolePermissionCreateSchema = baseRolePermissionCreateSchema;\nexport const rolePermissionUpdateSchema = baseRolePermissionUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type RolePermissionCreate = z.infer<typeof rolePermissionCreateSchema>;\nexport type RolePermissionUpdate = z.infer<typeof rolePermissionUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n rolePermissionI18n,\n getRolePermissionLabel,\n getRolePermissionFieldLabel,\n getRolePermissionFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { RolePermissionBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\n\n/**\n * Team\n */\nexport interface Team {\n /** Primary key */\n id: string;\n /** Console Team ID */\n console_team_id: unknown;\n /** Console Organization ID */\n console_org_id: unknown;\n /** Team Name */\n name: string;\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n /** Soft delete timestamp */\n deleted_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for Team\n * Contains model label and all field labels/placeholders\n */\nexport const teamI18n = {\n /** Model display name */\n label: {\"en\":\"Team\"},\n /** Field labels and placeholders */\n fields: {\n console_team_id: {\n label: {\"en\":\"Console Team ID\"},\n },\n console_org_id: {\n label: {\"en\":\"Console Organization ID\"},\n },\n name: {\n label: {\"en\":\"Team Name\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for Team */\nexport const baseTeamSchemas = {\n console_team_id: z.string(),\n console_org_id: z.string(),\n name: z.string().min(1).max(100),\n} as const;\n\n/** Create schema for Team (POST requests) */\nexport const baseTeamCreateSchema = z.object({\n console_team_id: baseTeamSchemas.console_team_id,\n console_org_id: baseTeamSchemas.console_org_id,\n name: baseTeamSchemas.name,\n});\n\n/** Update schema for Team (PUT/PATCH requests) */\nexport const baseTeamUpdateSchema = baseTeamCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseTeamCreate = z.infer<typeof baseTeamCreateSchema>;\nexport type BaseTeamUpdate = z.infer<typeof baseTeamUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getTeamLabel(locale: string): string {\n return teamI18n.label[locale as keyof typeof teamI18n.label] ?? teamI18n.label['en'] ?? 'Team';\n}\n\n/** Get field label for a specific locale */\nexport function getTeamFieldLabel(field: string, locale: string): string {\n const fieldI18n = teamI18n.fields[field as keyof typeof teamI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getTeamFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = teamI18n.fields[field as keyof typeof teamI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * Team Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { Team as TeamBase } from '@omnify-base/schemas/Team';\nimport {\n baseTeamSchemas,\n baseTeamCreateSchema,\n baseTeamUpdateSchema,\n teamI18n,\n getTeamLabel,\n getTeamFieldLabel,\n getTeamFieldPlaceholder,\n} from '@omnify-base/schemas/Team';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface Team extends TeamBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const teamSchemas = { ...baseTeamSchemas };\nexport const teamCreateSchema = baseTeamCreateSchema;\nexport const teamUpdateSchema = baseTeamUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type TeamCreate = z.infer<typeof teamCreateSchema>;\nexport type TeamUpdate = z.infer<typeof teamUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n teamI18n,\n getTeamLabel,\n getTeamFieldLabel,\n getTeamFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { TeamBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\nimport type { Permission } from './Permission';\n\n/**\n * Team Permission\n */\nexport interface TeamPermission {\n /** Primary key */\n id: string;\n /** Console Organization ID */\n console_org_id: unknown;\n /** Console Team ID */\n console_team_id: unknown;\n /** Permission */\n permission: Permission;\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n /** Soft delete timestamp */\n deleted_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for TeamPermission\n * Contains model label and all field labels/placeholders\n */\nexport const teamPermissionI18n = {\n /** Model display name */\n label: {\"en\":\"Team Permission\"},\n /** Field labels and placeholders */\n fields: {\n console_org_id: {\n label: {\"en\":\"Console Organization ID\"},\n },\n console_team_id: {\n label: {\"en\":\"Console Team ID\"},\n },\n permission: {\n label: {\"en\":\"Permission\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for TeamPermission */\nexport const baseTeamPermissionSchemas = {\n console_org_id: z.string(),\n console_team_id: z.string(),\n} as const;\n\n/** Create schema for TeamPermission (POST requests) */\nexport const baseTeamPermissionCreateSchema = z.object({\n console_org_id: baseTeamPermissionSchemas.console_org_id,\n console_team_id: baseTeamPermissionSchemas.console_team_id,\n});\n\n/** Update schema for TeamPermission (PUT/PATCH requests) */\nexport const baseTeamPermissionUpdateSchema = baseTeamPermissionCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseTeamPermissionCreate = z.infer<typeof baseTeamPermissionCreateSchema>;\nexport type BaseTeamPermissionUpdate = z.infer<typeof baseTeamPermissionUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getTeamPermissionLabel(locale: string): string {\n return teamPermissionI18n.label[locale as keyof typeof teamPermissionI18n.label] ?? teamPermissionI18n.label['en'] ?? 'TeamPermission';\n}\n\n/** Get field label for a specific locale */\nexport function getTeamPermissionFieldLabel(field: string, locale: string): string {\n const fieldI18n = teamPermissionI18n.fields[field as keyof typeof teamPermissionI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getTeamPermissionFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = teamPermissionI18n.fields[field as keyof typeof teamPermissionI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * TeamPermission Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { TeamPermission as TeamPermissionBase } from '@omnify-base/schemas/TeamPermission';\nimport {\n baseTeamPermissionSchemas,\n baseTeamPermissionCreateSchema,\n baseTeamPermissionUpdateSchema,\n teamPermissionI18n,\n getTeamPermissionLabel,\n getTeamPermissionFieldLabel,\n getTeamPermissionFieldPlaceholder,\n} from '@omnify-base/schemas/TeamPermission';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface TeamPermission extends TeamPermissionBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const teamPermissionSchemas = { ...baseTeamPermissionSchemas };\nexport const teamPermissionCreateSchema = baseTeamPermissionCreateSchema;\nexport const teamPermissionUpdateSchema = baseTeamPermissionUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type TeamPermissionCreate = z.infer<typeof teamPermissionCreateSchema>;\nexport type TeamPermissionUpdate = z.infer<typeof teamPermissionUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n teamPermissionI18n,\n getTeamPermissionLabel,\n getTeamPermissionFieldLabel,\n getTeamPermissionFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { TeamPermissionBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\nimport type { Role } from './Role';\n\n/**\n * User\n */\nexport interface User {\n /** Primary key */\n id: string;\n /** Name */\n name: string;\n /** Email */\n email: string;\n /** Console User ID */\n console_user_id?: unknown;\n /** Console Access Token */\n console_access_token?: string;\n /** Console Refresh Token */\n console_refresh_token?: string;\n /** Console Token Expiry */\n console_token_expires_at?: DateTimeString;\n /** Roles */\n roles: Role[];\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for User\n * Contains model label and all field labels/placeholders\n */\nexport const userI18n = {\n /** Model display name */\n label: {\"en\":\"User\"},\n /** Field labels and placeholders */\n fields: {\n name: {\n label: {\"en\":\"Name\"},\n },\n email: {\n label: {\"en\":\"Email\"},\n },\n console_user_id: {\n label: {\"en\":\"Console User ID\"},\n },\n console_access_token: {\n label: {\"en\":\"Console Access Token\"},\n },\n console_refresh_token: {\n label: {\"en\":\"Console Refresh Token\"},\n },\n console_token_expires_at: {\n label: {\"en\":\"Console Token Expiry\"},\n },\n roles: {\n label: {\"en\":\"Roles\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for User */\nexport const baseUserSchemas = {\n name: z.string().min(1),\n email: z.string().min(1),\n console_user_id: z.string().optional().nullable(),\n console_access_token: z.string().optional().nullable(),\n console_refresh_token: z.string().optional().nullable(),\n console_token_expires_at: z.string().datetime({ offset: true }).optional().nullable(),\n} as const;\n\n/** Create schema for User (POST requests) */\nexport const baseUserCreateSchema = z.object({\n name: baseUserSchemas.name,\n email: baseUserSchemas.email,\n console_user_id: baseUserSchemas.console_user_id,\n console_access_token: baseUserSchemas.console_access_token,\n console_refresh_token: baseUserSchemas.console_refresh_token,\n console_token_expires_at: baseUserSchemas.console_token_expires_at,\n});\n\n/** Update schema for User (PUT/PATCH requests) */\nexport const baseUserUpdateSchema = baseUserCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseUserCreate = z.infer<typeof baseUserCreateSchema>;\nexport type BaseUserUpdate = z.infer<typeof baseUserUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getUserLabel(locale: string): string {\n return userI18n.label[locale as keyof typeof userI18n.label] ?? userI18n.label['en'] ?? 'User';\n}\n\n/** Get field label for a specific locale */\nexport function getUserFieldLabel(field: string, locale: string): string {\n const fieldI18n = userI18n.fields[field as keyof typeof userI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getUserFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = userI18n.fields[field as keyof typeof userI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * User Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { User as UserBase } from '@omnify-base/schemas/User';\nimport {\n baseUserSchemas,\n baseUserCreateSchema,\n baseUserUpdateSchema,\n userI18n,\n getUserLabel,\n getUserFieldLabel,\n getUserFieldPlaceholder,\n} from '@omnify-base/schemas/User';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface User extends UserBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const userSchemas = { ...baseUserSchemas };\nexport const userCreateSchema = baseUserCreateSchema;\nexport const userUpdateSchema = baseUserUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type UserCreate = z.infer<typeof userCreateSchema>;\nexport type UserUpdate = z.infer<typeof userUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n userI18n,\n getUserLabel,\n getUserFieldLabel,\n getUserFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { UserBase };\n","'use client';\n\nimport { createContext, useContext } from 'react';\nimport type { SsoContextValue } from '../types';\n\n/**\n * SSO Context\n */\nexport const SsoContext = createContext<SsoContextValue | null>(null);\n\n/**\n * Hook to access SSO context\n * @throws Error if used outside SsoProvider\n */\nexport function useSsoContext(): SsoContextValue {\n const context = useContext(SsoContext);\n\n if (!context) {\n throw new Error('useSsoContext must be used within a SsoProvider');\n }\n\n return context;\n}\n","'use client';\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { SsoContext } from './SsoContext';\nimport type {\n SsoCallbackResponse,\n SsoConfig,\n SsoOrganization,\n SsoProviderProps,\n SsoUser,\n} from '../types';\n\n/**\n * Transform backend response to frontend format\n */\nfunction transformUser(data: SsoCallbackResponse['user']): SsoUser {\n return {\n id: data.id,\n consoleUserId: data.console_user_id,\n email: data.email,\n name: data.name,\n };\n}\n\n/**\n * Transform organizations from backend format\n */\nfunction transformOrganizations(\n data: SsoCallbackResponse['organizations']\n): SsoOrganization[] {\n return data.map((org) => ({\n id: org.organization_id,\n slug: org.organization_slug,\n name: org.organization_name,\n orgRole: org.org_role,\n serviceRole: org.service_role,\n }));\n}\n\n/**\n * Get storage instance based on type\n */\nfunction getStorage(type: 'localStorage' | 'sessionStorage'): Storage | null {\n if (typeof window === 'undefined') return null;\n return type === 'localStorage' ? window.localStorage : window.sessionStorage;\n}\n\n/**\n * Get XSRF token from cookie (for Sanctum CSRF protection)\n */\nfunction getXsrfToken(): string | undefined {\n if (typeof document === 'undefined') return undefined;\n return document.cookie\n .split('; ')\n .find(row => row.startsWith('XSRF-TOKEN='))\n ?.split('=')[1];\n}\n\n/**\n * SSO Provider component\n */\nexport function SsoProvider({ children, config, onAuthChange }: SsoProviderProps) {\n const [user, setUser] = useState<SsoUser | null>(null);\n const [organizations, setOrganizations] = useState<SsoOrganization[]>([]);\n const [currentOrg, setCurrentOrg] = useState<SsoOrganization | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n const storageKey = config.storageKey ?? 'sso_selected_org';\n const storage = getStorage(config.storage ?? 'localStorage');\n\n /**\n * Load selected org from storage\n */\n const loadSelectedOrg = useCallback(\n (orgs: SsoOrganization[]) => {\n if (!storage || orgs.length === 0) return null;\n\n const savedSlug = storage.getItem(storageKey);\n if (savedSlug) {\n const found = orgs.find((o) => o.slug === savedSlug);\n if (found) return found;\n }\n\n // Default to first org\n return orgs[0];\n },\n [storage, storageKey]\n );\n\n /**\n * Save selected org to storage\n */\n const saveSelectedOrg = useCallback(\n (org: SsoOrganization | null) => {\n if (!storage) return;\n\n if (org) {\n storage.setItem(storageKey, org.slug);\n } else {\n storage.removeItem(storageKey);\n }\n },\n [storage, storageKey]\n );\n\n /**\n * Fetch current user from backend (Sanctum cookie-based auth)\n */\n const fetchUser = useCallback(async () => {\n try {\n const xsrfToken = getXsrfToken();\n const headers: Record<string, string> = {\n 'Accept': 'application/json',\n };\n if (xsrfToken) {\n headers['X-XSRF-TOKEN'] = decodeURIComponent(xsrfToken);\n }\n\n const response = await fetch(`${config.apiUrl}/api/sso/user`, {\n headers,\n credentials: 'include',\n });\n\n if (!response.ok) {\n return null;\n }\n\n const data: { user: SsoCallbackResponse['user']; organizations: SsoCallbackResponse['organizations'] } =\n await response.json();\n\n const transformedUser = transformUser(data.user);\n const transformedOrgs = transformOrganizations(data.organizations);\n\n return { user: transformedUser, organizations: transformedOrgs };\n } catch {\n return null;\n }\n }, [config.apiUrl]);\n\n /**\n * Initialize auth state\n */\n useEffect(() => {\n let mounted = true;\n\n const init = async () => {\n setIsLoading(true);\n\n const result = await fetchUser();\n\n if (!mounted) return;\n\n if (result) {\n setUser(result.user);\n setOrganizations(result.organizations);\n const selectedOrg = loadSelectedOrg(result.organizations);\n setCurrentOrg(selectedOrg);\n onAuthChange?.(true, result.user);\n } else {\n setUser(null);\n setOrganizations([]);\n setCurrentOrg(null);\n onAuthChange?.(false, null);\n }\n\n setIsLoading(false);\n };\n\n init();\n\n return () => {\n mounted = false;\n };\n }, [fetchUser, loadSelectedOrg, onAuthChange]);\n\n /**\n * Login - redirect to Console\n */\n const login = useCallback(\n (redirectTo?: string) => {\n const callbackUrl = new URL('/sso/callback', window.location.origin);\n if (redirectTo) {\n callbackUrl.searchParams.set('redirect', redirectTo);\n }\n\n const loginUrl = new URL('/sso/authorize', config.consoleUrl);\n loginUrl.searchParams.set('service', config.serviceSlug);\n loginUrl.searchParams.set('redirect_uri', callbackUrl.toString());\n\n window.location.href = loginUrl.toString();\n },\n [config.consoleUrl, config.serviceSlug]\n );\n\n /**\n * Logout from service (Sanctum cookie-based)\n */\n const logout = useCallback(async () => {\n try {\n const xsrfToken = getXsrfToken();\n const headers: Record<string, string> = {};\n if (xsrfToken) {\n headers['X-XSRF-TOKEN'] = decodeURIComponent(xsrfToken);\n }\n\n await fetch(`${config.apiUrl}/api/sso/logout`, {\n method: 'POST',\n headers,\n credentials: 'include',\n });\n } catch {\n // Ignore errors\n }\n\n setUser(null);\n setOrganizations([]);\n setCurrentOrg(null);\n saveSelectedOrg(null);\n onAuthChange?.(false, null);\n }, [config.apiUrl, saveSelectedOrg, onAuthChange]);\n\n /**\n * Global logout - logout from Console too\n */\n const globalLogout = useCallback(\n async (redirectTo?: string) => {\n // First logout from service\n await logout();\n\n // Then redirect to Console logout\n // Convert relative path to absolute URL (e.g., '/' → 'https://example.com/')\n const redirectUri = redirectTo\n ? new URL(redirectTo, window.location.origin).toString()\n : window.location.origin;\n const logoutUrl = new URL('/sso/logout', config.consoleUrl);\n logoutUrl.searchParams.set('redirect_uri', redirectUri);\n\n window.location.href = logoutUrl.toString();\n },\n [logout, config.consoleUrl]\n );\n\n /**\n * Switch organization\n */\n const switchOrg = useCallback(\n (orgSlug: string) => {\n const org = organizations.find((o) => o.slug === orgSlug);\n if (org) {\n setCurrentOrg(org);\n saveSelectedOrg(org);\n }\n },\n [organizations, saveSelectedOrg]\n );\n\n /**\n * Refresh user data\n */\n const refreshUser = useCallback(async () => {\n const result = await fetchUser();\n\n if (result) {\n setUser(result.user);\n setOrganizations(result.organizations);\n\n // Keep current org if still valid\n if (currentOrg) {\n const stillValid = result.organizations.find((o) => o.slug === currentOrg.slug);\n if (!stillValid) {\n const newOrg = loadSelectedOrg(result.organizations);\n setCurrentOrg(newOrg);\n }\n }\n }\n }, [fetchUser, currentOrg, loadSelectedOrg]);\n\n /**\n * Get headers for API requests\n */\n const getHeaders = useCallback((): Record<string, string> => {\n const headers: Record<string, string> = {};\n\n if (currentOrg) {\n headers['X-Org-Id'] = currentOrg.slug;\n }\n\n return headers;\n }, [currentOrg]);\n\n const value = useMemo(\n () => ({\n user,\n organizations,\n currentOrg,\n isLoading,\n isAuthenticated: !!user,\n config,\n login,\n logout,\n globalLogout,\n switchOrg,\n refreshUser,\n getHeaders,\n }),\n [\n user,\n organizations,\n currentOrg,\n isLoading,\n config,\n login,\n logout,\n globalLogout,\n switchOrg,\n refreshUser,\n getHeaders,\n ]\n );\n\n return <SsoContext.Provider value={value}>{children}</SsoContext.Provider>;\n}\n","'use client';\n\nimport { useCallback } from 'react';\nimport { useSsoContext } from '../context/SsoContext';\nimport type { SsoUser } from '../types';\n\n/**\n * Hook for authentication actions and state\n */\nexport interface UseAuthReturn {\n /** Current user or null */\n user: SsoUser | null;\n /** Whether auth is being loaded */\n isLoading: boolean;\n /** Whether user is authenticated */\n isAuthenticated: boolean;\n /** Redirect to login */\n login: (redirectTo?: string) => void;\n /** Logout from service only */\n logout: () => Promise<void>;\n /** Logout from service and Console */\n globalLogout: (redirectTo?: string) => void;\n /** Refresh user data */\n refreshUser: () => Promise<void>;\n}\n\n/**\n * Hook for authentication\n *\n * @example\n * ```tsx\n * function LoginButton() {\n * const { isAuthenticated, login, logout, user } = useAuth();\n *\n * if (isAuthenticated) {\n * return (\n * <div>\n * <span>Hello, {user?.name}</span>\n * <button onClick={() => logout()}>Logout</button>\n * </div>\n * );\n * }\n *\n * return <button onClick={() => login()}>Login</button>;\n * }\n * ```\n */\nexport function useAuth(): UseAuthReturn {\n const { user, isLoading, isAuthenticated, login, logout, globalLogout, refreshUser } =\n useSsoContext();\n\n const handleLogin = useCallback(\n (redirectTo?: string) => {\n login(redirectTo);\n },\n [login]\n );\n\n const handleLogout = useCallback(async () => {\n await logout();\n }, [logout]);\n\n const handleGlobalLogout = useCallback(\n (redirectTo?: string) => {\n globalLogout(redirectTo);\n },\n [globalLogout]\n );\n\n return {\n user,\n isLoading,\n isAuthenticated,\n login: handleLogin,\n logout: handleLogout,\n globalLogout: handleGlobalLogout,\n refreshUser,\n };\n}\n","'use client';\n\nimport { useCallback, useMemo } from 'react';\nimport { useSsoContext } from '../context/SsoContext';\nimport type { SsoOrganization } from '../types';\n\n/**\n * Hook return type for organization management\n */\nexport interface UseOrganizationReturn {\n /** List of organizations user has access to */\n organizations: SsoOrganization[];\n /** Currently selected organization */\n currentOrg: SsoOrganization | null;\n /** Whether user has multiple organizations */\n hasMultipleOrgs: boolean;\n /** Switch to a different organization */\n switchOrg: (orgSlug: string) => void;\n /** Get current org's role */\n currentRole: string | null;\n /** Check if user has at least the given role in current org */\n hasRole: (role: string) => boolean;\n}\n\n/**\n * Role levels for comparison\n */\nconst ROLE_LEVELS: Record<string, number> = {\n admin: 100,\n manager: 50,\n member: 10,\n};\n\n/**\n * Hook for organization management\n *\n * @example\n * ```tsx\n * function OrgInfo() {\n * const { currentOrg, organizations, switchOrg, hasRole } = useOrganization();\n *\n * return (\n * <div>\n * <p>Current: {currentOrg?.name}</p>\n * {hasRole('admin') && <AdminPanel />}\n * <select onChange={(e) => switchOrg(e.target.value)}>\n * {organizations.map((org) => (\n * <option key={org.slug} value={org.slug}>{org.name}</option>\n * ))}\n * </select>\n * </div>\n * );\n * }\n * ```\n */\nexport function useOrganization(): UseOrganizationReturn {\n const { organizations, currentOrg, switchOrg } = useSsoContext();\n\n const hasMultipleOrgs = organizations.length > 1;\n\n const currentRole = currentOrg?.serviceRole ?? null;\n\n const hasRole = useCallback(\n (role: string): boolean => {\n if (!currentRole) return false;\n\n const requiredLevel = ROLE_LEVELS[role] ?? 0;\n const userLevel = ROLE_LEVELS[currentRole] ?? 0;\n\n return userLevel >= requiredLevel;\n },\n [currentRole]\n );\n\n const handleSwitchOrg = useCallback(\n (orgSlug: string) => {\n switchOrg(orgSlug);\n },\n [switchOrg]\n );\n\n return useMemo(\n () => ({\n organizations,\n currentOrg,\n hasMultipleOrgs,\n switchOrg: handleSwitchOrg,\n currentRole,\n hasRole,\n }),\n [organizations, currentOrg, hasMultipleOrgs, handleSwitchOrg, currentRole, hasRole]\n );\n}\n","'use client';\n\nimport { useMemo } from 'react';\nimport { useSsoContext } from '../context/SsoContext';\nimport type { SsoConfig, SsoOrganization, SsoUser } from '../types';\n\n/**\n * Combined SSO hook return type\n */\nexport interface UseSsoReturn {\n // Auth\n user: SsoUser | null;\n isLoading: boolean;\n isAuthenticated: boolean;\n login: (redirectTo?: string) => void;\n logout: () => Promise<void>;\n globalLogout: (redirectTo?: string) => void;\n refreshUser: () => Promise<void>;\n\n // Organization\n organizations: SsoOrganization[];\n currentOrg: SsoOrganization | null;\n hasMultipleOrgs: boolean;\n switchOrg: (orgSlug: string) => void;\n\n // Utilities\n getHeaders: () => Record<string, string>;\n config: SsoConfig;\n}\n\n/**\n * Combined hook for all SSO functionality\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const {\n * user,\n * isAuthenticated,\n * currentOrg,\n * getHeaders,\n * login,\n * logout,\n * } = useSso();\n *\n * const fetchData = async () => {\n * const response = await fetch('/api/data', {\n * headers: getHeaders(),\n * });\n * // ...\n * };\n *\n * if (!isAuthenticated) {\n * return <button onClick={() => login()}>Login</button>;\n * }\n *\n * return (\n * <div>\n * <p>Welcome, {user?.name}</p>\n * <p>Organization: {currentOrg?.name}</p>\n * <button onClick={() => logout()}>Logout</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useSso(): UseSsoReturn {\n const context = useSsoContext();\n\n return useMemo(\n () => ({\n // Auth\n user: context.user,\n isLoading: context.isLoading,\n isAuthenticated: context.isAuthenticated,\n login: context.login,\n logout: context.logout,\n globalLogout: context.globalLogout,\n refreshUser: context.refreshUser,\n\n // Organization\n organizations: context.organizations,\n currentOrg: context.currentOrg,\n hasMultipleOrgs: context.organizations.length > 1,\n switchOrg: context.switchOrg,\n\n // Utilities\n getHeaders: context.getHeaders,\n config: context.config,\n }),\n [context]\n );\n}\n","'use client';\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useSsoContext } from '../context/SsoContext';\nimport type { SsoCallbackProps, SsoCallbackResponse, SsoOrganization, SsoUser } from '../types';\n\n/**\n * Transform backend response to frontend format\n */\nfunction transformUser(data: SsoCallbackResponse['user']): SsoUser {\n return {\n id: data.id,\n consoleUserId: data.console_user_id,\n email: data.email,\n name: data.name,\n };\n}\n\n/**\n * Transform organizations from backend format\n */\nfunction transformOrganizations(\n data: SsoCallbackResponse['organizations']\n): SsoOrganization[] {\n return data.map((org) => ({\n id: org.organization_id,\n slug: org.organization_slug,\n name: org.organization_name,\n orgRole: org.org_role,\n serviceRole: org.service_role,\n }));\n}\n\n/**\n * Default loading component\n */\nfunction DefaultLoading() {\n return (\n <div style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: '200px'\n }}>\n <div>Authenticating...</div>\n </div>\n );\n}\n\n/**\n * Default error component\n */\nfunction DefaultError({ error }: { error: Error }) {\n return (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: '200px',\n color: 'red'\n }}>\n <div>Authentication Error</div>\n <div style={{ fontSize: '0.875rem', marginTop: '0.5rem' }}>{error.message}</div>\n </div>\n );\n}\n\n/**\n * SSO Callback component\n * \n * Place this component at your callback route (e.g., /sso/callback)\n * It handles the SSO code exchange and redirects after successful login.\n *\n * @example\n * ```tsx\n * // pages/sso/callback.tsx or app/sso/callback/page.tsx\n * export default function CallbackPage() {\n * return (\n * <SsoCallback\n * redirectTo=\"/dashboard\"\n * onSuccess={(user, orgs) => console.log('Logged in:', user)}\n * onError={(error) => console.error('Login failed:', error)}\n * />\n * );\n * }\n * ```\n */\nexport function SsoCallback({\n onSuccess,\n onError,\n redirectTo = '/',\n loadingComponent,\n errorComponent,\n}: SsoCallbackProps) {\n const { config, refreshUser } = useSsoContext();\n const [error, setError] = useState<Error | null>(null);\n const [isProcessing, setIsProcessing] = useState(true);\n // 二重呼び出し防止フラグ(React Strict Mode対応)\n const isProcessingRef = useRef(false);\n\n useEffect(() => {\n // 既に処理中の場合はスキップ\n if (isProcessingRef.current) {\n return;\n }\n isProcessingRef.current = true;\n\n const processCallback = async () => {\n try {\n // Get code from URL\n const urlParams = new URLSearchParams(window.location.search);\n const code = urlParams.get('code');\n const redirectParam = urlParams.get('redirect');\n\n if (!code) {\n throw new Error('No authorization code received');\n }\n\n // Get CSRF cookie first (required for Sanctum SPA auth)\n await fetch(`${config.apiUrl}/sanctum/csrf-cookie`, {\n credentials: 'include',\n });\n\n // Get XSRF token from cookie\n const xsrfToken = document.cookie\n .split('; ')\n .find(row => row.startsWith('XSRF-TOKEN='))\n ?.split('=')[1];\n\n // Exchange code for session\n const response = await fetch(`${config.apiUrl}/api/sso/callback`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n ...(xsrfToken ? { 'X-XSRF-TOKEN': decodeURIComponent(xsrfToken) } : {}),\n },\n credentials: 'include',\n body: JSON.stringify({ code }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || 'Failed to authenticate');\n }\n\n const data: SsoCallbackResponse = await response.json();\n\n // Transform data\n const user = transformUser(data.user);\n const organizations = transformOrganizations(data.organizations);\n\n // Refresh context\n await refreshUser();\n\n // Call success callback\n onSuccess?.(user, organizations);\n\n // Redirect\n const finalRedirect = redirectParam || redirectTo;\n window.location.href = finalRedirect;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Authentication failed');\n setError(error);\n onError?.(error);\n // エラー時はフラグをリセットして再試行可能に\n isProcessingRef.current = false;\n } finally {\n setIsProcessing(false);\n }\n };\n\n processCallback();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (error) {\n if (errorComponent) {\n return <>{errorComponent(error)}</>;\n }\n return <DefaultError error={error} />;\n }\n\n if (isProcessing) {\n if (loadingComponent) {\n return <>{loadingComponent}</>;\n }\n return <DefaultLoading />;\n }\n\n return null;\n}\n","'use client';\n\nimport React, { useCallback, useMemo } from 'react';\nimport { Dropdown, Button, Space, Typography, Badge } from 'antd';\nimport { SwapOutlined, CheckOutlined } from '@ant-design/icons';\nimport type { MenuProps } from 'antd';\nimport { useOrganization } from '../hooks/useOrganization';\nimport type { OrganizationSwitcherProps, SsoOrganization } from '../types';\n\nconst { Text } = Typography;\n\n/**\n * Organization Switcher component using Ant Design\n *\n * A dropdown component for switching between organizations.\n * Only renders if user has access to multiple organizations.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <OrganizationSwitcher />\n *\n * // With custom styling\n * <OrganizationSwitcher className=\"my-switcher\" />\n *\n * // With custom render\n * <OrganizationSwitcher\n * renderTrigger={(org, isOpen) => (\n * <Button>{org?.name} {isOpen ? '▲' : '▼'}</Button>\n * )}\n * renderOption={(org, isSelected) => (\n * <div className={isSelected ? 'selected' : ''}>{org.name}</div>\n * )}\n * />\n * ```\n */\nexport function OrganizationSwitcher({\n className,\n renderTrigger,\n renderOption,\n onChange,\n}: OrganizationSwitcherProps) {\n const { organizations, currentOrg, hasMultipleOrgs, switchOrg } = useOrganization();\n const [isOpen, setIsOpen] = React.useState(false);\n\n const handleSelect = useCallback(\n (org: SsoOrganization) => {\n switchOrg(org.slug);\n setIsOpen(false);\n onChange?.(org);\n },\n [switchOrg, onChange]\n );\n\n const menuItems: MenuProps['items'] = useMemo(() => {\n return organizations.map((org) => {\n const isSelected = currentOrg?.slug === org.slug;\n\n if (renderOption) {\n return {\n key: org.slug,\n label: (\n <div onClick={() => handleSelect(org)}>\n {renderOption(org, isSelected)}\n </div>\n ),\n };\n }\n\n return {\n key: org.slug,\n label: (\n <Space style={{ width: '100%', justifyContent: 'space-between' }}>\n <Space direction=\"vertical\" size={0}>\n <Text strong={isSelected}>{org.name}</Text>\n {org.serviceRole && (\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n {org.serviceRole}\n </Text>\n )}\n </Space>\n {isSelected && <CheckOutlined style={{ color: '#1890ff' }} />}\n </Space>\n ),\n onClick: () => handleSelect(org),\n };\n });\n }, [organizations, currentOrg, renderOption, handleSelect]);\n\n // Don't render if only one org\n if (!hasMultipleOrgs) {\n return null;\n }\n\n // Custom trigger\n if (renderTrigger) {\n return (\n <Dropdown\n menu={{ items: menuItems }}\n trigger={['click']}\n open={isOpen}\n onOpenChange={setIsOpen}\n className={className}\n >\n <div style={{ cursor: 'pointer' }}>\n {renderTrigger(currentOrg, isOpen)}\n </div>\n </Dropdown>\n );\n }\n\n // Default Ant Design trigger\n return (\n <Dropdown\n menu={{ items: menuItems }}\n trigger={['click']}\n open={isOpen}\n onOpenChange={setIsOpen}\n className={className}\n >\n <Button>\n <Space>\n <Badge status=\"success\" />\n <span>{currentOrg?.name ?? 'Select Organization'}</span>\n <SwapOutlined />\n </Space>\n </Button>\n </Dropdown>\n );\n}\n","'use client';\n\nimport React, { useEffect } from 'react';\nimport { useAuth } from '../hooks/useAuth';\nimport { useOrganization } from '../hooks/useOrganization';\nimport type { ProtectedRouteProps } from '../types';\n\n/**\n * Default loading component\n */\nfunction DefaultLoading() {\n return (\n <div style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: '200px'\n }}>\n <div>Loading...</div>\n </div>\n );\n}\n\n/**\n * Default login fallback\n */\nfunction DefaultLoginFallback({ login }: { login: () => void }) {\n return (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: '200px',\n gap: '1rem'\n }}>\n <div>Please log in to continue</div>\n <button\n onClick={login}\n style={{\n padding: '0.5rem 1rem',\n background: '#0070f3',\n color: 'white',\n border: 'none',\n borderRadius: '0.375rem',\n cursor: 'pointer',\n }}\n >\n Log In\n </button>\n </div>\n );\n}\n\n/**\n * Default access denied component\n */\nfunction DefaultAccessDenied({ reason }: { reason: string }) {\n return (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: '200px',\n color: '#dc2626'\n }}>\n <div style={{ fontSize: '1.5rem', fontWeight: 600 }}>Access Denied</div>\n <div style={{ marginTop: '0.5rem' }}>{reason}</div>\n </div>\n );\n}\n\n/**\n * Protected Route component\n *\n * Wraps content that requires authentication and optionally specific roles/permissions.\n *\n * @example\n * ```tsx\n * // Basic protection\n * <ProtectedRoute>\n * <Dashboard />\n * </ProtectedRoute>\n *\n * // With role requirement\n * <ProtectedRoute requiredRole=\"admin\">\n * <AdminPanel />\n * </ProtectedRoute>\n *\n * // With custom fallbacks\n * <ProtectedRoute\n * fallback={<Spinner />}\n * loginFallback={<CustomLoginPage />}\n * onAccessDenied={(reason) => console.log(reason)}\n * >\n * <ProtectedContent />\n * </ProtectedRoute>\n * ```\n */\nexport function ProtectedRoute({\n children,\n fallback,\n loginFallback,\n requiredRole,\n requiredPermission,\n onAccessDenied,\n}: ProtectedRouteProps) {\n const { user, isLoading, isAuthenticated, login } = useAuth();\n const { hasRole, currentOrg } = useOrganization();\n\n // Handle access denied callback\n useEffect(() => {\n if (isLoading) return;\n\n if (!isAuthenticated) {\n onAccessDenied?.('unauthenticated');\n } else if (requiredRole && !hasRole(requiredRole)) {\n onAccessDenied?.('insufficient_role');\n }\n // Note: Permission checking would need to be implemented with a permissions hook\n }, [isLoading, isAuthenticated, requiredRole, hasRole, onAccessDenied]);\n\n // Loading state\n if (isLoading) {\n return <>{fallback ?? <DefaultLoading />}</>;\n }\n\n // Not authenticated\n if (!isAuthenticated) {\n if (loginFallback) {\n return <>{loginFallback}</>;\n }\n return <DefaultLoginFallback login={() => login()} />;\n }\n\n // Check role requirement\n if (requiredRole && !hasRole(requiredRole)) {\n return (\n <DefaultAccessDenied\n reason={`This page requires ${requiredRole} role. Your role: ${currentOrg?.serviceRole ?? 'none'}`}\n />\n );\n }\n\n // Note: Permission checking would need a separate implementation\n // with a hook that checks permissions via the backend\n\n // All checks passed\n return <>{children}</>;\n}\n","/**\n * Shared utilities for SSO services\n */\n\n/**\n * Get XSRF token from cookie (for Sanctum CSRF protection)\n */\nexport function getXsrfToken(): string | undefined {\n if (typeof document === \"undefined\") return undefined;\n return document.cookie\n .split(\"; \")\n .find((row) => row.startsWith(\"XSRF-TOKEN=\"))\n ?.split(\"=\")[1];\n}\n\n/**\n * Build headers with XSRF token and optional org slug\n */\nexport function buildHeaders(orgSlug?: string): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n };\n\n const xsrfToken = getXsrfToken();\n if (xsrfToken) {\n headers[\"X-XSRF-TOKEN\"] = decodeURIComponent(xsrfToken);\n }\n\n if (orgSlug) {\n headers[\"X-Org-Slug\"] = orgSlug;\n }\n\n return headers;\n}\n\n/**\n * Fetch CSRF cookie from backend\n */\nexport async function csrf(apiUrl: string): Promise<void> {\n await fetch(`${apiUrl}/sanctum/csrf-cookie`, {\n credentials: \"include\",\n });\n}\n\n/**\n * Make API request with proper error handling\n */\nexport async function request<T>(\n apiUrl: string,\n path: string,\n options: RequestInit = {}\n): Promise<T> {\n const response = await fetch(`${apiUrl}${path}`, {\n ...options,\n credentials: \"include\",\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new Error(error.message || `HTTP ${response.status}`);\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json();\n}\n\n/**\n * Base service configuration\n */\nexport interface ServiceConfig {\n apiUrl: string;\n}\n","/**\n * Auth Service - SSO Authentication\n *\n * Handles SSO callback, logout, user info\n */\n\nimport { buildHeaders, csrf, request, type ServiceConfig } from \"./utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface SsoUser {\n id: number;\n console_user_id: number;\n email: string;\n name: string;\n}\n\nexport interface Organization {\n id: number;\n slug: string;\n name: string;\n role: string;\n}\n\nexport interface AuthCallbackInput {\n code: string;\n device_name?: string;\n}\n\nexport interface AuthCallbackResponse {\n user: SsoUser;\n organizations: Organization[];\n token?: string;\n}\n\nexport interface AuthUserResponse {\n user: SsoUser;\n organizations: Organization[];\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createAuthService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n /**\n * Exchange SSO authorization code for tokens\n * POST /api/sso/callback\n */\n callback: async (input: AuthCallbackInput): Promise<AuthCallbackResponse> => {\n await csrf(apiUrl);\n return request(apiUrl, \"/api/sso/callback\", {\n method: \"POST\",\n headers: buildHeaders(),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Logout current user and revoke tokens\n * POST /api/sso/logout\n */\n logout: async (): Promise<{ message: string }> => {\n return request(apiUrl, \"/api/sso/logout\", {\n method: \"POST\",\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get current authenticated user with organizations\n * GET /api/sso/user\n */\n getUser: async (): Promise<AuthUserResponse> => {\n return request(apiUrl, \"/api/sso/user\", {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get Console SSO global logout URL\n * GET /api/sso/global-logout-url\n */\n getGlobalLogoutUrl: async (redirectUri?: string): Promise<{ logout_url: string }> => {\n const params = redirectUri\n ? `?redirect_uri=${encodeURIComponent(redirectUri)}`\n : \"\";\n return request(apiUrl, `/api/sso/global-logout-url${params}`, {\n headers: buildHeaders(),\n });\n },\n };\n}\n\nexport type AuthService = ReturnType<typeof createAuthService>;\n","/**\n * Token Service - API Token Management\n *\n * For mobile apps using bearer tokens\n */\n\nimport { buildHeaders, request, type ServiceConfig } from \"./utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface ApiToken {\n id: number;\n name: string;\n last_used_at: string | null;\n created_at: string;\n is_current: boolean;\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createTokenService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n /**\n * List all API tokens for current user\n * GET /api/sso/tokens\n */\n list: async (): Promise<{ tokens: ApiToken[] }> => {\n return request(apiUrl, \"/api/sso/tokens\", {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Revoke a specific token\n * DELETE /api/sso/tokens/{tokenId}\n */\n revoke: async (tokenId: number): Promise<{ message: string }> => {\n return request(apiUrl, `/api/sso/tokens/${tokenId}`, {\n method: \"DELETE\",\n headers: buildHeaders(),\n });\n },\n\n /**\n * Revoke all tokens except current\n * POST /api/sso/tokens/revoke-others\n */\n revokeOthers: async (): Promise<{ message: string; revoked_count: number }> => {\n return request(apiUrl, \"/api/sso/tokens/revoke-others\", {\n method: \"POST\",\n headers: buildHeaders(),\n });\n },\n };\n}\n\nexport type TokenService = ReturnType<typeof createTokenService>;\n","/**\n * Role Service - Role Management\n *\n * CRUD operations for roles and role-permission assignments\n */\n\nimport { buildHeaders, request, type ServiceConfig } from \"./utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface Role {\n id: number;\n name: string;\n slug: string;\n description: string | null;\n level: number;\n permissions_count?: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface Permission {\n id: number;\n name: string;\n slug: string;\n group: string | null;\n description?: string | null;\n roles_count?: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface RoleWithPermissions extends Role {\n permissions: Permission[];\n}\n\nexport interface CreateRoleInput {\n slug: string;\n name: string;\n level: number;\n description?: string;\n}\n\nexport interface UpdateRoleInput {\n name?: string;\n level?: number;\n description?: string | null;\n}\n\nexport interface SyncPermissionsInput {\n permissions: (number | string)[];\n}\n\nexport interface SyncPermissionsResponse {\n message: string;\n attached: number;\n detached: number;\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createRoleService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n // =========================================================================\n // Read-only endpoints (authenticated users)\n // =========================================================================\n\n /**\n * Get all roles\n * GET /api/sso/roles\n */\n list: async (): Promise<{ data: Role[] }> => {\n return request(apiUrl, \"/api/sso/roles\", {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get single role with permissions\n * GET /api/sso/roles/{id}\n */\n get: async (id: number | string): Promise<{ data: RoleWithPermissions }> => {\n return request(apiUrl, `/api/sso/roles/${id}`, {\n headers: buildHeaders(),\n });\n },\n\n // =========================================================================\n // Admin endpoints (requires admin role + org context)\n // =========================================================================\n\n /**\n * List all roles (admin)\n * GET /api/admin/sso/roles\n */\n adminList: async (orgSlug: string): Promise<{ data: Role[] }> => {\n return request(apiUrl, \"/api/admin/sso/roles\", {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Get single role (admin)\n * GET /api/admin/sso/roles/{id}\n */\n adminGet: async (\n id: number | string,\n orgSlug: string\n ): Promise<{ data: RoleWithPermissions }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}`, {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Create role (admin only)\n * POST /api/admin/sso/roles\n */\n create: async (\n input: CreateRoleInput,\n orgSlug: string\n ): Promise<{ data: Role; message: string }> => {\n return request(apiUrl, \"/api/admin/sso/roles\", {\n method: \"POST\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Update role (admin only)\n * PUT /api/admin/sso/roles/{id}\n */\n update: async (\n id: number | string,\n input: UpdateRoleInput,\n orgSlug: string\n ): Promise<{ data: Role; message: string }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}`, {\n method: \"PUT\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Delete role (admin only)\n * DELETE /api/admin/sso/roles/{id}\n */\n delete: async (id: number | string, orgSlug: string): Promise<void> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}`, {\n method: \"DELETE\",\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Get role's permissions (admin)\n * GET /api/admin/sso/roles/{id}/permissions\n */\n getPermissions: async (\n id: number | string,\n orgSlug: string\n ): Promise<{\n role: Pick<Role, \"id\" | \"slug\" | \"name\">;\n permissions: Permission[];\n }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}/permissions`, {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Sync role's permissions (admin)\n * PUT /api/admin/sso/roles/{id}/permissions\n */\n syncPermissions: async (\n id: number | string,\n input: SyncPermissionsInput,\n orgSlug: string\n ): Promise<SyncPermissionsResponse> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}/permissions`, {\n method: \"PUT\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n });\n },\n };\n}\n\nexport type RoleService = ReturnType<typeof createRoleService>;\n","/**\n * Permission Service - Permission Management\n *\n * CRUD operations for permissions and permission matrix\n */\n\nimport { buildHeaders, request, type ServiceConfig } from \"./utils\";\nimport type { Role, Permission } from \"./roleService\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface PermissionMatrix {\n roles: Pick<Role, \"id\" | \"slug\" | \"name\">[];\n permissions: Record<string, Pick<Permission, \"id\" | \"slug\" | \"name\">[]>;\n matrix: Record<string, string[]>; // role_slug: permission_slugs[]\n}\n\nexport interface CreatePermissionInput {\n slug: string;\n name: string;\n group?: string;\n description?: string;\n}\n\nexport interface UpdatePermissionInput {\n name?: string;\n group?: string | null;\n description?: string | null;\n}\n\nexport interface PermissionListParams {\n group?: string;\n search?: string;\n grouped?: boolean;\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createPermissionService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n // =========================================================================\n // Read-only endpoints (authenticated users)\n // =========================================================================\n\n /**\n * Get all permissions\n * GET /api/sso/permissions\n */\n list: async (params?: PermissionListParams): Promise<{ data: Permission[]; groups: string[] }> => {\n const queryString = params\n ? `?${new URLSearchParams(\n Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => [k, String(v)])\n )}`\n : \"\";\n return request(apiUrl, `/api/sso/permissions${queryString}`, {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get permission matrix (roles x permissions)\n * GET /api/sso/permission-matrix\n */\n getMatrix: async (): Promise<PermissionMatrix> => {\n return request(apiUrl, \"/api/sso/permission-matrix\", {\n headers: buildHeaders(),\n });\n },\n\n // =========================================================================\n // Admin endpoints (requires admin role + org context)\n // =========================================================================\n\n /**\n * List all permissions (admin)\n * GET /api/admin/sso/permissions\n */\n adminList: async (\n orgSlug: string,\n params?: PermissionListParams\n ): Promise<{ data: Permission[]; groups: string[] }> => {\n const queryString = params\n ? `?${new URLSearchParams(\n Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => [k, String(v)])\n )}`\n : \"\";\n return request(apiUrl, `/api/admin/sso/permissions${queryString}`, {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Get single permission (admin)\n * GET /api/admin/sso/permissions/{id}\n */\n adminGet: async (\n id: number | string,\n orgSlug: string\n ): Promise<{ data: Permission }> => {\n return request(apiUrl, `/api/admin/sso/permissions/${id}`, {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Create permission (admin only)\n * POST /api/admin/sso/permissions\n */\n create: async (\n input: CreatePermissionInput,\n orgSlug: string\n ): Promise<{ data: Permission; message: string }> => {\n return request(apiUrl, \"/api/admin/sso/permissions\", {\n method: \"POST\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Update permission (admin only)\n * PUT /api/admin/sso/permissions/{id}\n */\n update: async (\n id: number | string,\n input: UpdatePermissionInput,\n orgSlug: string\n ): Promise<{ data: Permission; message: string }> => {\n return request(apiUrl, `/api/admin/sso/permissions/${id}`, {\n method: \"PUT\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Delete permission (admin only)\n * DELETE /api/admin/sso/permissions/{id}\n */\n delete: async (id: number | string, orgSlug: string): Promise<void> => {\n return request(apiUrl, `/api/admin/sso/permissions/${id}`, {\n method: \"DELETE\",\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Get permission matrix (admin)\n * GET /api/admin/sso/permission-matrix\n */\n adminGetMatrix: async (orgSlug: string): Promise<PermissionMatrix> => {\n return request(apiUrl, \"/api/admin/sso/permission-matrix\", {\n headers: buildHeaders(orgSlug),\n });\n },\n };\n}\n\nexport type PermissionService = ReturnType<typeof createPermissionService>;\n\n// Re-export Permission type for convenience\nexport type { Permission } from \"./roleService\";\n","/**\n * Team Service - Team Permission Management\n *\n * Manage team permissions and orphaned team cleanup\n */\n\nimport { buildHeaders, request, type ServiceConfig } from \"./utils\";\nimport type { Permission } from \"./roleService\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface TeamWithPermissions {\n console_team_id: number;\n name: string;\n path: string | null;\n permissions: Pick<Permission, \"id\" | \"slug\">[];\n}\n\nexport interface TeamPermissionDetail {\n console_team_id: number;\n permissions: Pick<Permission, \"id\" | \"slug\" | \"name\">[];\n}\n\nexport interface OrphanedTeam {\n console_team_id: number;\n permissions_count: number;\n permissions: string[];\n deleted_at: string | null;\n}\n\nexport interface SyncTeamPermissionsInput {\n permissions: (number | string)[];\n}\n\nexport interface CleanupOrphanedInput {\n console_team_id?: number;\n older_than_days?: number;\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createTeamService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n /**\n * Get all teams with their permissions (admin only)\n * GET /api/admin/sso/teams/permissions\n */\n list: async (orgSlug: string): Promise<{ teams: TeamWithPermissions[] }> => {\n return request(apiUrl, \"/api/admin/sso/teams/permissions\", {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Get specific team permissions (admin only)\n * GET /api/admin/sso/teams/{teamId}/permissions\n */\n getPermissions: async (\n teamId: number,\n orgSlug: string\n ): Promise<TeamPermissionDetail> => {\n return request(apiUrl, `/api/admin/sso/teams/${teamId}/permissions`, {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Sync team permissions (admin only)\n * PUT /api/admin/sso/teams/{teamId}/permissions\n */\n syncPermissions: async (\n teamId: number,\n input: SyncTeamPermissionsInput,\n orgSlug: string\n ): Promise<{\n message: string;\n console_team_id: number;\n attached: number;\n detached: number;\n }> => {\n return request(apiUrl, `/api/admin/sso/teams/${teamId}/permissions`, {\n method: \"PUT\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Remove all permissions for a team (admin only)\n * DELETE /api/admin/sso/teams/{teamId}/permissions\n */\n removePermissions: async (teamId: number, orgSlug: string): Promise<void> => {\n return request(apiUrl, `/api/admin/sso/teams/${teamId}/permissions`, {\n method: \"DELETE\",\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * List orphaned team permissions (admin only)\n * GET /api/admin/sso/teams/orphaned\n */\n listOrphaned: async (\n orgSlug: string\n ): Promise<{\n orphaned_teams: OrphanedTeam[];\n total_orphaned_permissions: number;\n }> => {\n return request(apiUrl, \"/api/admin/sso/teams/orphaned\", {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Restore orphaned team permissions (admin only)\n * POST /api/admin/sso/teams/orphaned/{teamId}/restore\n */\n restoreOrphaned: async (\n teamId: number,\n orgSlug: string\n ): Promise<{\n message: string;\n console_team_id: number;\n restored_count: number;\n }> => {\n return request(apiUrl, `/api/admin/sso/teams/orphaned/${teamId}/restore`, {\n method: \"POST\",\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Cleanup orphaned team permissions (admin only)\n * DELETE /api/admin/sso/teams/orphaned\n */\n cleanupOrphaned: async (\n orgSlug: string,\n input?: CleanupOrphanedInput\n ): Promise<{ message: string; deleted_count: number }> => {\n return request(apiUrl, \"/api/admin/sso/teams/orphaned\", {\n method: \"DELETE\",\n headers: buildHeaders(orgSlug),\n body: input ? JSON.stringify(input) : undefined,\n });\n },\n };\n}\n\nexport type TeamService = ReturnType<typeof createTeamService>;\n","/**\n * User Role Service - Scoped Role Assignments\n *\n * Implements Branch-Level Permissions management:\n * - Global: org_id=null, branch_id=null → Role applies everywhere\n * - Org-wide: org_id=X, branch_id=null → Role applies to all branches in org\n * - Branch: org_id=X, branch_id=Y → Role applies only to specific branch\n */\n\nimport { buildHeaders, request, type ServiceConfig } from \"./utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type RoleScope = \"global\" | \"org-wide\" | \"branch\";\n\nexport interface RoleAssignment {\n id: string | null;\n role: {\n id: string;\n name: string;\n slug: string;\n level: number;\n };\n console_org_id: string | null;\n console_branch_id: string | null;\n scope: RoleScope;\n created_at: string | null;\n}\n\nexport interface UserRoleListResponse {\n data: RoleAssignment[];\n}\n\nexport interface AssignRoleInput {\n role_id: string;\n console_org_id?: string | null;\n console_branch_id?: string | null;\n}\n\nexport interface AssignRoleResponse {\n message: string;\n data: {\n role: {\n id: string;\n name: string;\n slug: string;\n level: number;\n };\n console_org_id: string | null;\n console_branch_id: string | null;\n scope: RoleScope;\n };\n}\n\nexport interface SyncRolesInput {\n roles: string[]; // Role IDs or slugs\n console_org_id?: string | null;\n console_branch_id?: string | null;\n}\n\nexport interface SyncRolesResponse {\n message: string;\n attached: string[];\n detached: string[];\n scope: RoleScope;\n}\n\nexport interface RemoveRoleResponse {\n message: string;\n removed: number;\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createUserRoleService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n /**\n * List user's role assignments with scope information\n * GET /api/admin/sso/users/{userId}/roles\n */\n list: async (userId: string, orgSlug?: string): Promise<RoleAssignment[]> => {\n const response = await request<UserRoleListResponse>(\n apiUrl,\n `/api/admin/sso/users/${userId}/roles`,\n { headers: buildHeaders(orgSlug) }\n );\n return response.data;\n },\n\n /**\n * List user's role assignments filtered by branch context\n * Returns roles applicable to the given org/branch\n */\n listByBranch: async (\n userId: string,\n orgId: string,\n branchId: string | null,\n orgSlug?: string\n ): Promise<RoleAssignment[]> => {\n const all = await request<UserRoleListResponse>(\n apiUrl,\n `/api/admin/sso/users/${userId}/roles`,\n { headers: buildHeaders(orgSlug) }\n );\n\n // Filter assignments that apply to this branch:\n // 1. Global assignments (org=null)\n // 2. Org-wide assignments (org=X, branch=null)\n // 3. Branch-specific assignments (org=X, branch=Y)\n return all.data.filter((a) => {\n // Global applies everywhere\n if (a.console_org_id === null) return true;\n\n // Must be same org\n if (a.console_org_id !== orgId) return false;\n\n // Org-wide applies to all branches\n if (a.console_branch_id === null) return true;\n\n // Branch-specific must match\n return a.console_branch_id === branchId;\n });\n },\n\n /**\n * Assign a role to user with scope\n * POST /api/admin/sso/users/{userId}/roles\n */\n assign: async (\n userId: string,\n input: AssignRoleInput,\n orgSlug?: string\n ): Promise<AssignRoleResponse> => {\n return request<AssignRoleResponse>(\n apiUrl,\n `/api/admin/sso/users/${userId}/roles`,\n {\n method: \"POST\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n }\n );\n },\n\n /**\n * Remove a role assignment from user\n * DELETE /api/admin/sso/users/{userId}/roles/{roleId}\n */\n remove: async (\n userId: string,\n roleId: string,\n orgId?: string | null,\n branchId?: string | null,\n orgSlug?: string\n ): Promise<RemoveRoleResponse> => {\n return request<RemoveRoleResponse>(\n apiUrl,\n `/api/admin/sso/users/${userId}/roles/${roleId}`,\n {\n method: \"DELETE\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify({\n console_org_id: orgId ?? null,\n console_branch_id: branchId ?? null,\n }),\n }\n );\n },\n\n /**\n * Sync roles for user in a specific scope\n * PUT /api/admin/sso/users/{userId}/roles/sync\n */\n sync: async (\n userId: string,\n input: SyncRolesInput,\n orgSlug?: string\n ): Promise<SyncRolesResponse> => {\n return request<SyncRolesResponse>(\n apiUrl,\n `/api/admin/sso/users/${userId}/roles/sync`,\n {\n method: \"PUT\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n }\n );\n },\n };\n}\n\n// Export type for the service\nexport type UserRoleService = ReturnType<typeof createUserRoleService>;\n\n// =============================================================================\n// Helper functions for permission resolution\n// =============================================================================\n\n/**\n * Get scope label for display\n */\nexport const getScopeLabel = (\n scope: RoleScope,\n locale: \"en\" | \"ja\" | \"vi\" = \"en\"\n): string => {\n const labels: Record<RoleScope, Record<string, string>> = {\n global: { en: \"Global\", ja: \"グローバル\", vi: \"Toàn hệ thống\" },\n \"org-wide\": { en: \"Organization\", ja: \"組織全体\", vi: \"Toàn tổ chức\" },\n branch: { en: \"Branch\", ja: \"支店限定\", vi: \"Chi nhánh\" },\n };\n return labels[scope][locale] || labels[scope][\"en\"];\n};\n\n/**\n * Get effective permissions for a user at a specific branch\n * based on their role assignments\n */\nexport const getEffectivePermissions = <\n TRole extends { id: string; permissions?: Array<string | { slug: string }> }\n>(\n roleAssignments: RoleAssignment[],\n allRoles: TRole[],\n orgId: string,\n branchId: string | null\n): string[] => {\n const permissions = new Set<string>();\n\n // Filter applicable assignments\n const applicableAssignments = roleAssignments.filter((a) => {\n if (a.console_org_id === null) return true;\n if (a.console_org_id !== orgId) return false;\n if (a.console_branch_id === null) return true;\n return a.console_branch_id === branchId;\n });\n\n // Collect permissions from all applicable roles\n for (const assignment of applicableAssignments) {\n const role = allRoles.find((r) => r.id === assignment.role.id);\n if (role?.permissions) {\n for (const perm of role.permissions) {\n if (typeof perm === \"string\") {\n permissions.add(perm);\n } else if (perm.slug) {\n permissions.add(perm.slug);\n }\n }\n }\n }\n\n return Array.from(permissions);\n};\n","/**\n * Branch Service - Branch Management\n *\n * Provides methods to fetch branches for the current user/organization\n */\n\nimport { buildHeaders, request, type ServiceConfig } from \"./utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface Branch {\n id: number;\n code: string;\n name: string;\n is_headquarters: boolean;\n is_primary: boolean;\n is_assigned: boolean;\n access_type: \"explicit\" | \"implicit\";\n timezone: string | null;\n currency: string | null;\n locale: string | null;\n}\n\nexport interface BranchesResponse {\n all_branches_access: boolean;\n branches: Branch[];\n primary_branch_id: number | null;\n organization: {\n id: number;\n slug: string;\n name: string;\n };\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createBranchService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n /**\n * Get branches for current user in organization\n * GET /api/sso/branches\n */\n list: async (orgSlug?: string): Promise<BranchesResponse> => {\n const params = orgSlug ? `?organization_slug=${orgSlug}` : \"\";\n return request(apiUrl, `/api/sso/branches${params}`, {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get a specific branch by ID\n * GET /api/sso/branches/{id}\n */\n get: async (branchId: number): Promise<Branch> => {\n const response = await request<{ data: Branch } | Branch>(\n apiUrl,\n `/api/sso/branches/${branchId}`,\n { headers: buildHeaders() }\n );\n return \"data\" in response ? response.data : response;\n },\n\n /**\n * Get headquarters branch for organization\n */\n getHeadquarters: async (orgSlug?: string): Promise<Branch | null> => {\n try {\n const params = orgSlug ? `?organization_slug=${orgSlug}` : \"\";\n const data = await request<BranchesResponse>(\n apiUrl,\n `/api/sso/branches${params}`,\n { headers: buildHeaders() }\n );\n return data.branches.find((b) => b.is_headquarters) ?? null;\n } catch {\n return null;\n }\n },\n\n /**\n * Get primary branch for current user\n */\n getPrimary: async (orgSlug?: string): Promise<Branch | null> => {\n try {\n const params = orgSlug ? `?organization_slug=${orgSlug}` : \"\";\n const data = await request<BranchesResponse>(\n apiUrl,\n `/api/sso/branches${params}`,\n { headers: buildHeaders() }\n );\n if (data.primary_branch_id) {\n return data.branches.find((b) => b.id === data.primary_branch_id) ?? null;\n }\n return null;\n } catch {\n return null;\n }\n },\n };\n}\n\n// Export type for the service\nexport type BranchService = ReturnType<typeof createBranchService>;\n","/**\n * SSO Service - API client for SSO endpoints\n *\n * Provides methods for SSO authentication, tokens, roles, permissions, teams\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface SsoUser {\n id: number;\n console_user_id: number;\n email: string;\n name: string;\n}\n\nexport interface Organization {\n id: number;\n slug: string;\n name: string;\n role: string;\n}\n\nexport interface Role {\n id: number;\n name: string;\n slug: string;\n description: string | null;\n level: number;\n permissions_count?: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface Permission {\n id: number;\n name: string;\n slug: string;\n group: string | null;\n description?: string | null;\n roles_count?: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface RoleWithPermissions extends Role {\n permissions: Permission[];\n}\n\nexport interface PermissionMatrix {\n roles: Pick<Role, \"id\" | \"slug\" | \"name\">[];\n permissions: Record<string, Pick<Permission, \"id\" | \"slug\" | \"name\">[]>;\n matrix: Record<string, string[]>; // role_slug: permission_slugs[]\n}\n\nexport interface ApiToken {\n id: number;\n name: string;\n last_used_at: string | null;\n created_at: string;\n is_current: boolean;\n}\n\nexport interface TeamWithPermissions {\n console_team_id: number;\n name: string;\n path: string | null;\n permissions: Pick<Permission, \"id\" | \"slug\">[];\n}\n\nexport interface TeamPermissionDetail {\n console_team_id: number;\n permissions: Pick<Permission, \"id\" | \"slug\" | \"name\">[];\n}\n\nexport interface OrphanedTeam {\n console_team_id: number;\n permissions_count: number;\n permissions: string[];\n deleted_at: string | null;\n}\n\n// Input types\nexport interface SsoCallbackInput {\n code: string;\n device_name?: string;\n}\n\nexport interface CreateRoleInput {\n slug: string;\n name: string;\n level: number;\n description?: string;\n}\n\nexport interface UpdateRoleInput {\n name?: string;\n level?: number;\n description?: string | null;\n}\n\nexport interface CreatePermissionInput {\n slug: string;\n name: string;\n group?: string;\n description?: string;\n}\n\nexport interface UpdatePermissionInput {\n name?: string;\n group?: string | null;\n description?: string | null;\n}\n\nexport interface SyncPermissionsInput {\n permissions: (number | string)[];\n}\n\nexport interface CleanupOrphanedInput {\n console_team_id?: number;\n older_than_days?: number;\n}\n\n// =============================================================================\n// Helper functions\n// =============================================================================\n\n/**\n * Get XSRF token from cookie (for Sanctum CSRF protection)\n */\nfunction getXsrfToken(): string | undefined {\n if (typeof document === \"undefined\") return undefined;\n return document.cookie\n .split(\"; \")\n .find((row) => row.startsWith(\"XSRF-TOKEN=\"))\n ?.split(\"=\")[1];\n}\n\n/**\n * Build headers with XSRF token and optional org slug\n */\nfunction buildHeaders(orgSlug?: string): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n };\n\n const xsrfToken = getXsrfToken();\n if (xsrfToken) {\n headers[\"X-XSRF-TOKEN\"] = decodeURIComponent(xsrfToken);\n }\n\n if (orgSlug) {\n headers[\"X-Org-Slug\"] = orgSlug;\n }\n\n return headers;\n}\n\n/**\n * Fetch CSRF cookie from backend\n */\nasync function csrf(apiUrl: string): Promise<void> {\n await fetch(`${apiUrl}/sanctum/csrf-cookie`, {\n credentials: \"include\",\n });\n}\n\n/**\n * Make API request with proper error handling\n */\nasync function request<T>(\n apiUrl: string,\n path: string,\n options: RequestInit = {}\n): Promise<T> {\n const response = await fetch(`${apiUrl}${path}`, {\n ...options,\n credentials: \"include\",\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new Error(error.message || `HTTP ${response.status}`);\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json();\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport interface SsoServiceConfig {\n apiUrl: string;\n}\n\nexport function createSsoService(config: SsoServiceConfig) {\n const { apiUrl } = config;\n\n return {\n // =========================================================================\n // SSO Auth\n // =========================================================================\n\n /**\n * Exchange SSO authorization code for tokens\n * POST /api/sso/callback\n */\n callback: async (\n input: SsoCallbackInput\n ): Promise<{\n user: SsoUser;\n organizations: Organization[];\n token?: string;\n }> => {\n await csrf(apiUrl);\n return request(apiUrl, \"/api/sso/callback\", {\n method: \"POST\",\n headers: buildHeaders(),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Logout current user and revoke tokens\n * POST /api/sso/logout\n */\n logout: async (): Promise<{ message: string }> => {\n return request(apiUrl, \"/api/sso/logout\", {\n method: \"POST\",\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get current authenticated user with organizations\n * GET /api/sso/user\n */\n getUser: async (): Promise<{\n user: SsoUser;\n organizations: Organization[];\n }> => {\n return request(apiUrl, \"/api/sso/user\", {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get Console SSO global logout URL\n * GET /api/sso/global-logout-url\n */\n getGlobalLogoutUrl: async (\n redirectUri?: string\n ): Promise<{ logout_url: string }> => {\n const params = redirectUri\n ? `?redirect_uri=${encodeURIComponent(redirectUri)}`\n : \"\";\n return request(apiUrl, `/api/sso/global-logout-url${params}`, {\n headers: buildHeaders(),\n });\n },\n\n // =========================================================================\n // SSO Tokens (for mobile apps)\n // =========================================================================\n\n /**\n * List all API tokens for current user\n * GET /api/sso/tokens\n */\n getTokens: async (): Promise<{ tokens: ApiToken[] }> => {\n return request(apiUrl, \"/api/sso/tokens\", {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Revoke a specific token\n * DELETE /api/sso/tokens/{tokenId}\n */\n revokeToken: async (tokenId: number): Promise<{ message: string }> => {\n return request(apiUrl, `/api/sso/tokens/${tokenId}`, {\n method: \"DELETE\",\n headers: buildHeaders(),\n });\n },\n\n /**\n * Revoke all tokens except current\n * POST /api/sso/tokens/revoke-others\n */\n revokeOtherTokens: async (): Promise<{\n message: string;\n revoked_count: number;\n }> => {\n return request(apiUrl, \"/api/sso/tokens/revoke-others\", {\n method: \"POST\",\n headers: buildHeaders(),\n });\n },\n\n // =========================================================================\n // Roles (Read-only for authenticated users)\n // =========================================================================\n\n /**\n * Get all roles\n * GET /api/sso/roles\n */\n getRoles: async (): Promise<{ data: Role[] }> => {\n return request(apiUrl, \"/api/sso/roles\", {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get single role with permissions\n * GET /api/sso/roles/{id}\n */\n getRole: async (id: number): Promise<{ data: RoleWithPermissions }> => {\n return request(apiUrl, `/api/sso/roles/${id}`, {\n headers: buildHeaders(),\n });\n },\n\n // =========================================================================\n // Permissions (Read-only for authenticated users)\n // =========================================================================\n\n /**\n * Get all permissions\n * GET /api/sso/permissions\n */\n getPermissions: async (params?: {\n group?: string;\n search?: string;\n grouped?: boolean;\n }): Promise<{ data: Permission[]; groups: string[] }> => {\n const queryString = params\n ? `?${new URLSearchParams(\n Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => [k, String(v)])\n )}`\n : \"\";\n return request(apiUrl, `/api/sso/permissions${queryString}`, {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get permission matrix (roles x permissions)\n * GET /api/sso/permission-matrix\n */\n getPermissionMatrix: async (): Promise<PermissionMatrix> => {\n return request(apiUrl, \"/api/sso/permission-matrix\", {\n headers: buildHeaders(),\n });\n },\n\n // =========================================================================\n // Admin - Roles (requires admin role + org context)\n // =========================================================================\n\n /**\n * List all roles (admin)\n * GET /api/admin/sso/roles\n */\n adminGetRoles: async (orgSlug: string): Promise<{ data: Role[] }> => {\n return request(apiUrl, \"/api/admin/sso/roles\", {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Get single role (admin)\n * GET /api/admin/sso/roles/{id}\n */\n adminGetRole: async (\n id: number,\n orgSlug: string\n ): Promise<{ data: RoleWithPermissions }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}`, {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Create role (admin only)\n * POST /api/admin/sso/roles\n */\n createRole: async (\n input: CreateRoleInput,\n orgSlug: string\n ): Promise<{ data: Role; message: string }> => {\n return request(apiUrl, \"/api/admin/sso/roles\", {\n method: \"POST\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Update role (admin only)\n * PUT /api/admin/sso/roles/{id}\n */\n updateRole: async (\n id: number,\n input: UpdateRoleInput,\n orgSlug: string\n ): Promise<{ data: Role; message: string }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}`, {\n method: \"PUT\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Delete role (admin only)\n * DELETE /api/admin/sso/roles/{id}\n */\n deleteRole: async (id: number, orgSlug: string): Promise<void> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}`, {\n method: \"DELETE\",\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Get role's permissions (admin)\n * GET /api/admin/sso/roles/{id}/permissions\n */\n getRolePermissions: async (\n id: number,\n orgSlug: string\n ): Promise<{\n role: Pick<Role, \"id\" | \"slug\" | \"name\">;\n permissions: Permission[];\n }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}/permissions`, {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Sync role's permissions (admin)\n * PUT /api/admin/sso/roles/{id}/permissions\n */\n syncRolePermissions: async (\n id: number,\n input: SyncPermissionsInput,\n orgSlug: string\n ): Promise<{ message: string; attached: number; detached: number }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}/permissions`, {\n method: \"PUT\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n });\n },\n\n // =========================================================================\n // Admin - Permissions (requires admin role + org context)\n // =========================================================================\n\n /**\n * List all permissions (admin)\n * GET /api/admin/sso/permissions\n */\n adminGetPermissions: async (\n orgSlug: string,\n params?: { group?: string; search?: string; grouped?: boolean }\n ): Promise<{ data: Permission[]; groups: string[] }> => {\n const queryString = params\n ? `?${new URLSearchParams(\n Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => [k, String(v)])\n )}`\n : \"\";\n return request(apiUrl, `/api/admin/sso/permissions${queryString}`, {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Get single permission (admin)\n * GET /api/admin/sso/permissions/{id}\n */\n adminGetPermission: async (\n id: number,\n orgSlug: string\n ): Promise<{ data: Permission }> => {\n return request(apiUrl, `/api/admin/sso/permissions/${id}`, {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Create permission (admin only)\n * POST /api/admin/sso/permissions\n */\n createPermission: async (\n input: CreatePermissionInput,\n orgSlug: string\n ): Promise<{ data: Permission; message: string }> => {\n return request(apiUrl, \"/api/admin/sso/permissions\", {\n method: \"POST\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Update permission (admin only)\n * PUT /api/admin/sso/permissions/{id}\n */\n updatePermission: async (\n id: number,\n input: UpdatePermissionInput,\n orgSlug: string\n ): Promise<{ data: Permission; message: string }> => {\n return request(apiUrl, `/api/admin/sso/permissions/${id}`, {\n method: \"PUT\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Delete permission (admin only)\n * DELETE /api/admin/sso/permissions/{id}\n */\n deletePermission: async (id: number, orgSlug: string): Promise<void> => {\n return request(apiUrl, `/api/admin/sso/permissions/${id}`, {\n method: \"DELETE\",\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Get permission matrix (admin)\n * GET /api/admin/sso/permission-matrix\n */\n adminGetPermissionMatrix: async (\n orgSlug: string\n ): Promise<PermissionMatrix> => {\n return request(apiUrl, \"/api/admin/sso/permission-matrix\", {\n headers: buildHeaders(orgSlug),\n });\n },\n\n // =========================================================================\n // Admin - Team Permissions (requires admin role + org context)\n // =========================================================================\n\n /**\n * Get all teams with their permissions (admin only)\n * GET /api/admin/sso/teams/permissions\n */\n getTeamPermissions: async (\n orgSlug: string\n ): Promise<{ teams: TeamWithPermissions[] }> => {\n return request(apiUrl, \"/api/admin/sso/teams/permissions\", {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Get specific team permissions (admin only)\n * GET /api/admin/sso/teams/{teamId}/permissions\n */\n getTeamPermission: async (\n teamId: number,\n orgSlug: string\n ): Promise<TeamPermissionDetail> => {\n return request(apiUrl, `/api/admin/sso/teams/${teamId}/permissions`, {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Sync team permissions (admin only)\n * PUT /api/admin/sso/teams/{teamId}/permissions\n */\n syncTeamPermissions: async (\n teamId: number,\n input: SyncPermissionsInput,\n orgSlug: string\n ): Promise<{\n message: string;\n console_team_id: number;\n attached: number;\n detached: number;\n }> => {\n return request(apiUrl, `/api/admin/sso/teams/${teamId}/permissions`, {\n method: \"PUT\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Remove all permissions for a team (admin only)\n * DELETE /api/admin/sso/teams/{teamId}/permissions\n */\n removeTeamPermissions: async (\n teamId: number,\n orgSlug: string\n ): Promise<void> => {\n return request(apiUrl, `/api/admin/sso/teams/${teamId}/permissions`, {\n method: \"DELETE\",\n headers: buildHeaders(orgSlug),\n });\n },\n\n // =========================================================================\n // Admin - Orphaned Team Permissions (requires admin role + org context)\n // =========================================================================\n\n /**\n * List orphaned team permissions (admin only)\n * GET /api/admin/sso/teams/orphaned\n */\n getOrphanedTeamPermissions: async (\n orgSlug: string\n ): Promise<{\n orphaned_teams: OrphanedTeam[];\n total_orphaned_permissions: number;\n }> => {\n return request(apiUrl, \"/api/admin/sso/teams/orphaned\", {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Restore orphaned team permissions (admin only)\n * POST /api/admin/sso/teams/orphaned/{teamId}/restore\n */\n restoreOrphanedTeamPermissions: async (\n teamId: number,\n orgSlug: string\n ): Promise<{\n message: string;\n console_team_id: number;\n restored_count: number;\n }> => {\n return request(apiUrl, `/api/admin/sso/teams/orphaned/${teamId}/restore`, {\n method: \"POST\",\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Cleanup orphaned team permissions (admin only)\n * DELETE /api/admin/sso/teams/orphaned\n */\n cleanupOrphanedTeamPermissions: async (\n orgSlug: string,\n input?: CleanupOrphanedInput\n ): Promise<{ message: string; deleted_count: number }> => {\n return request(apiUrl, \"/api/admin/sso/teams/orphaned\", {\n method: \"DELETE\",\n headers: buildHeaders(orgSlug),\n body: input ? JSON.stringify(input) : undefined,\n });\n },\n };\n}\n\n// Export types\nexport type SsoService = ReturnType<typeof createSsoService>;\n","/**\n * SSO Query Keys - For TanStack Query / React Query\n *\n * Centralized key management for SSO-related queries.\n * Structure matches the service organization.\n */\n\nexport const ssoQueryKeys = {\n all: [\"sso\"] as const,\n\n // =========================================================================\n // Auth (authService)\n // =========================================================================\n auth: {\n all: () => [...ssoQueryKeys.all, \"auth\"] as const,\n user: () => [...ssoQueryKeys.auth.all(), \"user\"] as const,\n globalLogoutUrl: (redirectUri?: string) =>\n [...ssoQueryKeys.auth.all(), \"global-logout-url\", redirectUri] as const,\n },\n\n // =========================================================================\n // Tokens (tokenService)\n // =========================================================================\n tokens: {\n all: () => [...ssoQueryKeys.all, \"tokens\"] as const,\n list: () => [...ssoQueryKeys.tokens.all(), \"list\"] as const,\n },\n\n // =========================================================================\n // Roles (roleService)\n // =========================================================================\n roles: {\n all: () => [...ssoQueryKeys.all, \"roles\"] as const,\n list: () => [...ssoQueryKeys.roles.all(), \"list\"] as const,\n detail: (id: number | string) =>\n [...ssoQueryKeys.roles.all(), \"detail\", id] as const,\n permissions: (id: number | string) =>\n [...ssoQueryKeys.roles.all(), id, \"permissions\"] as const,\n },\n\n // =========================================================================\n // Permissions (permissionService)\n // =========================================================================\n permissions: {\n all: () => [...ssoQueryKeys.all, \"permissions\"] as const,\n list: (params?: { group?: string; search?: string; grouped?: boolean }) =>\n [...ssoQueryKeys.permissions.all(), \"list\", params] as const,\n detail: (id: number | string) =>\n [...ssoQueryKeys.permissions.all(), \"detail\", id] as const,\n matrix: () => [...ssoQueryKeys.permissions.all(), \"matrix\"] as const,\n },\n\n // =========================================================================\n // Teams (teamService)\n // =========================================================================\n teams: {\n all: () => [...ssoQueryKeys.all, \"teams\"] as const,\n list: () => [...ssoQueryKeys.teams.all(), \"list\"] as const,\n permissions: (teamId: number) =>\n [...ssoQueryKeys.teams.all(), teamId, \"permissions\"] as const,\n orphaned: () => [...ssoQueryKeys.teams.all(), \"orphaned\"] as const,\n },\n\n // =========================================================================\n // User Roles (userRoleService) - Scoped Role Assignments\n // =========================================================================\n userRoles: {\n all: () => [...ssoQueryKeys.all, \"user-roles\"] as const,\n list: (userId: string) =>\n [...ssoQueryKeys.userRoles.all(), userId] as const,\n byBranch: (userId: string, orgId: string, branchId: string | null) =>\n [...ssoQueryKeys.userRoles.all(), userId, orgId, branchId] as const,\n },\n\n // =========================================================================\n // Branches (branchService)\n // =========================================================================\n branches: {\n all: () => [...ssoQueryKeys.all, \"branches\"] as const,\n list: (orgSlug?: string) =>\n [...ssoQueryKeys.branches.all(), \"list\", orgSlug] as const,\n detail: (branchId: number) =>\n [...ssoQueryKeys.branches.all(), \"detail\", branchId] as const,\n headquarters: (orgSlug?: string) =>\n [...ssoQueryKeys.branches.all(), \"headquarters\", orgSlug] as const,\n primary: (orgSlug?: string) =>\n [...ssoQueryKeys.branches.all(), \"primary\", orgSlug] as const,\n },\n\n // =========================================================================\n // Admin variants (with org context)\n // =========================================================================\n admin: {\n roles: {\n all: (orgSlug: string) =>\n [...ssoQueryKeys.all, \"admin\", orgSlug, \"roles\"] as const,\n list: (orgSlug: string) =>\n [...ssoQueryKeys.admin.roles.all(orgSlug), \"list\"] as const,\n detail: (orgSlug: string, id: number | string) =>\n [...ssoQueryKeys.admin.roles.all(orgSlug), \"detail\", id] as const,\n permissions: (orgSlug: string, id: number | string) =>\n [...ssoQueryKeys.admin.roles.all(orgSlug), id, \"permissions\"] as const,\n },\n\n permissions: {\n all: (orgSlug: string) =>\n [...ssoQueryKeys.all, \"admin\", orgSlug, \"permissions\"] as const,\n list: (orgSlug: string, params?: { group?: string; search?: string; grouped?: boolean }) =>\n [...ssoQueryKeys.admin.permissions.all(orgSlug), \"list\", params] as const,\n detail: (orgSlug: string, id: number | string) =>\n [...ssoQueryKeys.admin.permissions.all(orgSlug), \"detail\", id] as const,\n matrix: (orgSlug: string) =>\n [...ssoQueryKeys.admin.permissions.all(orgSlug), \"matrix\"] as const,\n },\n\n teams: {\n all: (orgSlug: string) =>\n [...ssoQueryKeys.all, \"admin\", orgSlug, \"teams\"] as const,\n list: (orgSlug: string) =>\n [...ssoQueryKeys.admin.teams.all(orgSlug), \"list\"] as const,\n permissions: (orgSlug: string, teamId: number) =>\n [...ssoQueryKeys.admin.teams.all(orgSlug), teamId, \"permissions\"] as const,\n orphaned: (orgSlug: string) =>\n [...ssoQueryKeys.admin.teams.all(orgSlug), \"orphaned\"] as const,\n },\n\n userRoles: {\n all: (orgSlug: string) =>\n [...ssoQueryKeys.all, \"admin\", orgSlug, \"user-roles\"] as const,\n list: (orgSlug: string, userId: string) =>\n [...ssoQueryKeys.admin.userRoles.all(orgSlug), userId] as const,\n byBranch: (orgSlug: string, userId: string, orgId: string, branchId: string | null) =>\n [...ssoQueryKeys.admin.userRoles.all(orgSlug), userId, orgId, branchId] as const,\n },\n },\n} as const;\n"],"mappings":"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","names":["import_zod","import_zod","import_zod","import_zod","import_zod","import_zod","import_react","import_react","import_react","import_react","import_react","import_jsx_runtime","transformUser","transformOrganizations","error","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","DefaultLoading","getXsrfToken","getXsrfToken","buildHeaders","csrf","request"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../node_modules/@omnify-base/schemas/i18n.ts","../node_modules/@omnify-base/schemas/BranchCache.ts","../src/schemas/BranchCache.ts","../node_modules/@omnify-base/schemas/OrganizationCache.ts","../src/schemas/OrganizationCache.ts","../node_modules/@omnify-base/schemas/Permission.ts","../src/schemas/Permission.ts","../node_modules/@omnify-base/schemas/Role.ts","../src/schemas/Role.ts","../node_modules/@omnify-base/schemas/RolePermission.ts","../src/schemas/RolePermission.ts","../node_modules/@omnify-base/schemas/TeamCache.ts","../src/schemas/TeamCache.ts","../node_modules/@omnify-base/schemas/TeamPermission.ts","../src/schemas/TeamPermission.ts","../node_modules/@omnify-base/schemas/UserCache.ts","../src/schemas/UserCache.ts","../src/context/SsoContext.tsx","../src/context/SsoProvider.tsx","../src/context/BranchContext.tsx","../src/context/BranchProvider.tsx","../src/queryKeys.ts","../src/services/utils.ts","../src/services/branchService.ts","../src/hooks/useAuth.ts","../src/hooks/useOrganization.ts","../src/hooks/useSso.ts","../src/hooks/useBranch.ts","../src/components/SsoCallback.tsx","../src/components/OrganizationSwitcher.tsx","../src/components/ProtectedRoute.tsx","../src/components/OrgBranchSelectorModal.tsx","../src/components/BranchGate.tsx","../src/components/admin/UserTable.tsx","../src/i18n/translations.ts","../src/i18n/useSsoTranslation.ts","../src/i18n/I18nProvider.tsx","../src/i18n/config.ts","../src/i18n/useTranslations.ts","../src/i18n/useLocale.ts","../src/components/admin/UserForm.tsx","../src/utils/branchHeaders.ts","../src/services/authService.ts","../src/services/tokenService.ts","../src/services/roleService.ts","../src/services/permissionService.ts","../src/services/teamService.ts","../src/services/userRoleService.ts","../src/services/userService.ts","../src/services/ssoService.ts"],"sourcesContent":["/**\n * @famgia/omnify-react-sso\n *\n * SSO (Single Sign-On) schemas, types, components, and utilities for Omnify.\n */\n\n// =============================================================================\n// Schemas (auto-generated from Omnify)\n// =============================================================================\n\nexport * from './schemas';\n\n// =============================================================================\n// Context & Provider\n// =============================================================================\n\nexport { SsoContext } from './context/SsoContext';\nexport { SsoProvider } from './context/SsoProvider';\nexport { BranchContext } from './context/BranchContext';\nexport { BranchProvider } from './context/BranchProvider';\n\n// =============================================================================\n// Hooks\n// =============================================================================\n\nexport { useAuth } from './hooks/useAuth';\nexport { useOrganization } from './hooks/useOrganization';\nexport { useSso } from './hooks/useSso';\nexport { useBranch } from './hooks/useBranch';\n\n// Hook return types\nexport type { UseAuthReturn } from './hooks/useAuth';\nexport type { UseOrganizationReturn } from './hooks/useOrganization';\nexport type { UseSsoReturn } from './hooks/useSso';\nexport type { UseBranchReturn } from './hooks/useBranch';\n\n// =============================================================================\n// Components\n// =============================================================================\n\nexport { SsoCallback } from './components/SsoCallback';\nexport { OrganizationSwitcher } from './components/OrganizationSwitcher';\nexport { ProtectedRoute } from './components/ProtectedRoute';\nexport { OrgBranchSelectorModal } from './components/OrgBranchSelectorModal';\nexport { BranchGate, useBranchGate } from './components/BranchGate';\n\n// Admin Components\nexport { UserTable, UserForm } from './components/admin';\nexport type { UserTableProps, UserFormProps } from './components/admin';\n\n// =============================================================================\n// i18n\n// =============================================================================\n\nexport {\n // SSO-specific\n useSsoTranslation,\n defaultTranslations,\n ssoNamespace,\n // Provider and hooks\n I18nProvider,\n type I18nProviderProps,\n useTranslations,\n useLocale,\n // Config\n locales,\n defaultLocale,\n localeNames,\n changeLanguage,\n getCurrentLocale,\n type Locale,\n} from './i18n';\n\n// =============================================================================\n// Utilities\n// =============================================================================\n\nexport {\n createBranchHeaderSetter,\n setBranchHeaders,\n BRANCH_HEADERS,\n} from './utils/branchHeaders';\n\n// =============================================================================\n// Services - Individual services (recommended)\n// =============================================================================\n\n// Auth Service\nexport { createAuthService } from './services';\nexport type {\n AuthService,\n SsoUser as AuthUser,\n Organization,\n AuthCallbackInput,\n AuthCallbackResponse,\n AuthUserResponse,\n} from './services';\n\n// Token Service\nexport { createTokenService } from './services';\nexport type { TokenService, ApiToken } from './services';\n\n// Role Service\nexport { createRoleService } from './services';\nexport type {\n RoleService,\n Role,\n RoleWithPermissions,\n CreateRoleInput,\n UpdateRoleInput,\n SyncPermissionsInput,\n SyncPermissionsResponse,\n} from './services';\n\n// Permission Service\nexport { createPermissionService } from './services';\nexport type {\n PermissionService,\n Permission,\n PermissionMatrix,\n PermissionListParams,\n CreatePermissionInput,\n UpdatePermissionInput,\n} from './services';\n\n// Team Service\nexport { createTeamService } from './services';\nexport type {\n TeamService,\n TeamWithPermissions,\n TeamPermissionDetail,\n OrphanedTeam,\n SyncTeamPermissionsInput,\n CleanupOrphanedInput,\n} from './services';\n\n// User Role Service (Scoped Role Assignments)\nexport { createUserRoleService, getScopeLabel, getEffectivePermissions } from './services';\nexport type {\n UserRoleService,\n RoleScope,\n RoleAssignment,\n AssignRoleInput,\n AssignRoleResponse,\n SyncRolesInput,\n SyncRolesResponse,\n RemoveRoleResponse,\n} from './services';\n\n// Branch Service\nexport { createBranchService } from './services';\nexport type { BranchService, Branch, BranchesResponse } from './services';\n\n// User Service (Admin CRUD)\nexport { createUserService } from './services';\nexport type {\n UserService,\n User,\n UserListParams,\n UserListResponse,\n UpdateUserInput,\n UserPermissionsBreakdown,\n RoleAssignmentWithPermissions,\n TeamMembershipWithPermissions,\n} from './services';\n\n// Service Config\nexport type { ServiceConfig } from './services';\n\n// =============================================================================\n// Legacy: ssoService (deprecated - use individual services)\n// =============================================================================\n\n/**\n * @deprecated Use individual services instead:\n * - createAuthService() for auth\n * - createTokenService() for tokens\n * - createRoleService() for roles\n * - createPermissionService() for permissions\n * - createTeamService() for teams\n * - createUserRoleService() for user role assignments\n * - createBranchService() for branches\n */\nexport { createSsoService } from './services';\nexport type { SsoService, SsoServiceConfig } from './services';\n\n// Legacy type aliases for backward compatibility\nexport type { SsoUser as SsoServiceUser } from './services';\nexport type { Role as ServiceRole } from './services';\nexport type { Permission as ServicePermission } from './services';\n\n// =============================================================================\n// Types (camelCase - for React components)\n// =============================================================================\n\nexport type {\n SsoUser,\n SsoOrganization,\n SsoConfig,\n SsoContextValue,\n SsoCallbackResponse,\n SsoProviderProps,\n SsoCallbackProps,\n OrganizationSwitcherProps,\n ProtectedRouteProps,\n // Branch types\n SsoBranch,\n BranchContextValue,\n BranchProviderProps,\n OrgBranchSelectorModalProps,\n OrgBranchSelection,\n // BranchGate types\n BranchGateProps,\n BranchGateSelection,\n} from './types';\n\n// =============================================================================\n// Query Keys (for TanStack Query / React Query)\n// =============================================================================\n\nexport { ssoQueryKeys } from './queryKeys';\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\n\nimport type { LocaleMap } from '@omnify-base/schemas/common';\n\n/**\n * Default locale for this project.\n */\nexport const defaultLocale = 'ja' as const;\n\n/**\n * Fallback locale when requested locale is not found.\n */\nexport const fallbackLocale = 'en' as const;\n\n/**\n * Supported locales in this project.\n */\nexport const supportedLocales = [\"ja\",\"en\"] as const;\n\n/**\n * Validation messages for all supported locales.\n * Use getMessage(key, locale, params) to get formatted message.\n */\nexport const validationMessages = {\n \"required\": {\n \"ja\": \"${displayName}は必須です\",\n \"en\": \"${displayName} is required\"\n },\n \"minLength\": {\n \"ja\": \"${displayName}は${min}文字以上で入力してください\",\n \"en\": \"${displayName} must be at least ${min} characters\"\n },\n \"maxLength\": {\n \"ja\": \"${displayName}は${max}文字以内で入力してください\",\n \"en\": \"${displayName} must be at most ${max} characters\"\n },\n \"min\": {\n \"ja\": \"${displayName}は${min}以上で入力してください\",\n \"en\": \"${displayName} must be at least ${min}\"\n },\n \"max\": {\n \"ja\": \"${displayName}は${max}以下で入力してください\",\n \"en\": \"${displayName} must be at most ${max}\"\n },\n \"email\": {\n \"ja\": \"有効なメールアドレスを入力してください\",\n \"en\": \"Please enter a valid email address\"\n },\n \"url\": {\n \"ja\": \"有効なURLを入力してください\",\n \"en\": \"Please enter a valid URL\"\n },\n \"pattern\": {\n \"ja\": \"${displayName}の形式が正しくありません\",\n \"en\": \"${displayName} format is invalid\"\n }\n} as const;\n\n/**\n * Get validation message for a specific key and locale.\n * Supports template placeholders: ${displayName}, ${min}, ${max}, etc.\n *\n * @param key - Message key (e.g., 'required', 'minLength')\n * @param locale - Locale code (e.g., 'ja', 'en')\n * @param params - Template parameters to replace\n * @returns Formatted message string\n *\n * @example\n * getMessage('required', 'ja', { displayName: '氏名' })\n * // => '氏名は必須です'\n */\nexport function getMessage(\n key: string,\n locale: string,\n params: Record<string, string | number> = {}\n): string {\n const messages = validationMessages[key as keyof typeof validationMessages];\n if (!messages) return key;\n\n let message = (messages as LocaleMap)[locale]\n ?? (messages as LocaleMap)[fallbackLocale]\n ?? (messages as LocaleMap)[defaultLocale]\n ?? key;\n\n // Replace template placeholders\n for (const [param, value] of Object.entries(params)) {\n message = message.replace(new RegExp(`\\\\$\\{${param}\\}`, 'g'), String(value));\n }\n\n return message;\n}\n\n/**\n * Get all validation messages for a specific locale.\n *\n * @param locale - Locale code\n * @returns Object with all messages for the locale\n */\nexport function getMessages(locale: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const [key, messages] of Object.entries(validationMessages)) {\n result[key] = (messages as LocaleMap)[locale]\n ?? (messages as LocaleMap)[fallbackLocale]\n ?? (messages as LocaleMap)[defaultLocale]\n ?? key;\n }\n return result;\n}\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\n\n/**\n * 支店キャッシュ\n */\nexport interface BranchCache {\n /** Primary key */\n id: string;\n /** Console Branch ID */\n console_branch_id: unknown;\n /** Console Organization ID */\n console_org_id: unknown;\n /** 支店コード */\n code: string;\n /** 支店名 */\n name: string;\n /** 本社 */\n is_headquarters: boolean;\n /** 有効 */\n is_active: boolean;\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n /** Soft delete timestamp */\n deleted_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for BranchCache\n * Contains model label and all field labels/placeholders\n */\nexport const branchCacheI18n = {\n /** Model display name */\n label: {\"ja\":\"支店キャッシュ\",\"en\":\"Branch Cache\"},\n /** Field labels and placeholders */\n fields: {\n console_branch_id: {\n label: {\"ja\":\"Console Branch ID\",\"en\":\"Console Branch ID\"},\n },\n console_org_id: {\n label: {\"ja\":\"Console Organization ID\",\"en\":\"Console Organization ID\"},\n },\n code: {\n label: {\"ja\":\"支店コード\",\"en\":\"Branch Code\"},\n },\n name: {\n label: {\"ja\":\"支店名\",\"en\":\"Branch Name\"},\n },\n is_headquarters: {\n label: {\"ja\":\"本社\",\"en\":\"Is Headquarters\"},\n },\n is_active: {\n label: {\"ja\":\"有効\",\"en\":\"Active\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for BranchCache */\nexport const baseBranchCacheSchemas = {\n console_branch_id: z.string(),\n console_org_id: z.string(),\n code: z.string().min(1).max(20),\n name: z.string().min(1).max(100),\n is_headquarters: z.boolean(),\n is_active: z.boolean(),\n} as const;\n\n/** Create schema for BranchCache (POST requests) */\nexport const baseBranchCacheCreateSchema = z.object({\n console_branch_id: baseBranchCacheSchemas.console_branch_id,\n console_org_id: baseBranchCacheSchemas.console_org_id,\n code: baseBranchCacheSchemas.code,\n name: baseBranchCacheSchemas.name,\n is_headquarters: baseBranchCacheSchemas.is_headquarters,\n is_active: baseBranchCacheSchemas.is_active,\n});\n\n/** Update schema for BranchCache (PUT/PATCH requests) */\nexport const baseBranchCacheUpdateSchema = baseBranchCacheCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseBranchCacheCreate = z.infer<typeof baseBranchCacheCreateSchema>;\nexport type BaseBranchCacheUpdate = z.infer<typeof baseBranchCacheUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getBranchCacheLabel(locale: string): string {\n return branchCacheI18n.label[locale as keyof typeof branchCacheI18n.label] ?? branchCacheI18n.label['en'] ?? 'BranchCache';\n}\n\n/** Get field label for a specific locale */\nexport function getBranchCacheFieldLabel(field: string, locale: string): string {\n const fieldI18n = branchCacheI18n.fields[field as keyof typeof branchCacheI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getBranchCacheFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = branchCacheI18n.fields[field as keyof typeof branchCacheI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * BranchCache Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { BranchCache as BranchCacheBase } from '@omnify-base/schemas/BranchCache';\nimport {\n baseBranchCacheSchemas,\n baseBranchCacheCreateSchema,\n baseBranchCacheUpdateSchema,\n branchCacheI18n,\n getBranchCacheLabel,\n getBranchCacheFieldLabel,\n getBranchCacheFieldPlaceholder,\n} from '@omnify-base/schemas/BranchCache';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface BranchCache extends BranchCacheBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const branchCacheSchemas = { ...baseBranchCacheSchemas };\nexport const branchCacheCreateSchema = baseBranchCacheCreateSchema;\nexport const branchCacheUpdateSchema = baseBranchCacheUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type BranchCacheCreate = z.infer<typeof branchCacheCreateSchema>;\nexport type BranchCacheUpdate = z.infer<typeof branchCacheUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n branchCacheI18n,\n getBranchCacheLabel,\n getBranchCacheFieldLabel,\n getBranchCacheFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { BranchCacheBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\n\n/**\n * 組織キャッシュ\n */\nexport interface OrganizationCache {\n /** Primary key */\n id: string;\n /** Console Organization ID */\n console_org_id: unknown;\n /** 組織名 */\n name: string;\n /** 組織コード */\n code: string;\n /** 有効 */\n is_active: boolean;\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n /** Soft delete timestamp */\n deleted_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for OrganizationCache\n * Contains model label and all field labels/placeholders\n */\nexport const organizationCacheI18n = {\n /** Model display name */\n label: {\"ja\":\"組織キャッシュ\",\"en\":\"Organization Cache\"},\n /** Field labels and placeholders */\n fields: {\n console_org_id: {\n label: {\"ja\":\"Console Organization ID\",\"en\":\"Console Organization ID\"},\n },\n name: {\n label: {\"ja\":\"組織名\",\"en\":\"Organization Name\"},\n },\n code: {\n label: {\"ja\":\"組織コード\",\"en\":\"Organization Code\"},\n },\n is_active: {\n label: {\"ja\":\"有効\",\"en\":\"Active\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for OrganizationCache */\nexport const baseOrganizationCacheSchemas = {\n console_org_id: z.string(),\n name: z.string().min(1).max(100),\n code: z.string().min(1).max(20),\n is_active: z.boolean(),\n} as const;\n\n/** Create schema for OrganizationCache (POST requests) */\nexport const baseOrganizationCacheCreateSchema = z.object({\n console_org_id: baseOrganizationCacheSchemas.console_org_id,\n name: baseOrganizationCacheSchemas.name,\n code: baseOrganizationCacheSchemas.code,\n is_active: baseOrganizationCacheSchemas.is_active,\n});\n\n/** Update schema for OrganizationCache (PUT/PATCH requests) */\nexport const baseOrganizationCacheUpdateSchema = baseOrganizationCacheCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseOrganizationCacheCreate = z.infer<typeof baseOrganizationCacheCreateSchema>;\nexport type BaseOrganizationCacheUpdate = z.infer<typeof baseOrganizationCacheUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getOrganizationCacheLabel(locale: string): string {\n return organizationCacheI18n.label[locale as keyof typeof organizationCacheI18n.label] ?? organizationCacheI18n.label['en'] ?? 'OrganizationCache';\n}\n\n/** Get field label for a specific locale */\nexport function getOrganizationCacheFieldLabel(field: string, locale: string): string {\n const fieldI18n = organizationCacheI18n.fields[field as keyof typeof organizationCacheI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getOrganizationCacheFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = organizationCacheI18n.fields[field as keyof typeof organizationCacheI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * OrganizationCache Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { OrganizationCache as OrganizationCacheBase } from '@omnify-base/schemas/OrganizationCache';\nimport {\n baseOrganizationCacheSchemas,\n baseOrganizationCacheCreateSchema,\n baseOrganizationCacheUpdateSchema,\n organizationCacheI18n,\n getOrganizationCacheLabel,\n getOrganizationCacheFieldLabel,\n getOrganizationCacheFieldPlaceholder,\n} from '@omnify-base/schemas/OrganizationCache';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface OrganizationCache extends OrganizationCacheBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const organizationCacheSchemas = { ...baseOrganizationCacheSchemas };\nexport const organizationCacheCreateSchema = baseOrganizationCacheCreateSchema;\nexport const organizationCacheUpdateSchema = baseOrganizationCacheUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type OrganizationCacheCreate = z.infer<typeof organizationCacheCreateSchema>;\nexport type OrganizationCacheUpdate = z.infer<typeof organizationCacheUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n organizationCacheI18n,\n getOrganizationCacheLabel,\n getOrganizationCacheFieldLabel,\n getOrganizationCacheFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { OrganizationCacheBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\nimport type { Role } from './Role';\n\n/**\n * 権限\n */\nexport interface Permission {\n /** Primary key */\n id: string;\n /** 権限名 */\n name: string;\n /** スラッグ */\n slug: string;\n /** グループ */\n group?: string;\n /** ロール */\n roles: Role[];\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for Permission\n * Contains model label and all field labels/placeholders\n */\nexport const permissionI18n = {\n /** Model display name */\n label: {\"ja\":\"権限\",\"en\":\"Permission\"},\n /** Field labels and placeholders */\n fields: {\n name: {\n label: {\"ja\":\"権限名\",\"en\":\"Permission Name\"},\n },\n slug: {\n label: {\"ja\":\"スラッグ\",\"en\":\"Slug\"},\n },\n group: {\n label: {\"ja\":\"グループ\",\"en\":\"Group\"},\n },\n roles: {\n label: {\"ja\":\"ロール\",\"en\":\"Roles\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for Permission */\nexport const basePermissionSchemas = {\n name: z.string().min(1).max(100),\n slug: z.string().min(1).max(100),\n group: z.string().max(50).optional().nullable(),\n} as const;\n\n/** Create schema for Permission (POST requests) */\nexport const basePermissionCreateSchema = z.object({\n name: basePermissionSchemas.name,\n slug: basePermissionSchemas.slug,\n group: basePermissionSchemas.group,\n});\n\n/** Update schema for Permission (PUT/PATCH requests) */\nexport const basePermissionUpdateSchema = basePermissionCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BasePermissionCreate = z.infer<typeof basePermissionCreateSchema>;\nexport type BasePermissionUpdate = z.infer<typeof basePermissionUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getPermissionLabel(locale: string): string {\n return permissionI18n.label[locale as keyof typeof permissionI18n.label] ?? permissionI18n.label['en'] ?? 'Permission';\n}\n\n/** Get field label for a specific locale */\nexport function getPermissionFieldLabel(field: string, locale: string): string {\n const fieldI18n = permissionI18n.fields[field as keyof typeof permissionI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getPermissionFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = permissionI18n.fields[field as keyof typeof permissionI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * Permission Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { Permission as PermissionBase } from '@omnify-base/schemas/Permission';\nimport {\n basePermissionSchemas,\n basePermissionCreateSchema,\n basePermissionUpdateSchema,\n permissionI18n,\n getPermissionLabel,\n getPermissionFieldLabel,\n getPermissionFieldPlaceholder,\n} from '@omnify-base/schemas/Permission';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface Permission extends PermissionBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const permissionSchemas = { ...basePermissionSchemas };\nexport const permissionCreateSchema = basePermissionCreateSchema;\nexport const permissionUpdateSchema = basePermissionUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type PermissionCreate = z.infer<typeof permissionCreateSchema>;\nexport type PermissionUpdate = z.infer<typeof permissionUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n permissionI18n,\n getPermissionLabel,\n getPermissionFieldLabel,\n getPermissionFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { PermissionBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\nimport type { Permission } from './Permission';\n\n/**\n * ロール\n */\nexport interface Role {\n /** Primary key */\n id: string;\n /** 組織ID */\n console_org_id?: string;\n /** ロール名 */\n name: string;\n /** スラッグ */\n slug: string;\n /** 説明 */\n description?: string;\n /** レベル */\n level: number;\n /** 権限 */\n permissions: Permission[];\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for Role\n * Contains model label and all field labels/placeholders\n */\nexport const roleI18n = {\n /** Model display name */\n label: {\"ja\":\"ロール\",\"en\":\"Role\"},\n /** Field labels and placeholders */\n fields: {\n console_org_id: {\n label: {\"ja\":\"組織ID\",\"en\":\"Organization ID\"},\n },\n name: {\n label: {\"ja\":\"ロール名\",\"en\":\"Role Name\"},\n },\n slug: {\n label: {\"ja\":\"スラッグ\",\"en\":\"Slug\"},\n },\n description: {\n label: {\"ja\":\"説明\",\"en\":\"Description\"},\n },\n level: {\n label: {\"ja\":\"レベル\",\"en\":\"Level\"},\n },\n permissions: {\n label: {\"ja\":\"権限\",\"en\":\"Permissions\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for Role */\nexport const baseRoleSchemas = {\n console_org_id: z.string().max(36).optional().nullable(),\n name: z.string().min(1).max(100),\n slug: z.string().min(1).max(100),\n description: z.string().optional().nullable(),\n level: z.number().int(),\n} as const;\n\n/** Create schema for Role (POST requests) */\nexport const baseRoleCreateSchema = z.object({\n console_org_id: baseRoleSchemas.console_org_id,\n name: baseRoleSchemas.name,\n slug: baseRoleSchemas.slug,\n description: baseRoleSchemas.description,\n level: baseRoleSchemas.level,\n});\n\n/** Update schema for Role (PUT/PATCH requests) */\nexport const baseRoleUpdateSchema = baseRoleCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseRoleCreate = z.infer<typeof baseRoleCreateSchema>;\nexport type BaseRoleUpdate = z.infer<typeof baseRoleUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getRoleLabel(locale: string): string {\n return roleI18n.label[locale as keyof typeof roleI18n.label] ?? roleI18n.label['en'] ?? 'Role';\n}\n\n/** Get field label for a specific locale */\nexport function getRoleFieldLabel(field: string, locale: string): string {\n const fieldI18n = roleI18n.fields[field as keyof typeof roleI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getRoleFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = roleI18n.fields[field as keyof typeof roleI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * Role Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { Role as RoleBase } from '@omnify-base/schemas/Role';\nimport {\n baseRoleSchemas,\n baseRoleCreateSchema,\n baseRoleUpdateSchema,\n roleI18n,\n getRoleLabel,\n getRoleFieldLabel,\n getRoleFieldPlaceholder,\n} from '@omnify-base/schemas/Role';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface Role extends RoleBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const roleSchemas = { ...baseRoleSchemas };\nexport const roleCreateSchema = baseRoleCreateSchema;\nexport const roleUpdateSchema = baseRoleUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type RoleCreate = z.infer<typeof roleCreateSchema>;\nexport type RoleUpdate = z.infer<typeof roleUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n roleI18n,\n getRoleLabel,\n getRoleFieldLabel,\n getRoleFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { RoleBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\nimport type { Permission } from './Permission';\nimport type { Role } from './Role';\n\n/**\n * ロール権限\n */\nexport interface RolePermission {\n /** ロール */\n role: Role;\n /** 権限 */\n permission: Permission;\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for RolePermission\n * Contains model label and all field labels/placeholders\n */\nexport const rolePermissionI18n = {\n /** Model display name */\n label: {\"ja\":\"ロール権限\",\"en\":\"Role Permission\"},\n /** Field labels and placeholders */\n fields: {\n role: {\n label: {\"ja\":\"ロール\",\"en\":\"Role\"},\n },\n permission: {\n label: {\"ja\":\"権限\",\"en\":\"Permission\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for RolePermission */\nexport const baseRolePermissionSchemas = {\n} as const;\n\n/** Create schema for RolePermission (POST requests) */\nexport const baseRolePermissionCreateSchema = z.object({\n});\n\n/** Update schema for RolePermission (PUT/PATCH requests) */\nexport const baseRolePermissionUpdateSchema = baseRolePermissionCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseRolePermissionCreate = z.infer<typeof baseRolePermissionCreateSchema>;\nexport type BaseRolePermissionUpdate = z.infer<typeof baseRolePermissionUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getRolePermissionLabel(locale: string): string {\n return rolePermissionI18n.label[locale as keyof typeof rolePermissionI18n.label] ?? rolePermissionI18n.label['en'] ?? 'RolePermission';\n}\n\n/** Get field label for a specific locale */\nexport function getRolePermissionFieldLabel(field: string, locale: string): string {\n const fieldI18n = rolePermissionI18n.fields[field as keyof typeof rolePermissionI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getRolePermissionFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = rolePermissionI18n.fields[field as keyof typeof rolePermissionI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * RolePermission Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { RolePermission as RolePermissionBase } from '@omnify-base/schemas/RolePermission';\nimport {\n baseRolePermissionSchemas,\n baseRolePermissionCreateSchema,\n baseRolePermissionUpdateSchema,\n rolePermissionI18n,\n getRolePermissionLabel,\n getRolePermissionFieldLabel,\n getRolePermissionFieldPlaceholder,\n} from '@omnify-base/schemas/RolePermission';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface RolePermission extends RolePermissionBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const rolePermissionSchemas = { ...baseRolePermissionSchemas };\nexport const rolePermissionCreateSchema = baseRolePermissionCreateSchema;\nexport const rolePermissionUpdateSchema = baseRolePermissionUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type RolePermissionCreate = z.infer<typeof rolePermissionCreateSchema>;\nexport type RolePermissionUpdate = z.infer<typeof rolePermissionUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n rolePermissionI18n,\n getRolePermissionLabel,\n getRolePermissionFieldLabel,\n getRolePermissionFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { RolePermissionBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\n\n/**\n * チームキャッシュ\n */\nexport interface TeamCache {\n /** Primary key */\n id: string;\n /** Console Team ID */\n console_team_id: unknown;\n /** Console Organization ID */\n console_org_id: unknown;\n /** チーム名 */\n name: string;\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n /** Soft delete timestamp */\n deleted_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for TeamCache\n * Contains model label and all field labels/placeholders\n */\nexport const teamCacheI18n = {\n /** Model display name */\n label: {\"ja\":\"チームキャッシュ\",\"en\":\"Team Cache\"},\n /** Field labels and placeholders */\n fields: {\n console_team_id: {\n label: {\"ja\":\"Console Team ID\",\"en\":\"Console Team ID\"},\n },\n console_org_id: {\n label: {\"ja\":\"Console Organization ID\",\"en\":\"Console Organization ID\"},\n },\n name: {\n label: {\"ja\":\"チーム名\",\"en\":\"Team Name\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for TeamCache */\nexport const baseTeamCacheSchemas = {\n console_team_id: z.string(),\n console_org_id: z.string(),\n name: z.string().min(1).max(100),\n} as const;\n\n/** Create schema for TeamCache (POST requests) */\nexport const baseTeamCacheCreateSchema = z.object({\n console_team_id: baseTeamCacheSchemas.console_team_id,\n console_org_id: baseTeamCacheSchemas.console_org_id,\n name: baseTeamCacheSchemas.name,\n});\n\n/** Update schema for TeamCache (PUT/PATCH requests) */\nexport const baseTeamCacheUpdateSchema = baseTeamCacheCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseTeamCacheCreate = z.infer<typeof baseTeamCacheCreateSchema>;\nexport type BaseTeamCacheUpdate = z.infer<typeof baseTeamCacheUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getTeamCacheLabel(locale: string): string {\n return teamCacheI18n.label[locale as keyof typeof teamCacheI18n.label] ?? teamCacheI18n.label['en'] ?? 'TeamCache';\n}\n\n/** Get field label for a specific locale */\nexport function getTeamCacheFieldLabel(field: string, locale: string): string {\n const fieldI18n = teamCacheI18n.fields[field as keyof typeof teamCacheI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getTeamCacheFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = teamCacheI18n.fields[field as keyof typeof teamCacheI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * TeamCache Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { TeamCache as TeamCacheBase } from '@omnify-base/schemas/TeamCache';\nimport {\n baseTeamCacheSchemas,\n baseTeamCacheCreateSchema,\n baseTeamCacheUpdateSchema,\n teamCacheI18n,\n getTeamCacheLabel,\n getTeamCacheFieldLabel,\n getTeamCacheFieldPlaceholder,\n} from '@omnify-base/schemas/TeamCache';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface TeamCache extends TeamCacheBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const teamCacheSchemas = { ...baseTeamCacheSchemas };\nexport const teamCacheCreateSchema = baseTeamCacheCreateSchema;\nexport const teamCacheUpdateSchema = baseTeamCacheUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type TeamCacheCreate = z.infer<typeof teamCacheCreateSchema>;\nexport type TeamCacheUpdate = z.infer<typeof teamCacheUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n teamCacheI18n,\n getTeamCacheLabel,\n getTeamCacheFieldLabel,\n getTeamCacheFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { TeamCacheBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\nimport type { Permission } from './Permission';\n\n/**\n * チーム権限\n */\nexport interface TeamPermission {\n /** Primary key */\n id: string;\n /** Console Organization ID */\n console_org_id: unknown;\n /** Console Team ID */\n console_team_id: unknown;\n /** 権限 */\n permission: Permission;\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n /** Soft delete timestamp */\n deleted_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for TeamPermission\n * Contains model label and all field labels/placeholders\n */\nexport const teamPermissionI18n = {\n /** Model display name */\n label: {\"ja\":\"チーム権限\",\"en\":\"Team Permission\"},\n /** Field labels and placeholders */\n fields: {\n console_org_id: {\n label: {\"ja\":\"Console Organization ID\",\"en\":\"Console Organization ID\"},\n },\n console_team_id: {\n label: {\"ja\":\"Console Team ID\",\"en\":\"Console Team ID\"},\n },\n permission: {\n label: {\"ja\":\"権限\",\"en\":\"Permission\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for TeamPermission */\nexport const baseTeamPermissionSchemas = {\n console_org_id: z.string(),\n console_team_id: z.string(),\n} as const;\n\n/** Create schema for TeamPermission (POST requests) */\nexport const baseTeamPermissionCreateSchema = z.object({\n console_org_id: baseTeamPermissionSchemas.console_org_id,\n console_team_id: baseTeamPermissionSchemas.console_team_id,\n});\n\n/** Update schema for TeamPermission (PUT/PATCH requests) */\nexport const baseTeamPermissionUpdateSchema = baseTeamPermissionCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseTeamPermissionCreate = z.infer<typeof baseTeamPermissionCreateSchema>;\nexport type BaseTeamPermissionUpdate = z.infer<typeof baseTeamPermissionUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getTeamPermissionLabel(locale: string): string {\n return teamPermissionI18n.label[locale as keyof typeof teamPermissionI18n.label] ?? teamPermissionI18n.label['en'] ?? 'TeamPermission';\n}\n\n/** Get field label for a specific locale */\nexport function getTeamPermissionFieldLabel(field: string, locale: string): string {\n const fieldI18n = teamPermissionI18n.fields[field as keyof typeof teamPermissionI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getTeamPermissionFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = teamPermissionI18n.fields[field as keyof typeof teamPermissionI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * TeamPermission Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { TeamPermission as TeamPermissionBase } from '@omnify-base/schemas/TeamPermission';\nimport {\n baseTeamPermissionSchemas,\n baseTeamPermissionCreateSchema,\n baseTeamPermissionUpdateSchema,\n teamPermissionI18n,\n getTeamPermissionLabel,\n getTeamPermissionFieldLabel,\n getTeamPermissionFieldPlaceholder,\n} from '@omnify-base/schemas/TeamPermission';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface TeamPermission extends TeamPermissionBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const teamPermissionSchemas = { ...baseTeamPermissionSchemas };\nexport const teamPermissionCreateSchema = baseTeamPermissionCreateSchema;\nexport const teamPermissionUpdateSchema = baseTeamPermissionUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type TeamPermissionCreate = z.infer<typeof teamPermissionCreateSchema>;\nexport type TeamPermissionUpdate = z.infer<typeof teamPermissionUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n teamPermissionI18n,\n getTeamPermissionLabel,\n getTeamPermissionFieldLabel,\n getTeamPermissionFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { TeamPermissionBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\nimport type { Role } from './Role';\n\n/**\n * ユーザーキャッシュ\n */\nexport interface UserCache {\n /** Primary key */\n id: string;\n /** 名前 */\n name: string;\n /** メールアドレス */\n email: string;\n /** Console User ID */\n console_user_id?: unknown;\n /** 所属組織ID */\n console_org_id?: unknown;\n /** Console Access Token */\n console_access_token?: string;\n /** Console Refresh Token */\n console_refresh_token?: string;\n /** Console Token有効期限 */\n console_token_expires_at?: DateTimeString;\n /** ロール */\n roles: Role[];\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for UserCache\n * Contains model label and all field labels/placeholders\n */\nexport const userCacheI18n = {\n /** Model display name */\n label: {\"ja\":\"ユーザーキャッシュ\",\"en\":\"User Cache\"},\n /** Field labels and placeholders */\n fields: {\n name: {\n label: {\"ja\":\"名前\",\"en\":\"Name\"},\n },\n email: {\n label: {\"ja\":\"メールアドレス\",\"en\":\"Email\"},\n },\n console_user_id: {\n label: {\"ja\":\"Console User ID\",\"en\":\"Console User ID\"},\n },\n console_org_id: {\n label: {\"ja\":\"所属組織ID\",\"en\":\"Organization ID\"},\n },\n console_access_token: {\n label: {\"ja\":\"Console Access Token\",\"en\":\"Console Access Token\"},\n },\n console_refresh_token: {\n label: {\"ja\":\"Console Refresh Token\",\"en\":\"Console Refresh Token\"},\n },\n console_token_expires_at: {\n label: {\"ja\":\"Console Token有効期限\",\"en\":\"Console Token Expiry\"},\n },\n roles: {\n label: {\"ja\":\"ロール\",\"en\":\"Roles\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for UserCache */\nexport const baseUserCacheSchemas = {\n name: z.string().min(1),\n email: z.string().min(1),\n console_user_id: z.string().optional().nullable(),\n console_org_id: z.string().optional().nullable(),\n console_access_token: z.string().optional().nullable(),\n console_refresh_token: z.string().optional().nullable(),\n console_token_expires_at: z.string().datetime({ offset: true }).optional().nullable(),\n} as const;\n\n/** Create schema for UserCache (POST requests) */\nexport const baseUserCacheCreateSchema = z.object({\n name: baseUserCacheSchemas.name,\n email: baseUserCacheSchemas.email,\n console_user_id: baseUserCacheSchemas.console_user_id,\n console_org_id: baseUserCacheSchemas.console_org_id,\n console_access_token: baseUserCacheSchemas.console_access_token,\n console_refresh_token: baseUserCacheSchemas.console_refresh_token,\n console_token_expires_at: baseUserCacheSchemas.console_token_expires_at,\n});\n\n/** Update schema for UserCache (PUT/PATCH requests) */\nexport const baseUserCacheUpdateSchema = baseUserCacheCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseUserCacheCreate = z.infer<typeof baseUserCacheCreateSchema>;\nexport type BaseUserCacheUpdate = z.infer<typeof baseUserCacheUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getUserCacheLabel(locale: string): string {\n return userCacheI18n.label[locale as keyof typeof userCacheI18n.label] ?? userCacheI18n.label['en'] ?? 'UserCache';\n}\n\n/** Get field label for a specific locale */\nexport function getUserCacheFieldLabel(field: string, locale: string): string {\n const fieldI18n = userCacheI18n.fields[field as keyof typeof userCacheI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getUserCacheFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = userCacheI18n.fields[field as keyof typeof userCacheI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * UserCache Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { UserCache as UserCacheBase } from '@omnify-base/schemas/UserCache';\nimport {\n baseUserCacheSchemas,\n baseUserCacheCreateSchema,\n baseUserCacheUpdateSchema,\n userCacheI18n,\n getUserCacheLabel,\n getUserCacheFieldLabel,\n getUserCacheFieldPlaceholder,\n} from '@omnify-base/schemas/UserCache';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface UserCache extends UserCacheBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const userCacheSchemas = { ...baseUserCacheSchemas };\nexport const userCacheCreateSchema = baseUserCacheCreateSchema;\nexport const userCacheUpdateSchema = baseUserCacheUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type UserCacheCreate = z.infer<typeof userCacheCreateSchema>;\nexport type UserCacheUpdate = z.infer<typeof userCacheUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n userCacheI18n,\n getUserCacheLabel,\n getUserCacheFieldLabel,\n getUserCacheFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { UserCacheBase };\n","'use client';\n\nimport { createContext, useContext } from 'react';\nimport type { SsoContextValue } from '../types';\n\n/**\n * SSO Context\n */\nexport const SsoContext = createContext<SsoContextValue | null>(null);\n\n/**\n * Hook to access SSO context\n * @throws Error if used outside SsoProvider\n */\nexport function useSsoContext(): SsoContextValue {\n const context = useContext(SsoContext);\n\n if (!context) {\n throw new Error('useSsoContext must be used within a SsoProvider');\n }\n\n return context;\n}\n","'use client';\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport type {\n SsoCallbackResponse,\n SsoConfig,\n SsoOrganization,\n SsoProviderProps,\n SsoUser,\n} from '../types';\nimport { SsoContext } from './SsoContext';\n\n/**\n * Transform backend response to frontend format\n */\nfunction transformUser(data: SsoCallbackResponse['user']): SsoUser {\n return {\n id: data.id,\n consoleUserId: data.console_user_id,\n email: data.email,\n name: data.name,\n };\n}\n\n/**\n * Transform organizations from backend format\n */\nfunction transformOrganizations(\n data: SsoCallbackResponse['organizations']\n): SsoOrganization[] {\n return data.map((org) => ({\n id: org.organization_id,\n slug: org.organization_slug,\n name: org.organization_name,\n orgRole: org.org_role,\n serviceRole: org.service_role,\n }));\n}\n\n/**\n * Get storage instance based on type\n */\nfunction getStorage(type: 'localStorage' | 'sessionStorage'): Storage | null {\n if (typeof window === 'undefined') return null;\n return type === 'localStorage' ? window.localStorage : window.sessionStorage;\n}\n\n/**\n * Get XSRF token from cookie (for Sanctum CSRF protection)\n */\nfunction getXsrfToken(): string | undefined {\n if (typeof document === 'undefined') return undefined;\n return document.cookie\n .split('; ')\n .find(row => row.startsWith('XSRF-TOKEN='))\n ?.split('=')[1];\n}\n\n/**\n * SSO Provider component\n */\nexport function SsoProvider({ children, config, onAuthChange }: SsoProviderProps) {\n const [user, setUser] = useState<SsoUser | null>(null);\n const [organizations, setOrganizations] = useState<SsoOrganization[]>([]);\n const [currentOrg, setCurrentOrg] = useState<SsoOrganization | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n const storageKey = config.storageKey ?? 'sso_selected_org';\n const storage = getStorage(config.storage ?? 'localStorage');\n\n /**\n * Load selected org from storage\n */\n const loadSelectedOrg = useCallback(\n (orgs: SsoOrganization[]) => {\n if (!storage || orgs.length === 0) return null;\n\n const savedSlug = storage.getItem(storageKey);\n if (savedSlug) {\n const found = orgs.find((o) => o.slug === savedSlug);\n if (found) return found;\n }\n\n // Default to first org\n return orgs[0];\n },\n [storage, storageKey]\n );\n\n /**\n * Save selected org to storage\n */\n const saveSelectedOrg = useCallback(\n (org: SsoOrganization | null) => {\n if (!storage) return;\n\n if (org) {\n storage.setItem(storageKey, org.slug);\n } else {\n storage.removeItem(storageKey);\n }\n },\n [storage, storageKey]\n );\n\n /**\n * Fetch current user from backend (Sanctum cookie-based auth)\n */\n const fetchUser = useCallback(async () => {\n try {\n const xsrfToken = getXsrfToken();\n const headers: Record<string, string> = {\n 'Accept': 'application/json',\n };\n if (xsrfToken) {\n headers['X-XSRF-TOKEN'] = decodeURIComponent(xsrfToken);\n }\n\n const response = await fetch(`${config.apiUrl}/api/sso/user`, {\n headers,\n credentials: 'include',\n });\n\n if (!response.ok) {\n return null;\n }\n\n const data: { user: SsoCallbackResponse['user']; organizations: SsoCallbackResponse['organizations'] } =\n await response.json();\n\n const transformedUser = transformUser(data.user);\n const transformedOrgs = transformOrganizations(data.organizations);\n\n return { user: transformedUser, organizations: transformedOrgs };\n } catch {\n return null;\n }\n }, [config.apiUrl]);\n\n /**\n * Initialize auth state\n */\n useEffect(() => {\n let mounted = true;\n\n const init = async () => {\n setIsLoading(true);\n\n const result = await fetchUser();\n\n if (!mounted) return;\n\n if (result) {\n setUser(result.user);\n setOrganizations(result.organizations);\n const selectedOrg = loadSelectedOrg(result.organizations);\n setCurrentOrg(selectedOrg);\n onAuthChange?.(true, result.user);\n } else {\n setUser(null);\n setOrganizations([]);\n setCurrentOrg(null);\n onAuthChange?.(false, null);\n }\n\n setIsLoading(false);\n };\n\n init();\n\n return () => {\n mounted = false;\n };\n }, [fetchUser, loadSelectedOrg, onAuthChange]);\n\n /**\n * Login - redirect to Console\n */\n const login = useCallback(\n (redirectTo?: string) => {\n const callbackUrl = new URL('/sso/callback', window.location.origin);\n if (redirectTo) {\n callbackUrl.searchParams.set('redirect', redirectTo);\n }\n\n const loginUrl = new URL('/sso/authorize', config.consoleUrl);\n loginUrl.searchParams.set('service', config.serviceSlug);\n loginUrl.searchParams.set('redirect_uri', callbackUrl.toString());\n\n window.location.href = loginUrl.toString();\n },\n [config.consoleUrl, config.serviceSlug]\n );\n\n /**\n * Logout from service (Sanctum cookie-based)\n */\n const logout = useCallback(async () => {\n try {\n const xsrfToken = getXsrfToken();\n const headers: Record<string, string> = {};\n if (xsrfToken) {\n headers['X-XSRF-TOKEN'] = decodeURIComponent(xsrfToken);\n }\n\n await fetch(`${config.apiUrl}/api/sso/logout`, {\n method: 'POST',\n headers,\n credentials: 'include',\n });\n } catch {\n // Ignore errors\n }\n\n setUser(null);\n setOrganizations([]);\n setCurrentOrg(null);\n saveSelectedOrg(null);\n onAuthChange?.(false, null);\n }, [config.apiUrl, saveSelectedOrg, onAuthChange]);\n\n /**\n * Global logout - logout from Console too\n */\n const globalLogout = useCallback(\n async (redirectTo?: string) => {\n // First logout from service\n await logout();\n\n // Then redirect to Console logout\n // Convert relative path to absolute URL (e.g., '/' → 'https://example.com/')\n const redirectUri = redirectTo\n ? new URL(redirectTo, window.location.origin).toString()\n : window.location.origin;\n const logoutUrl = new URL('/sso/logout', config.consoleUrl);\n logoutUrl.searchParams.set('redirect_uri', redirectUri);\n\n window.location.href = logoutUrl.toString();\n },\n [logout, config.consoleUrl]\n );\n\n /**\n * Switch organization\n */\n const switchOrg = useCallback(\n (orgSlug: string) => {\n const org = organizations.find((o) => o.slug === orgSlug);\n if (org) {\n setCurrentOrg(org);\n saveSelectedOrg(org);\n }\n },\n [organizations, saveSelectedOrg]\n );\n\n /**\n * Refresh user data\n */\n const refreshUser = useCallback(async () => {\n const result = await fetchUser();\n\n if (result) {\n setUser(result.user);\n setOrganizations(result.organizations);\n\n // Keep current org if still valid\n if (currentOrg) {\n const stillValid = result.organizations.find((o) => o.slug === currentOrg.slug);\n if (!stillValid) {\n const newOrg = loadSelectedOrg(result.organizations);\n setCurrentOrg(newOrg);\n }\n }\n }\n }, [fetchUser, currentOrg, loadSelectedOrg]);\n\n /**\n * Get headers for API requests\n */\n const getHeaders = useCallback((): Record<string, string> => {\n const headers: Record<string, string> = {};\n\n if (currentOrg) {\n headers['X-Org-Id'] = currentOrg.slug;\n }\n\n return headers;\n }, [currentOrg]);\n\n const value = useMemo(\n () => ({\n user,\n organizations,\n currentOrg,\n isLoading,\n isAuthenticated: !!user,\n config,\n login,\n logout,\n globalLogout,\n switchOrg,\n refreshUser,\n getHeaders,\n }),\n [\n user,\n organizations,\n currentOrg,\n isLoading,\n config,\n login,\n logout,\n globalLogout,\n switchOrg,\n refreshUser,\n getHeaders,\n ]\n );\n\n return <SsoContext.Provider value={value}>{children}</SsoContext.Provider>;\n}\n","'use client';\n\nimport { createContext, useContext } from 'react';\nimport type { BranchContextValue } from '../types';\n\n/**\n * Branch Context\n * \n * Provides branch state management across the application.\n * Must be used within a BranchProvider.\n */\nexport const BranchContext = createContext<BranchContextValue | null>(null);\n\n/**\n * Hook to access Branch context\n * @throws Error if used outside BranchProvider\n */\nexport function useBranchContext(): BranchContextValue {\n const context = useContext(BranchContext);\n\n if (!context) {\n throw new Error('useBranchContext must be used within a BranchProvider');\n }\n\n return context;\n}\n","'use client';\n\nimport { useQuery, useQueryClient } from '@tanstack/react-query';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { ssoQueryKeys } from '../queryKeys';\nimport { createBranchService, type BranchesResponse } from '../services/branchService';\nimport type { BranchProviderProps, SsoBranch, BranchContextValue } from '../types';\nimport { BranchContext } from './BranchContext';\nimport { useSsoContext } from './SsoContext';\n\nconst DEFAULT_STORAGE_KEY = 'omnify_selected_branch';\n\n/**\n * BranchProvider component\n * \n * Provides branch state management for the application.\n * Automatically fetches branches when organization changes.\n * \n * @example\n * ```tsx\n * // In your app\n * <SsoProvider config={ssoConfig}>\n * <BranchProvider>\n * <App />\n * </BranchProvider>\n * </SsoProvider>\n * \n * // In a component\n * function MyComponent() {\n * const { branches, currentBranch, switchBranch } = useBranch();\n * // ...\n * }\n * ```\n */\nexport function BranchProvider({\n children,\n storage = 'localStorage',\n storageKey = DEFAULT_STORAGE_KEY,\n onBranchChange,\n}: BranchProviderProps) {\n const { config, currentOrg, isAuthenticated } = useSsoContext();\n const queryClient = useQueryClient();\n\n const branchService = useMemo(\n () => createBranchService({ apiUrl: config.apiUrl }),\n [config.apiUrl]\n );\n\n // Get saved branch ID from storage\n const getSavedBranchId = useCallback((): number | null => {\n if (typeof window === 'undefined') return null;\n const storageObj = storage === 'localStorage' ? localStorage : sessionStorage;\n const saved = storageObj.getItem(`${storageKey}_${currentOrg?.slug}`);\n return saved ? parseInt(saved, 10) : null;\n }, [storage, storageKey, currentOrg?.slug]);\n\n // Save branch ID to storage\n const saveBranchId = useCallback((branchId: number | null) => {\n if (typeof window === 'undefined' || !currentOrg?.slug) return;\n const storageObj = storage === 'localStorage' ? localStorage : sessionStorage;\n if (branchId) {\n storageObj.setItem(`${storageKey}_${currentOrg.slug}`, String(branchId));\n } else {\n storageObj.removeItem(`${storageKey}_${currentOrg.slug}`);\n }\n }, [storage, storageKey, currentOrg?.slug]);\n\n // Selected branch state\n const [selectedBranchId, setSelectedBranchId] = useState<number | null>(() => getSavedBranchId());\n\n // Fetch branches for current organization\n const {\n data: branchesData,\n isLoading,\n error,\n refetch,\n } = useQuery<BranchesResponse>({\n queryKey: ssoQueryKeys.branches.list(currentOrg?.slug),\n queryFn: () => branchService.list(currentOrg?.slug),\n enabled: isAuthenticated && !!currentOrg,\n staleTime: 5 * 60 * 1000, // 5 minutes\n });\n\n // Extract branches data\n const branches = branchesData?.branches ?? [];\n const allBranchesAccess = branchesData?.all_branches_access ?? false;\n const primaryBranchId = branchesData?.primary_branch_id ?? null;\n const hasMultipleBranches = branches.length > 1;\n\n // Find current branch from branches list\n const currentBranch = useMemo((): SsoBranch | null => {\n if (!branches.length) return null;\n\n // If only one branch, auto-select it\n if (branches.length === 1) {\n return branches[0];\n }\n\n // If we have a saved selection, use it\n if (selectedBranchId) {\n const found = branches.find(b => b.id === selectedBranchId);\n if (found) return found;\n }\n\n // Use primary branch if available\n if (primaryBranchId) {\n const primary = branches.find(b => b.id === primaryBranchId);\n if (primary) return primary;\n }\n\n // Use headquarters\n const hq = branches.find(b => b.is_headquarters);\n if (hq) return hq;\n\n // Fallback to first branch\n return branches[0];\n }, [branches, selectedBranchId, primaryBranchId]);\n\n // Update selected branch ID when current branch changes\n useEffect(() => {\n if (currentBranch && currentBranch.id !== selectedBranchId) {\n setSelectedBranchId(currentBranch.id);\n saveBranchId(currentBranch.id);\n onBranchChange?.(currentBranch);\n }\n }, [currentBranch, selectedBranchId, saveBranchId, onBranchChange]);\n\n // Reset selection when organization changes\n useEffect(() => {\n const savedId = getSavedBranchId();\n setSelectedBranchId(savedId);\n }, [currentOrg?.slug, getSavedBranchId]);\n\n // Switch branch function\n const switchBranch = useCallback((branchId: number) => {\n const branch = branches.find(b => b.id === branchId);\n if (branch) {\n setSelectedBranchId(branchId);\n saveBranchId(branchId);\n onBranchChange?.(branch);\n }\n }, [branches, saveBranchId, onBranchChange]);\n\n // Refresh branches\n const refreshBranches = useCallback(async () => {\n await queryClient.invalidateQueries({\n queryKey: ssoQueryKeys.branches.list(currentOrg?.slug),\n });\n await refetch();\n }, [queryClient, currentOrg?.slug, refetch]);\n\n const contextValue: BranchContextValue = useMemo(\n () => ({\n branches,\n currentBranch,\n allBranchesAccess,\n primaryBranchId,\n isLoading,\n error: error as Error | null,\n hasMultipleBranches,\n switchBranch,\n refreshBranches,\n }),\n [\n branches,\n currentBranch,\n allBranchesAccess,\n primaryBranchId,\n isLoading,\n error,\n hasMultipleBranches,\n switchBranch,\n refreshBranches,\n ]\n );\n\n return (\n <BranchContext.Provider value={contextValue}>\n {children}\n </BranchContext.Provider>\n );\n}\n","/**\n * SSO Query Keys - For TanStack Query / React Query\n *\n * Centralized key management for SSO-related queries.\n * Structure matches the service organization.\n */\n\nexport const ssoQueryKeys = {\n all: [\"sso\"] as const,\n\n // =========================================================================\n // Auth (authService)\n // =========================================================================\n auth: {\n all: () => [...ssoQueryKeys.all, \"auth\"] as const,\n user: () => [...ssoQueryKeys.auth.all(), \"user\"] as const,\n globalLogoutUrl: (redirectUri?: string) =>\n [...ssoQueryKeys.auth.all(), \"global-logout-url\", redirectUri] as const,\n },\n\n // =========================================================================\n // Tokens (tokenService)\n // =========================================================================\n tokens: {\n all: () => [...ssoQueryKeys.all, \"tokens\"] as const,\n list: () => [...ssoQueryKeys.tokens.all(), \"list\"] as const,\n },\n\n // =========================================================================\n // Roles (roleService)\n // =========================================================================\n roles: {\n all: () => [...ssoQueryKeys.all, \"roles\"] as const,\n list: () => [...ssoQueryKeys.roles.all(), \"list\"] as const,\n detail: (id: number | string) =>\n [...ssoQueryKeys.roles.all(), \"detail\", id] as const,\n permissions: (id: number | string) =>\n [...ssoQueryKeys.roles.all(), id, \"permissions\"] as const,\n },\n\n // =========================================================================\n // Permissions (permissionService)\n // =========================================================================\n permissions: {\n all: () => [...ssoQueryKeys.all, \"permissions\"] as const,\n list: (params?: { group?: string; search?: string; grouped?: boolean }) =>\n [...ssoQueryKeys.permissions.all(), \"list\", params] as const,\n detail: (id: number | string) =>\n [...ssoQueryKeys.permissions.all(), \"detail\", id] as const,\n matrix: () => [...ssoQueryKeys.permissions.all(), \"matrix\"] as const,\n },\n\n // =========================================================================\n // Teams (teamService)\n // =========================================================================\n teams: {\n all: () => [...ssoQueryKeys.all, \"teams\"] as const,\n list: () => [...ssoQueryKeys.teams.all(), \"list\"] as const,\n permissions: (teamId: number) =>\n [...ssoQueryKeys.teams.all(), teamId, \"permissions\"] as const,\n orphaned: () => [...ssoQueryKeys.teams.all(), \"orphaned\"] as const,\n },\n\n // =========================================================================\n // User Roles (userRoleService) - Scoped Role Assignments\n // =========================================================================\n userRoles: {\n all: () => [...ssoQueryKeys.all, \"user-roles\"] as const,\n list: (userId: string) =>\n [...ssoQueryKeys.userRoles.all(), userId] as const,\n byBranch: (userId: string, orgId: string, branchId: string | null) =>\n [...ssoQueryKeys.userRoles.all(), userId, orgId, branchId] as const,\n },\n\n // =========================================================================\n // Users (userService)\n // =========================================================================\n users: {\n all: () => [...ssoQueryKeys.all, \"users\"] as const,\n list: (params?: { page?: number; per_page?: number; search?: string; sort?: string; order?: string }) =>\n [...ssoQueryKeys.users.all(), \"list\", params] as const,\n detail: (id: number | string) =>\n [...ssoQueryKeys.users.all(), \"detail\", id] as const,\n },\n\n // =========================================================================\n // Branches (branchService)\n // =========================================================================\n branches: {\n all: () => [...ssoQueryKeys.all, \"branches\"] as const,\n list: (orgSlug?: string) =>\n [...ssoQueryKeys.branches.all(), \"list\", orgSlug] as const,\n detail: (branchId: number) =>\n [...ssoQueryKeys.branches.all(), \"detail\", branchId] as const,\n headquarters: (orgSlug?: string) =>\n [...ssoQueryKeys.branches.all(), \"headquarters\", orgSlug] as const,\n primary: (orgSlug?: string) =>\n [...ssoQueryKeys.branches.all(), \"primary\", orgSlug] as const,\n },\n\n // =========================================================================\n // Admin variants (with org context)\n // =========================================================================\n admin: {\n users: {\n all: (orgSlug: string) =>\n [...ssoQueryKeys.all, \"admin\", orgSlug, \"users\"] as const,\n list: (orgSlug: string, params?: { page?: number; per_page?: number; search?: string; sort?: string; order?: string }) =>\n [...ssoQueryKeys.admin.users.all(orgSlug), \"list\", params] as const,\n detail: (orgSlug: string, id: number | string) =>\n [...ssoQueryKeys.admin.users.all(orgSlug), \"detail\", id] as const,\n },\n\n roles: {\n all: (orgSlug: string) =>\n [...ssoQueryKeys.all, \"admin\", orgSlug, \"roles\"] as const,\n list: (orgSlug: string) =>\n [...ssoQueryKeys.admin.roles.all(orgSlug), \"list\"] as const,\n detail: (orgSlug: string, id: number | string) =>\n [...ssoQueryKeys.admin.roles.all(orgSlug), \"detail\", id] as const,\n permissions: (orgSlug: string, id: number | string) =>\n [...ssoQueryKeys.admin.roles.all(orgSlug), id, \"permissions\"] as const,\n },\n\n permissions: {\n all: (orgSlug: string) =>\n [...ssoQueryKeys.all, \"admin\", orgSlug, \"permissions\"] as const,\n list: (orgSlug: string, params?: { group?: string; search?: string; grouped?: boolean }) =>\n [...ssoQueryKeys.admin.permissions.all(orgSlug), \"list\", params] as const,\n detail: (orgSlug: string, id: number | string) =>\n [...ssoQueryKeys.admin.permissions.all(orgSlug), \"detail\", id] as const,\n matrix: (orgSlug: string) =>\n [...ssoQueryKeys.admin.permissions.all(orgSlug), \"matrix\"] as const,\n },\n\n teams: {\n all: (orgSlug: string) =>\n [...ssoQueryKeys.all, \"admin\", orgSlug, \"teams\"] as const,\n list: (orgSlug: string) =>\n [...ssoQueryKeys.admin.teams.all(orgSlug), \"list\"] as const,\n permissions: (orgSlug: string, teamId: number) =>\n [...ssoQueryKeys.admin.teams.all(orgSlug), teamId, \"permissions\"] as const,\n orphaned: (orgSlug: string) =>\n [...ssoQueryKeys.admin.teams.all(orgSlug), \"orphaned\"] as const,\n },\n\n userRoles: {\n all: (orgSlug: string) =>\n [...ssoQueryKeys.all, \"admin\", orgSlug, \"user-roles\"] as const,\n list: (orgSlug: string, userId: string) =>\n [...ssoQueryKeys.admin.userRoles.all(orgSlug), userId] as const,\n byBranch: (orgSlug: string, userId: string, orgId: string, branchId: string | null) =>\n [...ssoQueryKeys.admin.userRoles.all(orgSlug), userId, orgId, branchId] as const,\n },\n },\n} as const;\n","/**\n * Shared utilities for SSO services\n */\n\n/**\n * Get XSRF token from cookie (for Sanctum CSRF protection)\n */\nexport function getXsrfToken(): string | undefined {\n if (typeof document === \"undefined\") return undefined;\n return document.cookie\n .split(\"; \")\n .find((row) => row.startsWith(\"XSRF-TOKEN=\"))\n ?.split(\"=\")[1];\n}\n\n/**\n * Build headers with XSRF token and optional org slug\n */\nexport function buildHeaders(orgSlug?: string): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n };\n\n const xsrfToken = getXsrfToken();\n if (xsrfToken) {\n headers[\"X-XSRF-TOKEN\"] = decodeURIComponent(xsrfToken);\n }\n\n if (orgSlug) {\n // Backend middleware expects X-Org-Id (contains org slug for identification)\n headers[\"X-Org-Id\"] = orgSlug;\n }\n\n return headers;\n}\n\n/**\n * Fetch CSRF cookie from backend\n */\nexport async function csrf(apiUrl: string): Promise<void> {\n await fetch(`${apiUrl}/sanctum/csrf-cookie`, {\n credentials: \"include\",\n });\n}\n\n/**\n * Make API request with proper error handling\n */\nexport async function request<T>(\n apiUrl: string,\n path: string,\n options: RequestInit = {}\n): Promise<T> {\n const response = await fetch(`${apiUrl}${path}`, {\n ...options,\n credentials: \"include\",\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new Error(error.message || `HTTP ${response.status}`);\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json();\n}\n\n/**\n * Base service configuration\n */\nexport interface ServiceConfig {\n apiUrl: string;\n}\n","/**\n * Branch Service - Branch Management\n *\n * Provides methods to fetch branches for the current user/organization\n */\n\nimport { buildHeaders, request, type ServiceConfig } from \"./utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface Branch {\n id: number;\n code: string;\n name: string;\n is_headquarters: boolean;\n is_primary: boolean;\n is_assigned: boolean;\n access_type: \"explicit\" | \"implicit\";\n timezone: string | null;\n currency: string | null;\n locale: string | null;\n}\n\nexport interface BranchesResponse {\n all_branches_access: boolean;\n branches: Branch[];\n primary_branch_id: number | null;\n organization: {\n id: number;\n slug: string;\n name: string;\n };\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createBranchService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n /**\n * Get branches for current user in organization\n * GET /api/sso/branches\n */\n list: async (orgSlug?: string): Promise<BranchesResponse> => {\n const params = orgSlug ? `?organization_slug=${orgSlug}` : \"\";\n return request(apiUrl, `/api/sso/branches${params}`, {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get a specific branch by ID\n * GET /api/sso/branches/{id}\n */\n get: async (branchId: number): Promise<Branch> => {\n const response = await request<{ data: Branch } | Branch>(\n apiUrl,\n `/api/sso/branches/${branchId}`,\n { headers: buildHeaders() }\n );\n return \"data\" in response ? response.data : response;\n },\n\n /**\n * Get headquarters branch for organization\n */\n getHeadquarters: async (orgSlug?: string): Promise<Branch | null> => {\n try {\n const params = orgSlug ? `?organization_slug=${orgSlug}` : \"\";\n const data = await request<BranchesResponse>(\n apiUrl,\n `/api/sso/branches${params}`,\n { headers: buildHeaders() }\n );\n return data.branches.find((b) => b.is_headquarters) ?? null;\n } catch {\n return null;\n }\n },\n\n /**\n * Get primary branch for current user\n */\n getPrimary: async (orgSlug?: string): Promise<Branch | null> => {\n try {\n const params = orgSlug ? `?organization_slug=${orgSlug}` : \"\";\n const data = await request<BranchesResponse>(\n apiUrl,\n `/api/sso/branches${params}`,\n { headers: buildHeaders() }\n );\n if (data.primary_branch_id) {\n return data.branches.find((b) => b.id === data.primary_branch_id) ?? null;\n }\n return null;\n } catch {\n return null;\n }\n },\n };\n}\n\n// Export type for the service\nexport type BranchService = ReturnType<typeof createBranchService>;\n","'use client';\n\nimport { useCallback } from 'react';\nimport { useSsoContext } from '../context/SsoContext';\nimport type { SsoUser } from '../types';\n\n/**\n * Hook for authentication actions and state\n */\nexport interface UseAuthReturn {\n /** Current user or null */\n user: SsoUser | null;\n /** Whether auth is being loaded */\n isLoading: boolean;\n /** Whether user is authenticated */\n isAuthenticated: boolean;\n /** Redirect to login */\n login: (redirectTo?: string) => void;\n /** Logout from service only */\n logout: () => Promise<void>;\n /** Logout from service and Console */\n globalLogout: (redirectTo?: string) => void;\n /** Refresh user data */\n refreshUser: () => Promise<void>;\n}\n\n/**\n * Hook for authentication\n *\n * @example\n * ```tsx\n * function LoginButton() {\n * const { isAuthenticated, login, logout, user } = useAuth();\n *\n * if (isAuthenticated) {\n * return (\n * <div>\n * <span>Hello, {user?.name}</span>\n * <button onClick={() => logout()}>Logout</button>\n * </div>\n * );\n * }\n *\n * return <button onClick={() => login()}>Login</button>;\n * }\n * ```\n */\nexport function useAuth(): UseAuthReturn {\n const { user, isLoading, isAuthenticated, login, logout, globalLogout, refreshUser } =\n useSsoContext();\n\n const handleLogin = useCallback(\n (redirectTo?: string) => {\n login(redirectTo);\n },\n [login]\n );\n\n const handleLogout = useCallback(async () => {\n await logout();\n }, [logout]);\n\n const handleGlobalLogout = useCallback(\n (redirectTo?: string) => {\n globalLogout(redirectTo);\n },\n [globalLogout]\n );\n\n return {\n user,\n isLoading,\n isAuthenticated,\n login: handleLogin,\n logout: handleLogout,\n globalLogout: handleGlobalLogout,\n refreshUser,\n };\n}\n","'use client';\n\nimport { useCallback, useMemo } from 'react';\nimport { useSsoContext } from '../context/SsoContext';\nimport type { SsoOrganization } from '../types';\n\n/**\n * Hook return type for organization management\n */\nexport interface UseOrganizationReturn {\n /** List of organizations user has access to */\n organizations: SsoOrganization[];\n /** Currently selected organization */\n currentOrg: SsoOrganization | null;\n /** Whether user has multiple organizations */\n hasMultipleOrgs: boolean;\n /** Switch to a different organization */\n switchOrg: (orgSlug: string) => void;\n /** Get current org's role */\n currentRole: string | null;\n /** Check if user has at least the given role in current org */\n hasRole: (role: string) => boolean;\n}\n\n/**\n * Role levels for comparison\n */\nconst ROLE_LEVELS: Record<string, number> = {\n admin: 100,\n manager: 50,\n member: 10,\n};\n\n/**\n * Hook for organization management\n *\n * @example\n * ```tsx\n * function OrgInfo() {\n * const { currentOrg, organizations, switchOrg, hasRole } = useOrganization();\n *\n * return (\n * <div>\n * <p>Current: {currentOrg?.name}</p>\n * {hasRole('admin') && <AdminPanel />}\n * <select onChange={(e) => switchOrg(e.target.value)}>\n * {organizations.map((org) => (\n * <option key={org.slug} value={org.slug}>{org.name}</option>\n * ))}\n * </select>\n * </div>\n * );\n * }\n * ```\n */\nexport function useOrganization(): UseOrganizationReturn {\n const { organizations, currentOrg, switchOrg } = useSsoContext();\n\n const hasMultipleOrgs = organizations.length > 1;\n\n const currentRole = currentOrg?.serviceRole ?? null;\n\n const hasRole = useCallback(\n (role: string): boolean => {\n if (!currentRole) return false;\n\n const requiredLevel = ROLE_LEVELS[role] ?? 0;\n const userLevel = ROLE_LEVELS[currentRole] ?? 0;\n\n return userLevel >= requiredLevel;\n },\n [currentRole]\n );\n\n const handleSwitchOrg = useCallback(\n (orgSlug: string) => {\n switchOrg(orgSlug);\n },\n [switchOrg]\n );\n\n return useMemo(\n () => ({\n organizations,\n currentOrg,\n hasMultipleOrgs,\n switchOrg: handleSwitchOrg,\n currentRole,\n hasRole,\n }),\n [organizations, currentOrg, hasMultipleOrgs, handleSwitchOrg, currentRole, hasRole]\n );\n}\n","'use client';\n\nimport { useMemo } from 'react';\nimport { useSsoContext } from '../context/SsoContext';\nimport type { SsoConfig, SsoOrganization, SsoUser } from '../types';\n\n/**\n * Combined SSO hook return type\n */\nexport interface UseSsoReturn {\n // Auth\n user: SsoUser | null;\n isLoading: boolean;\n isAuthenticated: boolean;\n login: (redirectTo?: string) => void;\n logout: () => Promise<void>;\n globalLogout: (redirectTo?: string) => void;\n refreshUser: () => Promise<void>;\n\n // Organization\n organizations: SsoOrganization[];\n currentOrg: SsoOrganization | null;\n hasMultipleOrgs: boolean;\n switchOrg: (orgSlug: string) => void;\n\n // Utilities\n getHeaders: () => Record<string, string>;\n config: SsoConfig;\n}\n\n/**\n * Combined hook for all SSO functionality\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const {\n * user,\n * isAuthenticated,\n * currentOrg,\n * getHeaders,\n * login,\n * logout,\n * } = useSso();\n *\n * const fetchData = async () => {\n * const response = await fetch('/api/data', {\n * headers: getHeaders(),\n * });\n * // ...\n * };\n *\n * if (!isAuthenticated) {\n * return <button onClick={() => login()}>Login</button>;\n * }\n *\n * return (\n * <div>\n * <p>Welcome, {user?.name}</p>\n * <p>Organization: {currentOrg?.name}</p>\n * <button onClick={() => logout()}>Logout</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useSso(): UseSsoReturn {\n const context = useSsoContext();\n\n return useMemo(\n () => ({\n // Auth\n user: context.user,\n isLoading: context.isLoading,\n isAuthenticated: context.isAuthenticated,\n login: context.login,\n logout: context.logout,\n globalLogout: context.globalLogout,\n refreshUser: context.refreshUser,\n\n // Organization\n organizations: context.organizations,\n currentOrg: context.currentOrg,\n hasMultipleOrgs: context.organizations.length > 1,\n switchOrg: context.switchOrg,\n\n // Utilities\n getHeaders: context.getHeaders,\n config: context.config,\n }),\n [context]\n );\n}\n","'use client';\n\nimport { useBranchContext } from '../context/BranchContext';\nimport type { BranchContextValue } from '../types';\n\n/**\n * Hook return type for branch management\n */\nexport type UseBranchReturn = BranchContextValue;\n\n/**\n * Hook for branch management\n * \n * Provides access to branch state and operations.\n * Must be used within a BranchProvider.\n * \n * @example\n * ```tsx\n * function BranchInfo() {\n * const { \n * branches, \n * currentBranch, \n * hasMultipleBranches,\n * switchBranch \n * } = useBranch();\n * \n * // Auto-selection logic is handled by the provider\n * // - If only 1 branch: auto-selected\n * // - If multiple: use saved preference or primary branch\n * \n * return (\n * <div>\n * <p>Current: {currentBranch?.name}</p>\n * {hasMultipleBranches && (\n * <select onChange={(e) => switchBranch(Number(e.target.value))}>\n * {branches.map((branch) => (\n * <option key={branch.id} value={branch.id}>\n * {branch.name}\n * </option>\n * ))}\n * </select>\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function useBranch(): UseBranchReturn {\n return useBranchContext();\n}\n","'use client';\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useSsoContext } from '../context/SsoContext';\nimport type { SsoCallbackProps, SsoCallbackResponse, SsoOrganization, SsoUser } from '../types';\n\n/**\n * Transform backend response to frontend format\n */\nfunction transformUser(data: SsoCallbackResponse['user']): SsoUser {\n return {\n id: data.id,\n consoleUserId: data.console_user_id,\n email: data.email,\n name: data.name,\n };\n}\n\n/**\n * Transform organizations from backend format\n */\nfunction transformOrganizations(\n data: SsoCallbackResponse['organizations']\n): SsoOrganization[] {\n return data.map((org) => ({\n id: org.organization_id,\n slug: org.organization_slug,\n name: org.organization_name,\n orgRole: org.org_role,\n serviceRole: org.service_role,\n }));\n}\n\n/**\n * Default loading component\n */\nfunction DefaultLoading() {\n return (\n <div style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: '200px'\n }}>\n <div>Authenticating...</div>\n </div>\n );\n}\n\n/**\n * Default error component\n */\nfunction DefaultError({ error }: { error: Error }) {\n return (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: '200px',\n color: 'red'\n }}>\n <div>Authentication Error</div>\n <div style={{ fontSize: '0.875rem', marginTop: '0.5rem' }}>{error.message}</div>\n </div>\n );\n}\n\n/**\n * SSO Callback component\n * \n * Place this component at your callback route (e.g., /sso/callback)\n * It handles the SSO code exchange and redirects after successful login.\n *\n * @example\n * ```tsx\n * // pages/sso/callback.tsx or app/sso/callback/page.tsx\n * export default function CallbackPage() {\n * return (\n * <SsoCallback\n * redirectTo=\"/dashboard\"\n * onSuccess={(user, orgs) => console.log('Logged in:', user)}\n * onError={(error) => console.error('Login failed:', error)}\n * />\n * );\n * }\n * ```\n */\nexport function SsoCallback({\n onSuccess,\n onError,\n redirectTo = '/',\n loadingComponent,\n errorComponent,\n}: SsoCallbackProps) {\n const { config, refreshUser } = useSsoContext();\n const [error, setError] = useState<Error | null>(null);\n const [isProcessing, setIsProcessing] = useState(true);\n // 二重呼び出し防止フラグ(React Strict Mode対応)\n const isProcessingRef = useRef(false);\n\n useEffect(() => {\n // 既に処理中の場合はスキップ\n if (isProcessingRef.current) {\n return;\n }\n isProcessingRef.current = true;\n\n const processCallback = async () => {\n try {\n // Get code from URL\n const urlParams = new URLSearchParams(window.location.search);\n const code = urlParams.get('code');\n const redirectParam = urlParams.get('redirect');\n\n if (!code) {\n throw new Error('No authorization code received');\n }\n\n // Get CSRF cookie first (required for Sanctum SPA auth)\n await fetch(`${config.apiUrl}/sanctum/csrf-cookie`, {\n credentials: 'include',\n });\n\n // Get XSRF token from cookie\n const xsrfToken = document.cookie\n .split('; ')\n .find(row => row.startsWith('XSRF-TOKEN='))\n ?.split('=')[1];\n\n // Exchange code for session\n const response = await fetch(`${config.apiUrl}/api/sso/callback`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n ...(xsrfToken ? { 'X-XSRF-TOKEN': decodeURIComponent(xsrfToken) } : {}),\n },\n credentials: 'include',\n body: JSON.stringify({ code }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || 'Failed to authenticate');\n }\n\n const data: SsoCallbackResponse = await response.json();\n\n // Transform data\n const user = transformUser(data.user);\n const organizations = transformOrganizations(data.organizations);\n\n // Refresh context\n await refreshUser();\n\n // Call success callback\n onSuccess?.(user, organizations);\n\n // Redirect\n const finalRedirect = redirectParam || redirectTo;\n window.location.href = finalRedirect;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Authentication failed');\n setError(error);\n onError?.(error);\n // エラー時はフラグをリセットして再試行可能に\n isProcessingRef.current = false;\n } finally {\n setIsProcessing(false);\n }\n };\n\n processCallback();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (error) {\n if (errorComponent) {\n return <>{errorComponent(error)}</>;\n }\n return <DefaultError error={error} />;\n }\n\n if (isProcessing) {\n if (loadingComponent) {\n return <>{loadingComponent}</>;\n }\n return <DefaultLoading />;\n }\n\n return null;\n}\n","'use client';\n\nimport { SwapOutlined, CheckOutlined } from '@ant-design/icons';\nimport { Dropdown, Button, Space, Typography, Badge } from 'antd';\nimport type { MenuProps } from 'antd';\nimport React, { useCallback, useMemo } from 'react';\nimport { useOrganization } from '../hooks/useOrganization';\nimport type { OrganizationSwitcherProps, SsoOrganization } from '../types';\n\nconst { Text } = Typography;\n\n/**\n * Organization Switcher component using Ant Design\n *\n * A dropdown component for switching between organizations.\n * Only renders if user has access to multiple organizations.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <OrganizationSwitcher />\n *\n * // With custom styling\n * <OrganizationSwitcher className=\"my-switcher\" />\n *\n * // With custom render\n * <OrganizationSwitcher\n * renderTrigger={(org, isOpen) => (\n * <Button>{org?.name} {isOpen ? '▲' : '▼'}</Button>\n * )}\n * renderOption={(org, isSelected) => (\n * <div className={isSelected ? 'selected' : ''}>{org.name}</div>\n * )}\n * />\n * ```\n */\nexport function OrganizationSwitcher({\n className,\n renderTrigger,\n renderOption,\n onChange,\n}: OrganizationSwitcherProps) {\n const { organizations, currentOrg, hasMultipleOrgs, switchOrg } = useOrganization();\n const [isOpen, setIsOpen] = React.useState(false);\n\n const handleSelect = useCallback(\n (org: SsoOrganization) => {\n switchOrg(org.slug);\n setIsOpen(false);\n onChange?.(org);\n },\n [switchOrg, onChange]\n );\n\n const menuItems: MenuProps['items'] = useMemo(() => {\n return organizations.map((org) => {\n const isSelected = currentOrg?.slug === org.slug;\n\n if (renderOption) {\n return {\n key: org.slug,\n label: (\n <div onClick={() => handleSelect(org)}>\n {renderOption(org, isSelected)}\n </div>\n ),\n };\n }\n\n return {\n key: org.slug,\n label: (\n <Space style={{ width: '100%', justifyContent: 'space-between' }}>\n <Space direction=\"vertical\" size={0}>\n <Text strong={isSelected}>{org.name}</Text>\n {org.serviceRole && (\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n {org.serviceRole}\n </Text>\n )}\n </Space>\n {isSelected && <CheckOutlined style={{ color: '#1890ff' }} />}\n </Space>\n ),\n onClick: () => handleSelect(org),\n };\n });\n }, [organizations, currentOrg, renderOption, handleSelect]);\n\n // Don't render if only one org\n if (!hasMultipleOrgs) {\n return null;\n }\n\n // Custom trigger\n if (renderTrigger) {\n return (\n <Dropdown\n menu={{ items: menuItems }}\n trigger={['click']}\n open={isOpen}\n onOpenChange={setIsOpen}\n className={className}\n >\n <div style={{ cursor: 'pointer' }}>\n {renderTrigger(currentOrg, isOpen)}\n </div>\n </Dropdown>\n );\n }\n\n // Default Ant Design trigger\n return (\n <Dropdown\n menu={{ items: menuItems }}\n trigger={['click']}\n open={isOpen}\n onOpenChange={setIsOpen}\n className={className}\n >\n <Button>\n <Space>\n <Badge status=\"success\" />\n <span>{currentOrg?.name ?? 'Select Organization'}</span>\n <SwapOutlined />\n </Space>\n </Button>\n </Dropdown>\n );\n}\n","'use client';\n\nimport React, { useEffect } from 'react';\nimport { useAuth } from '../hooks/useAuth';\nimport { useOrganization } from '../hooks/useOrganization';\nimport type { ProtectedRouteProps } from '../types';\n\n/**\n * Default loading component\n */\nfunction DefaultLoading() {\n return (\n <div style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: '200px'\n }}>\n <div>Loading...</div>\n </div>\n );\n}\n\n/**\n * Default login fallback\n */\nfunction DefaultLoginFallback({ login }: { login: () => void }) {\n return (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: '200px',\n gap: '1rem'\n }}>\n <div>Please log in to continue</div>\n <button\n onClick={login}\n style={{\n padding: '0.5rem 1rem',\n background: '#0070f3',\n color: 'white',\n border: 'none',\n borderRadius: '0.375rem',\n cursor: 'pointer',\n }}\n >\n Log In\n </button>\n </div>\n );\n}\n\n/**\n * Default access denied component\n */\nfunction DefaultAccessDenied({ reason }: { reason: string }) {\n return (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: '200px',\n color: '#dc2626'\n }}>\n <div style={{ fontSize: '1.5rem', fontWeight: 600 }}>Access Denied</div>\n <div style={{ marginTop: '0.5rem' }}>{reason}</div>\n </div>\n );\n}\n\n/**\n * Protected Route component\n *\n * Wraps content that requires authentication and optionally specific roles/permissions.\n *\n * @example\n * ```tsx\n * // Basic protection\n * <ProtectedRoute>\n * <Dashboard />\n * </ProtectedRoute>\n *\n * // With role requirement\n * <ProtectedRoute requiredRole=\"admin\">\n * <AdminPanel />\n * </ProtectedRoute>\n *\n * // With custom fallbacks\n * <ProtectedRoute\n * fallback={<Spinner />}\n * loginFallback={<CustomLoginPage />}\n * onAccessDenied={(reason) => console.log(reason)}\n * >\n * <ProtectedContent />\n * </ProtectedRoute>\n * ```\n */\nexport function ProtectedRoute({\n children,\n fallback,\n loginFallback,\n requiredRole,\n requiredPermission,\n onAccessDenied,\n}: ProtectedRouteProps) {\n const { user, isLoading, isAuthenticated, login } = useAuth();\n const { hasRole, currentOrg } = useOrganization();\n\n // Handle access denied callback\n useEffect(() => {\n if (isLoading) return;\n\n if (!isAuthenticated) {\n onAccessDenied?.('unauthenticated');\n } else if (requiredRole && !hasRole(requiredRole)) {\n onAccessDenied?.('insufficient_role');\n }\n // Note: Permission checking would need to be implemented with a permissions hook\n }, [isLoading, isAuthenticated, requiredRole, hasRole, onAccessDenied]);\n\n // Loading state\n if (isLoading) {\n return <>{fallback ?? <DefaultLoading />}</>;\n }\n\n // Not authenticated\n if (!isAuthenticated) {\n if (loginFallback) {\n return <>{loginFallback}</>;\n }\n return <DefaultLoginFallback login={() => login()} />;\n }\n\n // Check role requirement\n if (requiredRole && !hasRole(requiredRole)) {\n return (\n <DefaultAccessDenied\n reason={`This page requires ${requiredRole} role. Your role: ${currentOrg?.serviceRole ?? 'none'}`}\n />\n );\n }\n\n // Note: Permission checking would need a separate implementation\n // with a hook that checks permissions via the backend\n\n // All checks passed\n return <>{children}</>;\n}\n","'use client';\n\nimport { BankOutlined, ApartmentOutlined, CheckCircleFilled } from '@ant-design/icons';\nimport { useQuery } from '@tanstack/react-query';\nimport { Modal, Select, Form, Space, Typography, Spin, Alert, Badge } from 'antd';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useSsoContext } from '../context/SsoContext';\nimport { useBranch } from '../hooks/useBranch';\nimport { useOrganization } from '../hooks/useOrganization';\nimport { ssoQueryKeys } from '../queryKeys';\nimport { createBranchService, type BranchesResponse } from '../services/branchService';\nimport type { OrgBranchSelectorModalProps, SsoOrganization, SsoBranch } from '../types';\n\nconst { Text, Title } = Typography;\n\n/**\n * Organization and Branch Selector Modal\n * \n * A modal component for selecting organization and branch.\n * - If user has only one organization, it's auto-selected\n * - If user has only one branch, it's auto-selected\n * - Shows selection UI only when there are multiple options\n * \n * @example\n * ```tsx\n * function CreateProjectButton() {\n * const [modalOpen, setModalOpen] = useState(false);\n * \n * const handleConfirm = (orgId: number, branchId: number) => {\n * // Create project with selected org and branch\n * createProject({ organization_id: orgId, branch_id: branchId });\n * setModalOpen(false);\n * };\n * \n * return (\n * <>\n * <Button onClick={() => setModalOpen(true)}>\n * Create Project\n * </Button>\n * <OrgBranchSelectorModal\n * open={modalOpen}\n * onClose={() => setModalOpen(false)}\n * onConfirm={handleConfirm}\n * />\n * </>\n * );\n * }\n * ```\n */\nexport function OrgBranchSelectorModal({\n open,\n onClose,\n onConfirm,\n title = 'Select Organization & Branch',\n requireBranch = true,\n loadingComponent,\n}: OrgBranchSelectorModalProps) {\n const { config } = useSsoContext();\n const { organizations, currentOrg, hasMultipleOrgs } = useOrganization();\n const { currentBranch } = useBranch();\n const [form] = Form.useForm();\n\n // Selected organization state (for fetching branches)\n const [selectedOrgSlug, setSelectedOrgSlug] = useState<string | null>(\n currentOrg?.slug ?? null\n );\n\n // Branch service\n const branchService = useMemo(\n () => createBranchService({ apiUrl: config.apiUrl }),\n [config.apiUrl]\n );\n\n // Fetch branches for selected organization\n const {\n data: branchesData,\n isLoading: branchesLoading,\n error: branchesError,\n } = useQuery<BranchesResponse>({\n queryKey: ssoQueryKeys.branches.list(selectedOrgSlug ?? undefined),\n queryFn: () => branchService.list(selectedOrgSlug ?? undefined),\n enabled: open && !!selectedOrgSlug,\n });\n\n const branches = branchesData?.branches ?? [];\n const hasMultipleBranches = branches.length > 1;\n\n // Find selected organization object (fallback to first org if only one)\n const selectedOrg = useMemo(\n () => {\n if (selectedOrgSlug) {\n return organizations.find(o => o.slug === selectedOrgSlug) ?? null;\n }\n // Fallback: if only one org and none selected yet, use that one\n if (organizations.length === 1) {\n return organizations[0];\n }\n return null;\n },\n [organizations, selectedOrgSlug]\n );\n\n // Auto-select organization when modal opens\n useEffect(() => {\n if (!open) return;\n\n // Skip if already selected\n if (selectedOrgSlug && form.getFieldValue('organization_id')) return;\n\n // Priority: currentOrg > single org\n if (currentOrg) {\n setSelectedOrgSlug(currentOrg.slug);\n form.setFieldValue('organization_id', currentOrg.id);\n } else if (organizations.length === 1) {\n setSelectedOrgSlug(organizations[0].slug);\n form.setFieldValue('organization_id', organizations[0].id);\n }\n }, [open, organizations, currentOrg, selectedOrgSlug, form]);\n\n // Auto-select branch: prioritize currentBranch, then primary, then headquarters\n useEffect(() => {\n if (!open || branchesLoading) return;\n\n if (branches.length === 1) {\n form.setFieldValue('branch_id', branches[0].id);\n } else if (branches.length > 0) {\n // First, try to use currentBranch if it exists in the branch list\n if (currentBranch && branches.some(b => b.id === currentBranch.id)) {\n form.setFieldValue('branch_id', currentBranch.id);\n } else {\n // Fallback: Try to select primary or headquarters\n const primaryId = branchesData?.primary_branch_id;\n if (primaryId) {\n form.setFieldValue('branch_id', primaryId);\n } else {\n const hq = branches.find(b => b.is_headquarters);\n if (hq) {\n form.setFieldValue('branch_id', hq.id);\n }\n }\n }\n }\n }, [open, branches, branchesLoading, branchesData, currentBranch, form]);\n\n // Auto-confirm if both are auto-selected\n useEffect(() => {\n if (!open || branchesLoading) return;\n\n const orgId = form.getFieldValue('organization_id');\n const branchId = form.getFieldValue('branch_id');\n\n // If we have auto-selected values and no multiple choices needed\n if (orgId && branchId && !hasMultipleOrgs && !hasMultipleBranches) {\n // Small delay to ensure UI renders\n const timer = setTimeout(() => {\n onConfirm(orgId, branchId);\n }, 100);\n return () => clearTimeout(timer);\n }\n }, [open, branchesLoading, hasMultipleOrgs, hasMultipleBranches, form, onConfirm]);\n\n const handleOrgChange = useCallback((orgId: number) => {\n const org = organizations.find(o => o.id === orgId);\n if (org) {\n setSelectedOrgSlug(org.slug);\n // Reset branch selection when org changes\n form.setFieldValue('branch_id', undefined);\n }\n }, [organizations, form]);\n\n const handleSubmit = useCallback(() => {\n form.validateFields().then(values => {\n onConfirm(values.organization_id, values.branch_id);\n });\n }, [form, onConfirm]);\n\n const handleClose = useCallback(() => {\n form.resetFields();\n setSelectedOrgSlug(currentOrg?.slug ?? null);\n onClose();\n }, [form, currentOrg, onClose]);\n\n // If loading and no branches yet, show loading\n const isInitialLoading = open && (!organizations.length || (selectedOrgSlug && branchesLoading && !branches.length));\n\n // Check if we need to show the modal at all\n const needsSelection = hasMultipleOrgs || hasMultipleBranches;\n\n return (\n <Modal\n title={\n <Space>\n <BankOutlined />\n <span>{title}</span>\n </Space>\n }\n open={open}\n onCancel={handleClose}\n onOk={handleSubmit}\n okText=\"Confirm\"\n cancelText=\"Cancel\"\n destroyOnHidden\n width={480}\n >\n {isInitialLoading ? (\n <div style={{ textAlign: 'center', padding: 40 }}>\n {loadingComponent ?? <Spin size=\"large\" />}\n <div style={{ marginTop: 16 }}>\n <Text type=\"secondary\">Loading...</Text>\n </div>\n </div>\n ) : (\n <Form\n form={form}\n layout=\"vertical\"\n style={{ marginTop: 16 }}\n >\n {branchesError && (\n <Alert\n type=\"error\"\n message=\"Failed to load branches\"\n description={(branchesError as Error).message}\n style={{ marginBottom: 16 }}\n />\n )}\n\n {/* Organization Selection */}\n <Form.Item\n name=\"organization_id\"\n label={\n <Space>\n <BankOutlined />\n <span>Organization</span>\n {!hasMultipleOrgs && selectedOrg && (\n <Badge status=\"success\" text=\"Auto-selected\" />\n )}\n </Space>\n }\n rules={[{ required: true, message: 'Please select an organization' }]}\n >\n {hasMultipleOrgs ? (\n <Select\n placeholder=\"Select organization\"\n onChange={handleOrgChange}\n size=\"large\"\n optionLabelProp=\"label\"\n >\n {organizations.map((org) => (\n <Select.Option\n key={org.id}\n value={org.id}\n label={org.name}\n >\n <Space style={{ width: '100%', justifyContent: 'space-between' }}>\n <div>\n <Text strong>{org.name}</Text>\n {org.serviceRole && (\n <Text type=\"secondary\" style={{ marginLeft: 8, fontSize: 12 }}>\n ({org.serviceRole})\n </Text>\n )}\n </div>\n {org.slug === currentOrg?.slug && (\n <CheckCircleFilled style={{ color: '#52c41a' }} />\n )}\n </Space>\n </Select.Option>\n ))}\n </Select>\n ) : (\n <div\n style={{\n padding: '8px 12px',\n background: '#f5f5f5',\n borderRadius: 6,\n border: '1px solid #d9d9d9',\n }}\n >\n <Space>\n <BankOutlined style={{ color: '#1677ff' }} />\n <Text strong>{selectedOrg?.name}</Text>\n </Space>\n </div>\n )}\n </Form.Item>\n\n {/* Branch Selection */}\n {selectedOrgSlug && (\n <Form.Item\n name=\"branch_id\"\n label={\n <Space>\n <ApartmentOutlined />\n <span>Branch</span>\n {!hasMultipleBranches && branches.length === 1 && (\n <Badge status=\"success\" text=\"Auto-selected\" />\n )}\n </Space>\n }\n rules={requireBranch ? [{ required: true, message: 'Please select a branch' }] : undefined}\n >\n {branchesLoading ? (\n <div style={{ padding: '8px 12px', textAlign: 'center' }}>\n <Spin size=\"small\" />\n <Text type=\"secondary\" style={{ marginLeft: 8 }}>\n Loading branches...\n </Text>\n </div>\n ) : hasMultipleBranches ? (\n <Select\n placeholder=\"Select branch\"\n size=\"large\"\n optionLabelProp=\"label\"\n >\n {branches.map((branch) => (\n <Select.Option\n key={branch.id}\n value={branch.id}\n label={branch.name}\n >\n <Space style={{ width: '100%', justifyContent: 'space-between' }}>\n <div>\n <Text strong>{branch.name}</Text>\n <Text type=\"secondary\" style={{ marginLeft: 8, fontSize: 12 }}>\n {branch.code}\n </Text>\n </div>\n <Space size={4}>\n {branch.is_headquarters && (\n <Badge color=\"blue\" text=\"HQ\" />\n )}\n {branch.is_primary && (\n <Badge color=\"green\" text=\"Primary\" />\n )}\n </Space>\n </Space>\n </Select.Option>\n ))}\n </Select>\n ) : branches.length === 1 ? (\n <div\n style={{\n padding: '8px 12px',\n background: '#f5f5f5',\n borderRadius: 6,\n border: '1px solid #d9d9d9',\n }}\n >\n <Space>\n <ApartmentOutlined style={{ color: '#1677ff' }} />\n <Text strong>{branches[0].name}</Text>\n <Text type=\"secondary\">({branches[0].code})</Text>\n </Space>\n </div>\n ) : (\n <Alert\n type=\"warning\"\n message=\"No branches available\"\n description=\"You don't have access to any branches in this organization.\"\n />\n )}\n </Form.Item>\n )}\n\n {/* Info message when everything is auto-selected */}\n {!needsSelection && selectedOrg && branches.length > 0 && (\n <Alert\n type=\"info\"\n message=\"Auto-selected\"\n description={`Using ${selectedOrg.name} / ${branches[0]?.name ?? 'Default'}`}\n icon={<CheckCircleFilled />}\n showIcon\n />\n )}\n </Form>\n )}\n </Modal>\n );\n}\n","'use client';\n\nimport { BankOutlined, ApartmentOutlined, CheckCircleFilled } from '@ant-design/icons';\nimport { useQuery } from '@tanstack/react-query';\nimport { Modal, Select, Space, Typography, Badge, Spin, Button, Alert } from 'antd';\nimport React, { useEffect, useState } from 'react';\nimport { useSsoContext } from '../context/SsoContext';\nimport { useOrganization } from '../hooks/useOrganization';\nimport { ssoQueryKeys } from '../queryKeys';\nimport { createBranchService, type BranchesResponse } from '../services/branchService';\nimport type { BranchGateProps } from '../types';\n\nconst { Text, Title } = Typography;\n\nconst DEFAULT_STORAGE_KEY = 'omnify_branch_gate_selection';\n\n// Re-export type from types.ts\nexport type { BranchGateSelection } from '../types';\n\ntype StoredSelection = {\n orgId: string;\n orgSlug: string;\n orgName: string;\n branchId: string;\n branchName: string;\n branchCode: string;\n};\n\n/**\n * BranchGate - Ensures user has selected an org/branch before accessing the app.\n * \n * Different from OrgBranchSelectorModal:\n * - OrgBranchSelectorModal: Modal for one-time selection (e.g., creating a project)\n * - BranchGate: Gate that blocks app access until selection is made, persists globally\n * \n * Auto-selection behavior:\n * - If user has only 1 org and 1 branch: auto-selects and allows access\n * - If user has multiple options: shows selection modal first\n * - Stores selection in localStorage for persistence\n * \n * @example\n * ```tsx\n * // In your app layout\n * function DashboardLayout({ children }) {\n * return (\n * <BranchGate\n * onSelectionChange={(selection) => {\n * // Set API headers globally\n * api.defaults.headers['X-Branch-Id'] = selection.branchId;\n * api.defaults.headers['X-Org-Id'] = selection.orgId;\n * }}\n * >\n * {children}\n * </BranchGate>\n * );\n * }\n * ```\n */\nexport function BranchGate({\n children,\n onSelectionChange,\n storageKey = DEFAULT_STORAGE_KEY,\n loadingComponent,\n title,\n description,\n}: BranchGateProps) {\n const { config, isAuthenticated } = useSsoContext();\n const { organizations, currentOrg, hasMultipleOrgs } = useOrganization();\n\n // Stored selection\n const [storedSelection, setStoredSelection] = useState<StoredSelection | null>(null);\n const [isInitialized, setIsInitialized] = useState(false);\n\n // Temp selection (UI state before confirm)\n const [tempOrgId, setTempOrgId] = useState<string | null>(null);\n const [tempBranchId, setTempBranchId] = useState<string | null>(null);\n\n // Branch service\n const branchService = React.useMemo(\n () => createBranchService({ apiUrl: config.apiUrl }),\n [config.apiUrl]\n );\n\n // Get org slug for branch fetching\n const activeOrgSlug = React.useMemo(() => {\n if (tempOrgId) {\n return organizations.find(o => String(o.id) === tempOrgId)?.slug;\n }\n return storedSelection?.orgSlug ?? currentOrg?.slug;\n }, [tempOrgId, organizations, storedSelection, currentOrg]);\n\n // Fetch branches\n const { data: branchesData, isLoading: branchesLoading } = useQuery<BranchesResponse>({\n queryKey: ssoQueryKeys.branches.list(activeOrgSlug),\n queryFn: () => branchService.list(activeOrgSlug),\n enabled: isAuthenticated && !!activeOrgSlug,\n });\n\n const branches = branchesData?.branches ?? [];\n const hasMultipleBranches = branches.length > 1;\n\n // Load from localStorage on mount\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const saved = localStorage.getItem(storageKey);\n if (saved) {\n try {\n const parsed = JSON.parse(saved) as StoredSelection;\n setStoredSelection(parsed);\n onSelectionChange?.(parsed);\n } catch {\n localStorage.removeItem(storageKey);\n }\n }\n setIsInitialized(true);\n }, [storageKey, onSelectionChange]);\n\n // Auto-select org if only one\n useEffect(() => {\n if (!isAuthenticated || !isInitialized || storedSelection) return;\n\n if (organizations.length === 1 && !tempOrgId) {\n setTempOrgId(String(organizations[0].id));\n }\n }, [isAuthenticated, isInitialized, organizations, storedSelection, tempOrgId]);\n\n // Auto-select branch if only one\n useEffect(() => {\n if (!tempOrgId || branchesLoading || storedSelection) return;\n\n if (branches.length === 1 && !tempBranchId) {\n setTempBranchId(String(branches[0].id));\n } else if (branches.length > 0 && !tempBranchId) {\n // Auto-select primary or HQ\n const primaryId = branchesData?.primary_branch_id;\n if (primaryId) {\n setTempBranchId(String(primaryId));\n } else {\n const hq = branches.find(b => b.is_headquarters);\n if (hq) {\n setTempBranchId(String(hq.id));\n }\n }\n }\n }, [tempOrgId, branches, branchesLoading, branchesData, storedSelection, tempBranchId]);\n\n // Auto-confirm if both are auto-selected and no UI needed\n useEffect(() => {\n if (storedSelection || !isInitialized) return;\n if (!tempOrgId || !tempBranchId || branchesLoading) return;\n\n // If no multiple choices, auto-confirm\n if (!hasMultipleOrgs && !hasMultipleBranches) {\n confirmSelection();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tempOrgId, tempBranchId, branchesLoading, hasMultipleOrgs, hasMultipleBranches, storedSelection, isInitialized]);\n\n const confirmSelection = React.useCallback(() => {\n if (!tempOrgId || !tempBranchId) return;\n\n const org = organizations.find(o => String(o.id) === tempOrgId);\n const branch = branches.find(b => String(b.id) === tempBranchId);\n\n if (!org || !branch) return;\n\n const selection: StoredSelection = {\n orgId: String(org.id),\n orgSlug: org.slug,\n orgName: org.name,\n branchId: String(branch.id),\n branchName: branch.name,\n branchCode: branch.code,\n };\n\n localStorage.setItem(storageKey, JSON.stringify(selection));\n setStoredSelection(selection);\n onSelectionChange?.(selection);\n\n // Clear temp\n setTempOrgId(null);\n setTempBranchId(null);\n }, [tempOrgId, tempBranchId, organizations, branches, storageKey, onSelectionChange]);\n\n const clearSelection = React.useCallback(() => {\n localStorage.removeItem(storageKey);\n setStoredSelection(null);\n onSelectionChange?.(null);\n }, [storageKey, onSelectionChange]);\n\n // Determine if selection is needed\n const needsSelection = isAuthenticated && isInitialized && !storedSelection && (hasMultipleOrgs || hasMultipleBranches);\n const isLoading = !isAuthenticated || !isInitialized || (!!activeOrgSlug && branchesLoading && !storedSelection);\n\n // Show loading while checking\n if (isLoading && !needsSelection) {\n if (loadingComponent) {\n return <>{loadingComponent}</>;\n }\n return (\n <div style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: '100vh',\n background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n }}>\n <Spin size=\"large\" />\n </div>\n );\n }\n\n // Show selection modal if needed\n if (needsSelection) {\n const canConfirm = tempOrgId && tempBranchId;\n\n return (\n <div style={{\n minHeight: '100vh',\n background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 24,\n }}>\n <div style={{\n background: '#fff',\n borderRadius: 16,\n padding: 32,\n maxWidth: 480,\n width: '100%',\n boxShadow: '0 20px 60px rgba(0,0,0,0.3)',\n }}>\n <div style={{ textAlign: 'center', marginBottom: 24 }}>\n <div style={{\n width: 64,\n height: 64,\n borderRadius: '50%',\n background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n margin: '0 auto 16px',\n }}>\n <BankOutlined style={{ fontSize: 28, color: '#fff' }} />\n </div>\n <Title level={3} style={{ margin: 0 }}>\n {title ?? 'Select Organization'}\n </Title>\n <Text type=\"secondary\">\n {description ?? 'Please select your organization and branch to continue'}\n </Text>\n </div>\n\n {/* Organization Selection */}\n <div style={{ marginBottom: 20 }}>\n <Text strong style={{ display: 'block', marginBottom: 8 }}>\n <Space>\n <BankOutlined />\n <span>Organization</span>\n {!hasMultipleOrgs && <Badge status=\"success\" text=\"Auto-selected\" />}\n </Space>\n </Text>\n {hasMultipleOrgs ? (\n <Select\n value={tempOrgId}\n onChange={(value) => {\n setTempOrgId(String(value));\n setTempBranchId(null);\n }}\n placeholder=\"Select organization\"\n size=\"large\"\n style={{ width: '100%' }}\n optionLabelProp=\"label\"\n >\n {organizations.map((org) => (\n <Select.Option key={org.id} value={String(org.id)} label={org.name}>\n <Space style={{ width: '100%', justifyContent: 'space-between' }}>\n <div>\n <Text strong>{org.name}</Text>\n {org.serviceRole && (\n <Text type=\"secondary\" style={{ marginLeft: 8, fontSize: 12 }}>\n ({org.serviceRole})\n </Text>\n )}\n </div>\n </Space>\n </Select.Option>\n ))}\n </Select>\n ) : (\n <div style={{\n padding: '8px 12px',\n background: '#f5f5f5',\n borderRadius: 6,\n border: '1px solid #d9d9d9',\n }}>\n <Space>\n <BankOutlined style={{ color: '#1677ff' }} />\n <Text strong>{organizations[0]?.name}</Text>\n </Space>\n </div>\n )}\n </div>\n\n {/* Branch Selection */}\n {tempOrgId && (\n <div style={{ marginBottom: 24 }}>\n <Text strong style={{ display: 'block', marginBottom: 8 }}>\n <Space>\n <ApartmentOutlined />\n <span>Branch</span>\n {!hasMultipleBranches && branches.length === 1 && (\n <Badge status=\"success\" text=\"Auto-selected\" />\n )}\n </Space>\n </Text>\n {branchesLoading ? (\n <div style={{ padding: '12px', textAlign: 'center' }}>\n <Spin size=\"small\" />\n <Text type=\"secondary\" style={{ marginLeft: 8 }}>\n Loading...\n </Text>\n </div>\n ) : hasMultipleBranches ? (\n <Select\n value={tempBranchId}\n onChange={(value) => setTempBranchId(String(value))}\n placeholder=\"Select branch\"\n size=\"large\"\n style={{ width: '100%' }}\n optionLabelProp=\"label\"\n >\n {branches.map((branch) => (\n <Select.Option key={branch.id} value={String(branch.id)} label={branch.name}>\n <Space style={{ width: '100%', justifyContent: 'space-between' }}>\n <div>\n <Text strong>{branch.name}</Text>\n <Text type=\"secondary\" style={{ marginLeft: 8, fontSize: 12 }}>\n {branch.code}\n </Text>\n </div>\n <Space size={4}>\n {branch.is_headquarters && <Badge color=\"blue\" text=\"HQ\" />}\n {branch.is_primary && <Badge color=\"green\" text=\"Primary\" />}\n </Space>\n </Space>\n </Select.Option>\n ))}\n </Select>\n ) : branches.length === 1 ? (\n <div style={{\n padding: '8px 12px',\n background: '#f5f5f5',\n borderRadius: 6,\n border: '1px solid #d9d9d9',\n }}>\n <Space>\n <ApartmentOutlined style={{ color: '#1677ff' }} />\n <Text strong>{branches[0].name}</Text>\n <Text type=\"secondary\">({branches[0].code})</Text>\n </Space>\n </div>\n ) : (\n <Alert\n type=\"warning\"\n message=\"No branches available\"\n description=\"You don't have access to any branches in this organization.\"\n />\n )}\n </div>\n )}\n\n {/* Confirm Button */}\n <Button\n type=\"primary\"\n size=\"large\"\n block\n disabled={!canConfirm}\n onClick={confirmSelection}\n icon={<CheckCircleFilled />}\n style={{\n height: 48,\n fontSize: 16,\n background: canConfirm\n ? 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)'\n : undefined,\n border: 'none',\n }}\n >\n Confirm\n </Button>\n </div>\n </div>\n );\n }\n\n // Selection complete - render children\n return <>{children}</>;\n}\n\n// Export hook for accessing current selection\nexport function useBranchGate(storageKey = DEFAULT_STORAGE_KEY) {\n const [selection, setSelection] = useState<StoredSelection | null>(null);\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const saved = localStorage.getItem(storageKey);\n if (saved) {\n try {\n setSelection(JSON.parse(saved));\n } catch {\n // ignore\n }\n }\n\n // Listen for storage changes\n const handleStorage = (e: StorageEvent) => {\n if (e.key === storageKey) {\n if (e.newValue) {\n try {\n setSelection(JSON.parse(e.newValue));\n } catch {\n setSelection(null);\n }\n } else {\n setSelection(null);\n }\n }\n };\n\n window.addEventListener('storage', handleStorage);\n return () => window.removeEventListener('storage', handleStorage);\n }, [storageKey]);\n\n const clearSelection = React.useCallback(() => {\n localStorage.removeItem(storageKey);\n setSelection(null);\n }, [storageKey]);\n\n return {\n selection,\n selectedOrg: selection ? { id: selection.orgId, slug: selection.orgSlug, name: selection.orgName } : null,\n selectedBranch: selection ? { id: selection.branchId, name: selection.branchName, code: selection.branchCode } : null,\n clearSelection,\n };\n}\n","\"use client\";\n\nimport { EditOutlined, DeleteOutlined, SearchOutlined } from \"@ant-design/icons\";\nimport { Table, Space, Button, Popconfirm, Tag, Input } from \"antd\";\nimport type { ColumnsType, TablePaginationConfig } from \"antd/es/table\";\nimport type { FilterValue, SorterResult } from \"antd/es/table/interface\";\nimport { useSsoTranslation } from \"../../i18n\";\nimport type { User, UserListResponse } from \"../../services/userService\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface UserTableProps {\n users: User[];\n loading?: boolean;\n pagination?: UserListResponse[\"meta\"];\n sortField?: string;\n sortOrder?: \"asc\" | \"desc\";\n onPageChange?: (page: number, pageSize: number) => void;\n onSortChange?: (field: string | undefined, order: \"asc\" | \"desc\" | undefined) => void;\n onSearch?: (value: string) => void;\n onEdit?: (user: User) => void;\n onDelete?: (user: User) => void;\n deleteLoading?: boolean;\n showSearch?: boolean;\n showActions?: boolean;\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\nexport function UserTable({\n users,\n loading = false,\n pagination,\n sortField,\n sortOrder,\n onPageChange,\n onSortChange,\n onSearch,\n onEdit,\n onDelete,\n deleteLoading = false,\n showSearch = true,\n showActions = true,\n}: UserTableProps) {\n const { t } = useSsoTranslation();\n\n const columns: ColumnsType<User> = [\n {\n title: t(\"email\"),\n dataIndex: \"email\",\n key: \"email\",\n sorter: true,\n sortOrder: sortField === \"email\" ? (sortOrder === \"asc\" ? \"ascend\" : \"descend\") : undefined,\n },\n {\n title: t(\"name\"),\n dataIndex: \"name\",\n key: \"name\",\n sorter: true,\n sortOrder: sortField === \"name\" ? (sortOrder === \"asc\" ? \"ascend\" : \"descend\") : undefined,\n },\n {\n title: \"SSO\",\n dataIndex: \"console_user_id\",\n key: \"sso\",\n width: 100,\n render: (value: string | null) =>\n value ? <Tag color=\"green\">{t(\"ssoUser\")}</Tag> : <Tag color=\"default\">{t(\"localUser\")}</Tag>,\n },\n ];\n\n // Add actions column if enabled\n if (showActions && (onEdit || onDelete)) {\n columns.push({\n title: t(\"actions\"),\n key: \"actions\",\n width: 120,\n render: (_: unknown, record: User) => (\n <Space>\n {onEdit && (\n <Button\n type=\"text\"\n icon={<EditOutlined />}\n size=\"small\"\n onClick={() => onEdit(record)}\n />\n )}\n {onDelete && (\n <Popconfirm\n title={t(\"confirmDelete\")}\n onConfirm={() => onDelete(record)}\n okText={t(\"yes\")}\n cancelText={t(\"no\")}\n >\n <Button\n type=\"text\"\n danger\n icon={<DeleteOutlined />}\n size=\"small\"\n loading={deleteLoading}\n />\n </Popconfirm>\n )}\n </Space>\n ),\n });\n }\n\n const handleTableChange = (\n paginationConfig: TablePaginationConfig,\n _filters: Record<string, FilterValue | null>,\n sorter: SorterResult<User> | SorterResult<User>[]\n ) => {\n // Handle pagination\n if (onPageChange && paginationConfig.current && paginationConfig.pageSize) {\n onPageChange(paginationConfig.current, paginationConfig.pageSize);\n }\n\n // Handle sorting\n if (onSortChange) {\n const singleSorter = Array.isArray(sorter) ? sorter[0] : sorter;\n if (singleSorter?.field) {\n onSortChange(\n singleSorter.field as string,\n singleSorter.order === \"ascend\" ? \"asc\" : \"desc\"\n );\n } else {\n onSortChange(undefined, undefined);\n }\n }\n };\n\n return (\n <div>\n {showSearch && onSearch && (\n <div style={{ marginBottom: 16 }}>\n <Input\n placeholder={t(\"searchUsers\")}\n prefix={<SearchOutlined />}\n onChange={(e) => onSearch(e.target.value)}\n style={{ width: 300 }}\n allowClear\n />\n </div>\n )}\n <Table\n columns={columns}\n dataSource={users}\n loading={loading}\n rowKey=\"id\"\n onChange={handleTableChange}\n pagination={\n pagination\n ? {\n current: pagination.current_page,\n pageSize: pagination.per_page,\n total: pagination.total,\n showSizeChanger: true,\n showTotal: (total) => t(\"total\", { count: total }),\n }\n : false\n }\n />\n </div>\n );\n}\n","/**\n * Default translations for SSO components\n *\n * Apps can override these by adding to their i18n resources under the \"sso\" namespace.\n */\n\nexport const ssoNamespace = \"sso\";\n\nexport const defaultTranslations = {\n en: {\n // Common\n actions: \"Actions\",\n save: \"Save\",\n cancel: \"Cancel\",\n delete: \"Delete\",\n edit: \"Edit\",\n search: \"Search\",\n loading: \"Loading...\",\n yes: \"Yes\",\n no: \"No\",\n confirmDelete: \"Are you sure you want to delete?\",\n\n // Users\n users: \"Users\",\n user: \"User\",\n name: \"Name\",\n email: \"Email\",\n ssoUser: \"SSO User\",\n localUser: \"Local User\",\n userList: \"User List\",\n userDetails: \"User Details\",\n editUser: \"Edit User\",\n deleteUser: \"Delete User\",\n searchUsers: \"Search users...\",\n noUsersFound: \"No users found\",\n userDeleted: \"User deleted successfully\",\n userUpdated: \"User updated successfully\",\n\n // Roles\n roles: \"Roles\",\n role: \"Role\",\n roleName: \"Role Name\",\n roleDescription: \"Description\",\n permissions: \"Permissions\",\n assignRole: \"Assign Role\",\n removeRole: \"Remove Role\",\n\n // Permissions\n permission: \"Permission\",\n permissionName: \"Permission Name\",\n permissionDescription: \"Description\",\n\n // Validation\n required: \"{{field}} is required\",\n maxLength: \"{{field}} must be at most {{max}} characters\",\n invalidEmail: \"Please enter a valid email address\",\n\n // Pagination\n total: \"Total {{count}} items\",\n page: \"Page {{current}} of {{total}}\",\n },\n ja: {\n // Common\n actions: \"操作\",\n save: \"保存\",\n cancel: \"キャンセル\",\n delete: \"削除\",\n edit: \"編集\",\n search: \"検索\",\n loading: \"読み込み中...\",\n yes: \"はい\",\n no: \"いいえ\",\n confirmDelete: \"本当に削除しますか?\",\n\n // Users\n users: \"ユーザー\",\n user: \"ユーザー\",\n name: \"名前\",\n email: \"メールアドレス\",\n ssoUser: \"SSOユーザー\",\n localUser: \"ローカルユーザー\",\n userList: \"ユーザー一覧\",\n userDetails: \"ユーザー詳細\",\n editUser: \"ユーザー編集\",\n deleteUser: \"ユーザー削除\",\n searchUsers: \"ユーザーを検索...\",\n noUsersFound: \"ユーザーが見つかりません\",\n userDeleted: \"ユーザーを削除しました\",\n userUpdated: \"ユーザーを更新しました\",\n\n // Roles\n roles: \"ロール\",\n role: \"ロール\",\n roleName: \"ロール名\",\n roleDescription: \"説明\",\n permissions: \"権限\",\n assignRole: \"ロールを割り当て\",\n removeRole: \"ロールを削除\",\n\n // Permissions\n permission: \"権限\",\n permissionName: \"権限名\",\n permissionDescription: \"説明\",\n\n // Validation\n required: \"{{field}}は必須です\",\n maxLength: \"{{field}}は{{max}}文字以内で入力してください\",\n invalidEmail: \"有効なメールアドレスを入力してください\",\n\n // Pagination\n total: \"全{{count}}件\",\n page: \"{{total}}ページ中{{current}}ページ\",\n },\n vi: {\n // Common\n actions: \"Hành động\",\n save: \"Lưu\",\n cancel: \"Hủy\",\n delete: \"Xóa\",\n edit: \"Sửa\",\n search: \"Tìm kiếm\",\n loading: \"Đang tải...\",\n yes: \"Có\",\n no: \"Không\",\n confirmDelete: \"Bạn có chắc muốn xóa?\",\n\n // Users\n users: \"Người dùng\",\n user: \"Người dùng\",\n name: \"Tên\",\n email: \"Email\",\n ssoUser: \"Người dùng SSO\",\n localUser: \"Người dùng nội bộ\",\n userList: \"Danh sách người dùng\",\n userDetails: \"Chi tiết người dùng\",\n editUser: \"Sửa người dùng\",\n deleteUser: \"Xóa người dùng\",\n searchUsers: \"Tìm người dùng...\",\n noUsersFound: \"Không tìm thấy người dùng\",\n userDeleted: \"Đã xóa người dùng\",\n userUpdated: \"Đã cập nhật người dùng\",\n\n // Roles\n roles: \"Vai trò\",\n role: \"Vai trò\",\n roleName: \"Tên vai trò\",\n roleDescription: \"Mô tả\",\n permissions: \"Quyền\",\n assignRole: \"Gán vai trò\",\n removeRole: \"Xóa vai trò\",\n\n // Permissions\n permission: \"Quyền\",\n permissionName: \"Tên quyền\",\n permissionDescription: \"Mô tả\",\n\n // Validation\n required: \"{{field}} là bắt buộc\",\n maxLength: \"{{field}} tối đa {{max}} ký tự\",\n invalidEmail: \"Email không hợp lệ\",\n\n // Pagination\n total: \"Tổng {{count}} mục\",\n page: \"Trang {{current}}/{{total}}\",\n },\n};\n","/**\n * Hook for SSO translations using react-i18next\n *\n * Falls back to English if translation not found.\n * Apps should initialize i18next and add SSO translations to their resources.\n */\n\nimport { useCallback } from \"react\";\nimport { defaultTranslations } from \"./translations\";\n\ntype TranslationKey = keyof typeof defaultTranslations.en;\n\n/**\n * Hook for SSO component translations\n *\n * Falls back to English if react-i18next is not available or translation not found.\n *\n * @example\n * const { t } = useSsoTranslation();\n * <span>{t(\"users\")}</span>\n * <span>{t(\"required\", { field: t(\"email\") })}</span>\n */\nexport function useSsoTranslation() {\n // Simple fallback implementation using English translations\n // Apps using react-i18next should add SSO namespace to their i18n config\n const t = useCallback(\n (key: TranslationKey, options?: Record<string, unknown>): string => {\n let value = defaultTranslations.en[key] || key;\n\n // Simple interpolation for {{variable}}\n if (options) {\n Object.entries(options).forEach(([k, v]) => {\n value = value.replace(new RegExp(`{{${k}}}`, \"g\"), String(v));\n });\n }\n\n return value;\n },\n []\n );\n\n return { t };\n}\n","\"use client\";\n\nimport i18n from \"i18next\";\nimport LanguageDetector from \"i18next-browser-languagedetector\";\nimport { type ReactNode, useMemo } from \"react\";\nimport { I18nextProvider } from \"react-i18next\";\nimport { initReactI18next } from \"react-i18next\";\nimport { locales, defaultLocale } from \"./config\";\nimport { defaultTranslations, ssoNamespace } from \"./translations\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype TranslationMessages = Record<string, any>;\n\nexport interface I18nProviderProps {\n children: ReactNode;\n /** App-specific translations for each locale */\n translations?: {\n en?: TranslationMessages;\n ja?: TranslationMessages;\n vi?: TranslationMessages;\n };\n /** Default locale (defaults to \"ja\") */\n fallbackLocale?: string;\n}\n\n// Track initialization state\nlet initialized = false;\n\nfunction getOrCreateI18n(appTranslations?: I18nProviderProps[\"translations\"], fallbackLocale?: string) {\n if (initialized) return i18n;\n\n // Build resources combining app translations with SSO translations\n const resources = {\n en: {\n translation: appTranslations?.en || {},\n [ssoNamespace]: defaultTranslations.en,\n },\n ja: {\n translation: appTranslations?.ja || {},\n [ssoNamespace]: defaultTranslations.ja,\n },\n vi: {\n translation: appTranslations?.vi || {},\n [ssoNamespace]: defaultTranslations.vi,\n },\n };\n\n i18n\n .use(LanguageDetector)\n .use(initReactI18next)\n .init({\n resources,\n fallbackLng: fallbackLocale || defaultLocale,\n supportedLngs: locales,\n detection: {\n order: [\"cookie\", \"localStorage\", \"navigator\"],\n caches: [\"cookie\", \"localStorage\"],\n lookupCookie: \"locale\",\n lookupLocalStorage: \"locale\",\n },\n interpolation: {\n escapeValue: false,\n },\n defaultNS: \"translation\",\n ns: [\"translation\", ssoNamespace],\n react: {\n useSuspense: false,\n },\n });\n\n initialized = true;\n return i18n;\n}\n\nexport function I18nProvider({ children, translations, fallbackLocale }: I18nProviderProps) {\n // Initialize synchronously on first render\n const i18nInstance = useMemo(\n () => getOrCreateI18n(translations, fallbackLocale),\n [translations, fallbackLocale]\n );\n\n return <I18nextProvider i18n={i18nInstance}>{children}</I18nextProvider>;\n}\n","/**\n * i18n configuration constants\n */\n\nimport i18n from \"i18next\";\n\n// Supported locales\nexport const locales = [\"ja\", \"en\", \"vi\"] as const;\nexport type Locale = (typeof locales)[number];\nexport const defaultLocale: Locale = \"ja\";\n\nexport const localeNames: Record<Locale, string> = {\n ja: \"日本語\",\n en: \"English\",\n vi: \"Tiếng Việt\",\n};\n\n// Helper to change language (client-side only)\nexport const changeLanguage = (locale: Locale) => {\n if (typeof window === \"undefined\") return;\n\n i18n.changeLanguage(locale);\n\n // Also set cookie for persistence\n document.cookie = `locale=${locale};path=/;max-age=31536000`;\n};\n\n// Get current locale (client-side only)\nexport const getCurrentLocale = (): Locale => {\n if (typeof window === \"undefined\") return defaultLocale;\n\n return (i18n.language as Locale) || defaultLocale;\n};\n","\"use client\";\n\n/**\n * Compatibility hook for next-intl style translations\n *\n * This provides the same API as next-intl's useTranslations()\n * but uses react-i18next under the hood.\n */\n\nimport { useCallback } from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\ntype TranslationValues = Record<string, string | number>;\n\n/**\n * Hook that mimics next-intl's useTranslations API\n *\n * @example\n * // Without namespace (uses default \"translation\" namespace)\n * const t = useTranslations();\n * t(\"common.save\") // \"Save\"\n *\n * // With namespace prefix\n * const t = useTranslations(\"auth\");\n * t(\"login\") // accesses \"auth.login\"\n */\nexport function useTranslations(namespace?: string) {\n const { t: i18nT } = useTranslation();\n\n const t = useCallback(\n (key: string, values?: TranslationValues): string => {\n // Build the full key with namespace if provided\n const fullKey = namespace ? `${namespace}.${key}` : key;\n\n // Convert values to i18next format\n return i18nT(fullKey, values as Record<string, unknown>) as string;\n },\n [i18nT, namespace]\n );\n\n return t;\n}\n","\"use client\";\n\nimport { useTranslation } from \"react-i18next\";\nimport { defaultLocale, type Locale } from \"./config\";\n\n/**\n * Hook to get the current locale\n * This provides the same API as next-intl's useLocale()\n */\nexport function useLocale(): Locale {\n const { i18n } = useTranslation();\n return (i18n.language as Locale) || defaultLocale;\n}\n","\"use client\";\n\nimport { Form, Input, Button, Space } from \"antd\";\nimport { useSsoTranslation } from \"../../i18n\";\nimport type { User, UpdateUserInput } from \"../../services/userService\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface UserFormProps {\n initialValues?: Partial<User>;\n onSubmit: (values: UpdateUserInput) => void;\n onCancel?: () => void;\n loading?: boolean;\n submitText?: string;\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\nexport function UserForm({\n initialValues,\n onSubmit,\n onCancel,\n loading = false,\n submitText,\n}: UserFormProps) {\n const { t } = useSsoTranslation();\n const [form] = Form.useForm<UpdateUserInput>();\n\n const handleFinish = (values: UpdateUserInput) => {\n onSubmit(values);\n };\n\n return (\n <Form\n form={form}\n layout=\"vertical\"\n initialValues={initialValues}\n onFinish={handleFinish}\n style={{ maxWidth: 600 }}\n >\n <Form.Item\n label={t(\"name\")}\n name=\"name\"\n rules={[\n { required: true, message: t(\"required\", { field: t(\"name\") }) },\n { max: 255, message: t(\"maxLength\", { field: t(\"name\"), max: 255 }) },\n ]}\n >\n <Input />\n </Form.Item>\n\n <Form.Item\n label={t(\"email\")}\n name=\"email\"\n rules={[\n { required: true, message: t(\"required\", { field: t(\"email\") }) },\n { type: \"email\", message: t(\"invalidEmail\") },\n ]}\n >\n <Input type=\"email\" />\n </Form.Item>\n\n <Form.Item>\n <Space>\n <Button type=\"primary\" htmlType=\"submit\" loading={loading}>\n {submitText || t(\"save\")}\n </Button>\n {onCancel && (\n <Button onClick={onCancel}>\n {t(\"cancel\")}\n </Button>\n )}\n </Space>\n </Form.Item>\n </Form>\n );\n}\n","/**\n * Branch header utilities for API clients\n *\n * These utilities help set branch context headers on axios instances.\n * Works with BranchGate's onSelectionChange callback.\n *\n * @example\n * ```typescript\n * import { createBranchHeaderSetter } from '@famgia/omnify-react-sso';\n * import api from './api'; // your axios instance\n *\n * // Create setter for your axios instance\n * const setBranchHeaders = createBranchHeaderSetter(api);\n *\n * // Use in BranchGate\n * <BranchGate onSelectionChange={setBranchHeaders}>\n * <App />\n * </BranchGate>\n * ```\n */\n\nimport type { BranchGateSelection } from '../types';\n\n/**\n * Headers set by branch selection\n */\nexport const BRANCH_HEADERS = {\n BRANCH_ID: 'X-Branch-Id',\n ORG_ID: 'X-Org-Id',\n BRANCH_NAME: 'X-Branch-Name',\n BRANCH_CODE: 'X-Branch-Code',\n} as const;\n\n/**\n * Minimal axios-like interface for header management\n */\ninterface AxiosLike {\n defaults: {\n headers: {\n common: Record<string, string | undefined>;\n };\n };\n}\n\n/**\n * Create a branch header setter function for an axios instance\n *\n * @param axiosInstance - Your axios instance\n * @returns A function to pass to BranchGate's onSelectionChange\n *\n * @example\n * ```typescript\n * const setBranchHeaders = createBranchHeaderSetter(api);\n *\n * <BranchGate onSelectionChange={setBranchHeaders}>\n * <App />\n * </BranchGate>\n * ```\n */\nexport function createBranchHeaderSetter(axiosInstance: AxiosLike) {\n return (selection: BranchGateSelection | null) => {\n if (selection) {\n axiosInstance.defaults.headers.common[BRANCH_HEADERS.BRANCH_ID] = selection.branchId;\n axiosInstance.defaults.headers.common[BRANCH_HEADERS.ORG_ID] = selection.orgId;\n if (selection.branchName) {\n axiosInstance.defaults.headers.common[BRANCH_HEADERS.BRANCH_NAME] = selection.branchName;\n }\n if (selection.branchCode) {\n axiosInstance.defaults.headers.common[BRANCH_HEADERS.BRANCH_CODE] = selection.branchCode;\n }\n } else {\n delete axiosInstance.defaults.headers.common[BRANCH_HEADERS.BRANCH_ID];\n delete axiosInstance.defaults.headers.common[BRANCH_HEADERS.ORG_ID];\n delete axiosInstance.defaults.headers.common[BRANCH_HEADERS.BRANCH_NAME];\n delete axiosInstance.defaults.headers.common[BRANCH_HEADERS.BRANCH_CODE];\n }\n };\n}\n\n/**\n * Set branch headers directly on an axios instance\n *\n * @example\n * ```typescript\n * import api from './api';\n * import { setBranchHeaders } from '@famgia/omnify-react-sso';\n *\n * // In BranchGate onSelectionChange\n * <BranchGate onSelectionChange={(s) => setBranchHeaders(api, s)}>\n * <App />\n * </BranchGate>\n * ```\n */\nexport function setBranchHeaders(\n axiosInstance: AxiosLike,\n selection: BranchGateSelection | null\n): void {\n createBranchHeaderSetter(axiosInstance)(selection);\n}\n","/**\n * Auth Service - SSO Authentication\n *\n * Handles SSO callback, logout, user info\n */\n\nimport { buildHeaders, csrf, request, type ServiceConfig } from \"./utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface SsoUser {\n id: number;\n console_user_id: number;\n email: string;\n name: string;\n}\n\nexport interface Organization {\n id: number;\n slug: string;\n name: string;\n role: string;\n}\n\nexport interface AuthCallbackInput {\n code: string;\n device_name?: string;\n}\n\nexport interface AuthCallbackResponse {\n user: SsoUser;\n organizations: Organization[];\n token?: string;\n}\n\nexport interface AuthUserResponse {\n user: SsoUser;\n organizations: Organization[];\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createAuthService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n /**\n * Exchange SSO authorization code for tokens\n * POST /api/sso/callback\n */\n callback: async (input: AuthCallbackInput): Promise<AuthCallbackResponse> => {\n await csrf(apiUrl);\n return request(apiUrl, \"/api/sso/callback\", {\n method: \"POST\",\n headers: buildHeaders(),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Logout current user and revoke tokens\n * POST /api/sso/logout\n */\n logout: async (): Promise<{ message: string }> => {\n return request(apiUrl, \"/api/sso/logout\", {\n method: \"POST\",\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get current authenticated user with organizations\n * GET /api/sso/user\n */\n getUser: async (): Promise<AuthUserResponse> => {\n return request(apiUrl, \"/api/sso/user\", {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get Console SSO global logout URL\n * GET /api/sso/global-logout-url\n */\n getGlobalLogoutUrl: async (redirectUri?: string): Promise<{ logout_url: string }> => {\n const params = redirectUri\n ? `?redirect_uri=${encodeURIComponent(redirectUri)}`\n : \"\";\n return request(apiUrl, `/api/sso/global-logout-url${params}`, {\n headers: buildHeaders(),\n });\n },\n };\n}\n\nexport type AuthService = ReturnType<typeof createAuthService>;\n","/**\n * Token Service - API Token Management\n *\n * For mobile apps using bearer tokens\n */\n\nimport { buildHeaders, request, type ServiceConfig } from \"./utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface ApiToken {\n id: number;\n name: string;\n last_used_at: string | null;\n created_at: string;\n is_current: boolean;\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createTokenService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n /**\n * List all API tokens for current user\n * GET /api/sso/tokens\n */\n list: async (): Promise<{ tokens: ApiToken[] }> => {\n return request(apiUrl, \"/api/sso/tokens\", {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Revoke a specific token\n * DELETE /api/sso/tokens/{tokenId}\n */\n revoke: async (tokenId: number): Promise<{ message: string }> => {\n return request(apiUrl, `/api/sso/tokens/${tokenId}`, {\n method: \"DELETE\",\n headers: buildHeaders(),\n });\n },\n\n /**\n * Revoke all tokens except current\n * POST /api/sso/tokens/revoke-others\n */\n revokeOthers: async (): Promise<{ message: string; revoked_count: number }> => {\n return request(apiUrl, \"/api/sso/tokens/revoke-others\", {\n method: \"POST\",\n headers: buildHeaders(),\n });\n },\n };\n}\n\nexport type TokenService = ReturnType<typeof createTokenService>;\n","/**\n * Role Service - Role Management\n *\n * CRUD operations for roles and role-permission assignments\n */\n\nimport { buildHeaders, request, type ServiceConfig } from \"./utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface Role {\n id: string;\n name: string;\n slug: string;\n description: string | null;\n level: number;\n console_org_id?: string | null;\n permissions_count?: number;\n organization?: {\n id: string;\n console_org_id: string;\n name: string;\n code: string;\n } | null;\n created_at: string;\n updated_at: string;\n}\n\nexport interface Permission {\n id: string;\n name: string;\n slug: string;\n group: string | null;\n description?: string | null;\n roles_count?: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface RoleWithPermissions extends Role {\n permissions: Permission[];\n}\n\nexport interface CreateRoleInput {\n slug: string;\n name: string;\n level: number;\n description?: string;\n scope?: 'global' | 'org';\n console_org_id?: string | null;\n}\n\nexport interface RoleListParams {\n 'filter[scope]'?: 'global' | 'org' | 'all';\n 'filter[org_id]'?: string;\n}\n\nexport interface UpdateRoleInput {\n name?: string;\n level?: number;\n description?: string | null;\n}\n\nexport interface SyncPermissionsInput {\n permissions: (number | string)[];\n}\n\nexport interface SyncPermissionsResponse {\n message: string;\n attached: number;\n detached: number;\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createRoleService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n // =========================================================================\n // Read-only endpoints (authenticated users)\n // =========================================================================\n\n /**\n * Get all roles\n * GET /api/sso/roles\n */\n list: async (): Promise<{ data: Role[] }> => {\n return request(apiUrl, \"/api/sso/roles\", {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get single role with permissions\n * GET /api/sso/roles/{id}\n */\n get: async (id: number | string): Promise<{ data: RoleWithPermissions }> => {\n return request(apiUrl, `/api/sso/roles/${id}`, {\n headers: buildHeaders(),\n });\n },\n\n // =========================================================================\n // Admin endpoints (requires admin role + org context)\n // =========================================================================\n\n /**\n * List all roles (admin)\n * GET /api/admin/sso/roles\n */\n adminList: async (orgSlug: string, params?: RoleListParams): Promise<{ data: Role[] }> => {\n const searchParams = new URLSearchParams();\n if (params?.['filter[scope]']) searchParams.set('filter[scope]', params['filter[scope]']);\n if (params?.['filter[org_id]']) searchParams.set('filter[org_id]', params['filter[org_id]']);\n\n const query = searchParams.toString();\n const path = query ? `/api/admin/sso/roles?${query}` : '/api/admin/sso/roles';\n\n return request(apiUrl, path, {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Get single role (admin)\n * GET /api/admin/sso/roles/{id}\n */\n adminGet: async (\n id: number | string,\n orgSlug: string\n ): Promise<{ data: RoleWithPermissions }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}`, {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Create role (admin only)\n * POST /api/admin/sso/roles\n */\n create: async (\n input: CreateRoleInput,\n orgSlug: string\n ): Promise<{ data: Role; message: string }> => {\n return request(apiUrl, \"/api/admin/sso/roles\", {\n method: \"POST\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Update role (admin only)\n * PUT /api/admin/sso/roles/{id}\n */\n update: async (\n id: number | string,\n input: UpdateRoleInput,\n orgSlug: string\n ): Promise<{ data: Role; message: string }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}`, {\n method: \"PUT\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Delete role (admin only)\n * DELETE /api/admin/sso/roles/{id}\n */\n delete: async (id: number | string, orgSlug: string): Promise<void> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}`, {\n method: \"DELETE\",\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Get role's permissions (admin)\n * GET /api/admin/sso/roles/{id}/permissions\n */\n getPermissions: async (\n id: number | string,\n orgSlug: string\n ): Promise<{\n role: Pick<Role, \"id\" | \"slug\" | \"name\">;\n permissions: Permission[];\n }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}/permissions`, {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Sync role's permissions (admin)\n * PUT /api/admin/sso/roles/{id}/permissions\n */\n syncPermissions: async (\n id: number | string,\n input: SyncPermissionsInput,\n orgSlug: string\n ): Promise<SyncPermissionsResponse> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}/permissions`, {\n method: \"PUT\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n });\n },\n };\n}\n\nexport type RoleService = ReturnType<typeof createRoleService>;\n","/**\n * Permission Service - Permission Management\n *\n * CRUD operations for permissions and permission matrix\n */\n\nimport type { Role, Permission } from \"./roleService\";\nimport { buildHeaders, request, type ServiceConfig } from \"./utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface PermissionMatrix {\n roles: Pick<Role, \"id\" | \"slug\" | \"name\">[];\n permissions: Record<string, Pick<Permission, \"id\" | \"slug\" | \"name\">[]>;\n matrix: Record<string, string[]>; // role_slug: permission_slugs[]\n}\n\nexport interface CreatePermissionInput {\n slug: string;\n name: string;\n group?: string;\n description?: string;\n}\n\nexport interface UpdatePermissionInput {\n name?: string;\n group?: string | null;\n description?: string | null;\n}\n\nexport interface PermissionListParams {\n group?: string;\n search?: string;\n grouped?: boolean;\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createPermissionService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n // =========================================================================\n // Read-only endpoints (authenticated users)\n // =========================================================================\n\n /**\n * Get all permissions\n * GET /api/sso/permissions\n */\n list: async (params?: PermissionListParams): Promise<{ data: Permission[]; groups: string[] }> => {\n const queryString = params\n ? `?${new URLSearchParams(\n Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => [k, String(v)])\n )}`\n : \"\";\n return request(apiUrl, `/api/sso/permissions${queryString}`, {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get permission matrix (roles x permissions)\n * GET /api/sso/permission-matrix\n */\n getMatrix: async (): Promise<PermissionMatrix> => {\n return request(apiUrl, \"/api/sso/permission-matrix\", {\n headers: buildHeaders(),\n });\n },\n\n // =========================================================================\n // Admin endpoints (requires admin role + org context)\n // =========================================================================\n\n /**\n * List all permissions (admin)\n * GET /api/admin/sso/permissions\n */\n adminList: async (\n orgSlug: string,\n params?: PermissionListParams\n ): Promise<{ data: Permission[]; groups: string[] }> => {\n const queryString = params\n ? `?${new URLSearchParams(\n Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => [k, String(v)])\n )}`\n : \"\";\n return request(apiUrl, `/api/admin/sso/permissions${queryString}`, {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Get single permission (admin)\n * GET /api/admin/sso/permissions/{id}\n */\n adminGet: async (\n id: number | string,\n orgSlug: string\n ): Promise<{ data: Permission }> => {\n return request(apiUrl, `/api/admin/sso/permissions/${id}`, {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Create permission (admin only)\n * POST /api/admin/sso/permissions\n */\n create: async (\n input: CreatePermissionInput,\n orgSlug: string\n ): Promise<{ data: Permission; message: string }> => {\n return request(apiUrl, \"/api/admin/sso/permissions\", {\n method: \"POST\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Update permission (admin only)\n * PUT /api/admin/sso/permissions/{id}\n */\n update: async (\n id: number | string,\n input: UpdatePermissionInput,\n orgSlug: string\n ): Promise<{ data: Permission; message: string }> => {\n return request(apiUrl, `/api/admin/sso/permissions/${id}`, {\n method: \"PUT\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Delete permission (admin only)\n * DELETE /api/admin/sso/permissions/{id}\n */\n delete: async (id: number | string, orgSlug: string): Promise<void> => {\n return request(apiUrl, `/api/admin/sso/permissions/${id}`, {\n method: \"DELETE\",\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Get permission matrix (admin)\n * GET /api/admin/sso/permission-matrix\n */\n adminGetMatrix: async (orgSlug: string): Promise<PermissionMatrix> => {\n return request(apiUrl, \"/api/admin/sso/permission-matrix\", {\n headers: buildHeaders(orgSlug),\n });\n },\n };\n}\n\nexport type PermissionService = ReturnType<typeof createPermissionService>;\n\n// Re-export Permission type for convenience\nexport type { Permission } from \"./roleService\";\n","/**\n * Team Service - Team Permission Management\n *\n * Manage team permissions and orphaned team cleanup\n */\n\nimport type { Permission } from \"./roleService\";\nimport { buildHeaders, request, type ServiceConfig } from \"./utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface TeamWithPermissions {\n console_team_id: number;\n name: string;\n path: string | null;\n permissions: Pick<Permission, \"id\" | \"slug\">[];\n}\n\nexport interface TeamPermissionDetail {\n console_team_id: number;\n permissions: Pick<Permission, \"id\" | \"slug\" | \"name\">[];\n}\n\nexport interface OrphanedTeam {\n console_team_id: number;\n permissions_count: number;\n permissions: string[];\n deleted_at: string | null;\n}\n\nexport interface SyncTeamPermissionsInput {\n permissions: (number | string)[];\n}\n\nexport interface CleanupOrphanedInput {\n console_team_id?: number;\n older_than_days?: number;\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createTeamService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n /**\n * Get all teams with their permissions (admin only)\n * GET /api/admin/sso/teams/permissions\n */\n list: async (orgSlug: string): Promise<{ teams: TeamWithPermissions[] }> => {\n return request(apiUrl, \"/api/admin/sso/teams/permissions\", {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Get specific team permissions (admin only)\n * GET /api/admin/sso/teams/{teamId}/permissions\n */\n getPermissions: async (\n teamId: number,\n orgSlug: string\n ): Promise<TeamPermissionDetail> => {\n return request(apiUrl, `/api/admin/sso/teams/${teamId}/permissions`, {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Sync team permissions (admin only)\n * PUT /api/admin/sso/teams/{teamId}/permissions\n */\n syncPermissions: async (\n teamId: number,\n input: SyncTeamPermissionsInput,\n orgSlug: string\n ): Promise<{\n message: string;\n console_team_id: number;\n attached: number;\n detached: number;\n }> => {\n return request(apiUrl, `/api/admin/sso/teams/${teamId}/permissions`, {\n method: \"PUT\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Remove all permissions for a team (admin only)\n * DELETE /api/admin/sso/teams/{teamId}/permissions\n */\n removePermissions: async (teamId: number, orgSlug: string): Promise<void> => {\n return request(apiUrl, `/api/admin/sso/teams/${teamId}/permissions`, {\n method: \"DELETE\",\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * List orphaned team permissions (admin only)\n * GET /api/admin/sso/teams/orphaned\n */\n listOrphaned: async (\n orgSlug: string\n ): Promise<{\n orphaned_teams: OrphanedTeam[];\n total_orphaned_permissions: number;\n }> => {\n return request(apiUrl, \"/api/admin/sso/teams/orphaned\", {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Restore orphaned team permissions (admin only)\n * POST /api/admin/sso/teams/orphaned/{teamId}/restore\n */\n restoreOrphaned: async (\n teamId: number,\n orgSlug: string\n ): Promise<{\n message: string;\n console_team_id: number;\n restored_count: number;\n }> => {\n return request(apiUrl, `/api/admin/sso/teams/orphaned/${teamId}/restore`, {\n method: \"POST\",\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Cleanup orphaned team permissions (admin only)\n * DELETE /api/admin/sso/teams/orphaned\n */\n cleanupOrphaned: async (\n orgSlug: string,\n input?: CleanupOrphanedInput\n ): Promise<{ message: string; deleted_count: number }> => {\n return request(apiUrl, \"/api/admin/sso/teams/orphaned\", {\n method: \"DELETE\",\n headers: buildHeaders(orgSlug),\n body: input ? JSON.stringify(input) : undefined,\n });\n },\n };\n}\n\nexport type TeamService = ReturnType<typeof createTeamService>;\n","/**\n * User Role Service - Scoped Role Assignments\n *\n * Implements Branch-Level Permissions management:\n * - Global: org_id=null, branch_id=null → Role applies everywhere\n * - Org-wide: org_id=X, branch_id=null → Role applies to all branches in org\n * - Branch: org_id=X, branch_id=Y → Role applies only to specific branch\n */\n\nimport { buildHeaders, request, type ServiceConfig } from \"./utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type RoleScope = \"global\" | \"org-wide\" | \"branch\";\n\nexport interface RoleAssignment {\n id: string | null;\n role: {\n id: string;\n name: string;\n slug: string;\n level: number;\n };\n console_org_id: string | null;\n console_branch_id: string | null;\n scope: RoleScope;\n created_at: string | null;\n}\n\nexport interface UserRoleListResponse {\n data: RoleAssignment[];\n}\n\nexport interface AssignRoleInput {\n role_id: string;\n console_org_id?: string | null;\n console_branch_id?: string | null;\n}\n\nexport interface AssignRoleResponse {\n message: string;\n data: {\n role: {\n id: string;\n name: string;\n slug: string;\n level: number;\n };\n console_org_id: string | null;\n console_branch_id: string | null;\n scope: RoleScope;\n };\n}\n\nexport interface SyncRolesInput {\n roles: string[]; // Role IDs or slugs\n console_org_id?: string | null;\n console_branch_id?: string | null;\n}\n\nexport interface SyncRolesResponse {\n message: string;\n attached: string[];\n detached: string[];\n scope: RoleScope;\n}\n\nexport interface RemoveRoleResponse {\n message: string;\n removed: number;\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createUserRoleService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n /**\n * List user's role assignments with scope information\n * GET /api/admin/sso/users/{userId}/roles\n */\n list: async (userId: string, orgSlug?: string): Promise<RoleAssignment[]> => {\n const response = await request<UserRoleListResponse>(\n apiUrl,\n `/api/admin/sso/users/${userId}/roles`,\n { headers: buildHeaders(orgSlug) }\n );\n return response.data;\n },\n\n /**\n * List user's role assignments filtered by branch context\n * Returns roles applicable to the given org/branch\n */\n listByBranch: async (\n userId: string,\n orgId: string,\n branchId: string | null,\n orgSlug?: string\n ): Promise<RoleAssignment[]> => {\n const all = await request<UserRoleListResponse>(\n apiUrl,\n `/api/admin/sso/users/${userId}/roles`,\n { headers: buildHeaders(orgSlug) }\n );\n\n // Filter assignments that apply to this branch:\n // 1. Global assignments (org=null)\n // 2. Org-wide assignments (org=X, branch=null)\n // 3. Branch-specific assignments (org=X, branch=Y)\n return all.data.filter((a) => {\n // Global applies everywhere\n if (a.console_org_id === null) return true;\n\n // Must be same org\n if (a.console_org_id !== orgId) return false;\n\n // Org-wide applies to all branches\n if (a.console_branch_id === null) return true;\n\n // Branch-specific must match\n return a.console_branch_id === branchId;\n });\n },\n\n /**\n * Assign a role to user with scope\n * POST /api/admin/sso/users/{userId}/roles\n */\n assign: async (\n userId: string,\n input: AssignRoleInput,\n orgSlug?: string\n ): Promise<AssignRoleResponse> => {\n return request<AssignRoleResponse>(\n apiUrl,\n `/api/admin/sso/users/${userId}/roles`,\n {\n method: \"POST\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n }\n );\n },\n\n /**\n * Remove a role assignment from user\n * DELETE /api/admin/sso/users/{userId}/roles/{roleId}\n */\n remove: async (\n userId: string,\n roleId: string,\n orgId?: string | null,\n branchId?: string | null,\n orgSlug?: string\n ): Promise<RemoveRoleResponse> => {\n return request<RemoveRoleResponse>(\n apiUrl,\n `/api/admin/sso/users/${userId}/roles/${roleId}`,\n {\n method: \"DELETE\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify({\n console_org_id: orgId ?? null,\n console_branch_id: branchId ?? null,\n }),\n }\n );\n },\n\n /**\n * Sync roles for user in a specific scope\n * PUT /api/admin/sso/users/{userId}/roles/sync\n */\n sync: async (\n userId: string,\n input: SyncRolesInput,\n orgSlug?: string\n ): Promise<SyncRolesResponse> => {\n return request<SyncRolesResponse>(\n apiUrl,\n `/api/admin/sso/users/${userId}/roles/sync`,\n {\n method: \"PUT\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n }\n );\n },\n };\n}\n\n// Export type for the service\nexport type UserRoleService = ReturnType<typeof createUserRoleService>;\n\n// =============================================================================\n// Helper functions for permission resolution\n// =============================================================================\n\n/**\n * Get scope label for display\n */\nexport const getScopeLabel = (\n scope: RoleScope,\n locale: \"en\" | \"ja\" | \"vi\" = \"en\"\n): string => {\n const labels: Record<RoleScope, Record<string, string>> = {\n global: { en: \"Global\", ja: \"グローバル\", vi: \"Toàn hệ thống\" },\n \"org-wide\": { en: \"Organization\", ja: \"組織全体\", vi: \"Toàn tổ chức\" },\n branch: { en: \"Branch\", ja: \"支店限定\", vi: \"Chi nhánh\" },\n };\n return labels[scope][locale] || labels[scope][\"en\"];\n};\n\n/**\n * Get effective permissions for a user at a specific branch\n * based on their role assignments\n */\nexport const getEffectivePermissions = <\n TRole extends { id: string; permissions?: Array<string | { slug: string }> }\n>(\n roleAssignments: RoleAssignment[],\n allRoles: TRole[],\n orgId: string,\n branchId: string | null\n): string[] => {\n const permissions = new Set<string>();\n\n // Filter applicable assignments\n const applicableAssignments = roleAssignments.filter((a) => {\n if (a.console_org_id === null) return true;\n if (a.console_org_id !== orgId) return false;\n if (a.console_branch_id === null) return true;\n return a.console_branch_id === branchId;\n });\n\n // Collect permissions from all applicable roles\n for (const assignment of applicableAssignments) {\n const role = allRoles.find((r) => r.id === assignment.role.id);\n if (role?.permissions) {\n for (const perm of role.permissions) {\n if (typeof perm === \"string\") {\n permissions.add(perm);\n } else if (perm.slug) {\n permissions.add(perm.slug);\n }\n }\n }\n }\n\n return Array.from(permissions);\n};\n","/**\n * User Service - Admin User CRUD operations\n *\n * Provides user management functionality for admin users.\n * Uses the /api/admin/sso/users endpoints.\n */\n\nimport { buildHeaders, request, type ServiceConfig } from \"./utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface User {\n id: string;\n name: string;\n email: string;\n console_user_id?: string;\n created_at?: string;\n updated_at?: string;\n}\n\nexport interface UserListParams {\n page?: number;\n per_page?: number;\n \"filter[search]\"?: string;\n \"filter[org_id]\"?: string;\n sort?: string;\n}\n\nexport interface UserListResponse {\n data: User[];\n links?: {\n first?: string;\n last?: string;\n prev?: string | null;\n next?: string | null;\n };\n meta: {\n current_page: number;\n from: number | null;\n last_page: number;\n per_page: number;\n to: number | null;\n total: number;\n };\n}\n\nexport interface UserResponse {\n data: User;\n}\n\nexport interface UpdateUserInput {\n name?: string;\n email?: string;\n}\n\nexport interface RoleAssignmentWithPermissions {\n role: {\n id: string;\n name: string;\n slug: string;\n level: number;\n };\n scope: \"global\" | \"org-wide\" | \"branch\";\n console_org_id: string | null;\n console_branch_id: string | null;\n org_name?: string | null;\n branch_name?: string | null;\n permissions: string[];\n}\n\nexport interface TeamMembershipWithPermissions {\n team: {\n id: string | number;\n name: string;\n path: string | null;\n };\n is_leader: boolean;\n permissions: string[];\n}\n\nexport interface UserPermissionsBreakdown {\n user: {\n id: string;\n name: string;\n email: string;\n console_org_id?: string | null;\n organization?: {\n id: string;\n console_org_id: string;\n name: string;\n code: string;\n } | null;\n };\n context: {\n org_id: string | null;\n branch_id: string | null;\n };\n role_assignments: RoleAssignmentWithPermissions[];\n team_memberships: TeamMembershipWithPermissions[];\n aggregated_permissions: string[];\n}\n\n// =============================================================================\n// Service\n// =============================================================================\n\nexport interface UserService {\n list(params?: UserListParams, orgSlug?: string): Promise<UserListResponse>;\n get(id: string, orgSlug?: string): Promise<User>;\n update(id: string, input: UpdateUserInput, orgSlug?: string): Promise<User>;\n delete(id: string, orgSlug?: string): Promise<void>;\n search(email: string, orgSlug?: string): Promise<User[]>;\n getPermissions(\n userId: string,\n orgId?: string,\n branchId?: string,\n orgSlug?: string\n ): Promise<UserPermissionsBreakdown>;\n}\n\nexport function createUserService(config: ServiceConfig): UserService {\n const { apiUrl } = config;\n const basePath = \"/api/admin/sso/users\";\n\n return {\n /**\n * List users with pagination and filtering\n */\n async list(params?: UserListParams, orgSlug?: string): Promise<UserListResponse> {\n const searchParams = new URLSearchParams();\n\n if (params?.page) searchParams.set(\"page\", String(params.page));\n if (params?.per_page) searchParams.set(\"per_page\", String(params.per_page));\n if (params?.[\"filter[search]\"]) searchParams.set(\"filter[search]\", params[\"filter[search]\"]);\n if (params?.[\"filter[org_id]\"]) searchParams.set(\"filter[org_id]\", params[\"filter[org_id]\"]);\n if (params?.sort) searchParams.set(\"sort\", params.sort);\n\n const query = searchParams.toString();\n const path = query ? `${basePath}?${query}` : basePath;\n\n return request<UserListResponse>(apiUrl, path, {\n method: \"GET\",\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Get user by ID\n */\n async get(id: string, orgSlug?: string): Promise<User> {\n const response = await request<UserResponse>(apiUrl, `${basePath}/${id}`, {\n method: \"GET\",\n headers: buildHeaders(orgSlug),\n });\n return response.data;\n },\n\n /**\n * Update a user\n */\n async update(id: string, input: UpdateUserInput, orgSlug?: string): Promise<User> {\n const response = await request<UserResponse>(apiUrl, `${basePath}/${id}`, {\n method: \"PUT\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n });\n return response.data;\n },\n\n /**\n * Delete a user\n */\n async delete(id: string, orgSlug?: string): Promise<void> {\n await request<void>(apiUrl, `${basePath}/${id}`, {\n method: \"DELETE\",\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Search users by email (autocomplete)\n */\n async search(email: string, orgSlug?: string): Promise<User[]> {\n if (email.length < 2) return [];\n\n const response = await request<{ data: User[] }>(\n apiUrl,\n `${basePath}/search?email=${encodeURIComponent(email)}`,\n {\n method: \"GET\",\n headers: buildHeaders(orgSlug),\n }\n );\n return response.data;\n },\n\n /**\n * Get user permissions breakdown\n * Shows roles, teams, and aggregated permissions for a user in context\n */\n async getPermissions(\n userId: string,\n orgId?: string,\n branchId?: string,\n orgSlug?: string\n ): Promise<UserPermissionsBreakdown> {\n // Build query params for context\n const params = new URLSearchParams();\n if (orgId) params.set(\"org_id\", orgId);\n if (branchId) params.set(\"branch_id\", branchId);\n\n const query = params.toString();\n const path = query\n ? `${basePath}/${userId}/permissions?${query}`\n : `${basePath}/${userId}/permissions`;\n\n return request<UserPermissionsBreakdown>(apiUrl, path, {\n method: \"GET\",\n headers: buildHeaders(orgSlug),\n });\n },\n };\n}\n","/**\n * SSO Service - API client for SSO endpoints\n *\n * Provides methods for SSO authentication, tokens, roles, permissions, teams\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface SsoUser {\n id: number;\n console_user_id: number;\n email: string;\n name: string;\n}\n\nexport interface Organization {\n id: number;\n slug: string;\n name: string;\n role: string;\n}\n\nexport interface Role {\n id: string;\n name: string;\n slug: string;\n description: string | null;\n level: number;\n console_org_id?: string | null;\n permissions_count?: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface Permission {\n id: string;\n name: string;\n slug: string;\n group: string | null;\n description?: string | null;\n roles_count?: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface RoleWithPermissions extends Role {\n permissions: Permission[];\n}\n\nexport interface PermissionMatrix {\n roles: Pick<Role, \"id\" | \"slug\" | \"name\">[];\n permissions: Record<string, Pick<Permission, \"id\" | \"slug\" | \"name\">[]>;\n matrix: Record<string, string[]>; // role_slug: permission_slugs[]\n}\n\nexport interface ApiToken {\n id: number;\n name: string;\n last_used_at: string | null;\n created_at: string;\n is_current: boolean;\n}\n\nexport interface TeamWithPermissions {\n console_team_id: number;\n name: string;\n path: string | null;\n permissions: Pick<Permission, \"id\" | \"slug\">[];\n}\n\nexport interface TeamPermissionDetail {\n console_team_id: number;\n permissions: Pick<Permission, \"id\" | \"slug\" | \"name\">[];\n}\n\nexport interface OrphanedTeam {\n console_team_id: number;\n permissions_count: number;\n permissions: string[];\n deleted_at: string | null;\n}\n\n// Input types\nexport interface SsoCallbackInput {\n code: string;\n device_name?: string;\n}\n\nexport interface CreateRoleInput {\n slug: string;\n name: string;\n level: number;\n description?: string;\n}\n\nexport interface UpdateRoleInput {\n name?: string;\n level?: number;\n description?: string | null;\n}\n\nexport interface CreatePermissionInput {\n slug: string;\n name: string;\n group?: string;\n description?: string;\n}\n\nexport interface UpdatePermissionInput {\n name?: string;\n group?: string | null;\n description?: string | null;\n}\n\nexport interface SyncPermissionsInput {\n permissions: (number | string)[];\n}\n\nexport interface CleanupOrphanedInput {\n console_team_id?: number;\n older_than_days?: number;\n}\n\n// =============================================================================\n// Helper functions\n// =============================================================================\n\n/**\n * Get XSRF token from cookie (for Sanctum CSRF protection)\n */\nfunction getXsrfToken(): string | undefined {\n if (typeof document === \"undefined\") return undefined;\n return document.cookie\n .split(\"; \")\n .find((row) => row.startsWith(\"XSRF-TOKEN=\"))\n ?.split(\"=\")[1];\n}\n\n/**\n * Build headers with XSRF token and optional org slug\n */\nfunction buildHeaders(orgSlug?: string): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n };\n\n const xsrfToken = getXsrfToken();\n if (xsrfToken) {\n headers[\"X-XSRF-TOKEN\"] = decodeURIComponent(xsrfToken);\n }\n\n if (orgSlug) {\n // Backend middleware expects X-Org-Id (contains org slug for identification)\n headers[\"X-Org-Id\"] = orgSlug;\n }\n\n return headers;\n}\n\n/**\n * Fetch CSRF cookie from backend\n */\nasync function csrf(apiUrl: string): Promise<void> {\n await fetch(`${apiUrl}/sanctum/csrf-cookie`, {\n credentials: \"include\",\n });\n}\n\n/**\n * Make API request with proper error handling\n */\nasync function request<T>(\n apiUrl: string,\n path: string,\n options: RequestInit = {}\n): Promise<T> {\n const response = await fetch(`${apiUrl}${path}`, {\n ...options,\n credentials: \"include\",\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new Error(error.message || `HTTP ${response.status}`);\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json();\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport interface SsoServiceConfig {\n apiUrl: string;\n}\n\nexport function createSsoService(config: SsoServiceConfig) {\n const { apiUrl } = config;\n\n return {\n // =========================================================================\n // SSO Auth\n // =========================================================================\n\n /**\n * Exchange SSO authorization code for tokens\n * POST /api/sso/callback\n */\n callback: async (\n input: SsoCallbackInput\n ): Promise<{\n user: SsoUser;\n organizations: Organization[];\n token?: string;\n }> => {\n await csrf(apiUrl);\n return request(apiUrl, \"/api/sso/callback\", {\n method: \"POST\",\n headers: buildHeaders(),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Logout current user and revoke tokens\n * POST /api/sso/logout\n */\n logout: async (): Promise<{ message: string }> => {\n return request(apiUrl, \"/api/sso/logout\", {\n method: \"POST\",\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get current authenticated user with organizations\n * GET /api/sso/user\n */\n getUser: async (): Promise<{\n user: SsoUser;\n organizations: Organization[];\n }> => {\n return request(apiUrl, \"/api/sso/user\", {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get Console SSO global logout URL\n * GET /api/sso/global-logout-url\n */\n getGlobalLogoutUrl: async (\n redirectUri?: string\n ): Promise<{ logout_url: string }> => {\n const params = redirectUri\n ? `?redirect_uri=${encodeURIComponent(redirectUri)}`\n : \"\";\n return request(apiUrl, `/api/sso/global-logout-url${params}`, {\n headers: buildHeaders(),\n });\n },\n\n // =========================================================================\n // SSO Tokens (for mobile apps)\n // =========================================================================\n\n /**\n * List all API tokens for current user\n * GET /api/sso/tokens\n */\n getTokens: async (): Promise<{ tokens: ApiToken[] }> => {\n return request(apiUrl, \"/api/sso/tokens\", {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Revoke a specific token\n * DELETE /api/sso/tokens/{tokenId}\n */\n revokeToken: async (tokenId: number): Promise<{ message: string }> => {\n return request(apiUrl, `/api/sso/tokens/${tokenId}`, {\n method: \"DELETE\",\n headers: buildHeaders(),\n });\n },\n\n /**\n * Revoke all tokens except current\n * POST /api/sso/tokens/revoke-others\n */\n revokeOtherTokens: async (): Promise<{\n message: string;\n revoked_count: number;\n }> => {\n return request(apiUrl, \"/api/sso/tokens/revoke-others\", {\n method: \"POST\",\n headers: buildHeaders(),\n });\n },\n\n // =========================================================================\n // Roles (Read-only for authenticated users)\n // =========================================================================\n\n /**\n * Get all roles\n * GET /api/sso/roles\n */\n getRoles: async (): Promise<{ data: Role[] }> => {\n return request(apiUrl, \"/api/sso/roles\", {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get single role with permissions\n * GET /api/sso/roles/{id}\n */\n getRole: async (id: number): Promise<{ data: RoleWithPermissions }> => {\n return request(apiUrl, `/api/sso/roles/${id}`, {\n headers: buildHeaders(),\n });\n },\n\n // =========================================================================\n // Permissions (Read-only for authenticated users)\n // =========================================================================\n\n /**\n * Get all permissions\n * GET /api/sso/permissions\n */\n getPermissions: async (params?: {\n group?: string;\n search?: string;\n grouped?: boolean;\n }): Promise<{ data: Permission[]; groups: string[] }> => {\n const queryString = params\n ? `?${new URLSearchParams(\n Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => [k, String(v)])\n )}`\n : \"\";\n return request(apiUrl, `/api/sso/permissions${queryString}`, {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get permission matrix (roles x permissions)\n * GET /api/sso/permission-matrix\n */\n getPermissionMatrix: async (): Promise<PermissionMatrix> => {\n return request(apiUrl, \"/api/sso/permission-matrix\", {\n headers: buildHeaders(),\n });\n },\n\n // =========================================================================\n // Admin - Roles (requires admin role + org context)\n // =========================================================================\n\n /**\n * List all roles (admin)\n * GET /api/admin/sso/roles\n */\n adminGetRoles: async (orgSlug: string): Promise<{ data: Role[] }> => {\n return request(apiUrl, \"/api/admin/sso/roles\", {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Get single role (admin)\n * GET /api/admin/sso/roles/{id}\n */\n adminGetRole: async (\n id: number,\n orgSlug: string\n ): Promise<{ data: RoleWithPermissions }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}`, {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Create role (admin only)\n * POST /api/admin/sso/roles\n */\n createRole: async (\n input: CreateRoleInput,\n orgSlug: string\n ): Promise<{ data: Role; message: string }> => {\n return request(apiUrl, \"/api/admin/sso/roles\", {\n method: \"POST\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Update role (admin only)\n * PUT /api/admin/sso/roles/{id}\n */\n updateRole: async (\n id: number,\n input: UpdateRoleInput,\n orgSlug: string\n ): Promise<{ data: Role; message: string }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}`, {\n method: \"PUT\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Delete role (admin only)\n * DELETE /api/admin/sso/roles/{id}\n */\n deleteRole: async (id: number, orgSlug: string): Promise<void> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}`, {\n method: \"DELETE\",\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Get role's permissions (admin)\n * GET /api/admin/sso/roles/{id}/permissions\n */\n getRolePermissions: async (\n id: number,\n orgSlug: string\n ): Promise<{\n role: Pick<Role, \"id\" | \"slug\" | \"name\">;\n permissions: Permission[];\n }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}/permissions`, {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Sync role's permissions (admin)\n * PUT /api/admin/sso/roles/{id}/permissions\n */\n syncRolePermissions: async (\n id: number,\n input: SyncPermissionsInput,\n orgSlug: string\n ): Promise<{ message: string; attached: number; detached: number }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}/permissions`, {\n method: \"PUT\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n });\n },\n\n // =========================================================================\n // Admin - Permissions (requires admin role + org context)\n // =========================================================================\n\n /**\n * List all permissions (admin)\n * GET /api/admin/sso/permissions\n */\n adminGetPermissions: async (\n orgSlug: string,\n params?: { group?: string; search?: string; grouped?: boolean }\n ): Promise<{ data: Permission[]; groups: string[] }> => {\n const queryString = params\n ? `?${new URLSearchParams(\n Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => [k, String(v)])\n )}`\n : \"\";\n return request(apiUrl, `/api/admin/sso/permissions${queryString}`, {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Get single permission (admin)\n * GET /api/admin/sso/permissions/{id}\n */\n adminGetPermission: async (\n id: number,\n orgSlug: string\n ): Promise<{ data: Permission }> => {\n return request(apiUrl, `/api/admin/sso/permissions/${id}`, {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Create permission (admin only)\n * POST /api/admin/sso/permissions\n */\n createPermission: async (\n input: CreatePermissionInput,\n orgSlug: string\n ): Promise<{ data: Permission; message: string }> => {\n return request(apiUrl, \"/api/admin/sso/permissions\", {\n method: \"POST\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Update permission (admin only)\n * PUT /api/admin/sso/permissions/{id}\n */\n updatePermission: async (\n id: number,\n input: UpdatePermissionInput,\n orgSlug: string\n ): Promise<{ data: Permission; message: string }> => {\n return request(apiUrl, `/api/admin/sso/permissions/${id}`, {\n method: \"PUT\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Delete permission (admin only)\n * DELETE /api/admin/sso/permissions/{id}\n */\n deletePermission: async (id: number, orgSlug: string): Promise<void> => {\n return request(apiUrl, `/api/admin/sso/permissions/${id}`, {\n method: \"DELETE\",\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Get permission matrix (admin)\n * GET /api/admin/sso/permission-matrix\n */\n adminGetPermissionMatrix: async (\n orgSlug: string\n ): Promise<PermissionMatrix> => {\n return request(apiUrl, \"/api/admin/sso/permission-matrix\", {\n headers: buildHeaders(orgSlug),\n });\n },\n\n // =========================================================================\n // Admin - Team Permissions (requires admin role + org context)\n // =========================================================================\n\n /**\n * Get all teams with their permissions (admin only)\n * GET /api/admin/sso/teams/permissions\n */\n getTeamPermissions: async (\n orgSlug: string\n ): Promise<{ teams: TeamWithPermissions[] }> => {\n return request(apiUrl, \"/api/admin/sso/teams/permissions\", {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Get specific team permissions (admin only)\n * GET /api/admin/sso/teams/{teamId}/permissions\n */\n getTeamPermission: async (\n teamId: number,\n orgSlug: string\n ): Promise<TeamPermissionDetail> => {\n return request(apiUrl, `/api/admin/sso/teams/${teamId}/permissions`, {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Sync team permissions (admin only)\n * PUT /api/admin/sso/teams/{teamId}/permissions\n */\n syncTeamPermissions: async (\n teamId: number,\n input: SyncPermissionsInput,\n orgSlug: string\n ): Promise<{\n message: string;\n console_team_id: number;\n attached: number;\n detached: number;\n }> => {\n return request(apiUrl, `/api/admin/sso/teams/${teamId}/permissions`, {\n method: \"PUT\",\n headers: buildHeaders(orgSlug),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Remove all permissions for a team (admin only)\n * DELETE /api/admin/sso/teams/{teamId}/permissions\n */\n removeTeamPermissions: async (\n teamId: number,\n orgSlug: string\n ): Promise<void> => {\n return request(apiUrl, `/api/admin/sso/teams/${teamId}/permissions`, {\n method: \"DELETE\",\n headers: buildHeaders(orgSlug),\n });\n },\n\n // =========================================================================\n // Admin - Orphaned Team Permissions (requires admin role + org context)\n // =========================================================================\n\n /**\n * List orphaned team permissions (admin only)\n * GET /api/admin/sso/teams/orphaned\n */\n getOrphanedTeamPermissions: async (\n orgSlug: string\n ): Promise<{\n orphaned_teams: OrphanedTeam[];\n total_orphaned_permissions: number;\n }> => {\n return request(apiUrl, \"/api/admin/sso/teams/orphaned\", {\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Restore orphaned team permissions (admin only)\n * POST /api/admin/sso/teams/orphaned/{teamId}/restore\n */\n restoreOrphanedTeamPermissions: async (\n teamId: number,\n orgSlug: string\n ): Promise<{\n message: string;\n console_team_id: number;\n restored_count: number;\n }> => {\n return request(apiUrl, `/api/admin/sso/teams/orphaned/${teamId}/restore`, {\n method: \"POST\",\n headers: buildHeaders(orgSlug),\n });\n },\n\n /**\n * Cleanup orphaned team permissions (admin only)\n * DELETE /api/admin/sso/teams/orphaned\n */\n cleanupOrphanedTeamPermissions: async (\n orgSlug: string,\n input?: CleanupOrphanedInput\n ): Promise<{ message: string; deleted_count: number }> => {\n return request(apiUrl, \"/api/admin/sso/teams/orphaned\", {\n method: \"DELETE\",\n headers: buildHeaders(orgSlug),\n body: input ? JSON.stringify(input) : undefined,\n });\n },\n };\n}\n\n// Export types\nexport type SsoService = ReturnType<typeof createSsoService>;\n"],"mappings":"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","names":["defaultLocale","import_zod","import_zod","import_zod","import_zod","import_zod","import_zod","import_zod","import_react","import_react","import_react","getXsrfToken","import_jsx_runtime","import_react","import_react","import_react","import_react","import_jsx_runtime","transformUser","transformOrganizations","error","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","DefaultLoading","import_icons","import_react_query","import_antd","import_react","import_jsx_runtime","Text","import_icons","import_react_query","import_antd","import_react","import_jsx_runtime","Text","Title","DEFAULT_STORAGE_KEY","React","import_icons","import_antd","import_react","import_i18next","import_react","import_react_i18next","defaultLocale","i18n","import_jsx_runtime","fallbackLocale","i18n","LanguageDetector","defaultLocale","import_react","import_react_i18next","import_react_i18next","i18n","defaultLocale","import_jsx_runtime","import_antd","import_jsx_runtime","getXsrfToken","buildHeaders","csrf","request"]}
|