@mesob/auth-react 0.5.8 → 0.5.10

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 (152) hide show
  1. package/dist/{chunk-YP5V56LW.js → chunk-22KICA5N.js} +3 -3
  2. package/dist/{chunk-XLPPZKU2.js → chunk-22WSB5V2.js} +15 -5
  3. package/dist/chunk-22WSB5V2.js.map +1 -0
  4. package/dist/{chunk-GQFTH5DQ.js → chunk-25DJGLNU.js} +12 -8
  5. package/dist/chunk-25DJGLNU.js.map +1 -0
  6. package/dist/{chunk-W2HMARW4.js → chunk-2BF2JIDK.js} +3 -3
  7. package/dist/{chunk-4LHFPVAY.js → chunk-4YPLJ2P6.js} +7 -13
  8. package/dist/chunk-4YPLJ2P6.js.map +1 -0
  9. package/dist/{chunk-SA6HTWCL.js → chunk-5FNUPWPO.js} +2 -2
  10. package/dist/{chunk-6AV6I5B4.js → chunk-75K2SCNC.js} +3 -3
  11. package/dist/{chunk-YCVDEX5U.js → chunk-7QJBDRTL.js} +6 -5
  12. package/dist/chunk-7QJBDRTL.js.map +1 -0
  13. package/dist/{chunk-FCPN2FD7.js → chunk-B7BS57X7.js} +10 -4
  14. package/dist/chunk-B7BS57X7.js.map +1 -0
  15. package/dist/{chunk-FLGP4ROM.js → chunk-CBR5NTFM.js} +14 -8
  16. package/dist/chunk-CBR5NTFM.js.map +1 -0
  17. package/dist/chunk-DBTKXQV7.js +13 -0
  18. package/dist/chunk-DBTKXQV7.js.map +1 -0
  19. package/dist/{chunk-PUOQX6DR.js → chunk-DQB4WY5T.js} +4 -4
  20. package/dist/{chunk-TPG4RW7H.js → chunk-DRAUYDZ5.js} +2 -2
  21. package/dist/{chunk-IBRB7ABJ.js → chunk-G2RWFKGF.js} +2 -2
  22. package/dist/{chunk-EIJFTUTM.js → chunk-GP4XI5KB.js} +3 -3
  23. package/dist/{chunk-22AQI2FA.js → chunk-GWRMQSME.js} +5 -5
  24. package/dist/{chunk-XO5LLEGV.js → chunk-HOROLWBY.js} +2 -2
  25. package/dist/{chunk-YVHMCTLM.js → chunk-I46PN4JU.js} +2 -2
  26. package/dist/{chunk-VS5FEGMX.js → chunk-IUCTHMVY.js} +2 -2
  27. package/dist/{chunk-IFFWIROT.js → chunk-J7NROVB4.js} +2 -2
  28. package/dist/{chunk-FU4K62DS.js → chunk-KL2XZKDU.js} +2 -2
  29. package/dist/{chunk-VMAGFUOK.js → chunk-LI7WPOVY.js} +3 -3
  30. package/dist/{chunk-I34SXFQJ.js → chunk-LYCBL2W3.js} +4 -4
  31. package/dist/{chunk-A5ON3RKH.js → chunk-M2K6O5CN.js} +2 -2
  32. package/dist/chunk-M2K6O5CN.js.map +1 -0
  33. package/dist/{chunk-G4VPR4UC.js → chunk-M677DPBR.js} +2 -2
  34. package/dist/{chunk-BX75EFF3.js → chunk-MPZAPUVR.js} +4 -4
  35. package/dist/{chunk-V7HCZDJ4.js → chunk-NJGVOQIU.js} +4 -4
  36. package/dist/{chunk-HBQK5PAH.js → chunk-NPA7L57G.js} +2 -2
  37. package/dist/{chunk-TAJQ7O3U.js → chunk-ORQZZUVL.js} +2 -2
  38. package/dist/{chunk-5B6GREDA.js → chunk-OT2H5EHA.js} +2 -2
  39. package/dist/{chunk-NTDVUVZO.js → chunk-QNPK2H5A.js} +3 -3
  40. package/dist/{chunk-MDM3QYPM.js → chunk-QRYUUXNJ.js} +7 -6
  41. package/dist/chunk-QRYUUXNJ.js.map +1 -0
  42. package/dist/{chunk-Z4FXOZEJ.js → chunk-R7VVXH5U.js} +3 -3
  43. package/dist/{chunk-3GFTD46V.js → chunk-SLIIENXJ.js} +2 -2
  44. package/dist/{chunk-VWYJI2FU.js → chunk-TT3V6PC7.js} +4 -4
  45. package/dist/{chunk-ZOKBN5H4.js → chunk-UIXR5GF3.js} +2 -2
  46. package/dist/{chunk-XZAYLXLS.js → chunk-UV7JR3YU.js} +2 -2
  47. package/dist/{chunk-SX6WAVQS.js → chunk-VTANFZKG.js} +5 -5
  48. package/dist/{chunk-5XCUGCW7.js → chunk-VWGOCWRF.js} +9 -6
  49. package/dist/chunk-VWGOCWRF.js.map +1 -0
  50. package/dist/{chunk-WOJ3HM5R.js → chunk-WAMZL5CS.js} +4 -4
  51. package/dist/{chunk-DCWKYK3D.js → chunk-WY2F7475.js} +18 -10
  52. package/dist/chunk-WY2F7475.js.map +1 -0
  53. package/dist/{chunk-OMTV6IOB.js → chunk-XTLFZ77E.js} +2 -2
  54. package/dist/chunk-XTLFZ77E.js.map +1 -0
  55. package/dist/{chunk-H2W42KYL.js → chunk-Y6KURGWG.js} +2 -2
  56. package/dist/chunk-YR6SS2CC.js +11 -0
  57. package/dist/chunk-YR6SS2CC.js.map +1 -0
  58. package/dist/{chunk-BM3YKYGC.js → chunk-ZIUAYN37.js} +2 -2
  59. package/dist/components/auth/countdown.js +3 -3
  60. package/dist/components/auth/forgot-password.js +5 -3
  61. package/dist/components/auth/reset-password-form.js +3 -3
  62. package/dist/components/auth/set-password.js +5 -4
  63. package/dist/components/auth/sign-in.js +5 -4
  64. package/dist/components/auth/sign-up.js +5 -3
  65. package/dist/components/auth/verification-form.js +4 -4
  66. package/dist/components/auth/verify-email.js +5 -5
  67. package/dist/components/auth/verify-phone.js +5 -5
  68. package/dist/components/authorization/deny.js +2 -2
  69. package/dist/components/authorization/grant.js +2 -2
  70. package/dist/components/iam/domains-page.js +6 -6
  71. package/dist/components/iam/iam-guard.js +3 -3
  72. package/dist/components/iam/permission-selector.js +2 -2
  73. package/dist/components/iam/permissions-page.js +4 -4
  74. package/dist/components/iam/permissions.js +2 -2
  75. package/dist/components/iam/role-detail-layout.js +2 -2
  76. package/dist/components/iam/role-detail-page.js +4 -4
  77. package/dist/components/iam/role-permissions-page.js +5 -5
  78. package/dist/components/iam/roles-page.js +6 -6
  79. package/dist/components/iam/roles.js +2 -2
  80. package/dist/components/iam/sessions-page.js +6 -6
  81. package/dist/components/iam/sessions.js +2 -2
  82. package/dist/components/iam/tenants-page.js +6 -6
  83. package/dist/components/iam/tenants.js +2 -2
  84. package/dist/components/iam/users-page.js +7 -7
  85. package/dist/components/iam/users.js +2 -2
  86. package/dist/components/profile/account.js +2 -2
  87. package/dist/components/profile/change-email-form.js +8 -8
  88. package/dist/components/profile/change-password-form.js +2 -2
  89. package/dist/components/profile/change-phone-form.js +9 -9
  90. package/dist/components/profile/otp-verification-modal.js +5 -5
  91. package/dist/components/profile/profile-layout.js +3 -3
  92. package/dist/components/profile/request-change-email-form.js +2 -2
  93. package/dist/components/profile/request-change-phone-form.js +3 -3
  94. package/dist/components/profile/security.js +14 -14
  95. package/dist/components/profile/verify-change-email-form.js +6 -6
  96. package/dist/components/profile/verify-change-phone-form.js +6 -6
  97. package/dist/index.d.ts +1 -0
  98. package/dist/index.js +48 -44
  99. package/dist/index.js.map +1 -1
  100. package/dist/pages/auth/layout.js +1 -1
  101. package/dist/pages/iam/tenants/tenant-selector.js +3 -3
  102. package/dist/pages/iam/users/user-selector.js +4 -4
  103. package/dist/pages/profile/account.js +1 -1
  104. package/dist/pages/profile/security.js +1 -1
  105. package/dist/utils/normalize-email.d.ts +2 -0
  106. package/dist/utils/normalize-phone.d.ts +1 -0
  107. package/package.json +4 -4
  108. package/dist/chunk-4LHFPVAY.js.map +0 -1
  109. package/dist/chunk-5XCUGCW7.js.map +0 -1
  110. package/dist/chunk-A5ON3RKH.js.map +0 -1
  111. package/dist/chunk-DCWKYK3D.js.map +0 -1
  112. package/dist/chunk-FCPN2FD7.js.map +0 -1
  113. package/dist/chunk-FLGP4ROM.js.map +0 -1
  114. package/dist/chunk-GQFTH5DQ.js.map +0 -1
  115. package/dist/chunk-MDM3QYPM.js.map +0 -1
  116. package/dist/chunk-OMTV6IOB.js.map +0 -1
  117. package/dist/chunk-V2W3WPCZ.js +0 -22
  118. package/dist/chunk-V2W3WPCZ.js.map +0 -1
  119. package/dist/chunk-XLPPZKU2.js.map +0 -1
  120. package/dist/chunk-YCVDEX5U.js.map +0 -1
  121. /package/dist/{chunk-YP5V56LW.js.map → chunk-22KICA5N.js.map} +0 -0
  122. /package/dist/{chunk-W2HMARW4.js.map → chunk-2BF2JIDK.js.map} +0 -0
  123. /package/dist/{chunk-SA6HTWCL.js.map → chunk-5FNUPWPO.js.map} +0 -0
  124. /package/dist/{chunk-6AV6I5B4.js.map → chunk-75K2SCNC.js.map} +0 -0
  125. /package/dist/{chunk-PUOQX6DR.js.map → chunk-DQB4WY5T.js.map} +0 -0
  126. /package/dist/{chunk-TPG4RW7H.js.map → chunk-DRAUYDZ5.js.map} +0 -0
  127. /package/dist/{chunk-IBRB7ABJ.js.map → chunk-G2RWFKGF.js.map} +0 -0
  128. /package/dist/{chunk-EIJFTUTM.js.map → chunk-GP4XI5KB.js.map} +0 -0
  129. /package/dist/{chunk-22AQI2FA.js.map → chunk-GWRMQSME.js.map} +0 -0
  130. /package/dist/{chunk-XO5LLEGV.js.map → chunk-HOROLWBY.js.map} +0 -0
  131. /package/dist/{chunk-YVHMCTLM.js.map → chunk-I46PN4JU.js.map} +0 -0
  132. /package/dist/{chunk-VS5FEGMX.js.map → chunk-IUCTHMVY.js.map} +0 -0
  133. /package/dist/{chunk-IFFWIROT.js.map → chunk-J7NROVB4.js.map} +0 -0
  134. /package/dist/{chunk-FU4K62DS.js.map → chunk-KL2XZKDU.js.map} +0 -0
  135. /package/dist/{chunk-VMAGFUOK.js.map → chunk-LI7WPOVY.js.map} +0 -0
  136. /package/dist/{chunk-I34SXFQJ.js.map → chunk-LYCBL2W3.js.map} +0 -0
  137. /package/dist/{chunk-G4VPR4UC.js.map → chunk-M677DPBR.js.map} +0 -0
  138. /package/dist/{chunk-BX75EFF3.js.map → chunk-MPZAPUVR.js.map} +0 -0
  139. /package/dist/{chunk-V7HCZDJ4.js.map → chunk-NJGVOQIU.js.map} +0 -0
  140. /package/dist/{chunk-HBQK5PAH.js.map → chunk-NPA7L57G.js.map} +0 -0
  141. /package/dist/{chunk-TAJQ7O3U.js.map → chunk-ORQZZUVL.js.map} +0 -0
  142. /package/dist/{chunk-5B6GREDA.js.map → chunk-OT2H5EHA.js.map} +0 -0
  143. /package/dist/{chunk-NTDVUVZO.js.map → chunk-QNPK2H5A.js.map} +0 -0
  144. /package/dist/{chunk-Z4FXOZEJ.js.map → chunk-R7VVXH5U.js.map} +0 -0
  145. /package/dist/{chunk-3GFTD46V.js.map → chunk-SLIIENXJ.js.map} +0 -0
  146. /package/dist/{chunk-VWYJI2FU.js.map → chunk-TT3V6PC7.js.map} +0 -0
  147. /package/dist/{chunk-ZOKBN5H4.js.map → chunk-UIXR5GF3.js.map} +0 -0
  148. /package/dist/{chunk-XZAYLXLS.js.map → chunk-UV7JR3YU.js.map} +0 -0
  149. /package/dist/{chunk-SX6WAVQS.js.map → chunk-VTANFZKG.js.map} +0 -0
  150. /package/dist/{chunk-WOJ3HM5R.js.map → chunk-WAMZL5CS.js.map} +0 -0
  151. /package/dist/{chunk-H2W42KYL.js.map → chunk-Y6KURGWG.js.map} +0 -0
  152. /package/dist/{chunk-BM3YKYGC.js.map → chunk-ZIUAYN37.js.map} +0 -0
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-C5ZW7FD2.js";
4
4
  import {
5
5
  useSession
6
- } from "./chunk-A5ON3RKH.js";
6
+ } from "./chunk-M2K6O5CN.js";
7
7
 
8
8
  // src/components/profile/account.tsx
9
9
  import { Badge, Card, CardContent, Separator } from "@mesob/ui/components";
@@ -86,4 +86,4 @@ function Account() {
86
86
  export {
87
87
  Account
88
88
  };
89
- //# sourceMappingURL=chunk-IBRB7ABJ.js.map
89
+ //# sourceMappingURL=chunk-G2RWFKGF.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  Countdown
3
- } from "./chunk-IFFWIROT.js";
3
+ } from "./chunk-J7NROVB4.js";
4
4
  import {
5
5
  useTranslator
6
- } from "./chunk-HBQK5PAH.js";
6
+ } from "./chunk-NPA7L57G.js";
7
7
 
8
8
  // src/components/auth/verification-form.tsx
9
9
  import { zodResolver } from "@hookform/resolvers/zod";
@@ -96,4 +96,4 @@ var VerificationForm = ({
96
96
  export {
97
97
  VerificationForm
98
98
  };
99
- //# sourceMappingURL=chunk-EIJFTUTM.js.map
99
+ //# sourceMappingURL=chunk-GP4XI5KB.js.map
@@ -1,21 +1,21 @@
1
1
  import {
2
2
  UserCard,
3
3
  UserForm
4
- } from "./chunk-OMTV6IOB.js";
4
+ } from "./chunk-XTLFZ77E.js";
5
5
  import {
6
6
  Link,
7
7
  authApi$
8
- } from "./chunk-NTDVUVZO.js";
8
+ } from "./chunk-QNPK2H5A.js";
9
9
  import {
10
10
  defaultEntityQueryOptions
11
11
  } from "./chunk-NPW7D2HZ.js";
12
12
  import {
13
13
  IAMGuard
14
- } from "./chunk-BM3YKYGC.js";
14
+ } from "./chunk-ZIUAYN37.js";
15
15
  import {
16
16
  useApi,
17
17
  useConfig
18
- } from "./chunk-A5ON3RKH.js";
18
+ } from "./chunk-M2K6O5CN.js";
19
19
 
20
20
  // src/components/iam/users-page.tsx
21
21
  import {
@@ -1167,4 +1167,4 @@ function UsersPageContent() {
1167
1167
  export {
1168
1168
  UsersPage
1169
1169
  };
1170
- //# sourceMappingURL=chunk-22AQI2FA.js.map
1170
+ //# sourceMappingURL=chunk-GWRMQSME.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-TFVBER3Y.js";
4
4
  import {
5
5
  useApi
6
- } from "./chunk-A5ON3RKH.js";
6
+ } from "./chunk-M2K6O5CN.js";
7
7
 
8
8
  // src/components/iam/sessions.tsx
9
9
  import { Button } from "@mesob/ui/components";
@@ -95,4 +95,4 @@ function Sessions() {
95
95
  export {
96
96
  Sessions
97
97
  };
98
- //# sourceMappingURL=chunk-XO5LLEGV.js.map
98
+ //# sourceMappingURL=chunk-HOROLWBY.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useApi
3
- } from "./chunk-A5ON3RKH.js";
3
+ } from "./chunk-M2K6O5CN.js";
4
4
 
5
5
  // src/components/iam/permission-selector.tsx
6
6
  import {
@@ -90,4 +90,4 @@ function PermissionSelector({
90
90
  export {
91
91
  PermissionSelector
92
92
  };
93
- //# sourceMappingURL=chunk-YVHMCTLM.js.map
93
+ //# sourceMappingURL=chunk-I46PN4JU.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useSession
3
- } from "./chunk-A5ON3RKH.js";
3
+ } from "./chunk-M2K6O5CN.js";
4
4
 
5
5
  // src/components/profile/change-password-form.tsx
6
6
  import { zodResolver } from "@hookform/resolvers/zod";
@@ -236,4 +236,4 @@ function ChangePasswordForm() {
236
236
  export {
237
237
  ChangePasswordForm
238
238
  };
239
- //# sourceMappingURL=chunk-VS5FEGMX.js.map
239
+ //# sourceMappingURL=chunk-IUCTHMVY.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useTranslator
3
- } from "./chunk-HBQK5PAH.js";
3
+ } from "./chunk-NPA7L57G.js";
4
4
 
5
5
  // src/components/auth/countdown.tsx
6
6
  import { Spinner } from "@mesob/ui/components";
@@ -61,4 +61,4 @@ var Countdown = ({
61
61
  export {
62
62
  Countdown
63
63
  };
64
- //# sourceMappingURL=chunk-IFFWIROT.js.map
64
+ //# sourceMappingURL=chunk-J7NROVB4.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useSession
3
- } from "./chunk-A5ON3RKH.js";
3
+ } from "./chunk-M2K6O5CN.js";
4
4
 
5
5
  // src/components/authorization/grant.tsx
6
6
  import { grant as canGrant } from "@mesob/common";
@@ -25,4 +25,4 @@ function Grant({
25
25
  export {
26
26
  Grant
27
27
  };
28
- //# sourceMappingURL=chunk-FU4K62DS.js.map
28
+ //# sourceMappingURL=chunk-KL2XZKDU.js.map
@@ -3,11 +3,11 @@ import {
3
3
  } from "./chunk-NPW7D2HZ.js";
4
4
  import {
5
5
  IAMGuard
6
- } from "./chunk-BM3YKYGC.js";
6
+ } from "./chunk-ZIUAYN37.js";
7
7
  import {
8
8
  useApi,
9
9
  useConfig
10
- } from "./chunk-A5ON3RKH.js";
10
+ } from "./chunk-M2K6O5CN.js";
11
11
 
12
12
  // src/components/iam/permissions-page.tsx
13
13
  import {
@@ -278,4 +278,4 @@ function PermissionsPageContent() {
278
278
  export {
279
279
  PermissionsPage
280
280
  };
281
- //# sourceMappingURL=chunk-VMAGFUOK.js.map
281
+ //# sourceMappingURL=chunk-LI7WPOVY.js.map
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  authApi$
3
- } from "./chunk-NTDVUVZO.js";
3
+ } from "./chunk-QNPK2H5A.js";
4
4
  import {
5
5
  defaultEntityQueryOptions
6
6
  } from "./chunk-NPW7D2HZ.js";
7
7
  import {
8
8
  IAMGuard
9
- } from "./chunk-BM3YKYGC.js";
9
+ } from "./chunk-ZIUAYN37.js";
10
10
  import {
11
11
  useApi,
12
12
  useConfig
13
- } from "./chunk-A5ON3RKH.js";
13
+ } from "./chunk-M2K6O5CN.js";
14
14
 
15
15
  // src/components/iam/sessions-page.tsx
16
16
  import {
@@ -271,4 +271,4 @@ function SessionsPageContent() {
271
271
  export {
272
272
  SessionsPage
273
273
  };
274
- //# sourceMappingURL=chunk-I34SXFQJ.js.map
274
+ //# sourceMappingURL=chunk-LYCBL2W3.js.map
@@ -59,7 +59,7 @@ var defaultAuthClientConfig = {
59
59
  locale: "en"
60
60
  },
61
61
  prefix: "msb",
62
- phoneRegex: /^(\+2519|\+2517|2519|2517|09|07)\d{8}$/
62
+ phoneRegex: /^\+251[79]\d{8}$/
63
63
  };
64
64
 
65
65
  // src/utils/custom-fetch.ts
@@ -291,4 +291,4 @@ export {
291
291
  useHasAuthCookie,
292
292
  MesobAuthProvider
293
293
  };
294
- //# sourceMappingURL=chunk-A5ON3RKH.js.map
294
+ //# sourceMappingURL=chunk-M2K6O5CN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/cookie.ts","../src/provider.tsx","../src/lib/translations.ts","../src/types.ts","../src/utils/custom-fetch.ts"],"sourcesContent":["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.prefix?.trim() || config.cookiePrefix?.trim() || '';\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 { 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 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 await signOutMutation.mutateAsync({});\n clearAuth();\n\n const redirectUrl = config.navigation?.defaultRedirectUrl || '/';\n\n if (config.navigation?.onNavigate) {\n config.navigation.onNavigate(redirectUrl);\n } else if (typeof window !== 'undefined') {\n window.location.href = redirectUrl;\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","type Messages = Record<string, unknown>;\n\nexport function createTranslator(messages: Messages, namespace?: string) {\n return (key: string, params?: Record<string, string | number>): string => {\n const fullKey = namespace ? `${namespace}.${key}` : key;\n const keys = fullKey.split('.');\n\n let value: unknown = messages;\n for (const k of keys) {\n if (value && typeof value === 'object' && value !== null) {\n value = (value as Record<string, unknown>)[k];\n } else {\n return fullKey;\n }\n }\n\n if (typeof value !== 'string') {\n return fullKey;\n }\n\n // Simple parameter replacement\n if (params) {\n return value.replace(/\\{(\\w+)\\}/g, (_, param) =>\n String(params[param] ?? `{${param}}`),\n );\n }\n\n return value;\n };\n}\n","import type { PermissionTree } from '@mesob/common';\n\nexport type UIConfig = {\n logo: React.ReactNode;\n name: React.ReactNode;\n logoImage?: string;\n};\n\nexport type FeaturesConfig = {\n enableSignup?: boolean;\n enablePasswordReset?: boolean;\n enableEmailSignup?: boolean;\n enablePhoneSignup?: boolean;\n enableEmailSignIn?: boolean;\n enablePhoneSignIn?: boolean;\n allowedSignupEmailDomains?: string[];\n enableSocialSignup?: boolean;\n socialProviders?: string[];\n};\n\nexport type TenantConfig = {\n enabled: boolean;\n tenantId: string;\n};\n\nexport type NavigationConfig = {\n locale?: string;\n defaultRedirectUrl?: string;\n onNavigate?: (path: string) => void;\n linkComponent?: React.ComponentType<\n React.ComponentProps<'a'> & { href: string }\n >;\n links?: {\n signIn?: string;\n signUp?: string;\n forgotPassword?: string;\n setPassword?: string;\n };\n};\n\nexport type AuthClientConfig = {\n baseURL: string;\n ui: UIConfig;\n features?: FeaturesConfig;\n tenant?: TenantConfig;\n permissions?: PermissionTree;\n navigation?: NavigationConfig;\n messages?: Record<string, unknown>;\n /** @deprecated use `prefix` */\n cookiePrefix?: string;\n /** Must match API `prefix` (session cookie + KV namespace). */\n prefix?: string;\n phoneRegex?: RegExp | string;\n /** Default userType filter for users list (e.g. 'employee'). Omit or 'all' to show all. */\n defaultUserType?: string;\n};\n\ntype DefaultAuthClientConfig = {\n readonly features: {\n readonly enableSignup: true;\n readonly enablePasswordReset: true;\n readonly enableEmailSignup: true;\n readonly enablePhoneSignup: true;\n readonly enableEmailSignIn: true;\n readonly enablePhoneSignIn: true;\n readonly allowedSignupEmailDomains: [];\n readonly enableSocialSignup: false;\n readonly socialProviders: [];\n };\n readonly navigation: {\n readonly locale: 'en';\n };\n readonly prefix: 'msb';\n readonly phoneRegex: RegExp;\n};\n\nexport const defaultAuthClientConfig: DefaultAuthClientConfig = {\n features: {\n enableSignup: true,\n enablePasswordReset: true,\n enableEmailSignup: true,\n enablePhoneSignup: true,\n enableEmailSignIn: true,\n enablePhoneSignIn: true,\n allowedSignupEmailDomains: [],\n enableSocialSignup: false,\n socialProviders: [],\n },\n navigation: {\n locale: 'en',\n },\n prefix: 'msb',\n phoneRegex: /^\\+251[79]\\d{8}$/,\n} as const;\n\nexport type User = {\n id: string;\n tenantId: string;\n fullName: string;\n email: string | null;\n phone: string | null;\n handle?: string;\n image: string | null;\n emailVerified: boolean;\n phoneVerified: boolean;\n lastSignInAt?: string | null;\n /** Role IDs */\n roles?: string[] | null;\n roleCodes?: string[] | null;\n permissions?: string[] | null;\n};\n\nexport type Session = {\n id?: string;\n expiresAt: string;\n createdAt?: string;\n userAgent?: string | null;\n ip?: string | null;\n};\n\nexport type AuthResponse = {\n user: User;\n session: Session;\n sessionToken?: string;\n sessionExpiresAt?: string;\n};\n\nexport type AuthErrorCode =\n | 'USER_NOT_FOUND'\n | 'INVALID_PASSWORD'\n | 'USER_EXISTS'\n | 'VERIFICATION_EXPIRED'\n | 'VERIFICATION_MISMATCH'\n | 'VERIFICATION_NOT_FOUND'\n | 'TOO_MANY_ATTEMPTS'\n | 'REQUIRES_VERIFICATION'\n | 'UNAUTHORIZED'\n | 'ACCESS_DENIED'\n | 'HAS_NO_PASSWORD'\n | 'PASSWORD_ALREADY_SET'\n | 'RATE_LIMITED';\n\nexport type AuthError = {\n message: string;\n code?: AuthErrorCode;\n status?: number;\n details?: Record<string, unknown>;\n};\n","import type { AuthClientConfig } from '../types';\n\nexport const createCustomFetch = (_config: AuthClientConfig) => {\n return (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n if (input instanceof Request) {\n return fetch(input, { ...init, credentials: 'include' });\n }\n return fetch(input, { ...init, credentials: 'include' });\n };\n};\n"],"mappings":"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","names":["error"]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  useApi,
3
3
  useSession
4
- } from "./chunk-A5ON3RKH.js";
4
+ } from "./chunk-M2K6O5CN.js";
5
5
 
6
6
  // src/components/profile/request-change-email-form.tsx
7
7
  import { zodResolver } from "@hookform/resolvers/zod";
@@ -252,4 +252,4 @@ function RequestChangeEmailForm({
252
252
  export {
253
253
  RequestChangeEmailForm
254
254
  };
255
- //# sourceMappingURL=chunk-G4VPR4UC.js.map
255
+ //# sourceMappingURL=chunk-M677DPBR.js.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  VerifyChangePhoneForm
3
- } from "./chunk-Z4FXOZEJ.js";
3
+ } from "./chunk-R7VVXH5U.js";
4
4
  import {
5
5
  RequestChangePhoneForm
6
- } from "./chunk-4LHFPVAY.js";
6
+ } from "./chunk-4YPLJ2P6.js";
7
7
  import {
8
8
  useSession
9
- } from "./chunk-A5ON3RKH.js";
9
+ } from "./chunk-M2K6O5CN.js";
10
10
 
11
11
  // src/components/profile/change-phone-form.tsx
12
12
  import {
@@ -91,4 +91,4 @@ function ChangePhoneForm() {
91
91
  export {
92
92
  ChangePhoneForm
93
93
  };
94
- //# sourceMappingURL=chunk-BX75EFF3.js.map
94
+ //# sourceMappingURL=chunk-MPZAPUVR.js.map
@@ -4,17 +4,17 @@ import {
4
4
  import {
5
5
  Link,
6
6
  authApi$
7
- } from "./chunk-NTDVUVZO.js";
7
+ } from "./chunk-QNPK2H5A.js";
8
8
  import {
9
9
  defaultEntityQueryOptions
10
10
  } from "./chunk-NPW7D2HZ.js";
11
11
  import {
12
12
  IAMGuard
13
- } from "./chunk-BM3YKYGC.js";
13
+ } from "./chunk-ZIUAYN37.js";
14
14
  import {
15
15
  useApi,
16
16
  useConfig
17
- } from "./chunk-A5ON3RKH.js";
17
+ } from "./chunk-M2K6O5CN.js";
18
18
 
19
19
  // src/components/iam/tenants-page.tsx
20
20
  import {
@@ -541,4 +541,4 @@ function TenantsPageContent() {
541
541
  export {
542
542
  TenantsPage
543
543
  };
544
- //# sourceMappingURL=chunk-V7HCZDJ4.js.map
544
+ //# sourceMappingURL=chunk-NJGVOQIU.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createTranslator,
3
3
  useConfig
4
- } from "./chunk-A5ON3RKH.js";
4
+ } from "./chunk-M2K6O5CN.js";
5
5
 
6
6
  // src/hooks/use-translator.ts
7
7
  import { useMesob } from "@mesob/ui/providers";
@@ -20,4 +20,4 @@ function useTranslator(namespace) {
20
20
  export {
21
21
  useTranslator
22
22
  };
23
- //# sourceMappingURL=chunk-HBQK5PAH.js.map
23
+ //# sourceMappingURL=chunk-NPA7L57G.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-TFVBER3Y.js";
4
4
  import {
5
5
  useApi
6
- } from "./chunk-A5ON3RKH.js";
6
+ } from "./chunk-M2K6O5CN.js";
7
7
 
8
8
  // src/components/iam/users.tsx
9
9
  import { Badge, Button } from "@mesob/ui/components";
@@ -104,4 +104,4 @@ function Users() {
104
104
  export {
105
105
  Users
106
106
  };
107
- //# sourceMappingURL=chunk-TAJQ7O3U.js.map
107
+ //# sourceMappingURL=chunk-ORQZZUVL.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useSession
3
- } from "./chunk-A5ON3RKH.js";
3
+ } from "./chunk-M2K6O5CN.js";
4
4
 
5
5
  // src/components/authorization/deny.tsx
6
6
  import { deny as canDeny } from "@mesob/common";
@@ -20,4 +20,4 @@ function Deny({ permissions, userPermissions, children }) {
20
20
  export {
21
21
  Deny
22
22
  };
23
- //# sourceMappingURL=chunk-5B6GREDA.js.map
23
+ //# sourceMappingURL=chunk-OT2H5EHA.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  AppLink,
3
3
  useNavigate
4
- } from "./chunk-3GFTD46V.js";
4
+ } from "./chunk-SLIIENXJ.js";
5
5
  import {
6
6
  useApi
7
- } from "./chunk-A5ON3RKH.js";
7
+ } from "./chunk-M2K6O5CN.js";
8
8
 
9
9
  // src/pages/iam/shared/page-helpers.tsx
10
10
  import { jsx } from "react/jsx-runtime";
@@ -33,4 +33,4 @@ export {
33
33
  Link,
34
34
  useRouter
35
35
  };
36
- //# sourceMappingURL=chunk-NTDVUVZO.js.map
36
+ //# sourceMappingURL=chunk-QNPK2H5A.js.map
@@ -5,17 +5,17 @@ import {
5
5
  Link,
6
6
  authApi$,
7
7
  useRouter
8
- } from "./chunk-NTDVUVZO.js";
8
+ } from "./chunk-QNPK2H5A.js";
9
9
  import {
10
10
  defaultEntityQueryOptions
11
11
  } from "./chunk-NPW7D2HZ.js";
12
12
  import {
13
13
  IAMGuard
14
- } from "./chunk-BM3YKYGC.js";
14
+ } from "./chunk-ZIUAYN37.js";
15
15
  import {
16
16
  useApi,
17
17
  useConfig
18
- } from "./chunk-A5ON3RKH.js";
18
+ } from "./chunk-M2K6O5CN.js";
19
19
 
20
20
  // src/components/iam/roles-page.tsx
21
21
  import {
@@ -112,6 +112,7 @@ function RoleForm({
112
112
  defaultValues: defaults
113
113
  });
114
114
  const { reset, formState, control, register, setValue } = form;
115
+ const registerForLocaleFields = register;
115
116
  const nameVal = useWatch({ control, name: "name" });
116
117
  const codeVal = useWatch({ control, name: "code" });
117
118
  useEffect(() => {
@@ -181,7 +182,7 @@ function RoleForm({
181
182
  label: "Name",
182
183
  field: "name",
183
184
  required: true,
184
- register,
185
+ register: registerForLocaleFields,
185
186
  errors: formState.errors,
186
187
  placeholder: "e.g. Administrator",
187
188
  disabled: !editable
@@ -214,7 +215,7 @@ function RoleForm({
214
215
  {
215
216
  label: "Description",
216
217
  field: "description",
217
- register,
218
+ register: registerForLocaleFields,
218
219
  errors: formState.errors,
219
220
  placeholder: "Description",
220
221
  rows: 3,
@@ -588,4 +589,4 @@ export {
588
589
  RolesList,
589
590
  RolesPage
590
591
  };
591
- //# sourceMappingURL=chunk-MDM3QYPM.js.map
592
+ //# sourceMappingURL=chunk-QRYUUXNJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/iam/roles-page.tsx","../src/pages/iam/roles/_components/role-form.tsx","../src/pages/iam/roles/_components/roles-list.tsx","../src/pages/iam/roles/_components/role-card.tsx"],"sourcesContent":["'use client';\n\nimport {\n Button,\n EntityDrawerTrigger,\n EntityFilter,\n EntityHeader,\n EntitySearch,\n EntitySort,\n EntityViewToggle,\n PageBody,\n PageContainer,\n useBreadcrumbs,\n useEntityPagination,\n useEntityParams,\n} from '@mesob/ui/components';\nimport { IconShield } from '@tabler/icons-react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useState } from 'react';\nimport { toast } from 'sonner';\nimport type { paths } from '../../data/openapi';\nimport { defaultEntityQueryOptions } from '../../lib/query-options';\nimport { RoleForm } from '../../pages/iam/roles/_components/role-form';\nimport { RolesList } from '../../pages/iam/roles/_components/roles-list';\nimport { useApi, useConfig } from '../../provider';\nimport { IAMGuard } from './iam-guard';\n\nexport function RolesPage() {\n return (\n <IAMGuard>\n <RolesPageContent />\n </IAMGuard>\n );\n}\n\nfunction RolesPageContent() {\n const { hooks } = useApi();\n const { config } = useConfig();\n const homeHref = config.navigation?.defaultRedirectUrl || '/';\n const qc = useQueryClient();\n useBreadcrumbs({\n items: [\n { label: 'Home', href: homeHref },\n { label: 'IAM', href: '/iam/roles' },\n { label: 'Roles' },\n ],\n });\n\n const [createOpen, setCreateOpen] = useState(false);\n const { queryConfig, params, setParams } = useEntityParams({\n searchKey: 'search',\n });\n const rolesQuery = queryConfig as {\n params: {\n query: NonNullable<paths['/roles']['get']['parameters']['query']>;\n };\n };\n\n const { data, isPending, isFetching } = hooks.useQuery(\n 'get',\n '/roles',\n rolesQuery,\n defaultEntityQueryOptions,\n );\n\n const seedRoles = hooks.useMutation('post', '/roles/seed', {\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: ['get', '/roles'] });\n toast.success('Roles seeded');\n },\n onError: () => {\n toast.error('Failed to seed roles');\n },\n });\n\n const isLoading = isPending || isFetching;\n const roles = data?.roles ?? [];\n const { total, pageCount } = useEntityPagination({\n items: roles,\n total: data?.total,\n pageSize: params.pageSize,\n });\n\n return (\n <PageContainer className=\"flex flex-1 flex-col gap-4 p-4 pt-0\">\n <PageBody className=\"px-0\">\n <EntityHeader\n icon={<IconShield className=\"h-5 w-5\" />}\n title=\"Roles\"\n actions={\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n onClick={() => seedRoles.mutate({})}\n loading={seedRoles.isPending}\n >\n Seed Roles\n </Button>\n <EntityDrawerTrigger\n mode=\"new\"\n entity=\"Role\"\n open={createOpen}\n onOpenChange={setCreateOpen}\n >\n {(open, onClose) => (\n <RoleForm mode=\"new\" open={open} onClose={onClose} />\n )}\n </EntityDrawerTrigger>\n </div>\n }\n search={\n <EntitySearch paramKey=\"search\" placeholder=\"Search roles...\" />\n }\n filter={\n <EntityFilter\n options={[\n { label: 'All', value: '' },\n { label: 'By Code', value: 'code' },\n ]}\n placeholder=\"Filter\"\n />\n }\n sort={\n <EntitySort\n options={[\n { label: 'Created', value: 'createdAt' },\n { label: 'Updated', value: 'updatedAt' },\n { label: 'Code', value: 'code' },\n ]}\n />\n }\n view={<EntityViewToggle views={['table', 'card']} />}\n />\n <RolesList\n data={roles}\n isLoading={isLoading}\n view={(params.view || 'table') as 'table' | 'card'}\n pageIndex={params.page - 1}\n pageSize={params.pageSize}\n pageCount={pageCount}\n totalRows={total}\n onCreateNew={() => setCreateOpen(true)}\n onPageChange={(p) => setParams({ page: p + 1 })}\n onPageSizeChange={(size) => setParams({ pageSize: size, page: 1 })}\n />\n </PageBody>\n </PageContainer>\n );\n}\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport {\n EntityDrawer,\n EntityFormActions,\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n Input,\n LocaleInputText,\n LocaleInputTextarea,\n Skeleton,\n} from '@mesob/ui/components';\nimport { useLocaleConfig, useLocaleSchemas } from '@mesob/ui/providers';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useEffect, useMemo } from 'react';\nimport type { FieldValues, Resolver, UseFormRegister } from 'react-hook-form';\nimport { useForm, useWatch } from 'react-hook-form';\nimport { z } from 'zod';\nimport { authApi$ } from '../../shared/page-helpers';\n\ntype RoleFormData = {\n name: Record<string, string>;\n code: string;\n description: Record<string, string>;\n permissionIds: string[];\n};\n\ntype RoleFormProps = {\n mode: 'new' | 'edit';\n roleId?: string;\n open: boolean;\n onClose: () => void;\n onSuccess?: () => void;\n};\n\nexport function RoleForm({\n mode,\n roleId,\n open,\n onClose,\n onSuccess,\n}: RoleFormProps) {\n const qc = useQueryClient();\n const { localeInputDefault, requiredSchema, optionalSchema } =\n useLocaleSchemas();\n const { defaultLanguage } = useLocaleConfig();\n const schema = useMemo(\n () =>\n z.object({\n name: requiredSchema,\n code: z.string().min(1, 'Code is required'),\n description: optionalSchema,\n permissionIds: z.array(z.string()),\n }),\n [requiredSchema, optionalSchema],\n );\n const defaults: RoleFormData = useMemo(\n () => ({\n name: { ...localeInputDefault },\n code: '',\n description: { ...localeInputDefault },\n permissionIds: [],\n }),\n [localeInputDefault],\n );\n\n const { data, isLoading } = authApi$.useQuery(\n 'get',\n '/roles/{id}',\n { params: { path: { id: roleId ?? '' } } },\n { enabled: mode === 'edit' && !!roleId },\n );\n const create = authApi$.useMutation('post', '/roles', {\n onSuccess: () => qc.invalidateQueries({ queryKey: ['get', '/roles'] }),\n });\n const update = authApi$.useMutation('put', '/roles/{id}', {\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: ['get', '/roles'] });\n if (roleId) {\n qc.invalidateQueries({ queryKey: ['get', '/roles/{id}'] });\n }\n },\n });\n const del = authApi$.useMutation('delete', '/roles/{id}', {\n onSuccess: () => qc.invalidateQueries({ queryKey: ['get', '/roles'] }),\n });\n\n const form = useForm<RoleFormData>({\n resolver: zodResolver(schema) as Resolver<RoleFormData>,\n defaultValues: defaults,\n });\n\n const { reset, formState, control, register, setValue } = form;\n /** Locale inputs are typed with `FieldValues`; narrow cast avoids RHF `deps` mismatch. */\n const registerForLocaleFields =\n register as unknown as UseFormRegister<FieldValues>;\n const nameVal = useWatch({ control, name: 'name' });\n const codeVal = useWatch({ control, name: 'code' });\n\n useEffect(() => {\n const nameDefault =\n typeof nameVal === 'object' &&\n nameVal !== null &&\n defaultLanguage in nameVal\n ? ((nameVal as Record<string, string>)[defaultLanguage] ?? '')\n : '';\n if (\n mode === 'new' &&\n typeof nameDefault === 'string' &&\n nameDefault.trim().length > 0 &&\n !codeVal\n ) {\n const code = nameDefault\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n if (code) {\n setValue('code', code);\n }\n }\n }, [mode, nameVal, setValue, codeVal, defaultLanguage]);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n if (mode === 'edit' && data?.role && !isLoading) {\n const r = data.role;\n reset({\n name: (r.name ?? {}) as RoleFormData['name'],\n code: r.code,\n description: (r.description ?? {}) as RoleFormData['description'],\n permissionIds: r.permissionIds ?? [],\n });\n } else {\n reset({ ...defaults, permissionIds: [] });\n }\n }, [mode, data, open, isLoading, reset, defaults]);\n\n const onSubmit = form.handleSubmit(async (d) => {\n const body = {\n name: d.name,\n code: d.code,\n description: d.description ?? undefined,\n permissionIds: d.permissionIds,\n };\n if (mode === 'new') {\n await create.mutateAsync({ body });\n } else if (roleId) {\n await update.mutateAsync({\n params: { path: { id: roleId } },\n body,\n });\n }\n onSuccess?.();\n onClose();\n });\n\n const onDelete = async () => {\n if (!roleId) {\n return;\n }\n await del.mutateAsync({ params: { path: { id: roleId } } });\n onSuccess?.();\n onClose();\n };\n\n const editable = mode === 'new' || data?.role?.isEditable !== false;\n\n return (\n <EntityDrawer\n title={mode === 'new' ? 'New role' : 'Edit role'}\n open={open}\n onClose={onClose}\n isDirty={formState.isDirty}\n size=\"md\"\n form={\n isLoading ? (\n <FormSkeleton />\n ) : (\n <Form {...form}>\n <form onSubmit={onSubmit} className=\"space-y-4\">\n <LocaleInputText\n label=\"Name\"\n field=\"name\"\n required\n register={registerForLocaleFields}\n errors={formState.errors}\n placeholder=\"e.g. Administrator\"\n disabled={!editable}\n />\n <FormField\n control={control}\n name=\"code\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>\n Code <span className=\"text-destructive\">*</span>\n </FormLabel>\n <FormControl>\n <Input\n placeholder=\"e.g. admin\"\n disabled={!editable}\n {...field}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <LocaleInputTextarea\n label=\"Description\"\n field=\"description\"\n register={registerForLocaleFields}\n errors={formState.errors}\n placeholder=\"Description\"\n rows={3}\n disabled={!editable}\n />\n </form>\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={create.isPending || update.isPending}\n isDeleting={del.isPending}\n disabled={isLoading || !editable}\n itemName=\"role\"\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-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-24\" />\n <Skeleton className=\"h-20 w-full\" />\n </div>\n </div>\n );\n}\n","'use client';\n\nimport {\n Badge,\n DataTableAction,\n DataTablePagination,\n DisplayTable,\n EntityEmptyState,\n EntityLoadingState,\n Tbody,\n Td,\n Th,\n Thead,\n Tr,\n} from '@mesob/ui/components';\nimport { IconCalendar, IconShield } from '@tabler/icons-react';\nimport { useState } from 'react';\nimport { Link } from '../../shared/page-helpers';\nimport { RoleCard } from './role-card';\nimport { RoleForm } from './role-form';\nimport type { Role } from './roles-data';\nimport { str } from './roles-data';\n\nconst TABLE_COLUMN_COUNT = 5;\n\ntype RolesListProps = {\n data: Role[];\n isLoading?: boolean;\n view: 'table' | 'card';\n pageIndex: number;\n pageSize: number;\n pageCount: number;\n totalRows: number;\n onPageChange: (page: number) => void;\n onPageSizeChange: (size: number) => void;\n onCreateNew?: () => void;\n};\n\nexport function RolesList({\n data,\n isLoading,\n view,\n pageIndex,\n pageSize,\n pageCount,\n totalRows,\n onPageChange,\n onPageSizeChange,\n onCreateNew,\n}: RolesListProps) {\n const [drawerRole, setDrawerRole] = useState<Role | null>(null);\n\n if (isLoading) {\n return (\n <EntityLoadingState\n view={view}\n rowCount={pageSize}\n columnCount={TABLE_COLUMN_COUNT}\n cardCount={pageSize}\n />\n );\n }\n if (totalRows === 0) {\n return (\n <EntityEmptyState\n icon={IconShield}\n entityName=\"role\"\n title=\"No roles yet\"\n description=\"Create your first role to get started.\"\n onAction={onCreateNew}\n />\n );\n }\n if (view === 'table') {\n return (\n <div className=\"space-y-4\">\n {drawerRole ? (\n <RoleForm\n mode=\"edit\"\n roleId={drawerRole.id}\n open\n onClose={() => setDrawerRole(null)}\n onSuccess={() => setDrawerRole(null)}\n />\n ) : null}\n <DisplayTable withTableBorder>\n <Thead>\n <Tr>\n <Th>Role</Th>\n <Th>Description</Th>\n <Th>Access</Th>\n <Th>Created</Th>\n <Th className=\"w-[50px]\" />\n </Tr>\n </Thead>\n <Tbody>\n {data.map((role) => (\n <Tr key={role.id} className=\"group\">\n <Td>\n <Link\n href={`/iam/roles/${role.id}`}\n className=\"block text-left font-medium hover:text-primary hover:underline cursor-pointer\"\n >\n <p>{str(role.name) || role.code}</p>\n </Link>\n </Td>\n <Td>\n <span className=\"text-muted-foreground line-clamp-1 max-w-[200px]\">\n {str(role.description) || '—'}\n </span>\n </Td>\n <Td>\n <div className=\"flex flex-wrap gap-2\">\n {role.isSystem ? <Badge>System</Badge> : null}\n <Badge variant=\"secondary\">\n {role.permissionCount ?? role.permissionIds?.length ?? 0}{' '}\n permissions\n </Badge>\n </div>\n </Td>\n <Td>\n <div className=\"flex items-center gap-1 text-muted-foreground\">\n <IconCalendar className=\"h-4 w-4\" />\n {new Date(role.createdAt).toLocaleDateString()}\n </div>\n </Td>\n <Td>\n <DataTableAction onClick={() => setDrawerRole(role)} />\n </Td>\n </Tr>\n ))}\n </Tbody>\n </DisplayTable>\n <DataTablePagination\n pageIndex={pageIndex}\n pageSize={pageSize}\n pageCount={pageCount}\n totalRows={totalRows}\n onPageChange={onPageChange}\n onPageSizeChange={onPageSizeChange}\n />\n </div>\n );\n }\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\">\n {data.map((r) => (\n <RoleCard key={r.id} role={r} />\n ))}\n </div>\n <DataTablePagination\n pageIndex={pageIndex}\n pageSize={pageSize}\n pageCount={pageCount}\n totalRows={totalRows}\n onPageChange={onPageChange}\n onPageSizeChange={onPageSizeChange}\n />\n </div>\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, IconExternalLink } from '@tabler/icons-react';\nimport { useRouter } from '../../shared/page-helpers';\nimport type { Role } from './roles-data';\nimport { str } from './roles-data';\n\ntype RoleCardProps = {\n role: Role;\n mode?: 'navigate' | 'static';\n};\n\nexport function RoleCard({ role, mode = 'navigate' }: RoleCardProps) {\n const router = useRouter();\n const canNavigate = mode === 'navigate';\n\n return (\n <Card className=\"group transition-shadow hover:shadow-md\">\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-start justify-between\">\n <button\n type=\"button\"\n onClick={() => {\n if (canNavigate) {\n router.push(`/iam/roles/${role.id}`);\n }\n }}\n className=\"text-left font-semibold hover:text-primary hover:underline\"\n >\n {str(role.name) || role.code}\n </button>\n {canNavigate ? (\n <DropdownMenu>\n <DropdownMenuTrigger\n render={\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 opacity-0 transition-opacity group-hover:opacity-100\"\n />\n }\n >\n <IconDots className=\"h-4 w-4\" />\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent>\n <DropdownMenuItem\n onClick={() => router.push(`/iam/roles/${role.id}`)}\n >\n <IconExternalLink className=\"mr-2 h-4 w-4\" />\n Open\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenu>\n ) : null}\n </div>\n <Badge variant=\"outline\" className=\"text-xs\">\n {role.code}\n </Badge>\n </CardHeader>\n <CardContent>\n <div className=\"mb-3 flex flex-wrap gap-2\">\n {role.isSystem ? <Badge>System</Badge> : null}\n <Badge variant=\"secondary\">\n {role.permissionCount ?? role.permissionIds?.length ?? 0}{' '}\n permissions\n </Badge>\n <Badge variant=\"outline\">{role.userCount ?? 0} users</Badge>\n </div>\n {str(role.description) && (\n <p className=\"line-clamp-2 text-sm text-muted-foreground\">\n {str(role.description)}\n </p>\n )}\n <p className=\"mt-2 text-xs text-muted-foreground\">\n Created {new Date(role.createdAt).toLocaleDateString()}\n </p>\n </CardContent>\n </Card>\n );\n}\n"],"mappings":"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","names":["Button","IconShield","useQueryClient","useState","Badge","jsx","jsxs","jsx","jsxs","Badge","jsx","jsxs","useQueryClient","useState","IconShield","Button"]}
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  OtpVerificationModal
3
- } from "./chunk-ZOKBN5H4.js";
3
+ } from "./chunk-UIXR5GF3.js";
4
4
  import {
5
5
  useApi,
6
6
  useSession
7
- } from "./chunk-A5ON3RKH.js";
7
+ } from "./chunk-M2K6O5CN.js";
8
8
 
9
9
  // src/components/profile/verify-change-phone-form.tsx
10
10
  import { useState } from "react";
@@ -140,4 +140,4 @@ function VerifyChangePhoneForm({
140
140
  export {
141
141
  VerifyChangePhoneForm
142
142
  };
143
- //# sourceMappingURL=chunk-Z4FXOZEJ.js.map
143
+ //# sourceMappingURL=chunk-R7VVXH5U.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useConfig
3
- } from "./chunk-A5ON3RKH.js";
3
+ } from "./chunk-M2K6O5CN.js";
4
4
 
5
5
  // src/pages/iam/shared/navigation.tsx
6
6
  import { useMesob } from "@mesob/ui/providers";
@@ -31,4 +31,4 @@ export {
31
31
  AppLink,
32
32
  useNavigate
33
33
  };
34
- //# sourceMappingURL=chunk-3GFTD46V.js.map
34
+ //# sourceMappingURL=chunk-SLIIENXJ.js.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  PermissionSelector
3
- } from "./chunk-YVHMCTLM.js";
3
+ } from "./chunk-I46PN4JU.js";
4
4
  import {
5
5
  IAMGuard
6
- } from "./chunk-BM3YKYGC.js";
6
+ } from "./chunk-ZIUAYN37.js";
7
7
  import {
8
8
  useApi
9
- } from "./chunk-A5ON3RKH.js";
9
+ } from "./chunk-M2K6O5CN.js";
10
10
 
11
11
  // src/components/iam/role-permissions-page.tsx
12
12
  import {
@@ -289,4 +289,4 @@ function RolePermissionsPageContent({ roleId }) {
289
289
  export {
290
290
  RolePermissionsPage
291
291
  };
292
- //# sourceMappingURL=chunk-VWYJI2FU.js.map
292
+ //# sourceMappingURL=chunk-TT3V6PC7.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VerificationForm
3
- } from "./chunk-EIJFTUTM.js";
3
+ } from "./chunk-GP4XI5KB.js";
4
4
 
5
5
  // src/components/profile/otp-verification-modal.tsx
6
6
  import {
@@ -52,4 +52,4 @@ function OtpVerificationModal({
52
52
  export {
53
53
  OtpVerificationModal
54
54
  };
55
- //# sourceMappingURL=chunk-ZOKBN5H4.js.map
55
+ //# sourceMappingURL=chunk-UIXR5GF3.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-TFVBER3Y.js";
4
4
  import {
5
5
  useApi
6
- } from "./chunk-A5ON3RKH.js";
6
+ } from "./chunk-M2K6O5CN.js";
7
7
 
8
8
  // src/components/iam/roles.tsx
9
9
  import { Badge, Button } from "@mesob/ui/components";
@@ -115,4 +115,4 @@ function Roles() {
115
115
  export {
116
116
  Roles
117
117
  };
118
- //# sourceMappingURL=chunk-XZAYLXLS.js.map
118
+ //# sourceMappingURL=chunk-UV7JR3YU.js.map
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  ChangeEmailForm
3
- } from "./chunk-PUOQX6DR.js";
3
+ } from "./chunk-DQB4WY5T.js";
4
4
  import {
5
5
  ChangePasswordForm
6
- } from "./chunk-VS5FEGMX.js";
6
+ } from "./chunk-IUCTHMVY.js";
7
7
  import {
8
8
  ChangePhoneForm
9
- } from "./chunk-BX75EFF3.js";
9
+ } from "./chunk-MPZAPUVR.js";
10
10
  import {
11
11
  useSession
12
- } from "./chunk-A5ON3RKH.js";
12
+ } from "./chunk-M2K6O5CN.js";
13
13
 
14
14
  // src/components/profile/security.tsx
15
15
  import { Badge, Card, CardContent, Separator } from "@mesob/ui/components";
@@ -62,4 +62,4 @@ function Security() {
62
62
  export {
63
63
  Security
64
64
  };
65
- //# sourceMappingURL=chunk-SX6WAVQS.js.map
65
+ //# sourceMappingURL=chunk-VTANFZKG.js.map