@mesob/auth-react 0.3.4 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/dist/components/auth/auth-layout.d.ts +1 -1
  2. package/dist/components/auth/auth-layout.js +10 -2
  3. package/dist/components/auth/auth-layout.js.map +1 -1
  4. package/dist/components/auth/countdown.js +8 -6
  5. package/dist/components/auth/countdown.js.map +1 -1
  6. package/dist/components/auth/forgot-password.js +21 -19
  7. package/dist/components/auth/forgot-password.js.map +1 -1
  8. package/dist/components/auth/reset-password-form.js +22 -21
  9. package/dist/components/auth/reset-password-form.js.map +1 -1
  10. package/dist/components/auth/set-password.d.ts +9 -0
  11. package/dist/components/auth/set-password.js +527 -0
  12. package/dist/components/auth/set-password.js.map +1 -0
  13. package/dist/components/auth/sign-in.js +45 -26
  14. package/dist/components/auth/sign-in.js.map +1 -1
  15. package/dist/components/auth/sign-up.js +25 -29
  16. package/dist/components/auth/sign-up.js.map +1 -1
  17. package/dist/components/auth/verification-form.js +24 -27
  18. package/dist/components/auth/verification-form.js.map +1 -1
  19. package/dist/components/auth/verify-email.js +40 -31
  20. package/dist/components/auth/verify-email.js.map +1 -1
  21. package/dist/components/auth/verify-phone.js +40 -31
  22. package/dist/components/auth/verify-phone.js.map +1 -1
  23. package/dist/components/authorization/deny.d.ts +11 -0
  24. package/dist/components/authorization/deny.js +52 -0
  25. package/dist/components/authorization/deny.js.map +1 -0
  26. package/dist/components/authorization/grant.d.ts +12 -0
  27. package/dist/components/authorization/grant.js +57 -0
  28. package/dist/components/authorization/grant.js.map +1 -0
  29. package/dist/components/iam/permission-selector.d.ts +19 -0
  30. package/dist/components/iam/permission-selector.js +122 -0
  31. package/dist/components/iam/permission-selector.js.map +1 -0
  32. package/dist/components/iam/permissions.js +21 -33
  33. package/dist/components/iam/permissions.js.map +1 -1
  34. package/dist/components/iam/role-detail-layout.d.ts +11 -0
  35. package/dist/components/iam/role-detail-layout.js +137 -0
  36. package/dist/components/iam/role-detail-layout.js.map +1 -0
  37. package/dist/components/iam/role-detail-page.d.ts +9 -0
  38. package/dist/components/iam/role-detail-page.js +229 -0
  39. package/dist/components/iam/role-detail-page.js.map +1 -0
  40. package/dist/components/iam/role-permissions-page.d.ts +8 -0
  41. package/dist/components/iam/role-permissions-page.js +397 -0
  42. package/dist/components/iam/role-permissions-page.js.map +1 -0
  43. package/dist/components/iam/roles.js +20 -10
  44. package/dist/components/iam/roles.js.map +1 -1
  45. package/dist/components/iam/tenants.js +9 -2
  46. package/dist/components/iam/tenants.js.map +1 -1
  47. package/dist/components/iam/users.js +10 -9
  48. package/dist/components/iam/users.js.map +1 -1
  49. package/dist/components/profile/account.js +110 -19
  50. package/dist/components/profile/account.js.map +1 -1
  51. package/dist/components/profile/change-email-form.js +26 -29
  52. package/dist/components/profile/change-email-form.js.map +1 -1
  53. package/dist/components/profile/change-phone-form.js +26 -29
  54. package/dist/components/profile/change-phone-form.js.map +1 -1
  55. package/dist/components/profile/change-profile.d.ts +2 -1
  56. package/dist/components/profile/change-profile.js +16 -8
  57. package/dist/components/profile/change-profile.js.map +1 -1
  58. package/dist/components/profile/otp-verification-modal.js +24 -27
  59. package/dist/components/profile/otp-verification-modal.js.map +1 -1
  60. package/dist/components/profile/security.js +88 -57
  61. package/dist/components/profile/security.js.map +1 -1
  62. package/dist/components/profile/verify-change-email-form.js +24 -27
  63. package/dist/components/profile/verify-change-email-form.js.map +1 -1
  64. package/dist/components/profile/verify-change-phone-form.js +24 -27
  65. package/dist/components/profile/verify-change-phone-form.js.map +1 -1
  66. package/dist/index.d.ts +9 -1
  67. package/dist/index.js +1897 -821
  68. package/dist/index.js.map +1 -1
  69. package/dist/pages/auth/forgot-password.d.ts +7 -0
  70. package/dist/pages/auth/forgot-password.js +784 -0
  71. package/dist/pages/auth/forgot-password.js.map +1 -0
  72. package/dist/pages/auth/layout.d.ts +8 -0
  73. package/dist/pages/auth/layout.js +562 -0
  74. package/dist/pages/auth/layout.js.map +1 -0
  75. package/dist/pages/auth/reset-password.d.ts +10 -0
  76. package/dist/pages/auth/reset-password.js +913 -0
  77. package/dist/pages/auth/reset-password.js.map +1 -0
  78. package/dist/pages/auth/set-password.d.ts +10 -0
  79. package/dist/pages/auth/set-password.js +946 -0
  80. package/dist/pages/auth/set-password.js.map +1 -0
  81. package/dist/pages/auth/sign-in.d.ts +10 -0
  82. package/dist/pages/auth/sign-in.js +984 -0
  83. package/dist/pages/auth/sign-in.js.map +1 -0
  84. package/dist/pages/auth/sign-up.d.ts +10 -0
  85. package/dist/pages/auth/sign-up.js +940 -0
  86. package/dist/pages/auth/sign-up.js.map +1 -0
  87. package/dist/pages/auth/verify-email.d.ts +10 -0
  88. package/dist/pages/auth/verify-email.js +950 -0
  89. package/dist/pages/auth/verify-email.js.map +1 -0
  90. package/dist/pages/auth/verify-phone.d.ts +10 -0
  91. package/dist/pages/auth/verify-phone.js +964 -0
  92. package/dist/pages/auth/verify-phone.js.map +1 -0
  93. package/dist/pages/iam/permissions.d.ts +5 -0
  94. package/dist/pages/iam/permissions.js +308 -0
  95. package/dist/pages/iam/permissions.js.map +1 -0
  96. package/dist/pages/iam/role-detail-layout.d.ts +12 -0
  97. package/dist/pages/iam/role-detail-layout.js +145 -0
  98. package/dist/pages/iam/role-detail-layout.js.map +1 -0
  99. package/dist/pages/iam/role-detail.d.ts +12 -0
  100. package/dist/pages/iam/role-detail.js +241 -0
  101. package/dist/pages/iam/role-detail.js.map +1 -0
  102. package/dist/pages/iam/role-permissions.d.ts +12 -0
  103. package/dist/pages/iam/role-permissions.js +409 -0
  104. package/dist/pages/iam/role-permissions.js.map +1 -0
  105. package/dist/pages/iam/role-users.d.ts +12 -0
  106. package/dist/pages/iam/role-users.js +825 -0
  107. package/dist/pages/iam/role-users.js.map +1 -0
  108. package/dist/pages/iam/roles.d.ts +5 -0
  109. package/dist/pages/iam/roles.js +684 -0
  110. package/dist/pages/iam/roles.js.map +1 -0
  111. package/dist/pages/iam/sessions.d.ts +5 -0
  112. package/dist/pages/iam/sessions.js +315 -0
  113. package/dist/pages/iam/sessions.js.map +1 -0
  114. package/dist/pages/iam/tenant-detail.d.ts +10 -0
  115. package/dist/pages/iam/tenant-detail.js +186 -0
  116. package/dist/pages/iam/tenant-detail.js.map +1 -0
  117. package/dist/pages/iam/tenants.d.ts +5 -0
  118. package/dist/pages/iam/tenants.js +610 -0
  119. package/dist/pages/iam/tenants.js.map +1 -0
  120. package/dist/pages/iam/user-activity.d.ts +10 -0
  121. package/dist/pages/iam/user-activity.js +850 -0
  122. package/dist/pages/iam/user-activity.js.map +1 -0
  123. package/dist/pages/iam/user-detail-layout.d.ts +12 -0
  124. package/dist/pages/iam/user-detail-layout.js +106 -0
  125. package/dist/pages/iam/user-detail-layout.js.map +1 -0
  126. package/dist/pages/iam/user-detail.d.ts +10 -0
  127. package/dist/pages/iam/user-detail.js +102 -0
  128. package/dist/pages/iam/user-detail.js.map +1 -0
  129. package/dist/pages/iam/users.d.ts +5 -0
  130. package/dist/pages/iam/users.js +1275 -0
  131. package/dist/pages/iam/users.js.map +1 -0
  132. package/dist/pages/profile/account.d.ts +5 -0
  133. package/dist/pages/profile/account.js +182 -0
  134. package/dist/pages/profile/account.js.map +1 -0
  135. package/dist/pages/profile/layout.d.ts +8 -0
  136. package/dist/pages/profile/layout.js +133 -0
  137. package/dist/pages/profile/layout.js.map +1 -0
  138. package/dist/pages/profile/security.d.ts +5 -0
  139. package/dist/pages/profile/security.js +1539 -0
  140. package/dist/pages/profile/security.js.map +1 -0
  141. package/dist/{types-vcfvnAzQ.d.ts → types-g9QcNRxT.d.ts} +13 -7
  142. package/package.json +102 -3
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/pages/iam/roles/users/_components/role-users-page.tsx","../../../src/provider.tsx","../../../src/utils/cookie.ts","../../../src/pages/iam/shared/navigation.tsx","../../../src/lib/query-options.ts","../../../src/pages/iam/shared/page-helpers.tsx","../../../src/pages/iam/users/_components/user-selector.tsx","../../../src/pages/iam/users/_components/user-card.tsx","../../../src/pages/iam/users/_components/user-form.tsx","../../../src/pages/iam/role-users.tsx"],"sourcesContent":["'use client';\n\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n Badge,\n Button,\n DataTablePagination,\n DeleteConfirmButton,\n DisplayTable,\n EntityEmptyState,\n EntityFilter,\n EntityHeader,\n EntityLoadingState,\n EntitySearch,\n EntitySort,\n EntityViewToggle,\n PageBody,\n Tbody,\n Td,\n Th,\n Thead,\n Tr,\n useEntityPagination,\n useEntityParams,\n} from '@mesob/ui/components';\nimport { IconPlus, IconUser, IconUsers } from '@tabler/icons-react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport type { ReactNode } from 'react';\nimport { useMemo } from 'react';\nimport { toast } from 'sonner';\nimport type { paths } from '../../../../../data/openapi';\nimport { authApi$ } from '../../../shared/page-helpers';\nimport { UserSelector } from '../../../users/_components/user-selector';\nimport type { User } from '../../../users/_components/users-data';\n\ntype RoleUsersPageProps = {\n roleId: string;\n};\n\nconst TABLE_COLUMN_COUNT = 4;\n\nfunction initials(user: User) {\n return user.fullName\n .split(' ')\n .filter(Boolean)\n .slice(0, 2)\n .map((part: string) => part[0]?.toUpperCase() ?? '')\n .join('');\n}\n\nfunction UserIdentity({ user }: { user: User }) {\n return (\n <div className=\"flex items-center gap-3\">\n <Avatar className=\"h-9 w-9\">\n <AvatarImage src={user.image ?? undefined} />\n <AvatarFallback>{initials(user)}</AvatarFallback>\n </Avatar>\n <div>\n <p className=\"font-medium\">{user.fullName}</p>\n </div>\n </div>\n );\n}\n\nfunction UserContact({ user }: { user: User }) {\n return (\n <div className=\"space-y-1\">\n {user.email ? (\n <div className=\"flex items-center gap-2\">\n <span>{user.email}</span>\n {user.emailVerified ? (\n <Badge variant=\"outline\">Verified</Badge>\n ) : null}\n </div>\n ) : null}\n {user.phone ? (\n <div className=\"flex items-center gap-2\">\n <span>{user.phone}</span>\n {user.phoneVerified ? (\n <Badge variant=\"outline\">Verified</Badge>\n ) : null}\n </div>\n ) : null}\n {user.email || user.phone ? null : (\n <span className=\"text-muted-foreground\">—</span>\n )}\n </div>\n );\n}\n\nfunction UserRemoveButton({\n roleId,\n userId,\n onRemove,\n}: {\n roleId: string;\n userId: string;\n onRemove: (roleId: string, userId: string) => void;\n}) {\n return (\n <DeleteConfirmButton\n entityName=\"user\"\n onConfirm={() => onRemove(roleId, userId)}\n triggerClassName=\"size-8 text-destructive hover:text-destructive\"\n />\n );\n}\n\nfunction RoleUsersTable({\n roleId,\n users,\n onRemove,\n}: {\n roleId: string;\n users: User[];\n onRemove: (roleId: string, userId: string) => void;\n}) {\n return (\n <DisplayTable withTableBorder>\n <Thead>\n <Tr>\n <Th>User</Th>\n <Th>Contact</Th>\n <Th>Last sign in</Th>\n <Th className=\"w-[60px]\" />\n </Tr>\n </Thead>\n <Tbody>\n {users.map((user) => (\n <Tr key={user.id}>\n <Td>\n <UserIdentity user={user} />\n </Td>\n <Td>\n <UserContact user={user} />\n </Td>\n <Td>\n {user.lastSignInAt\n ? new Date(user.lastSignInAt).toLocaleDateString()\n : 'Never'}\n </Td>\n <Td>\n <UserRemoveButton\n roleId={roleId}\n userId={user.id}\n onRemove={onRemove}\n />\n </Td>\n </Tr>\n ))}\n </Tbody>\n </DisplayTable>\n );\n}\n\nfunction RoleUsersCards({\n roleId,\n users,\n onRemove,\n}: {\n roleId: string;\n users: User[];\n onRemove: (roleId: string, userId: string) => void;\n}) {\n return (\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3\">\n {users.map((user) => (\n <div\n key={user.id}\n className=\"rounded-xl border border-border/60 bg-card p-4 shadow-sm\"\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3\">\n <Avatar className=\"h-10 w-10\">\n <AvatarImage src={user.image ?? undefined} />\n <AvatarFallback>{initials(user)}</AvatarFallback>\n </Avatar>\n <div>\n <p className=\"font-semibold\">{user.fullName}</p>\n </div>\n </div>\n <div className=\"space-y-1 text-sm text-muted-foreground\">\n <p>{user.email ?? user.phone ?? 'No contact info'}</p>\n <p>\n Last sign in{' '}\n {user.lastSignInAt\n ? new Date(user.lastSignInAt).toLocaleDateString()\n : 'never'}\n </p>\n </div>\n </div>\n <UserRemoveButton\n roleId={roleId}\n userId={user.id}\n onRemove={onRemove}\n />\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nexport function RoleUsersPage({ roleId }: RoleUsersPageProps) {\n const qc = useQueryClient();\n const { queryConfig, params, setParams } = useEntityParams({\n searchKey: 'search',\n defaultSort: 'fullName',\n defaultOrder: 'asc',\n });\n const usersQuery = useMemo(\n () =>\n ({\n params: {\n path: { id: roleId },\n query: queryConfig.params.query,\n },\n }) as {\n params: {\n path: { id: string };\n query: NonNullable<\n paths['/roles/{id}/users']['get']['parameters']['query']\n >;\n };\n },\n [queryConfig, roleId],\n );\n\n const { data, isPending, isFetching } = authApi$.useQuery(\n 'get',\n '/roles/{id}/users',\n usersQuery,\n { enabled: !!roleId },\n );\n const assignUsers = authApi$.useMutation('post', '/roles/{id}/users', {\n onSuccess: (result: { created?: number } | undefined) => {\n qc.invalidateQueries({ queryKey: ['get', '/roles'] });\n qc.invalidateQueries({ queryKey: ['get', '/roles/{id}'] });\n qc.invalidateQueries({ queryKey: ['get', '/roles/{id}/users'] });\n toast.success(\n result?.created ? `${result.created} user(s) added` : 'No changes',\n );\n },\n onError: () => {\n toast.error('Failed to assign users');\n },\n });\n const revokeUser = authApi$.useMutation(\n 'delete',\n '/roles/{id}/users/{userId}',\n {\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: ['get', '/roles'] });\n qc.invalidateQueries({ queryKey: ['get', '/roles/{id}'] });\n qc.invalidateQueries({ queryKey: ['get', '/roles/{id}/users'] });\n toast.success('User removed');\n },\n onError: () => {\n toast.error('Failed to remove user');\n },\n },\n );\n\n const users = (data?.users ?? []) as User[];\n const { total, pageCount } = useEntityPagination({\n items: users,\n total: data?.total,\n pageSize: params.pageSize,\n });\n const isLoading = isPending || isFetching;\n const currentView = (params.view || 'table') as 'table' | 'card';\n const handleRemoveUser = (targetRoleId: string, userId: string) => {\n revokeUser.mutate({\n params: {\n path: { id: targetRoleId, userId },\n },\n });\n };\n\n if (!roleId) {\n return null;\n }\n\n let content: ReactNode;\n if (isLoading) {\n content = (\n <EntityLoadingState\n view={currentView}\n rowCount={params.pageSize}\n columnCount={TABLE_COLUMN_COUNT}\n cardCount={params.pageSize}\n />\n );\n } else if (total === 0) {\n content = (\n <EntityEmptyState\n icon={IconUsers}\n entityName=\"user\"\n title=\"No users assigned\"\n description=\"Assign users from the selector to add them to this role.\"\n />\n );\n } else if (currentView === 'table') {\n content = (\n <div className=\"space-y-4\">\n <RoleUsersTable\n roleId={roleId}\n users={users}\n onRemove={handleRemoveUser}\n />\n <DataTablePagination\n pageIndex={params.page - 1}\n pageSize={params.pageSize}\n pageCount={pageCount}\n totalRows={total}\n onPageChange={(page) => setParams({ page: page + 1 })}\n onPageSizeChange={(pageSize) => setParams({ pageSize, page: 1 })}\n />\n </div>\n );\n } else {\n content = (\n <div className=\"space-y-4\">\n <RoleUsersCards\n roleId={roleId}\n users={users}\n onRemove={handleRemoveUser}\n />\n <DataTablePagination\n pageIndex={params.page - 1}\n pageSize={params.pageSize}\n pageCount={pageCount}\n totalRows={total}\n onPageChange={(page) => setParams({ page: page + 1 })}\n onPageSizeChange={(pageSize) => setParams({ pageSize, page: 1 })}\n />\n </div>\n );\n }\n\n return (\n <PageBody className=\"px-0 pb-6\">\n <EntityHeader\n icon={<IconUser className=\"h-5 w-5\" />}\n title=\"Role users\"\n actions={\n <UserSelector\n trigger={\n <Button size=\"sm\" loading={assignUsers.isPending}>\n <IconPlus className=\"h-4 w-4\" />\n Add users\n </Button>\n }\n multiple\n excludeIds={users.map((user) => user.id)}\n onSelect={(selectedUsers: User[]) => {\n if (!selectedUsers.length) {\n return;\n }\n\n assignUsers.mutate({\n params: { path: { id: roleId } },\n body: {\n userIds: selectedUsers.map((user: User) => user.id),\n },\n });\n }}\n />\n }\n search={\n <EntitySearch\n paramKey=\"search\"\n placeholder=\"Search assigned users...\"\n />\n }\n filter={\n <EntityFilter\n options={[\n { label: 'All', value: '' },\n { label: 'Name', value: 'fullName' },\n { label: 'Email', value: 'email' },\n { label: 'Phone', value: 'phone' },\n ]}\n placeholder=\"Search field\"\n />\n }\n sort={\n <EntitySort\n defaultSort=\"fullName\"\n defaultOrder=\"asc\"\n options={[\n { label: 'Created', value: 'createdAt' },\n { label: 'Updated', value: 'updatedAt' },\n { label: 'Name', value: 'fullName' },\n { label: 'Last Sign In', value: 'lastSignInAt' },\n ]}\n />\n }\n view={<EntityViewToggle views={['table', 'card']} />}\n />\n {content}\n </PageBody>\n );\n}\n","'use client';\n\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { deepmerge } from 'deepmerge-ts';\nimport createFetchClient from 'openapi-fetch';\nimport createClient from 'openapi-react-query';\nimport type { ReactNode } from 'react';\nimport { createContext, useContext, useMemo, useState } from 'react';\nimport type { paths } from './data/openapi';\nimport { createTranslator } from './lib/translations';\nimport {\n type AuthClientConfig,\n type AuthResponse,\n defaultAuthClientConfig,\n type Session,\n type User,\n} from './types';\nimport { getSessionCookieName } from './utils/cookie';\nimport { createCustomFetch } from './utils/custom-fetch';\n\n// biome-ignore lint/suspicious/noExplicitAny: OpenAPI hooks type\ntype OpenApiHooks = any;\n\n// --- Utility: Check if running on server ---\nfunction isServer(): boolean {\n return typeof document === 'undefined';\n}\n\n/**\n * @deprecated Cookie is httpOnly and cannot be read client-side.\n * Use `useSession().isAuthenticated` instead.\n * This function always returns false on client.\n */\nexport function hasAuthCookie(_cookieName: string): boolean {\n // Cookie is httpOnly, can't check client-side\n // Always return false - use useSession() for auth status\n return false;\n}\n\n// --- Types ---\nexport type AuthStatus = 'loading' | 'authenticated' | 'unauthenticated';\n\ntype AuthState = {\n user: User | null;\n session: Session | null;\n status: AuthStatus;\n error: Error | null;\n};\n\ntype SessionContextValue = AuthState & {\n isLoading: boolean;\n isAuthenticated: boolean;\n refresh: () => Promise<void>;\n signOut: () => Promise<void>;\n};\n\ntype ApiContextValue = {\n hooks: OpenApiHooks;\n setAuth: (auth: AuthResponse) => void;\n clearAuth: () => void;\n refresh: () => Promise<void>;\n};\n\ntype ConfigContextValue = {\n config: AuthClientConfig;\n cookieName: string;\n t: (key: string, params?: Record<string, string | number>) => string;\n};\n\nconst SessionContext = createContext<SessionContextValue | null>(null);\nconst ApiContext = createContext<ApiContextValue | null>(null);\nconst ConfigContext = createContext<ConfigContextValue | null>(null);\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n refetchOnWindowFocus: false,\n },\n },\n});\n\n// --- Hooks ---\n\n/**\n * Get session state including user, session, and auth status.\n * - `status`: 'loading' | 'authenticated' | 'unauthenticated'\n * - `isLoading`: true while fetching session\n * - `isAuthenticated`: true if user and session exist\n */\nexport function useSession(): SessionContextValue {\n const context = useContext(SessionContext);\n if (!context) {\n throw new Error('useSession must be used within MesobAuthProvider');\n }\n return context;\n}\n\nexport function useApi(): ApiContextValue {\n const context = useContext(ApiContext);\n if (!context) {\n throw new Error('useApi must be used within MesobAuthProvider');\n }\n return context;\n}\n\nexport function useConfig(): ConfigContextValue {\n const context = useContext(ConfigContext);\n if (!context) {\n throw new Error('useConfig must be used within MesobAuthProvider');\n }\n return context;\n}\n\n/**\n * @deprecated Cookie is httpOnly, can't be checked client-side.\n * Use `useSession().isAuthenticated` instead.\n */\nexport function useHasAuthCookie(): boolean {\n const { status } = useSession();\n return status === 'authenticated' || status === 'loading';\n}\n\n// --- Provider ---\n\ntype MesobAuthProviderProps = {\n config: AuthClientConfig;\n children: ReactNode;\n};\n\nexport function MesobAuthProvider({\n config,\n children,\n}: MesobAuthProviderProps) {\n const mergedConfig = useMemo(\n () =>\n deepmerge(\n { ...defaultAuthClientConfig } as Partial<AuthClientConfig>,\n config,\n ) as AuthClientConfig,\n [config],\n );\n\n const api = useMemo(\n () =>\n createFetchClient<paths>({\n baseUrl: mergedConfig.baseURL,\n fetch: createCustomFetch(mergedConfig),\n }),\n [mergedConfig],\n );\n\n const hooks = useMemo(() => createClient(api), [api]);\n const cookieName = useMemo(\n () => getSessionCookieName(mergedConfig),\n [mergedConfig],\n );\n\n return (\n <QueryClientProvider client={queryClient}>\n <AuthStateProvider\n config={mergedConfig}\n hooks={hooks}\n cookieName={cookieName}\n >\n {children}\n </AuthStateProvider>\n </QueryClientProvider>\n );\n}\n\ntype AuthStateProviderProps = {\n config: AuthClientConfig;\n hooks: OpenApiHooks;\n cookieName: string;\n children: ReactNode;\n};\n\nfunction AuthStateProvider({\n config,\n hooks,\n cookieName,\n children,\n}: AuthStateProviderProps) {\n // Manual override for sign-out / sign-in\n const [override, setOverride] = useState<AuthState | null>(null);\n\n // Always fetch session - cookie is httpOnly, can't check client-side\n // Server will read the cookie and return user/session if valid\n const {\n data: sessionData,\n isLoading,\n isFetched,\n error: sessionError,\n refetch,\n } = hooks.useQuery(\n 'get',\n '/session',\n {},\n {\n enabled: !(override || isServer()),\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n retry: false,\n gcTime: 0,\n staleTime: 0,\n },\n );\n\n // Derive state directly - no useEffect\n const user = override?.user ?? sessionData?.user ?? null;\n const session = override?.session ?? sessionData?.session ?? null;\n const error = override?.error ?? (sessionError as Error | null);\n\n // Check error status code\n const errorStatus = (() => {\n if (!sessionError) {\n return null;\n }\n const err = sessionError as { status?: number };\n return err.status ?? null;\n })();\n\n // Check if error is a network/connection error\n const isNetworkError = (() => {\n if (!sessionError) {\n return false;\n }\n const error = sessionError as Error & { cause?: unknown; data?: unknown };\n const errorMessage =\n error.message || String(error) || JSON.stringify(error);\n // Network errors: TypeError, DOMException, or fetch failures\n if (\n error instanceof TypeError ||\n error instanceof DOMException ||\n error.name === 'TypeError' ||\n errorMessage.includes('Failed to fetch') ||\n errorMessage.includes('ERR_CONNECTION_REFUSED') ||\n errorMessage.includes('NetworkError') ||\n errorMessage.includes('Network request failed') ||\n errorMessage.includes('fetch failed')\n ) {\n return true;\n }\n // Check error cause\n if (error.cause) {\n const causeStr = String(error.cause);\n if (\n causeStr.includes('Failed to fetch') ||\n causeStr.includes('ERR_CONNECTION_REFUSED') ||\n causeStr.includes('NetworkError')\n ) {\n return true;\n }\n }\n return false;\n })();\n\n // Compute status\n // biome-ignore lint: Status determination requires multiple checks\n const status: AuthStatus = (() => {\n if (override) {\n return override.status;\n }\n if (isServer()) {\n return 'loading';\n }\n if (user && session) {\n return 'authenticated';\n }\n // Check for network errors or auth errors first - allow auth page to show\n if (isNetworkError || errorStatus === 401) {\n return 'unauthenticated';\n }\n // If we have an error but it's not a network error, still check loading state\n if (sessionError && !isNetworkError && errorStatus !== 401) {\n if (errorStatus && errorStatus >= 500) {\n return 'authenticated';\n }\n // Other errors mean unauthenticated\n if (isFetched) {\n return 'unauthenticated';\n }\n }\n if (isLoading || !isFetched) {\n return 'loading';\n }\n if (isFetched && !user && !session) {\n return 'unauthenticated';\n }\n return 'unauthenticated';\n })();\n\n const signOutMutation = hooks.useMutation('post', '/sign-out');\n const t = createTranslator(config.messages || {});\n\n const setAuth = (auth: AuthResponse) => {\n setOverride({\n user: auth.user,\n session: auth.session,\n status: 'authenticated',\n error: null,\n });\n };\n\n const clearAuth = () => {\n setOverride({\n user: null,\n session: null,\n status: 'unauthenticated',\n error: null,\n });\n };\n\n const refresh = async () => {\n setOverride(null);\n await refetch();\n };\n\n const signOut = async () => {\n try {\n await signOutMutation.mutateAsync({});\n } finally {\n clearAuth();\n }\n };\n\n return (\n <ConfigContext.Provider value={{ config, cookieName, t }}>\n <ApiContext.Provider value={{ hooks, setAuth, clearAuth, refresh }}>\n <SessionContext.Provider\n value={{\n user,\n session,\n status,\n error,\n isLoading: status === 'loading',\n isAuthenticated: status === 'authenticated',\n refresh,\n signOut,\n }}\n >\n {children}\n </SessionContext.Provider>\n </ApiContext.Provider>\n </ConfigContext.Provider>\n );\n}\n","import type { AuthClientConfig } from '../types';\n\nconst isProduction =\n typeof process !== 'undefined' && process.env.NODE_ENV === 'production';\n\nexport const getSessionCookieName = (config: AuthClientConfig): string => {\n const prefix = config.cookiePrefix || '';\n const baseName = 'session_token';\n if (prefix) {\n return `${prefix}_${baseName}`;\n }\n return isProduction ? '__Host-session_token' : baseName;\n};\n","'use client';\n\nimport { useMesob } from '@mesob/ui/providers';\nimport type { ReactNode } from 'react';\nimport { useConfig } from '../../../provider';\n\ntype AppLinkProps = React.ComponentProps<'a'> & {\n href: string;\n children: ReactNode;\n};\n\nexport function AppLink({ href, children, ...props }: AppLinkProps) {\n const mesob = useMesob();\n const Link = mesob?.linkComponent ?? mesob?.navigation?.Link;\n const locale = mesob?.locale;\n\n if (Link) {\n return (\n <Link href={href} {...(locale ? ({ locale } as object) : {})} {...props}>\n {children}\n </Link>\n );\n }\n\n return (\n <a href={href} {...props}>\n {children}\n </a>\n );\n}\n\nexport function useNavigate() {\n const { config } = useConfig();\n\n return (href: string) => {\n if (config.navigation?.onNavigate) {\n config.navigation.onNavigate(href);\n return;\n }\n\n if (typeof window !== 'undefined') {\n window.location.href = href;\n }\n };\n}\n","import { keepPreviousData } from '@tanstack/react-query';\n\nexport const defaultEntityQueryOptions = {\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n staleTime: 60 * 1000,\n gcTime: 5 * 60 * 1000,\n placeholderData: keepPreviousData,\n retry: 1,\n};\n","'use client';\n\nimport type { ComponentProps } from 'react';\nimport { useApi } from '../../../provider';\nimport { AppLink, useNavigate } from './navigation';\n\nexport { defaultEntityQueryOptions } from '../../../lib/query-options';\n\ntype HookArgs = [string, string, ...unknown[]];\n\nexport const authApi$ = {\n useQuery(...args: HookArgs) {\n const { hooks } = useApi();\n\n return hooks.useQuery(...args);\n },\n useMutation(...args: HookArgs) {\n const { hooks } = useApi();\n\n return hooks.useMutation(...args);\n },\n};\n\nexport function Link(props: ComponentProps<typeof AppLink>) {\n return <AppLink {...props} />;\n}\n\nexport function useRouter() {\n const navigate = useNavigate();\n\n return {\n push: navigate,\n };\n}\n","'use client';\n\nimport {\n Badge,\n EntitySelector,\n type EntitySelectorColumn,\n type EntitySelectorConfig,\n useEntitySectionState,\n} from '@mesob/ui/components';\nimport { cn } from '@mesob/ui/lib/utils';\nimport { IconCalendar, IconUsers } from '@tabler/icons-react';\nimport type { ReactNode } from 'react';\nimport type { paths } from '../../../../data/openapi';\nimport { authApi$, defaultEntityQueryOptions } from '../../shared/page-helpers';\nimport { UserCard } from './user-card';\nimport type { User } from './users-data';\n\nfunction SelectableUserCard({\n user,\n selected,\n onToggle,\n}: {\n user: User;\n selected: boolean;\n onToggle: () => void;\n}) {\n return (\n // biome-ignore lint/a11y/useSemanticElements: div needed to avoid nested buttons from UserCard\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onToggle}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n onToggle();\n }\n }}\n className={cn(\n 'cursor-pointer rounded-lg transition-shadow focus:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n selected && 'ring-primary ring-2',\n )}\n >\n <UserCard user={user} />\n </div>\n );\n}\n\nconst userColumns: EntitySelectorColumn<User>[] = [\n {\n key: 'name',\n header: 'Name',\n cell: (user: User) => <p className=\"font-medium\">{user.fullName}</p>,\n },\n {\n key: 'contact',\n header: 'Contact',\n cell: (user: User) => (\n <div className=\"space-y-1\">\n {user.email && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">{user.email}</span>\n {user.emailVerified && (\n <Badge variant=\"outline\" className=\"text-xs\">\n Verified\n </Badge>\n )}\n </div>\n )}\n {user.phone && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">{user.phone}</span>\n {user.phoneVerified && (\n <Badge variant=\"outline\" className=\"text-xs\">\n Verified\n </Badge>\n )}\n </div>\n )}\n {!(user.email || user.phone) && (\n <span className=\"text-muted-foreground\">—</span>\n )}\n </div>\n ),\n },\n {\n key: 'lastSignIn',\n header: 'Last sign in',\n cell: (user: User) => (\n <div className=\"flex items-center gap-1 text-muted-foreground\">\n <IconCalendar className=\"h-4 w-4\" />\n {user.lastSignInAt\n ? new Date(user.lastSignInAt).toLocaleDateString()\n : 'Never'}\n </div>\n ),\n },\n];\n\nconst EMPTY_EXCLUDE_IDS: string[] = [];\n\ntype UserSelectorProps = {\n trigger: ReactNode;\n multiple?: boolean;\n onSelect: (users: User[]) => void;\n excludeIds?: string[];\n modalSize?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n contentClassName?: string;\n};\n\nexport function UserSelector({\n trigger,\n multiple = false,\n onSelect,\n excludeIds = EMPTY_EXCLUDE_IDS,\n modalSize = 'xl',\n contentClassName,\n}: UserSelectorProps) {\n const state = useEntitySectionState({\n defaultSort: 'createdAt',\n defaultOrder: 'desc',\n defaultPageSize: 10,\n searchParamName: 'handle',\n });\n const usersQuery = state.queryConfig as {\n params: {\n query: NonNullable<paths['/users']['get']['parameters']['query']>;\n };\n };\n\n const { data, isPending, isFetching } = authApi$.useQuery(\n 'get',\n '/users',\n usersQuery,\n defaultEntityQueryOptions,\n );\n\n const users = (data?.users ?? []).filter((user: User) => {\n return !excludeIds.includes(user.id);\n });\n\n const config: EntitySelectorConfig<User> = {\n title: 'Select user(s)',\n modalSize,\n contentClassName,\n multiple,\n entityName: 'user',\n entityIcon: IconUsers,\n columns: userColumns,\n columnCount: 4,\n getItemLabel: (user: User) => user.fullName,\n searchPlaceholder: 'Search users...',\n filterOptions: [\n { label: 'All', value: '' },\n { label: 'Email Verified', value: 'emailVerified' },\n { label: 'Phone Verified', value: 'phoneVerified' },\n { label: 'Not Verified', value: 'notVerified' },\n ],\n sortOptions: [\n { label: 'Created', value: 'createdAt' },\n { label: 'Updated', value: 'updatedAt' },\n { label: 'Name', value: 'fullName' },\n { label: 'Last Sign In', value: 'lastSignInAt' },\n ],\n showViewToggle: false,\n renderCard: (user: User, selected: boolean, onToggle: () => void) => (\n <SelectableUserCard user={user} selected={selected} onToggle={onToggle} />\n ),\n };\n\n return (\n <EntitySelector<User>\n trigger={trigger}\n config={config}\n onSelect={onSelect}\n items={users}\n total={data?.total}\n isLoading={isPending || isFetching}\n state={state}\n />\n );\n}\n","'use client';\n\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n} from '@mesob/ui/components';\nimport { IconDots, IconPencil } from '@tabler/icons-react';\nimport { useState } from 'react';\nimport { Link } from '../../shared/page-helpers';\nimport { UserForm } from './user-form';\nimport type { User } from './users-data';\n\ntype UserCardProps = { user: User };\n\nexport function UserCard({ user }: UserCardProps) {\n const [editOpen, setEditOpen] = useState(false);\n return (\n <>\n <Card className=\"group hover:shadow-md transition-shadow\">\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-start justify-between\">\n <Link\n href={`/iam/users/${user.id}`}\n className=\"text-left font-semibold hover:text-primary hover:underline\"\n >\n {user.fullName}\n </Link>\n <DropdownMenu>\n <DropdownMenuTrigger\n render={\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 opacity-0 group-hover:opacity-100 transition-opacity\"\n />\n }\n >\n <IconDots className=\"h-4 w-4\" />\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent>\n <DropdownMenuItem onClick={() => setEditOpen(true)}>\n <IconPencil className=\"mr-2 h-4 w-4\" />\n Edit\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenu>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {user.email && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">{user.email}</span>\n {user.emailVerified && (\n <Badge variant=\"outline\" className=\"text-xs\">\n Verified\n </Badge>\n )}\n </div>\n )}\n <p className=\"text-xs text-muted-foreground\">\n Last sign in{' '}\n {user.lastSignInAt\n ? new Date(user.lastSignInAt).toLocaleDateString()\n : 'never'}\n </p>\n </CardContent>\n </Card>\n {editOpen && (\n <UserForm\n mode=\"edit\"\n userId={user.id}\n open={editOpen}\n onClose={() => setEditOpen(false)}\n />\n )}\n </>\n );\n}\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport {\n EntityDrawer,\n EntityFormActions,\n Input,\n Label,\n Skeleton,\n} from '@mesob/ui/components';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useEffect } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { z } from 'zod';\nimport { authApi$ } from '../../shared/page-helpers';\n\nconst schema = z.object({\n fullName: z.string().min(1, 'Name is required'),\n email: z.string().email().optional().or(z.literal('')),\n phone: z.string().optional(),\n});\n\ntype FormData = z.infer<typeof schema>;\n\nconst defaults: FormData = {\n fullName: '',\n email: '',\n phone: '',\n};\n\ntype UserFormProps = {\n mode: 'new' | 'edit';\n userId?: string;\n open: boolean;\n onClose: () => void;\n onSuccess?: () => void;\n};\n\nexport function UserForm({\n mode,\n userId,\n open,\n onClose,\n onSuccess,\n}: UserFormProps) {\n const qc = useQueryClient();\n const { data, isLoading } = authApi$.useQuery(\n 'get',\n '/users/{id}',\n { params: { path: { id: userId ?? '' } } },\n { enabled: mode === 'edit' && !!userId },\n );\n const create = authApi$.useMutation('post', '/users', {\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: ['get', '/users'] });\n },\n });\n const update = authApi$.useMutation('put', '/users/{id}', {\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: ['get', '/users'] });\n if (userId) {\n qc.invalidateQueries({ queryKey: ['get', '/users/{id}'] });\n }\n },\n });\n const del = authApi$.useMutation('delete', '/users/{id}', {\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: ['get', '/users'] });\n },\n });\n\n const form = useForm<FormData>({\n resolver: zodResolver(schema),\n defaultValues: defaults,\n });\n\n const { reset, formState } = form;\n\n useEffect(() => {\n if (!open) {\n return;\n }\n if (mode === 'edit' && data?.user && !isLoading) {\n const u = data.user;\n reset({\n fullName: u.fullName,\n email: u.email ?? '',\n phone: u.phone ?? '',\n });\n } else {\n reset(defaults);\n }\n }, [mode, data, open, isLoading, reset]);\n\n const onSubmit = form.handleSubmit(async (d) => {\n const payload = {\n fullName: d.fullName,\n email: d.email || undefined,\n phone: d.phone || undefined,\n };\n if (mode === 'new') {\n await create.mutateAsync({ body: payload });\n } else if (userId) {\n await update.mutateAsync({\n params: { path: { id: userId } },\n body: payload,\n });\n }\n onSuccess?.();\n onClose();\n });\n\n const onDelete = async () => {\n if (!userId) {\n return;\n }\n await del.mutateAsync({ params: { path: { id: userId } } });\n onSuccess?.();\n onClose();\n };\n\n const isSubmitting = create.isPending || update.isPending;\n\n return (\n <EntityDrawer\n title={mode === 'new' ? 'New user' : 'Edit user'}\n open={open}\n onClose={onClose}\n isDirty={formState.isDirty}\n form={\n isLoading ? (\n <FormSkeleton />\n ) : (\n <form onSubmit={onSubmit} className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"fullName\">\n Full name <span className=\"text-destructive\">*</span>\n </Label>\n <Input\n id=\"fullName\"\n placeholder=\"Full name\"\n {...form.register('fullName')}\n />\n {formState.errors.fullName && (\n <p className=\"text-sm text-destructive\">\n {formState.errors.fullName.message}\n </p>\n )}\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"email\">Email</Label>\n <Input\n id=\"email\"\n type=\"email\"\n placeholder=\"Email\"\n {...form.register('email')}\n />\n {formState.errors.email && (\n <p className=\"text-sm text-destructive\">\n {formState.errors.email.message}\n </p>\n )}\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"phone\">Phone</Label>\n <Input\n id=\"phone\"\n placeholder=\"Phone\"\n {...form.register('phone')}\n />\n </div>\n </form>\n )\n }\n actions={\n <EntityFormActions\n mode={mode}\n onSubmit={onSubmit}\n onReset={mode === 'new' ? () => reset(defaults) : undefined}\n onDelete={mode === 'edit' ? onDelete : undefined}\n isSubmitting={isSubmitting}\n isDeleting={del.isPending}\n disabled={isLoading}\n itemName=\"user\"\n />\n }\n />\n );\n}\n\nfunction FormSkeleton() {\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-20\" />\n <Skeleton className=\"h-10 w-full\" />\n </div>\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-16\" />\n <Skeleton className=\"h-10 w-full\" />\n </div>\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-14\" />\n <Skeleton className=\"h-10 w-full\" />\n </div>\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-16\" />\n <Skeleton className=\"h-10 w-full\" />\n </div>\n </div>\n );\n}\n","import type { Metadata } from 'next';\nimport { RoleUsersPage } from './roles/users/_components/role-users-page';\n\ntype RoleUsersPageProps = {\n params: Promise<{ id: string }>;\n};\n\nexport const metadata: Metadata = {\n title: 'Role Users',\n description: 'Manage users assigned to a role.',\n};\n\nexport default async function RoleUsersRoutePage({\n params,\n}: RoleUsersPageProps) {\n const { id } = await params;\n\n return <RoleUsersPage roleId={id} />;\n}\n"],"mappings":"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","names":["Badge","Button","IconUsers","useQueryClient","useMemo","jsx","Link","jsx","Badge","useState","jsx","jsx","jsxs","useState","jsx","jsxs","Badge","jsx","jsxs","Badge","useQueryClient","useMemo","IconUsers","Button","jsx"]}
@@ -0,0 +1,5 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function RolesPage(): react_jsx_runtime.JSX.Element;
4
+
5
+ export { RolesPage as default };