@mesob/auth-react 0.5.11 → 0.6.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 (188) hide show
  1. package/dist/{chunk-ORQZZUVL.js → chunk-2SYBZ6TR.js} +2 -4
  2. package/dist/chunk-2SYBZ6TR.js.map +1 -0
  3. package/dist/{chunk-LI7WPOVY.js → chunk-323NYGKW.js} +3 -6
  4. package/dist/chunk-323NYGKW.js.map +1 -0
  5. package/dist/{chunk-Y6KURGWG.js → chunk-34AJJ2CI.js} +2 -4
  6. package/dist/chunk-34AJJ2CI.js.map +1 -0
  7. package/dist/{chunk-WAMZL5CS.js → chunk-4O3LAHTY.js} +4 -7
  8. package/dist/chunk-4O3LAHTY.js.map +1 -0
  9. package/dist/{chunk-4YPLJ2P6.js → chunk-57G5Z44Y.js} +2 -6
  10. package/dist/chunk-57G5Z44Y.js.map +1 -0
  11. package/dist/{chunk-NJGVOQIU.js → chunk-5O6VWABF.js} +5 -8
  12. package/dist/chunk-5O6VWABF.js.map +1 -0
  13. package/dist/{chunk-UV7JR3YU.js → chunk-5PGLBU4A.js} +4 -6
  14. package/dist/chunk-5PGLBU4A.js.map +1 -0
  15. package/dist/{chunk-IUCTHMVY.js → chunk-5YAYZDKX.js} +2 -5
  16. package/dist/chunk-5YAYZDKX.js.map +1 -0
  17. package/dist/{chunk-M2K6O5CN.js → chunk-6BLYK6D6.js} +85 -29
  18. package/dist/chunk-6BLYK6D6.js.map +1 -0
  19. package/dist/{chunk-G2RWFKGF.js → chunk-6HVUVXQB.js} +2 -4
  20. package/dist/chunk-6HVUVXQB.js.map +1 -0
  21. package/dist/chunk-6YHUCPJ4.js +28 -0
  22. package/dist/chunk-6YHUCPJ4.js.map +1 -0
  23. package/dist/{chunk-B7BS57X7.js → chunk-7FSFDTQR.js} +10 -11
  24. package/dist/chunk-7FSFDTQR.js.map +1 -0
  25. package/dist/{chunk-22KICA5N.js → chunk-ABIQ2NM3.js} +3 -5
  26. package/dist/{chunk-22KICA5N.js.map → chunk-ABIQ2NM3.js.map} +1 -1
  27. package/dist/{chunk-TT3V6PC7.js → chunk-AHWUP6LB.js} +4 -6
  28. package/dist/chunk-AHWUP6LB.js.map +1 -0
  29. package/dist/{chunk-M677DPBR.js → chunk-AKJ3EHND.js} +2 -6
  30. package/dist/chunk-AKJ3EHND.js.map +1 -0
  31. package/dist/{chunk-J7NROVB4.js → chunk-CY3MODZU.js} +2 -2
  32. package/dist/{chunk-QNPK2H5A.js → chunk-F5SAYP67.js} +3 -5
  33. package/dist/{chunk-QNPK2H5A.js.map → chunk-F5SAYP67.js.map} +1 -1
  34. package/dist/{chunk-I46PN4JU.js → chunk-F6WCSBHX.js} +2 -5
  35. package/dist/chunk-F6WCSBHX.js.map +1 -0
  36. package/dist/{chunk-25DJGLNU.js → chunk-FWYDZVFS.js} +9 -10
  37. package/dist/chunk-FWYDZVFS.js.map +1 -0
  38. package/dist/{chunk-75K2SCNC.js → chunk-HXAIYFI4.js} +3 -6
  39. package/dist/chunk-HXAIYFI4.js.map +1 -0
  40. package/dist/{chunk-7QJBDRTL.js → chunk-IFXBZY6Q.js} +3 -6
  41. package/dist/chunk-IFXBZY6Q.js.map +1 -0
  42. package/dist/{chunk-UIXR5GF3.js → chunk-ITKSPHYO.js} +2 -2
  43. package/dist/{chunk-HOROLWBY.js → chunk-J4X3CA3V.js} +2 -4
  44. package/dist/chunk-J4X3CA3V.js.map +1 -0
  45. package/dist/{chunk-GP4XI5KB.js → chunk-L5UKZAA4.js} +3 -3
  46. package/dist/{chunk-VTANFZKG.js → chunk-LGAHTK5V.js} +5 -7
  47. package/dist/chunk-LGAHTK5V.js.map +1 -0
  48. package/dist/{chunk-EWXK56WQ.js → chunk-LNG736CV.js} +1 -1
  49. package/dist/{chunk-DQB4WY5T.js → chunk-LVA77T4L.js} +4 -6
  50. package/dist/chunk-LVA77T4L.js.map +1 -0
  51. package/dist/{chunk-WY2F7475.js → chunk-NNYLSQ2X.js} +9 -10
  52. package/dist/chunk-NNYLSQ2X.js.map +1 -0
  53. package/dist/{chunk-CBR5NTFM.js → chunk-OCFX4MBQ.js} +10 -11
  54. package/dist/chunk-OCFX4MBQ.js.map +1 -0
  55. package/dist/{chunk-XTLFZ77E.js → chunk-OMAJKLVW.js} +18 -20
  56. package/dist/chunk-OMAJKLVW.js.map +1 -0
  57. package/dist/{chunk-DRAUYDZ5.js → chunk-OUBYTCTD.js} +2 -4
  58. package/dist/chunk-OUBYTCTD.js.map +1 -0
  59. package/dist/{chunk-KL2XZKDU.js → chunk-Q5RYLX6Z.js} +2 -5
  60. package/dist/chunk-Q5RYLX6Z.js.map +1 -0
  61. package/dist/{chunk-OT2H5EHA.js → chunk-RGGHVAAK.js} +2 -5
  62. package/dist/chunk-RGGHVAAK.js.map +1 -0
  63. package/dist/{chunk-22WSB5V2.js → chunk-RI647FTV.js} +9 -10
  64. package/dist/chunk-RI647FTV.js.map +1 -0
  65. package/dist/{chunk-QRYUUXNJ.js → chunk-SCSRGIEL.js} +4 -7
  66. package/dist/chunk-SCSRGIEL.js.map +1 -0
  67. package/dist/chunk-SEBNQYIE.js +30 -0
  68. package/dist/chunk-SEBNQYIE.js.map +1 -0
  69. package/dist/{chunk-GWRMQSME.js → chunk-VQYNQ5X7.js} +7 -11
  70. package/dist/chunk-VQYNQ5X7.js.map +1 -0
  71. package/dist/{chunk-NPA7L57G.js → chunk-WG5H5PTL.js} +4 -4
  72. package/dist/chunk-WG5H5PTL.js.map +1 -0
  73. package/dist/{chunk-5FNUPWPO.js → chunk-WLKT5YFP.js} +12 -5
  74. package/dist/chunk-WLKT5YFP.js.map +1 -0
  75. package/dist/{chunk-2BF2JIDK.js → chunk-WM2ETQIY.js} +9 -10
  76. package/dist/chunk-WM2ETQIY.js.map +1 -0
  77. package/dist/{chunk-MPZAPUVR.js → chunk-WTWZOQTD.js} +4 -6
  78. package/dist/chunk-WTWZOQTD.js.map +1 -0
  79. package/dist/{chunk-VWGOCWRF.js → chunk-X6FJMSL3.js} +9 -10
  80. package/dist/chunk-X6FJMSL3.js.map +1 -0
  81. package/dist/{chunk-R7VVXH5U.js → chunk-YPFDH2E7.js} +3 -6
  82. package/dist/chunk-YPFDH2E7.js.map +1 -0
  83. package/dist/{chunk-LYCBL2W3.js → chunk-Z47HLNM4.js} +4 -7
  84. package/dist/chunk-Z47HLNM4.js.map +1 -0
  85. package/dist/{chunk-ZIUAYN37.js → chunk-ZHRM4QOO.js} +2 -2
  86. package/dist/components/auth/countdown.js +3 -3
  87. package/dist/components/auth/forgot-password.js +4 -3
  88. package/dist/components/auth/reset-password-form.js +4 -3
  89. package/dist/components/auth/set-password.js +4 -3
  90. package/dist/components/auth/sign-in.js +4 -3
  91. package/dist/components/auth/sign-up.js +4 -3
  92. package/dist/components/auth/verification-form.js +4 -4
  93. package/dist/components/auth/verify-email.js +6 -5
  94. package/dist/components/auth/verify-phone.js +6 -5
  95. package/dist/components/authorization/deny.js +1 -2
  96. package/dist/components/authorization/grant.js +1 -2
  97. package/dist/components/iam/domains-page.js +7 -6
  98. package/dist/components/iam/iam-guard.js +2 -3
  99. package/dist/components/iam/permission-selector.js +1 -2
  100. package/dist/components/iam/permissions-page.js +3 -4
  101. package/dist/components/iam/permissions.js +1 -2
  102. package/dist/components/iam/role-detail-layout.js +2 -2
  103. package/dist/components/iam/role-detail-page.js +3 -4
  104. package/dist/components/iam/role-permissions-page.js +4 -5
  105. package/dist/components/iam/roles-page.js +7 -6
  106. package/dist/components/iam/roles.js +1 -2
  107. package/dist/components/iam/sessions-page.js +7 -6
  108. package/dist/components/iam/sessions.js +1 -2
  109. package/dist/components/iam/tenants-page.js +8 -7
  110. package/dist/components/iam/tenants.js +1 -2
  111. package/dist/components/iam/users-page.js +8 -7
  112. package/dist/components/iam/users.js +1 -2
  113. package/dist/components/profile/account.js +1 -2
  114. package/dist/components/profile/change-email-form.js +8 -8
  115. package/dist/components/profile/change-password-form.js +1 -2
  116. package/dist/components/profile/change-phone-form.js +8 -8
  117. package/dist/components/profile/otp-verification-modal.js +5 -5
  118. package/dist/components/profile/profile-layout.js +4 -3
  119. package/dist/components/profile/request-change-email-form.js +1 -2
  120. package/dist/components/profile/request-change-phone-form.js +1 -2
  121. package/dist/components/profile/security.js +13 -13
  122. package/dist/components/profile/verify-change-email-form.js +6 -6
  123. package/dist/components/profile/verify-change-phone-form.js +6 -6
  124. package/dist/index.js +66 -61
  125. package/dist/index.js.map +1 -1
  126. package/dist/pages/auth/layout.js +11 -9
  127. package/dist/pages/auth/layout.js.map +1 -1
  128. package/dist/pages/auth/route.d.ts +4 -0
  129. package/dist/pages/auth/route.js +44 -0
  130. package/dist/pages/auth/route.js.map +1 -0
  131. package/dist/pages/iam/shared/navigation.d.ts +1 -1
  132. package/dist/pages/iam/tenants/tenant-selector.d.ts +1 -0
  133. package/dist/pages/iam/tenants/tenant-selector.js +5 -5
  134. package/dist/pages/iam/tenants/tenants-data.d.ts +1 -0
  135. package/dist/pages/iam/tenants/tenants-data.js +1 -1
  136. package/dist/pages/iam/users/user-selector.d.ts +1 -0
  137. package/dist/pages/iam/users/user-selector.js +5 -5
  138. package/dist/pages/iam/users/users-data.d.ts +1 -0
  139. package/dist/pages/profile/account.js +1 -3
  140. package/dist/pages/profile/account.js.map +1 -1
  141. package/dist/pages/profile/security.js +1 -3
  142. package/dist/pages/profile/security.js.map +1 -1
  143. package/dist/providers/nuqs-adapter.d.ts +6 -0
  144. package/dist/utils/navigation.d.ts +5 -0
  145. package/package.json +43 -8
  146. package/dist/chunk-22WSB5V2.js.map +0 -1
  147. package/dist/chunk-25DJGLNU.js.map +0 -1
  148. package/dist/chunk-2BF2JIDK.js.map +0 -1
  149. package/dist/chunk-4YPLJ2P6.js.map +0 -1
  150. package/dist/chunk-5FNUPWPO.js.map +0 -1
  151. package/dist/chunk-75K2SCNC.js.map +0 -1
  152. package/dist/chunk-7QJBDRTL.js.map +0 -1
  153. package/dist/chunk-B7BS57X7.js.map +0 -1
  154. package/dist/chunk-CBR5NTFM.js.map +0 -1
  155. package/dist/chunk-DQB4WY5T.js.map +0 -1
  156. package/dist/chunk-DRAUYDZ5.js.map +0 -1
  157. package/dist/chunk-G2RWFKGF.js.map +0 -1
  158. package/dist/chunk-GWRMQSME.js.map +0 -1
  159. package/dist/chunk-HOROLWBY.js.map +0 -1
  160. package/dist/chunk-I46PN4JU.js.map +0 -1
  161. package/dist/chunk-IUCTHMVY.js.map +0 -1
  162. package/dist/chunk-KL2XZKDU.js.map +0 -1
  163. package/dist/chunk-LI7WPOVY.js.map +0 -1
  164. package/dist/chunk-LYCBL2W3.js.map +0 -1
  165. package/dist/chunk-M2K6O5CN.js.map +0 -1
  166. package/dist/chunk-M677DPBR.js.map +0 -1
  167. package/dist/chunk-MPZAPUVR.js.map +0 -1
  168. package/dist/chunk-NJGVOQIU.js.map +0 -1
  169. package/dist/chunk-NPA7L57G.js.map +0 -1
  170. package/dist/chunk-ORQZZUVL.js.map +0 -1
  171. package/dist/chunk-OT2H5EHA.js.map +0 -1
  172. package/dist/chunk-QRYUUXNJ.js.map +0 -1
  173. package/dist/chunk-R7VVXH5U.js.map +0 -1
  174. package/dist/chunk-SLIIENXJ.js +0 -34
  175. package/dist/chunk-SLIIENXJ.js.map +0 -1
  176. package/dist/chunk-TT3V6PC7.js.map +0 -1
  177. package/dist/chunk-UV7JR3YU.js.map +0 -1
  178. package/dist/chunk-VTANFZKG.js.map +0 -1
  179. package/dist/chunk-VWGOCWRF.js.map +0 -1
  180. package/dist/chunk-WAMZL5CS.js.map +0 -1
  181. package/dist/chunk-WY2F7475.js.map +0 -1
  182. package/dist/chunk-XTLFZ77E.js.map +0 -1
  183. package/dist/chunk-Y6KURGWG.js.map +0 -1
  184. /package/dist/{chunk-J7NROVB4.js.map → chunk-CY3MODZU.js.map} +0 -0
  185. /package/dist/{chunk-UIXR5GF3.js.map → chunk-ITKSPHYO.js.map} +0 -0
  186. /package/dist/{chunk-GP4XI5KB.js.map → chunk-L5UKZAA4.js.map} +0 -0
  187. /package/dist/{chunk-EWXK56WQ.js.map → chunk-LNG736CV.js.map} +0 -0
  188. /package/dist/{chunk-ZIUAYN37.js.map → chunk-ZHRM4QOO.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/pages/iam/users/_components/user-card.tsx","../src/pages/iam/users/_components/user-form.tsx"],"sourcesContent":["'use client';\n\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@mesob/ui/components';\nimport { IconCircleCheck, 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 <Tooltip>\n <TooltipTrigger>\n <IconCircleCheck className=\"size-4 text-muted-foreground\" />\n </TooltipTrigger>\n <TooltipContent>Email verified</TooltipContent>\n </Tooltip>\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 AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger,\n Button,\n Checkbox,\n EntityDrawer,\n EntityFormActions,\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n Input,\n Skeleton,\n Stack,\n} from '@mesob/ui/components';\nimport { IconBan, IconUserCheck } from '@tabler/icons-react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useEffect } from 'react';\nimport { useForm, useWatch } from 'react-hook-form';\nimport { z } from 'zod';\nimport type { Role } from '../../roles/_components/roles-data';\nimport { str } from '../../roles/_components/roles-data';\nimport { authApi$ } from '../../shared/page-helpers';\n\nconst schema = z.object({\n fullName: z.string().trim().min(1, 'Full name is required'),\n email: z.string().email('Invalid email').nullable().or(z.literal('')),\n phone: z.string().nullable(),\n emailVerified: z.boolean(),\n phoneVerified: z.boolean(),\n roleIds: z.array(z.string().uuid()),\n});\n\ntype FormData = z.infer<typeof schema>;\n\nconst defaults: FormData = {\n fullName: '',\n email: '',\n phone: null,\n emailVerified: false,\n phoneVerified: false,\n roleIds: [],\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: userData, isLoading: userLoading } = authApi$.useQuery(\n 'get',\n '/users/{id}',\n { params: { path: { id: userId ?? '' } } },\n {\n enabled: mode === 'edit' && !!userId && open,\n refetchOnMount: 'always',\n },\n );\n const { data: rolesData } = authApi$.useQuery(\n 'get',\n '/roles',\n { params: { query: { limit: 100 } } },\n { enabled: open },\n );\n const allRoles = rolesData?.roles ?? [];\n const roles = allRoles\n .filter((r: Role) => (r.code ?? '').toLowerCase() !== 'owner')\n .sort((a: Role, b: Role) =>\n (str(a.name) || a.code)\n .toLowerCase()\n .localeCompare((str(b.name) || b.code).toLowerCase()),\n );\n const user = userData?.user;\n\n const form = useForm<FormData>({\n resolver: zodResolver(schema),\n defaultValues: defaults,\n });\n const { control, formState, reset, setValue } = form;\n const email = useWatch({ control, name: 'email' }) ?? '';\n const phone = useWatch({ control, name: 'phone' }) ?? '';\n const roleIds = useWatch({ control, name: 'roleIds' }) ?? [];\n const hasEmail = (email ?? '').toString().trim().length > 0;\n const hasPhone = (phone ?? '').toString().trim().length > 0;\n\n useEffect(() => {\n if (!hasEmail) {\n setValue('emailVerified', false, { shouldDirty: false });\n }\n if (!hasPhone) {\n setValue('phoneVerified', false, { shouldDirty: false });\n }\n }, [hasEmail, hasPhone, setValue]);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n if (mode === 'edit' && user && !userLoading) {\n reset({\n fullName: user.fullName,\n email: user.email ?? '',\n phone: user.phone ?? null,\n emailVerified: user.emailVerified ?? false,\n phoneVerified: user.phoneVerified ?? false,\n roleIds: user.roles ?? [],\n });\n } else {\n reset(defaults);\n }\n }, [mode, user, open, userLoading, reset]);\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 qc.invalidateQueries({ queryKey: ['get', '/users/{id}'] });\n },\n });\n const del = authApi$.useMutation('delete', '/users/{id}', {\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: ['get', '/users'] });\n },\n });\n const ban = authApi$.useMutation('post', '/users/{id}/ban', {\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: ['get', '/users'] });\n qc.invalidateQueries({ queryKey: ['get', '/users/{id}'] });\n },\n });\n const bannedUntil = (user as { bannedUntil?: string | null } | undefined)\n ?.bannedUntil;\n const isBanned = !!bannedUntil && new Date(bannedUntil) > new Date();\n\n const onSubmit = form.handleSubmit(async (d) => {\n const base = {\n fullName: d.fullName,\n email: d.email?.trim() || undefined,\n phone: d.phone?.trim() || undefined,\n emailVerified: d.emailVerified,\n phoneVerified: d.phoneVerified,\n };\n if (mode === 'new') {\n await create.mutateAsync({\n body: {\n ...base,\n email: base.email || undefined,\n phone: base.phone || undefined,\n },\n });\n } else if (userId) {\n await update.mutateAsync({\n params: { path: { id: userId } },\n body: {\n ...base,\n email: base.email ?? null,\n phone: base.phone ?? null,\n roleIds: d.roleIds,\n },\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 onBanUnban = async () => {\n if (!userId) {\n return;\n }\n await ban.mutateAsync({\n params: { path: { id: userId } },\n body: {\n bannedUntil: isBanned ? null : '9999-12-31T23:59:59.999Z',\n },\n });\n onSuccess?.();\n };\n\n const toggleRole = (roleId: string, checked: boolean) => {\n const next = checked\n ? [...roleIds, roleId]\n : roleIds.filter((id) => id !== roleId);\n setValue('roleIds', next, { shouldDirty: true });\n };\n\n const isSubmitting = create.isPending || update.isPending;\n const isBanning = ban.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 size=\"lg\"\n form={\n userLoading && mode === 'edit' ? (\n <FormSkeleton />\n ) : (\n <Form {...form}>\n <form onSubmit={onSubmit} className=\"space-y-6\">\n <Stack>\n <FormField\n control={control}\n name=\"fullName\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>\n Full name <span className=\"text-destructive\">*</span>\n </FormLabel>\n <FormControl>\n <Input placeholder=\"Full name\" {...field} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={control}\n name=\"email\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Email</FormLabel>\n <FormControl>\n <Input\n type=\"email\"\n placeholder=\"user@example.com\"\n {...field}\n value={field.value ?? ''}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={control}\n name=\"phone\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Phone</FormLabel>\n <FormControl>\n <Input\n placeholder=\"+251911223344\"\n {...field}\n value={field.value ?? ''}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <div className=\"space-y-4\">\n <FormLabel>Verification</FormLabel>\n <div className=\"flex flex-wrap gap-6 pt-1\">\n <FormField\n control={control}\n name=\"emailVerified\"\n render={({ field }) => (\n <FormItem className=\"flex flex-row items-center gap-2 space-y-0\">\n <FormControl>\n <Checkbox\n size=\"lg\"\n checked={field.value}\n disabled={!hasEmail}\n onCheckedChange={(c) =>\n field.onChange(c === true)\n }\n />\n </FormControl>\n <FormLabel className=\"cursor-pointer font-normal\">\n Email verified\n </FormLabel>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={control}\n name=\"phoneVerified\"\n render={({ field }) => (\n <FormItem className=\"flex flex-row items-center gap-2 space-y-0\">\n <FormControl>\n <Checkbox\n size=\"lg\"\n checked={field.value}\n disabled={!hasPhone}\n onCheckedChange={(c) =>\n field.onChange(c === true)\n }\n />\n </FormControl>\n <FormLabel className=\"cursor-pointer font-normal\">\n Phone verified\n </FormLabel>\n <FormMessage />\n </FormItem>\n )}\n />\n </div>\n </div>\n </Stack>\n\n {mode === 'edit' && roles.length > 0 && (\n <div className=\"space-y-4\">\n <FormLabel>Roles</FormLabel>\n <div className=\"flex flex-col gap-3 pt-1\">\n {roles.map((role: Role) => {\n const desc = str(role.description);\n return (\n <div key={role.id} className=\"flex items-start gap-3\">\n <Checkbox\n size=\"lg\"\n id={`role-${role.id}`}\n checked={roleIds.includes(role.id)}\n onCheckedChange={(c) =>\n toggleRole(role.id, c === true)\n }\n className=\"mt-0.5\"\n />\n <label\n htmlFor={`role-${role.id}`}\n className=\"flex min-w-0 flex-1 cursor-pointer flex-col gap-0.5\"\n >\n <span className=\"text-sm font-medium\">\n {str(role.name) || role.code}\n </span>\n {desc ? (\n <span className=\"text-xs text-muted-foreground\">\n {desc}\n </span>\n ) : null}\n </label>\n </div>\n );\n })}\n </div>\n </div>\n )}\n </form>\n </Form>\n )\n }\n actions={\n <div className=\"flex items-center gap-2\">\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={userLoading && mode === 'edit'}\n itemName=\"user\"\n />\n {mode === 'edit' && userId && (\n <AlertDialog>\n <AlertDialogTrigger\n render={\n <Button\n variant=\"outline\"\n disabled={userLoading}\n loading={isBanning}\n className=\"cursor-pointer\"\n leftIcon={\n isBanned ? (\n <IconUserCheck className=\"size-4\" />\n ) : (\n <IconBan className=\"size-4\" />\n )\n }\n />\n }\n >\n {isBanned ? 'Unban' : 'Ban'}\n </AlertDialogTrigger>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>\n {isBanned ? 'Unban user?' : 'Ban user?'}\n </AlertDialogTitle>\n <AlertDialogDescription>\n {isBanned\n ? 'This user will be able to sign in again.'\n : 'This user will not be able to sign in until unbanned.'}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction\n onClick={onBanUnban}\n variant={isBanned ? undefined : 'destructive'}\n >\n {isBanned ? 'Unban' : 'Ban'}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n )}\n </div>\n }\n />\n );\n}\n\nfunction FormSkeleton() {\n return (\n <div className=\"space-y-4\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div key={i} className=\"space-y-2\">\n <Skeleton className=\"h-4 w-20\" />\n <Skeleton className=\"h-10 w-full\" />\n </div>\n ))}\n </div>\n );\n}\n"],"mappings":"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","names":["Button","jsx","jsxs","Button"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/iam/tenants.tsx"],"sourcesContent":["'use client';\n\nimport { Badge, Button } from '@mesob/ui/components';\nimport { useState } from 'react';\nimport { useApi } from '../../provider';\nimport { DataTable, type DataTableColumn } from '../shared/data-table';\n\n// Tenant type from OpenAPI schema\ntype Tenant = {\n id: string;\n name: string;\n slug: string;\n status: string;\n createdAt: string;\n};\n\nexport function Tenants() {\n const { hooks } = useApi();\n const [page, setPage] = useState(1);\n const limit = 20;\n\n // Use openapi-react-query hooks\n const { data, isLoading, error } = hooks.useQuery('get', '/tenants', {\n params: {\n query: {\n page: String(page),\n limit: String(limit),\n },\n },\n });\n\n const columns: DataTableColumn<Tenant>[] = [\n {\n key: 'name',\n header: 'Tenant',\n cell: (tenant) => (\n <div>\n <p className=\"font-medium\">{tenant.name}</p>\n <p className=\"text-sm text-muted-foreground\">/{tenant.slug}</p>\n </div>\n ),\n },\n {\n key: 'status',\n header: 'Status',\n cell: (tenant) => (\n <Badge variant={tenant.status === 'active' ? 'default' : 'secondary'}>\n {tenant.status}\n </Badge>\n ),\n },\n {\n key: 'createdAt',\n header: 'Created',\n cell: (tenant) => (\n <p className=\"text-sm\">\n {new Date(tenant.createdAt).toLocaleDateString()}\n </p>\n ),\n },\n {\n key: 'actions',\n header: 'Actions',\n cell: (_tenant) => (\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\">\n Domains\n </Button>\n <Button variant=\"outline\" size=\"sm\">\n Edit\n </Button>\n </div>\n ),\n },\n ];\n\n if (error) {\n return (\n <div className=\"p-6 text-center\">\n <p className=\"text-destructive\">Error loading tenants</p>\n </div>\n );\n }\n\n return (\n <div className=\"w-full p-6 space-y-4\">\n <div className=\"flex justify-between items-center\">\n <div>\n <h1 className=\"text-3xl font-bold\">Tenants</h1>\n <p className=\"text-muted-foreground\">Manage tenant organizations</p>\n </div>\n <Button>Create Tenant</Button>\n </div>\n\n <DataTable\n data={(data as { tenants: Tenant[] })?.tenants || []}\n columns={columns}\n isLoading={isLoading}\n emptyMessage=\"No tenants found\"\n />\n\n {data &&\n 'tenants' in data &&\n data.tenants &&\n (data.tenants as Tenant[]).length >= limit && (\n <div className=\"flex justify-between items-center\">\n <Button\n variant=\"outline\"\n disabled={page === 1}\n onClick={() => setPage((prev) => prev - 1)}\n >\n Previous\n </Button>\n <span className=\"text-sm text-muted-foreground\">Page {page}</span>\n <Button\n variant=\"outline\"\n onClick={() => setPage((prev) => prev + 1)}\n >\n Next\n </Button>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;AAEA,SAAS,OAAO,cAAc;AAC9B,SAAS,gBAAgB;AAkCf,cACA,YADA;AArBH,SAAS,UAAU;AACxB,QAAM,EAAE,MAAM,IAAI,OAAO;AACzB,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,CAAC;AAClC,QAAM,QAAQ;AAGd,QAAM,EAAE,MAAM,WAAW,MAAM,IAAI,MAAM,SAAS,OAAO,YAAY;AAAA,IACnE,QAAQ;AAAA,MACN,OAAO;AAAA,QACL,MAAM,OAAO,IAAI;AAAA,QACjB,OAAO,OAAO,KAAK;AAAA,MACrB;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,UAAqC;AAAA,IACzC;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,MAAM,CAAC,WACL,qBAAC,SACC;AAAA,4BAAC,OAAE,WAAU,eAAe,iBAAO,MAAK;AAAA,QACxC,qBAAC,OAAE,WAAU,iCAAgC;AAAA;AAAA,UAAE,OAAO;AAAA,WAAK;AAAA,SAC7D;AAAA,IAEJ;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,MAAM,CAAC,WACL,oBAAC,SAAM,SAAS,OAAO,WAAW,WAAW,YAAY,aACtD,iBAAO,QACV;AAAA,IAEJ;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,MAAM,CAAC,WACL,oBAAC,OAAE,WAAU,WACV,cAAI,KAAK,OAAO,SAAS,EAAE,mBAAmB,GACjD;AAAA,IAEJ;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,MAAM,CAAC,YACL,qBAAC,SAAI,WAAU,cACb;AAAA,4BAAC,UAAO,SAAQ,WAAU,MAAK,MAAK,qBAEpC;AAAA,QACA,oBAAC,UAAO,SAAQ,WAAU,MAAK,MAAK,kBAEpC;AAAA,SACF;AAAA,IAEJ;AAAA,EACF;AAEA,MAAI,OAAO;AACT,WACE,oBAAC,SAAI,WAAU,mBACb,8BAAC,OAAE,WAAU,oBAAmB,mCAAqB,GACvD;AAAA,EAEJ;AAEA,SACE,qBAAC,SAAI,WAAU,wBACb;AAAA,yBAAC,SAAI,WAAU,qCACb;AAAA,2BAAC,SACC;AAAA,4BAAC,QAAG,WAAU,sBAAqB,qBAAO;AAAA,QAC1C,oBAAC,OAAE,WAAU,yBAAwB,yCAA2B;AAAA,SAClE;AAAA,MACA,oBAAC,UAAO,2BAAa;AAAA,OACvB;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,MAAO,MAAgC,WAAW,CAAC;AAAA,QACnD;AAAA,QACA;AAAA,QACA,cAAa;AAAA;AAAA,IACf;AAAA,IAEC,QACC,aAAa,QACb,KAAK,WACJ,KAAK,QAAqB,UAAU,SACnC,qBAAC,SAAI,WAAU,qCACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,UAAU,SAAS;AAAA,UACnB,SAAS,MAAM,QAAQ,CAAC,SAAS,OAAO,CAAC;AAAA,UAC1C;AAAA;AAAA,MAED;AAAA,MACA,qBAAC,UAAK,WAAU,iCAAgC;AAAA;AAAA,QAAM;AAAA,SAAK;AAAA,MAC3D;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,SAAS,MAAM,QAAQ,CAAC,SAAS,OAAO,CAAC;AAAA,UAC1C;AAAA;AAAA,MAED;AAAA,OACF;AAAA,KAEN;AAEJ;","names":[]}