@mesob/auth-react 0.4.1 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/dist/{chunk-KWG4DSB5.js → chunk-3HV5KQFZ.js} +2 -2
  2. package/dist/{chunk-MELNS4QH.js → chunk-4BFHC4JI.js} +2 -2
  3. package/dist/{chunk-JUHBVG5Q.js → chunk-4QMUNU5E.js} +3 -3
  4. package/dist/{chunk-ISNNPMF7.js → chunk-5NKPFZ2Q.js} +3 -3
  5. package/dist/{chunk-35TCGAW3.js → chunk-6F5LEXYI.js} +2 -2
  6. package/dist/{chunk-S3CXCCKL.js → chunk-ABF34UFW.js} +7 -4
  7. package/dist/chunk-ABF34UFW.js.map +1 -0
  8. package/dist/{chunk-C26NPUPI.js → chunk-AKEBT5PJ.js} +2 -2
  9. package/dist/{chunk-GP7GIUI3.js → chunk-BMZTYXGO.js} +2 -2
  10. package/dist/{chunk-EQ4346FE.js → chunk-CC3HI442.js} +3 -3
  11. package/dist/{chunk-L4CGIO2I.js → chunk-CDECLPL4.js} +8 -5
  12. package/dist/chunk-CDECLPL4.js.map +1 -0
  13. package/dist/{chunk-JZZJCBAE.js → chunk-DXTZQ2VY.js} +2 -2
  14. package/dist/{chunk-SOCZK4CV.js → chunk-EGZYJMSA.js} +7 -4
  15. package/dist/chunk-EGZYJMSA.js.map +1 -0
  16. package/dist/{chunk-ZESFGO3K.js → chunk-EKZYBYZQ.js} +2 -2
  17. package/dist/{chunk-GXKBVCVS.js → chunk-F6IMR5XS.js} +4 -3
  18. package/dist/chunk-F6IMR5XS.js.map +1 -0
  19. package/dist/{chunk-II5MLBSB.js → chunk-GB3Q5IWT.js} +4 -4
  20. package/dist/{chunk-FHOLUOOZ.js → chunk-GIGXCAGH.js} +3 -3
  21. package/dist/{chunk-PSRIZMWJ.js → chunk-GYFHM72X.js} +3 -3
  22. package/dist/{chunk-GRT6EBR6.js → chunk-HH347MJI.js} +2 -2
  23. package/dist/{chunk-OHIIMUQC.js → chunk-HM4MAF2I.js} +3 -3
  24. package/dist/{chunk-JB6XVST4.js → chunk-JED4SG3W.js} +8 -5
  25. package/dist/chunk-JED4SG3W.js.map +1 -0
  26. package/dist/{chunk-T6P7UHVP.js → chunk-JRHJNMG3.js} +2 -2
  27. package/dist/{chunk-MS2JUZ3N.js → chunk-KM5GOJ75.js} +4 -4
  28. package/dist/{chunk-C2KFZ57H.js → chunk-KTZSXSHV.js} +2 -2
  29. package/dist/{chunk-OQGJX37L.js → chunk-L2W6FXSZ.js} +2 -2
  30. package/dist/{chunk-OAN4EXU4.js → chunk-M6ZUEZJT.js} +3 -3
  31. package/dist/{chunk-OYHH7HQG.js → chunk-NFBOIG3D.js} +5 -5
  32. package/dist/{chunk-ZG6WFZHX.js → chunk-ODDTS4RN.js} +3 -3
  33. package/dist/{chunk-QNCE2B5O.js → chunk-OK7WPIHQ.js} +2 -2
  34. package/dist/{chunk-FFR5UHTS.js → chunk-PS2KBGDB.js} +3 -3
  35. package/dist/{chunk-3BZC4VVD.js → chunk-QJVZHT27.js} +3 -3
  36. package/dist/{chunk-AIMD6R6U.js → chunk-REHGRIUT.js} +2 -2
  37. package/dist/{chunk-5F5FZMHE.js → chunk-RJBNA7OH.js} +4 -4
  38. package/dist/{chunk-HOO2VLNM.js → chunk-RXHL7LUV.js} +3 -3
  39. package/dist/{chunk-OFLSINVU.js → chunk-RZFSMM3X.js} +7 -4
  40. package/dist/chunk-RZFSMM3X.js.map +1 -0
  41. package/dist/{chunk-45UCLKH2.js → chunk-S3KIMVDE.js} +4 -4
  42. package/dist/{chunk-NJPNTAAT.js → chunk-SJHJ63HK.js} +2 -2
  43. package/dist/{chunk-LSYKVFJA.js → chunk-SYT5Z7EF.js} +2 -2
  44. package/dist/{chunk-BZ42QPXE.js → chunk-UCNNUST6.js} +2 -2
  45. package/dist/{chunk-RLPZFLAS.js → chunk-V4VX55TT.js} +2 -2
  46. package/dist/{chunk-LZR4YUDV.js → chunk-VA2XUED4.js} +2 -2
  47. package/dist/{chunk-YZ264S2L.js → chunk-VU4Z2XSQ.js} +3 -3
  48. package/dist/{chunk-FAHN63DA.js → chunk-WD2COCQW.js} +8 -5
  49. package/dist/chunk-WD2COCQW.js.map +1 -0
  50. package/dist/{chunk-72YRO3A7.js → chunk-XCJ3ZH7D.js} +8 -5
  51. package/dist/chunk-XCJ3ZH7D.js.map +1 -0
  52. package/dist/{chunk-G7SCXCCM.js → chunk-XEFPJKBB.js} +2 -2
  53. package/dist/{chunk-UXOZ2TME.js → chunk-YHZLPAYD.js} +2 -2
  54. package/dist/{chunk-FBABIA5J.js → chunk-YLWCA2WK.js} +4 -11
  55. package/dist/chunk-YLWCA2WK.js.map +1 -0
  56. package/dist/{chunk-BGSHXIHI.js → chunk-ZE3R37PI.js} +9 -6
  57. package/dist/chunk-ZE3R37PI.js.map +1 -0
  58. package/dist/components/auth/countdown.js +3 -3
  59. package/dist/components/auth/forgot-password.js +3 -3
  60. package/dist/components/auth/reset-password-form.js +3 -3
  61. package/dist/components/auth/set-password.js +3 -3
  62. package/dist/components/auth/sign-in.js +3 -3
  63. package/dist/components/auth/sign-up.js +3 -3
  64. package/dist/components/auth/verification-form.js +4 -4
  65. package/dist/components/auth/verify-email.js +5 -5
  66. package/dist/components/auth/verify-phone.js +5 -5
  67. package/dist/components/authorization/deny.js +2 -2
  68. package/dist/components/authorization/grant.js +2 -2
  69. package/dist/components/iam/permission-selector.js +2 -2
  70. package/dist/components/iam/permissions-page.js +2 -2
  71. package/dist/components/iam/permissions.js +2 -2
  72. package/dist/components/iam/role-detail-layout.js +2 -2
  73. package/dist/components/iam/role-detail-page.js +2 -2
  74. package/dist/components/iam/role-permissions-page.js +3 -3
  75. package/dist/components/iam/roles-page.js +5 -5
  76. package/dist/components/iam/roles.js +2 -2
  77. package/dist/components/iam/sessions-page.js +4 -4
  78. package/dist/components/iam/sessions.js +2 -2
  79. package/dist/components/iam/tenants-page.js +4 -4
  80. package/dist/components/iam/tenants.js +2 -2
  81. package/dist/components/iam/users-page.js +5 -5
  82. package/dist/components/iam/users.js +2 -2
  83. package/dist/components/profile/account.js +2 -2
  84. package/dist/components/profile/change-email-form.js +8 -8
  85. package/dist/components/profile/change-password-form.js +2 -2
  86. package/dist/components/profile/change-phone-form.js +8 -8
  87. package/dist/components/profile/otp-verification-modal.js +5 -5
  88. package/dist/components/profile/profile-layout.js +3 -3
  89. package/dist/components/profile/request-change-email-form.js +2 -2
  90. package/dist/components/profile/request-change-phone-form.js +2 -2
  91. package/dist/components/profile/security.js +13 -13
  92. package/dist/components/profile/verify-change-email-form.js +6 -6
  93. package/dist/components/profile/verify-change-phone-form.js +6 -6
  94. package/dist/index.js +47 -47
  95. package/dist/pages/auth/forgot-password.js +3 -3
  96. package/dist/pages/auth/layout.js +4 -3
  97. package/dist/pages/auth/layout.js.map +1 -1
  98. package/dist/pages/auth/reset-password.js +3 -3
  99. package/dist/pages/auth/set-password.js +3 -3
  100. package/dist/pages/auth/sign-in.js +3 -3
  101. package/dist/pages/auth/sign-up.js +3 -3
  102. package/dist/pages/auth/verify-email.js +5 -5
  103. package/dist/pages/auth/verify-phone.js +5 -5
  104. package/dist/pages/iam/permissions.js +2 -2
  105. package/dist/pages/iam/role-detail-layout.js +2 -2
  106. package/dist/pages/iam/role-detail.js +2 -2
  107. package/dist/pages/iam/role-permissions.js +3 -3
  108. package/dist/pages/iam/role-users.js +5 -5
  109. package/dist/pages/iam/roles.js +5 -5
  110. package/dist/pages/iam/sessions.js +4 -4
  111. package/dist/pages/iam/tenant-detail.js +2 -2
  112. package/dist/pages/iam/tenants.js +4 -4
  113. package/dist/pages/iam/user-activity.js +5 -5
  114. package/dist/pages/iam/user-detail-layout.js +2 -2
  115. package/dist/pages/iam/user-detail.js +2 -2
  116. package/dist/pages/iam/users.js +5 -5
  117. package/dist/pages/profile/account.js +7 -3
  118. package/dist/pages/profile/account.js.map +1 -1
  119. package/dist/pages/profile/layout.js +3 -3
  120. package/dist/pages/profile/security.js +18 -14
  121. package/dist/pages/profile/security.js.map +1 -1
  122. package/package.json +3 -3
  123. package/dist/chunk-72YRO3A7.js.map +0 -1
  124. package/dist/chunk-BGSHXIHI.js.map +0 -1
  125. package/dist/chunk-FAHN63DA.js.map +0 -1
  126. package/dist/chunk-FBABIA5J.js.map +0 -1
  127. package/dist/chunk-GXKBVCVS.js.map +0 -1
  128. package/dist/chunk-JB6XVST4.js.map +0 -1
  129. package/dist/chunk-L4CGIO2I.js.map +0 -1
  130. package/dist/chunk-OFLSINVU.js.map +0 -1
  131. package/dist/chunk-S3CXCCKL.js.map +0 -1
  132. package/dist/chunk-SOCZK4CV.js.map +0 -1
  133. /package/dist/{chunk-KWG4DSB5.js.map → chunk-3HV5KQFZ.js.map} +0 -0
  134. /package/dist/{chunk-MELNS4QH.js.map → chunk-4BFHC4JI.js.map} +0 -0
  135. /package/dist/{chunk-JUHBVG5Q.js.map → chunk-4QMUNU5E.js.map} +0 -0
  136. /package/dist/{chunk-ISNNPMF7.js.map → chunk-5NKPFZ2Q.js.map} +0 -0
  137. /package/dist/{chunk-35TCGAW3.js.map → chunk-6F5LEXYI.js.map} +0 -0
  138. /package/dist/{chunk-C26NPUPI.js.map → chunk-AKEBT5PJ.js.map} +0 -0
  139. /package/dist/{chunk-GP7GIUI3.js.map → chunk-BMZTYXGO.js.map} +0 -0
  140. /package/dist/{chunk-EQ4346FE.js.map → chunk-CC3HI442.js.map} +0 -0
  141. /package/dist/{chunk-JZZJCBAE.js.map → chunk-DXTZQ2VY.js.map} +0 -0
  142. /package/dist/{chunk-ZESFGO3K.js.map → chunk-EKZYBYZQ.js.map} +0 -0
  143. /package/dist/{chunk-II5MLBSB.js.map → chunk-GB3Q5IWT.js.map} +0 -0
  144. /package/dist/{chunk-FHOLUOOZ.js.map → chunk-GIGXCAGH.js.map} +0 -0
  145. /package/dist/{chunk-PSRIZMWJ.js.map → chunk-GYFHM72X.js.map} +0 -0
  146. /package/dist/{chunk-GRT6EBR6.js.map → chunk-HH347MJI.js.map} +0 -0
  147. /package/dist/{chunk-OHIIMUQC.js.map → chunk-HM4MAF2I.js.map} +0 -0
  148. /package/dist/{chunk-T6P7UHVP.js.map → chunk-JRHJNMG3.js.map} +0 -0
  149. /package/dist/{chunk-MS2JUZ3N.js.map → chunk-KM5GOJ75.js.map} +0 -0
  150. /package/dist/{chunk-C2KFZ57H.js.map → chunk-KTZSXSHV.js.map} +0 -0
  151. /package/dist/{chunk-OQGJX37L.js.map → chunk-L2W6FXSZ.js.map} +0 -0
  152. /package/dist/{chunk-OAN4EXU4.js.map → chunk-M6ZUEZJT.js.map} +0 -0
  153. /package/dist/{chunk-OYHH7HQG.js.map → chunk-NFBOIG3D.js.map} +0 -0
  154. /package/dist/{chunk-ZG6WFZHX.js.map → chunk-ODDTS4RN.js.map} +0 -0
  155. /package/dist/{chunk-QNCE2B5O.js.map → chunk-OK7WPIHQ.js.map} +0 -0
  156. /package/dist/{chunk-FFR5UHTS.js.map → chunk-PS2KBGDB.js.map} +0 -0
  157. /package/dist/{chunk-3BZC4VVD.js.map → chunk-QJVZHT27.js.map} +0 -0
  158. /package/dist/{chunk-AIMD6R6U.js.map → chunk-REHGRIUT.js.map} +0 -0
  159. /package/dist/{chunk-5F5FZMHE.js.map → chunk-RJBNA7OH.js.map} +0 -0
  160. /package/dist/{chunk-HOO2VLNM.js.map → chunk-RXHL7LUV.js.map} +0 -0
  161. /package/dist/{chunk-45UCLKH2.js.map → chunk-S3KIMVDE.js.map} +0 -0
  162. /package/dist/{chunk-NJPNTAAT.js.map → chunk-SJHJ63HK.js.map} +0 -0
  163. /package/dist/{chunk-LSYKVFJA.js.map → chunk-SYT5Z7EF.js.map} +0 -0
  164. /package/dist/{chunk-BZ42QPXE.js.map → chunk-UCNNUST6.js.map} +0 -0
  165. /package/dist/{chunk-RLPZFLAS.js.map → chunk-V4VX55TT.js.map} +0 -0
  166. /package/dist/{chunk-LZR4YUDV.js.map → chunk-VA2XUED4.js.map} +0 -0
  167. /package/dist/{chunk-YZ264S2L.js.map → chunk-VU4Z2XSQ.js.map} +0 -0
  168. /package/dist/{chunk-G7SCXCCM.js.map → chunk-XEFPJKBB.js.map} +0 -0
  169. /package/dist/{chunk-UXOZ2TME.js.map → chunk-YHZLPAYD.js.map} +0 -0
@@ -6,11 +6,11 @@ import {
6
6
  } from "./chunk-DPH2PHK3.js";
7
7
  import {
8
8
  useTranslator
9
- } from "./chunk-QNCE2B5O.js";
9
+ } from "./chunk-OK7WPIHQ.js";
10
10
  import {
11
11
  useApi,
12
12
  useConfig
13
- } from "./chunk-72YRO3A7.js";
13
+ } from "./chunk-XCJ3ZH7D.js";
14
14
 
15
15
  // src/components/auth/sign-up.tsx
16
16
  import { zodResolver } from "@hookform/resolvers/zod";
@@ -307,4 +307,4 @@ var SignUp = ({
307
307
  export {
308
308
  SignUp
309
309
  };
310
- //# sourceMappingURL=chunk-OAN4EXU4.js.map
310
+ //# sourceMappingURL=chunk-M6ZUEZJT.js.map
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  ChangePhoneForm
3
- } from "./chunk-5F5FZMHE.js";
3
+ } from "./chunk-RJBNA7OH.js";
4
4
  import {
5
5
  ChangeEmailForm
6
- } from "./chunk-MS2JUZ3N.js";
6
+ } from "./chunk-KM5GOJ75.js";
7
7
  import {
8
8
  ChangePasswordForm
9
- } from "./chunk-OQGJX37L.js";
9
+ } from "./chunk-L2W6FXSZ.js";
10
10
  import {
11
11
  useSession
12
- } from "./chunk-72YRO3A7.js";
12
+ } from "./chunk-XCJ3ZH7D.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-OYHH7HQG.js.map
65
+ //# sourceMappingURL=chunk-NFBOIG3D.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  OtpVerificationModal
3
- } from "./chunk-KWG4DSB5.js";
3
+ } from "./chunk-3HV5KQFZ.js";
4
4
  import {
5
5
  useApi,
6
6
  useSession
7
- } from "./chunk-72YRO3A7.js";
7
+ } from "./chunk-XCJ3ZH7D.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-ZG6WFZHX.js.map
143
+ //# sourceMappingURL=chunk-ODDTS4RN.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createTranslator,
3
3
  useConfig
4
- } from "./chunk-72YRO3A7.js";
4
+ } from "./chunk-XCJ3ZH7D.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-QNCE2B5O.js.map
23
+ //# sourceMappingURL=chunk-OK7WPIHQ.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  Countdown
3
- } from "./chunk-GP7GIUI3.js";
3
+ } from "./chunk-BMZTYXGO.js";
4
4
  import {
5
5
  useTranslator
6
- } from "./chunk-QNCE2B5O.js";
6
+ } from "./chunk-OK7WPIHQ.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-FFR5UHTS.js.map
99
+ //# sourceMappingURL=chunk-PS2KBGDB.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  AppLink,
3
3
  useNavigate
4
- } from "./chunk-T6P7UHVP.js";
4
+ } from "./chunk-JRHJNMG3.js";
5
5
  import {
6
6
  useApi
7
- } from "./chunk-72YRO3A7.js";
7
+ } from "./chunk-XCJ3ZH7D.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-3BZC4VVD.js.map
36
+ //# sourceMappingURL=chunk-QJVZHT27.js.map
@@ -2,7 +2,7 @@ import {
2
2
  Link,
3
3
  authApi$,
4
4
  useRouter
5
- } from "./chunk-3BZC4VVD.js";
5
+ } from "./chunk-QJVZHT27.js";
6
6
 
7
7
  // src/pages/iam/roles/_components/role-form.tsx
8
8
  import { zodResolver } from "@hookform/resolvers/zod";
@@ -463,4 +463,4 @@ export {
463
463
  RoleCard,
464
464
  RolesList
465
465
  };
466
- //# sourceMappingURL=chunk-AIMD6R6U.js.map
466
+ //# sourceMappingURL=chunk-REHGRIUT.js.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  VerifyChangePhoneForm
3
- } from "./chunk-ZG6WFZHX.js";
3
+ } from "./chunk-ODDTS4RN.js";
4
4
  import {
5
5
  RequestChangePhoneForm
6
- } from "./chunk-C26NPUPI.js";
6
+ } from "./chunk-AKEBT5PJ.js";
7
7
  import {
8
8
  useSession
9
- } from "./chunk-72YRO3A7.js";
9
+ } from "./chunk-XCJ3ZH7D.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-5F5FZMHE.js.map
94
+ //# sourceMappingURL=chunk-RJBNA7OH.js.map
@@ -9,11 +9,11 @@ import {
9
9
  } from "./chunk-DPH2PHK3.js";
10
10
  import {
11
11
  useTranslator
12
- } from "./chunk-QNCE2B5O.js";
12
+ } from "./chunk-OK7WPIHQ.js";
13
13
  import {
14
14
  useApi,
15
15
  useConfig
16
- } from "./chunk-72YRO3A7.js";
16
+ } from "./chunk-XCJ3ZH7D.js";
17
17
 
18
18
  // src/components/auth/set-password.tsx
19
19
  import { zodResolver } from "@hookform/resolvers/zod";
@@ -302,4 +302,4 @@ var SetPassword = function SetPassword2({
302
302
  export {
303
303
  SetPassword
304
304
  };
305
- //# sourceMappingURL=chunk-HOO2VLNM.js.map
305
+ //# sourceMappingURL=chunk-RXHL7LUV.js.map
@@ -2,8 +2,9 @@ import {
2
2
  str
3
3
  } from "./chunk-LNG736CV.js";
4
4
  import {
5
- useApi
6
- } from "./chunk-72YRO3A7.js";
5
+ useApi,
6
+ useConfig
7
+ } from "./chunk-XCJ3ZH7D.js";
7
8
 
8
9
  // src/pages/iam/tenants/tenant-detail-page-content.tsx
9
10
  import {
@@ -24,6 +25,8 @@ function TenantDetailPageContent({
24
25
  tenantId
25
26
  }) {
26
27
  const { hooks } = useApi();
28
+ const { config } = useConfig();
29
+ const homeHref = config.navigation?.defaultRedirectUrl || "/";
27
30
  const qc = useQueryClient();
28
31
  const { data, isLoading } = hooks.useQuery(
29
32
  "get",
@@ -41,7 +44,7 @@ function TenantDetailPageContent({
41
44
  const title = tenant ? str(tenant.name) || tenant.id : tenantId ?? "Tenant";
42
45
  useBreadcrumbs({
43
46
  items: [
44
- { label: "Home", href: "/dashboard" },
47
+ { label: "Home", href: homeHref },
45
48
  { label: "IAM", href: "/iam" },
46
49
  { label: "Tenants", href: "/iam/tenants" },
47
50
  { label: title }
@@ -135,4 +138,4 @@ function TenantDetailPageContent({
135
138
  export {
136
139
  TenantDetailPageContent
137
140
  };
138
- //# sourceMappingURL=chunk-OFLSINVU.js.map
141
+ //# sourceMappingURL=chunk-RZFSMM3X.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/pages/iam/tenants/tenant-detail-page-content.tsx"],"sourcesContent":["'use client';\n\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n EntityDetailHeader,\n PageContainer,\n type TabItem,\n useBreadcrumbs,\n} from '@mesob/ui/components';\nimport { IconBuilding } from '@tabler/icons-react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useMemo } from 'react';\nimport { useApi, useConfig } from '../../../provider';\nimport { str } from './_components/tenants-data';\n\ntype TenantDetailPageContentProps = {\n tenantId: string;\n};\n\nexport function TenantDetailPageContent({\n tenantId,\n}: TenantDetailPageContentProps) {\n const { hooks } = useApi();\n const { config } = useConfig();\n const homeHref = config.navigation?.defaultRedirectUrl || '/';\n const qc = useQueryClient();\n\n const { data, isLoading } = hooks.useQuery(\n 'get',\n '/tenants/{id}',\n { params: { path: { id: tenantId } } },\n { enabled: !!tenantId },\n );\n const tenant = data?.tenant;\n\n const toggleActive = hooks.useMutation('put', '/tenants/{id}', {\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: ['get', '/tenants/{id}'] });\n qc.invalidateQueries({ queryKey: ['get', '/tenants'] });\n },\n });\n\n const title = tenant ? str(tenant.name) || tenant.id : (tenantId ?? 'Tenant');\n useBreadcrumbs({\n items: [\n { label: 'Home', href: homeHref },\n { label: 'IAM', href: '/iam' },\n { label: 'Tenants', href: '/iam/tenants' },\n { label: title },\n ],\n });\n\n const tabs: TabItem[] = useMemo(\n () => [\n {\n value: 'detail',\n name: 'Detail',\n content: (\n <Card className=\"mt-4\">\n <CardHeader>\n <CardTitle>Tenant details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2 text-sm\">\n {tenant && (\n <>\n <p>\n <span className=\"text-muted-foreground\">Name:</span>{' '}\n {str(tenant.name) || '—'}\n </p>\n <p>\n <span className=\"text-muted-foreground\">Description:</span>{' '}\n {str(tenant.description) || '—'}\n </p>\n <p>\n <span className=\"text-muted-foreground\">Language:</span>{' '}\n {tenant.defaultLanguage ?? '—'}\n </p>\n <p>\n <span className=\"text-muted-foreground\">Currency:</span>{' '}\n {tenant.defaultCurrency ?? '—'}\n </p>\n <p>\n <span className=\"text-muted-foreground\">Timezone:</span>{' '}\n {tenant.timezone ?? '—'}\n </p>\n </>\n )}\n </CardContent>\n </Card>\n ),\n },\n {\n value: 'theme',\n name: 'Theme',\n content: (\n <Card className=\"mt-4\">\n <CardHeader>\n <CardTitle>Theme</CardTitle>\n </CardHeader>\n <CardContent className=\"text-muted-foreground text-sm\">\n Theme settings (placeholder)\n </CardContent>\n </Card>\n ),\n },\n {\n value: 'settings',\n name: 'Settings',\n content: (\n <Card className=\"mt-4\">\n <CardHeader>\n <CardTitle>Settings</CardTitle>\n </CardHeader>\n <CardContent className=\"text-muted-foreground text-sm\">\n Tenant settings (placeholder)\n </CardContent>\n </Card>\n ),\n },\n ],\n [tenant],\n );\n\n const actions = tenant && (\n <Button\n variant={tenant.isActive ? 'secondary' : 'default'}\n size=\"sm\"\n onClick={() =>\n toggleActive.mutate({\n params: { path: { id: tenantId } },\n body: { isActive: !tenant.isActive },\n })\n }\n disabled={toggleActive.isPending}\n >\n {tenant.isActive ? 'Deactivate' : 'Activate'}\n </Button>\n );\n\n if (!tenantId) {\n return null;\n }\n if (isLoading || !tenant) {\n return (\n <div className=\"flex flex-1 flex-col gap-4 p-4 pt-0\">\n <div className=\"h-24 animate-pulse rounded-xl bg-muted\" />\n </div>\n );\n }\n\n return (\n <PageContainer className=\"flex flex-1 flex-col gap-4 p-4 pt-0\">\n <EntityDetailHeader\n title={title}\n icon={<IconBuilding className=\"h-5 w-5 text-muted-foreground\" />}\n actions={actions}\n tabs={tabs}\n />\n </PageContainer>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VerificationForm
3
- } from "./chunk-FFR5UHTS.js";
3
+ } from "./chunk-PS2KBGDB.js";
4
4
  import {
5
5
  handleError
6
6
  } from "./chunk-55BMNC4S.js";
@@ -9,11 +9,11 @@ import {
9
9
  } from "./chunk-DPH2PHK3.js";
10
10
  import {
11
11
  useTranslator
12
- } from "./chunk-QNCE2B5O.js";
12
+ } from "./chunk-OK7WPIHQ.js";
13
13
  import {
14
14
  useApi,
15
15
  useConfig
16
- } from "./chunk-72YRO3A7.js";
16
+ } from "./chunk-XCJ3ZH7D.js";
17
17
 
18
18
  // src/components/auth/verify-phone.tsx
19
19
  import { Alert, AlertDescription, AlertTitle } from "@mesob/ui/components";
@@ -185,4 +185,4 @@ var VerifyPhone = ({
185
185
  export {
186
186
  VerifyPhone
187
187
  };
188
- //# sourceMappingURL=chunk-45UCLKH2.js.map
188
+ //# sourceMappingURL=chunk-S3KIMVDE.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useApi
3
- } from "./chunk-72YRO3A7.js";
3
+ } from "./chunk-XCJ3ZH7D.js";
4
4
 
5
5
  // src/pages/iam/users/_components/user-detail-page-content.tsx
6
6
  import {
@@ -65,4 +65,4 @@ function UserDetailPageContent({ userId }) {
65
65
  export {
66
66
  UserDetailPageContent
67
67
  };
68
- //# sourceMappingURL=chunk-NJPNTAAT.js.map
68
+ //# sourceMappingURL=chunk-SJHJ63HK.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-TFVBER3Y.js";
4
4
  import {
5
5
  useApi
6
- } from "./chunk-72YRO3A7.js";
6
+ } from "./chunk-XCJ3ZH7D.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-LSYKVFJA.js.map
98
+ //# sourceMappingURL=chunk-SYT5Z7EF.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  Link,
3
3
  authApi$
4
- } from "./chunk-3BZC4VVD.js";
4
+ } from "./chunk-QJVZHT27.js";
5
5
 
6
6
  // src/pages/iam/users/_components/user-form.tsx
7
7
  import { zodResolver } from "@hookform/resolvers/zod";
@@ -268,4 +268,4 @@ export {
268
268
  UserForm,
269
269
  UserCard
270
270
  };
271
- //# sourceMappingURL=chunk-BZ42QPXE.js.map
271
+ //# sourceMappingURL=chunk-UCNNUST6.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useSession
3
- } from "./chunk-72YRO3A7.js";
3
+ } from "./chunk-XCJ3ZH7D.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-RLPZFLAS.js.map
23
+ //# sourceMappingURL=chunk-V4VX55TT.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-TFVBER3Y.js";
4
4
  import {
5
5
  useApi
6
- } from "./chunk-72YRO3A7.js";
6
+ } from "./chunk-XCJ3ZH7D.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-LZR4YUDV.js.map
107
+ //# sourceMappingURL=chunk-VA2XUED4.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  PermissionSelector
3
- } from "./chunk-GRT6EBR6.js";
3
+ } from "./chunk-HH347MJI.js";
4
4
  import {
5
5
  useApi
6
- } from "./chunk-72YRO3A7.js";
6
+ } from "./chunk-XCJ3ZH7D.js";
7
7
 
8
8
  // src/components/iam/role-permissions-page.tsx
9
9
  import {
@@ -283,4 +283,4 @@ function RolePermissionsPage({ roleId }) {
283
283
  export {
284
284
  RolePermissionsPage
285
285
  };
286
- //# sourceMappingURL=chunk-YZ264S2L.js.map
286
+ //# sourceMappingURL=chunk-VU4Z2XSQ.js.map
@@ -4,13 +4,14 @@ import {
4
4
  import {
5
5
  Link,
6
6
  authApi$
7
- } from "./chunk-3BZC4VVD.js";
7
+ } from "./chunk-QJVZHT27.js";
8
8
  import {
9
9
  defaultEntityQueryOptions
10
10
  } from "./chunk-NPW7D2HZ.js";
11
11
  import {
12
- useApi
13
- } from "./chunk-72YRO3A7.js";
12
+ useApi,
13
+ useConfig
14
+ } from "./chunk-XCJ3ZH7D.js";
14
15
 
15
16
  // src/components/iam/tenants-page.tsx
16
17
  import {
@@ -439,9 +440,11 @@ function TenantsList({
439
440
  import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
440
441
  function TenantsPage() {
441
442
  const { hooks } = useApi();
443
+ const { config } = useConfig();
444
+ const homeHref = config.navigation?.defaultRedirectUrl || "/";
442
445
  useBreadcrumbs({
443
446
  items: [
444
- { label: "Home", href: "/dashboard" },
447
+ { label: "Home", href: homeHref },
445
448
  { label: "IAM", href: "/iam/tenants" },
446
449
  { label: "Tenants" }
447
450
  ]
@@ -532,4 +535,4 @@ function TenantsPage() {
532
535
  export {
533
536
  TenantsPage
534
537
  };
535
- //# sourceMappingURL=chunk-FAHN63DA.js.map
538
+ //# sourceMappingURL=chunk-WD2COCQW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/iam/tenants-page.tsx","../src/pages/iam/tenants/_components/tenant-form.tsx","../src/pages/iam/tenants/_components/tenants-list.tsx","../src/pages/iam/tenants/_components/tenant-card.tsx"],"sourcesContent":["'use client';\n\nimport {\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 { IconBuilding } from '@tabler/icons-react';\nimport { useState } from 'react';\nimport type { paths } from '../../data/openapi';\nimport { defaultEntityQueryOptions } from '../../lib/query-options';\nimport { TenantForm } from '../../pages/iam/tenants/_components/tenant-form';\nimport { TenantsList } from '../../pages/iam/tenants/_components/tenants-list';\nimport { useApi, useConfig } from '../../provider';\n\nexport function TenantsPage() {\n const { hooks } = useApi();\n const { config } = useConfig();\n const homeHref = config.navigation?.defaultRedirectUrl || '/';\n useBreadcrumbs({\n items: [\n { label: 'Home', href: homeHref },\n { label: 'IAM', href: '/iam/tenants' },\n { label: 'Tenants' },\n ],\n });\n const [createOpen, setCreateOpen] = useState(false);\n\n const { queryConfig, params, setParams } = useEntityParams({\n searchKey: 'search',\n });\n const tenantsQuery = queryConfig as {\n params: {\n query: NonNullable<paths['/tenants']['get']['parameters']['query']>;\n };\n };\n\n const { data, error, isPending, isFetching } = hooks.useQuery(\n 'get',\n '/tenants',\n tenantsQuery,\n defaultEntityQueryOptions,\n );\n\n const isLoading = isPending || isFetching;\n const tenants = data?.tenants ?? [];\n const { total, pageCount } = useEntityPagination({\n items: tenants,\n total: data?.total,\n pageSize: params.pageSize,\n });\n const errorStatus = (error as { status?: number } | null)?.status;\n const hasAccessError = errorStatus === 401 || errorStatus === 403;\n const hasError = Boolean(error) && !isLoading;\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={<IconBuilding className=\"size-5\" />}\n title=\"Tenants\"\n actions={\n hasAccessError ? null : (\n <EntityDrawerTrigger\n mode=\"new\"\n entity=\"Tenant\"\n open={createOpen}\n onOpenChange={setCreateOpen}\n >\n {(open, onClose) => (\n <TenantForm mode=\"new\" open={open} onClose={onClose} />\n )}\n </EntityDrawerTrigger>\n )\n }\n search={\n hasAccessError ? null : (\n <EntitySearch paramKey=\"search\" placeholder=\"Search tenants...\" />\n )\n }\n filter={\n hasAccessError ? null : (\n <EntityFilter\n options={[\n { label: 'All', value: '' },\n { label: 'Active', value: 'isActive:true' },\n { label: 'Inactive', value: 'isActive:false' },\n ]}\n placeholder=\"Filter\"\n />\n )\n }\n sort={\n hasAccessError ? null : (\n <EntitySort\n options={[\n { label: 'Created', value: 'createdAt' },\n { label: 'Updated', value: 'updatedAt' },\n { label: 'Name', value: 'name' },\n ]}\n />\n )\n }\n view={\n hasAccessError ? null : (\n <EntityViewToggle views={['table', 'card']} />\n )\n }\n />\n {hasError ? (\n <div className=\"rounded-[1.75rem] border border-border/60 bg-muted/20 p-8\">\n <div className=\"text-lg font-semibold\">\n {hasAccessError\n ? 'Tenant access denied'\n : 'Unable to load tenants'}\n </div>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n {hasAccessError\n ? 'This account does not have permission to view or manage tenants.'\n : 'The tenants page returned an unexpected error. Retry after the API is healthy.'}\n </p>\n </div>\n ) : (\n <TenantsList\n data={tenants}\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 )}\n </PageBody>\n </PageContainer>\n );\n}\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport {\n EntityDrawer,\n EntityFormActions,\n Input,\n Label,\n Skeleton,\n Textarea,\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';\nimport { str } from './tenants-data';\n\nconst schema = z.object({\n id: z.string().min(1).max(30),\n name: z.string().optional(),\n description: z.string().optional(),\n isActive: z.boolean(),\n});\n\ntype FormData = z.infer<typeof schema>;\n\nconst defaults: FormData = {\n id: '',\n name: '',\n description: '',\n isActive: true,\n};\n\ntype TenantFormProps = {\n mode: 'new' | 'edit';\n tenantId?: string;\n open: boolean;\n onClose: () => void;\n onSuccess?: () => void;\n};\n\nexport function TenantForm({\n mode,\n tenantId,\n open,\n onClose,\n onSuccess,\n}: TenantFormProps) {\n const qc = useQueryClient();\n const { data, isLoading } = authApi$.useQuery(\n 'get',\n '/tenants/{id}',\n { params: { path: { id: tenantId ?? '' } } },\n { enabled: mode === 'edit' && !!tenantId },\n );\n const create = authApi$.useMutation('post', '/tenants', {\n onSuccess: () => qc.invalidateQueries({ queryKey: ['get', '/tenants'] }),\n });\n const update = authApi$.useMutation('put', '/tenants/{id}', {\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: ['get', '/tenants'] });\n if (tenantId) {\n qc.invalidateQueries({ queryKey: ['get', '/tenants/{id}'] });\n }\n },\n });\n const del = authApi$.useMutation('delete', '/tenants/{id}', {\n onSuccess: () => qc.invalidateQueries({ queryKey: ['get', '/tenants'] }),\n });\n\n const form = useForm<FormData>({\n resolver: zodResolver(schema),\n defaultValues: defaults,\n });\n\n const { reset, formState, register } = form;\n\n useEffect(() => {\n if (!open) {\n return;\n }\n if (mode === 'edit' && data?.tenant && !isLoading) {\n const t = data.tenant;\n reset({\n id: t.id,\n name: str(t.name) || '',\n description: str(t.description) || '',\n isActive: t.isActive,\n });\n } else {\n reset(defaults);\n }\n }, [mode, data, open, isLoading, reset]);\n\n const onSubmit = form.handleSubmit(async (d) => {\n const body = {\n id: d.id,\n name: d.name || undefined,\n description: d.description || undefined,\n isActive: d.isActive,\n };\n if (mode === 'new') {\n await create.mutateAsync({ body });\n } else if (tenantId) {\n await update.mutateAsync({\n params: { path: { id: tenantId } },\n body: {\n name: d.name || undefined,\n description: d.description || undefined,\n isActive: d.isActive,\n },\n });\n }\n onSuccess?.();\n onClose();\n });\n\n const onDelete = async () => {\n if (!tenantId) {\n return;\n }\n await del.mutateAsync({ params: { path: { id: tenantId } } });\n onSuccess?.();\n onClose();\n };\n\n return (\n <EntityDrawer\n title={mode === 'new' ? 'New tenant' : 'Edit tenant'}\n open={open}\n onClose={onClose}\n isDirty={formState.isDirty}\n size=\"md\"\n form={\n isLoading ? (\n <FormSkeleton />\n ) : (\n <form onSubmit={onSubmit} className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"id\">\n ID <span className=\"text-destructive\">*</span>\n </Label>\n <Input\n id=\"id\"\n placeholder=\"e.g. acme\"\n {...register('id')}\n disabled={mode === 'edit'}\n />\n {formState.errors.id && (\n <p className=\"text-sm text-destructive\">\n {formState.errors.id.message}\n </p>\n )}\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"name\">Name</Label>\n <Input\n id=\"name\"\n placeholder=\"Display name\"\n {...register('name')}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"description\">Description</Label>\n <Textarea\n id=\"description\"\n placeholder=\"Description\"\n rows={3}\n {...register('description')}\n />\n </div>\n {mode === 'edit' && (\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n id=\"isActive\"\n {...register('isActive', {\n setValueAs: (v) => v === true || v === 'on',\n })}\n className=\"h-4 w-4\"\n />\n <Label htmlFor=\"isActive\">Active</Label>\n </div>\n )}\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}\n itemName=\"tenant\"\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-12\" />\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-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 { IconBuilding, IconCalendar } from '@tabler/icons-react';\nimport { useState } from 'react';\nimport { Link } from '../../shared/page-helpers';\nimport { TenantCard } from './tenant-card';\nimport { TenantForm } from './tenant-form';\nimport type { Tenant } from './tenants-data';\nimport { str } from './tenants-data';\n\nconst TABLE_COLUMN_COUNT = 5;\n\ntype TenantsListProps = {\n data: Tenant[];\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 TenantsList({\n data,\n isLoading,\n view,\n pageIndex,\n pageSize,\n pageCount,\n totalRows,\n onPageChange,\n onPageSizeChange,\n onCreateNew,\n}: TenantsListProps) {\n const [editingTenantId, setEditingTenantId] = useState<string | 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={IconBuilding}\n entityName=\"tenant\"\n title=\"No tenants yet\"\n description=\"Create your first tenant to get started.\"\n onAction={onCreateNew}\n />\n );\n }\n if (view === 'table') {\n return (\n <div className=\"space-y-4\">\n {editingTenantId && (\n <TenantForm\n mode=\"edit\"\n tenantId={editingTenantId}\n open\n onClose={() => setEditingTenantId(null)}\n />\n )}\n <DisplayTable withTableBorder>\n <Thead>\n <Tr>\n <Th>Tenant</Th>\n <Th>Description</Th>\n <Th>Status</Th>\n <Th>Created</Th>\n <Th className=\"w-[50px]\" />\n </Tr>\n </Thead>\n <Tbody>\n {data.map((tenant) => (\n <Tr key={tenant.id} className=\"group\">\n <Td>\n <Link\n href={`/iam/tenants/${tenant.id}`}\n className=\"block text-left font-medium hover:text-primary hover:underline cursor-pointer\"\n >\n <p>{str(tenant.name) || tenant.id}</p>\n <p className=\"text-sm text-muted-foreground\">{tenant.id}</p>\n </Link>\n </Td>\n <Td>\n <span className=\"text-muted-foreground line-clamp-1 max-w-[200px]\">\n {str(tenant.description) || '—'}\n </span>\n </Td>\n <Td>\n <Badge variant={tenant.isActive ? 'default' : 'secondary'}>\n {tenant.isActive ? 'Active' : 'Inactive'}\n </Badge>\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(tenant.createdAt).toLocaleDateString()}\n </div>\n </Td>\n <Td>\n <DataTableAction\n onClick={() => setEditingTenantId(tenant.id)}\n />\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((t) => (\n <TenantCard key={t.id} tenant={t} />\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, IconPencil } from '@tabler/icons-react';\nimport { useState } from 'react';\nimport { Link } from '../../shared/page-helpers';\nimport { TenantForm } from './tenant-form';\nimport { str, type Tenant } from './tenants-data';\n\ntype TenantCardProps = { tenant: Tenant };\n\nexport function TenantCard({ tenant }: TenantCardProps) {\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/tenants/${tenant.id}`}\n className=\"text-left font-semibold hover:text-primary hover:underline\"\n >\n {str(tenant.name) || tenant.id}\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 <p className=\"text-sm text-muted-foreground\">{tenant.id}</p>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n <Badge variant={tenant.isActive ? 'default' : 'secondary'}>\n {tenant.isActive ? 'Active' : 'Inactive'}\n </Badge>\n {str(tenant.description) ? (\n <p className=\"text-sm text-muted-foreground line-clamp-2\">\n {str(tenant.description)}\n </p>\n ) : null}\n <p className=\"text-xs text-muted-foreground\">\n Created {new Date(tenant.createdAt).toLocaleDateString()}\n </p>\n </CardContent>\n </Card>\n {editOpen ? (\n <TenantForm\n mode=\"edit\"\n tenantId={tenant.id}\n open={editOpen}\n onClose={() => setEditOpen(false)}\n />\n ) : null}\n </>\n );\n}\n"],"mappings":"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","names":["IconBuilding","useState","Badge","useState","jsx","jsxs","jsx","jsxs","useState","Badge","jsx","jsxs","useState","IconBuilding"]}
@@ -251,10 +251,13 @@ function AuthStateProvider({
251
251
  await refetch();
252
252
  };
253
253
  const signOut = async () => {
254
- try {
255
- await signOutMutation.mutateAsync({});
256
- } finally {
257
- clearAuth();
254
+ await signOutMutation.mutateAsync({});
255
+ clearAuth();
256
+ const redirectUrl = config.navigation?.defaultRedirectUrl || "/";
257
+ if (config.navigation?.onNavigate) {
258
+ config.navigation.onNavigate(redirectUrl);
259
+ } else if (typeof window !== "undefined") {
260
+ window.location.href = redirectUrl;
258
261
  }
259
262
  };
260
263
  return /* @__PURE__ */ jsx(ConfigContext.Provider, { value: { config, cookieName, t }, children: /* @__PURE__ */ jsx(ApiContext.Provider, { value: { hooks, setAuth, clearAuth, refresh }, children: /* @__PURE__ */ jsx(
@@ -285,4 +288,4 @@ export {
285
288
  useHasAuthCookie,
286
289
  MesobAuthProvider
287
290
  };
288
- //# sourceMappingURL=chunk-72YRO3A7.js.map
291
+ //# sourceMappingURL=chunk-XCJ3ZH7D.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.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 { 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 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 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 cookiePrefix?: string;\n phoneRegex?: RegExp | 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 enableSocialSignup: false;\n readonly socialProviders: [];\n };\n readonly navigation: {\n readonly locale: 'en';\n };\n readonly cookiePrefix: '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 enableSocialSignup: false,\n socialProviders: [],\n },\n navigation: {\n locale: 'en',\n },\n cookiePrefix: 'msb',\n phoneRegex: /^(\\+2519|\\+2517|2519|2517|09|07)\\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\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":";AAEA,IAAM,eACJ,OAAO,YAAY,eAAe,QAAQ,IAAI,aAAa;AAEtD,IAAM,uBAAuB,CAAC,WAAqC;AACxE,QAAM,SAAS,OAAO,gBAAgB;AACtC,QAAM,WAAW;AACjB,MAAI,QAAQ;AACV,WAAO,GAAG,MAAM,IAAI,QAAQ;AAAA,EAC9B;AACA,SAAO,eAAe,yBAAyB;AACjD;;;ACVA,SAAS,aAAa,2BAA2B;AACjD,SAAS,iBAAiB;AAC1B,OAAO,uBAAuB;AAC9B,OAAO,kBAAkB;AAEzB,SAAS,eAAe,YAAY,SAAS,gBAAgB;;;ACLtD,SAAS,iBAAiB,UAAoB,WAAoB;AACvE,SAAO,CAAC,KAAa,WAAqD;AACxE,UAAM,UAAU,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACpD,UAAM,OAAO,QAAQ,MAAM,GAAG;AAE9B,QAAI,QAAiB;AACrB,eAAW,KAAK,MAAM;AACpB,UAAI,SAAS,OAAO,UAAU,YAAY,UAAU,MAAM;AACxD,gBAAS,MAAkC,CAAC;AAAA,MAC9C,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO;AAAA,IACT;AAGA,QAAI,QAAQ;AACV,aAAO,MAAM;AAAA,QAAQ;AAAA,QAAc,CAAC,GAAG,UACrC,OAAO,OAAO,KAAK,KAAK,IAAI,KAAK,GAAG;AAAA,MACtC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;ACoCO,IAAM,0BAAmD;AAAA,EAC9D,UAAU;AAAA,IACR,cAAc;AAAA,IACd,qBAAqB;AAAA,IACrB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,oBAAoB;AAAA,IACpB,iBAAiB,CAAC;AAAA,EACpB;AAAA,EACA,YAAY;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EACA,cAAc;AAAA,EACd,YAAY;AACd;;;AC7EO,IAAM,oBAAoB,CAAC,YAA8B;AAC9D,SAAO,CAAC,OAA0B,SAA0C;AAC1E,QAAI,iBAAiB,SAAS;AAC5B,aAAO,MAAM,OAAO,EAAE,GAAG,MAAM,aAAa,UAAU,CAAC;AAAA,IACzD;AACA,WAAO,MAAM,OAAO,EAAE,GAAG,MAAM,aAAa,UAAU,CAAC;AAAA,EACzD;AACF;;;AHsJM;AAvIN,SAAS,WAAoB;AAC3B,SAAO,OAAO,aAAa;AAC7B;AAOO,SAAS,cAAc,aAA8B;AAG1D,SAAO;AACT;AAgCA,IAAM,iBAAiB,cAA0C,IAAI;AACrE,IAAM,aAAa,cAAsC,IAAI;AAC7D,IAAM,gBAAgB,cAAyC,IAAI;AAEnE,IAAM,cAAc,IAAI,YAAY;AAAA,EAClC,gBAAgB;AAAA,IACd,SAAS;AAAA,MACP,sBAAsB;AAAA,IACxB;AAAA,EACF;AACF,CAAC;AAUM,SAAS,aAAkC;AAChD,QAAM,UAAU,WAAW,cAAc;AACzC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AACA,SAAO;AACT;AAEO,SAAS,SAA0B;AACxC,QAAM,UAAU,WAAW,UAAU;AACrC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AACA,SAAO;AACT;AAEO,SAAS,YAAgC;AAC9C,QAAM,UAAU,WAAW,aAAa;AACxC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AACA,SAAO;AACT;AAMO,SAAS,mBAA4B;AAC1C,QAAM,EAAE,OAAO,IAAI,WAAW;AAC9B,SAAO,WAAW,mBAAmB,WAAW;AAClD;AASO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,eAAe;AAAA,IACnB,MACE;AAAA,MACE,EAAE,GAAG,wBAAwB;AAAA,MAC7B;AAAA,IACF;AAAA,IACF,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,MAAM;AAAA,IACV,MACE,kBAAyB;AAAA,MACvB,SAAS,aAAa;AAAA,MACtB,OAAO,kBAAkB,YAAY;AAAA,IACvC,CAAC;AAAA,IACH,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,QAAQ,QAAQ,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,CAAC;AACpD,QAAM,aAAa;AAAA,IACjB,MAAM,qBAAqB,YAAY;AAAA,IACvC,CAAC,YAAY;AAAA,EACf;AAEA,SACE,oBAAC,uBAAoB,QAAQ,aAC3B;AAAA,IAAC;AAAA;AAAA,MACC,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MAEC;AAAA;AAAA,EACH,GACF;AAEJ;AASA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AAEzB,QAAM,CAAC,UAAU,WAAW,IAAI,SAA2B,IAAI;AAI/D,QAAM;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP;AAAA,EACF,IAAI,MAAM;AAAA,IACR;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD;AAAA,MACE,SAAS,EAAE,YAAY,SAAS;AAAA,MAChC,gBAAgB;AAAA,MAChB,sBAAsB;AAAA,MACtB,oBAAoB;AAAA,MACpB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,WAAW;AAAA,IACb;AAAA,EACF;AAGA,QAAM,OAAO,UAAU,QAAQ,aAAa,QAAQ;AACpD,QAAM,UAAU,UAAU,WAAW,aAAa,WAAW;AAC7D,QAAM,QAAQ,UAAU,SAAU;AAGlC,QAAM,eAAe,MAAM;AACzB,QAAI,CAAC,cAAc;AACjB,aAAO;AAAA,IACT;AACA,UAAM,MAAM;AACZ,WAAO,IAAI,UAAU;AAAA,EACvB,GAAG;AAGH,QAAM,kBAAkB,MAAM;AAC5B,QAAI,CAAC,cAAc;AACjB,aAAO;AAAA,IACT;AACA,UAAMA,SAAQ;AACd,UAAM,eACJA,OAAM,WAAW,OAAOA,MAAK,KAAK,KAAK,UAAUA,MAAK;AAExD,QACEA,kBAAiB,aACjBA,kBAAiB,gBACjBA,OAAM,SAAS,eACf,aAAa,SAAS,iBAAiB,KACvC,aAAa,SAAS,wBAAwB,KAC9C,aAAa,SAAS,cAAc,KACpC,aAAa,SAAS,wBAAwB,KAC9C,aAAa,SAAS,cAAc,GACpC;AACA,aAAO;AAAA,IACT;AAEA,QAAIA,OAAM,OAAO;AACf,YAAM,WAAW,OAAOA,OAAM,KAAK;AACnC,UACE,SAAS,SAAS,iBAAiB,KACnC,SAAS,SAAS,wBAAwB,KAC1C,SAAS,SAAS,cAAc,GAChC;AACA,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG;AAIH,QAAM,UAAsB,MAAM;AAChC,QAAI,UAAU;AACZ,aAAO,SAAS;AAAA,IAClB;AACA,QAAI,SAAS,GAAG;AACd,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,SAAS;AACnB,aAAO;AAAA,IACT;AAEA,QAAI,kBAAkB,gBAAgB,KAAK;AACzC,aAAO;AAAA,IACT;AAEA,QAAI,gBAAgB,CAAC,kBAAkB,gBAAgB,KAAK;AAC1D,UAAI,eAAe,eAAe,KAAK;AACrC,eAAO;AAAA,MACT;AAEA,UAAI,WAAW;AACb,eAAO;AAAA,MACT;AAAA,IACF;AACA,QAAI,aAAa,CAAC,WAAW;AAC3B,aAAO;AAAA,IACT;AACA,QAAI,aAAa,CAAC,QAAQ,CAAC,SAAS;AAClC,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,GAAG;AAEH,QAAM,kBAAkB,MAAM,YAAY,QAAQ,WAAW;AAC7D,QAAM,IAAI,iBAAiB,OAAO,YAAY,CAAC,CAAC;AAEhD,QAAM,UAAU,CAAC,SAAuB;AACtC,gBAAY;AAAA,MACV,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,QAAQ;AAAA,MACR,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,QAAM,YAAY,MAAM;AACtB,gBAAY;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,QAAM,UAAU,YAAY;AAC1B,gBAAY,IAAI;AAChB,UAAM,QAAQ;AAAA,EAChB;AAEA,QAAM,UAAU,YAAY;AAC1B,UAAM,gBAAgB,YAAY,CAAC,CAAC;AACpC,cAAU;AAEV,UAAM,cAAc,OAAO,YAAY,sBAAsB;AAE7D,QAAI,OAAO,YAAY,YAAY;AACjC,aAAO,WAAW,WAAW,WAAW;AAAA,IAC1C,WAAW,OAAO,WAAW,aAAa;AACxC,aAAO,SAAS,OAAO;AAAA,IACzB;AAAA,EACF;AAEA,SACE,oBAAC,cAAc,UAAd,EAAuB,OAAO,EAAE,QAAQ,YAAY,EAAE,GACrD,8BAAC,WAAW,UAAX,EAAoB,OAAO,EAAE,OAAO,SAAS,WAAW,QAAQ,GAC/D;AAAA,IAAC,eAAe;AAAA,IAAf;AAAA,MACC,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,WAAW;AAAA,QACtB,iBAAiB,WAAW;AAAA,QAC5B;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH,GACF,GACF;AAEJ;","names":["error"]}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-C5ZW7FD2.js";
4
4
  import {
5
5
  useSession
6
- } from "./chunk-72YRO3A7.js";
6
+ } from "./chunk-XCJ3ZH7D.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-G7SCXCCM.js.map
89
+ //# sourceMappingURL=chunk-XEFPJKBB.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-TFVBER3Y.js";
4
4
  import {
5
5
  useApi
6
- } from "./chunk-72YRO3A7.js";
6
+ } from "./chunk-XCJ3ZH7D.js";
7
7
 
8
8
  // src/components/iam/tenants.tsx
9
9
  import { Badge, Button } from "@mesob/ui/components";
@@ -101,4 +101,4 @@ function Tenants() {
101
101
  export {
102
102
  Tenants
103
103
  };
104
- //# sourceMappingURL=chunk-UXOZ2TME.js.map
104
+ //# sourceMappingURL=chunk-YHZLPAYD.js.map
@@ -9,11 +9,11 @@ import {
9
9
  } from "./chunk-DPH2PHK3.js";
10
10
  import {
11
11
  useTranslator
12
- } from "./chunk-QNCE2B5O.js";
12
+ } from "./chunk-OK7WPIHQ.js";
13
13
  import {
14
14
  useApi,
15
15
  useConfig
16
- } from "./chunk-72YRO3A7.js";
16
+ } from "./chunk-XCJ3ZH7D.js";
17
17
 
18
18
  // src/components/auth/sign-in.tsx
19
19
  import { zodResolver } from "@hookform/resolvers/zod";
@@ -96,7 +96,7 @@ var SignIn = ({ redirectUrl } = {}) => {
96
96
  const checkUserMutation = hooks.useMutation("post", "/check-account");
97
97
  const signInMutation = hooks.useMutation("post", "/sign-in");
98
98
  const phoneRegex = typeof config.phoneRegex === "string" ? new RegExp(config.phoneRegex) : config.phoneRegex || /^(\+2519|\+2517|2519|2517|09|07)\d{8}$/;
99
- const defaultRedirect = redirectUrl || config.navigation?.defaultRedirectUrl || "/dashboard";
99
+ const defaultRedirect = redirectUrl || config.navigation?.defaultRedirectUrl || "/";
100
100
  const forgotPasswordLink = config.navigation?.links?.forgotPassword || "/auth/forgot-password";
101
101
  const signUpLink = config.navigation?.links?.signUp || "/auth/sign-up";
102
102
  const setPasswordLink = config.navigation?.links?.setPassword || "/auth/set-password";
@@ -128,13 +128,6 @@ var SignIn = ({ redirectUrl } = {}) => {
128
128
  }
129
129
  });
130
130
  if (result.exists) {
131
- if (result.requiresPasswordSetup) {
132
- const redirectParam = defaultRedirect ? `&redirect=${encodeURIComponent(defaultRedirect)}` : "";
133
- onNavigate(
134
- `${setPasswordLink}?identifier=${encodeURIComponent(normalizedUsername)}${redirectParam}`
135
- );
136
- return;
137
- }
138
131
  setUsername(normalizedUsername);
139
132
  form.setValue("username", normalizedUsername);
140
133
  setShowPasswordField(true);
@@ -342,4 +335,4 @@ var SignIn = ({ redirectUrl } = {}) => {
342
335
  export {
343
336
  SignIn
344
337
  };
345
- //# sourceMappingURL=chunk-FBABIA5J.js.map
338
+ //# sourceMappingURL=chunk-YLWCA2WK.js.map