@mesob/auth-react 0.5.10 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/dist/{chunk-ORQZZUVL.js → chunk-2SYBZ6TR.js} +2 -4
  2. package/dist/chunk-2SYBZ6TR.js.map +1 -0
  3. package/dist/{chunk-LI7WPOVY.js → chunk-323NYGKW.js} +3 -6
  4. package/dist/chunk-323NYGKW.js.map +1 -0
  5. package/dist/{chunk-Y6KURGWG.js → chunk-34AJJ2CI.js} +2 -4
  6. package/dist/chunk-34AJJ2CI.js.map +1 -0
  7. package/dist/{chunk-WAMZL5CS.js → chunk-4O3LAHTY.js} +4 -7
  8. package/dist/chunk-4O3LAHTY.js.map +1 -0
  9. package/dist/{chunk-4YPLJ2P6.js → chunk-57G5Z44Y.js} +2 -6
  10. package/dist/chunk-57G5Z44Y.js.map +1 -0
  11. package/dist/{chunk-NJGVOQIU.js → chunk-5O6VWABF.js} +5 -8
  12. package/dist/chunk-5O6VWABF.js.map +1 -0
  13. package/dist/{chunk-UV7JR3YU.js → chunk-5PGLBU4A.js} +4 -6
  14. package/dist/chunk-5PGLBU4A.js.map +1 -0
  15. package/dist/{chunk-IUCTHMVY.js → chunk-5YAYZDKX.js} +2 -5
  16. package/dist/chunk-5YAYZDKX.js.map +1 -0
  17. package/dist/{chunk-M2K6O5CN.js → chunk-6BLYK6D6.js} +85 -29
  18. package/dist/chunk-6BLYK6D6.js.map +1 -0
  19. package/dist/{chunk-G2RWFKGF.js → chunk-6HVUVXQB.js} +2 -4
  20. package/dist/chunk-6HVUVXQB.js.map +1 -0
  21. package/dist/chunk-6YHUCPJ4.js +28 -0
  22. package/dist/chunk-6YHUCPJ4.js.map +1 -0
  23. package/dist/{chunk-B7BS57X7.js → chunk-7FSFDTQR.js} +10 -11
  24. package/dist/chunk-7FSFDTQR.js.map +1 -0
  25. package/dist/{chunk-22KICA5N.js → chunk-ABIQ2NM3.js} +3 -5
  26. package/dist/{chunk-22KICA5N.js.map → chunk-ABIQ2NM3.js.map} +1 -1
  27. package/dist/{chunk-TT3V6PC7.js → chunk-AHWUP6LB.js} +4 -6
  28. package/dist/chunk-AHWUP6LB.js.map +1 -0
  29. package/dist/{chunk-M677DPBR.js → chunk-AKJ3EHND.js} +2 -6
  30. package/dist/chunk-AKJ3EHND.js.map +1 -0
  31. package/dist/{chunk-J7NROVB4.js → chunk-CY3MODZU.js} +2 -2
  32. package/dist/{chunk-QNPK2H5A.js → chunk-F5SAYP67.js} +3 -5
  33. package/dist/{chunk-QNPK2H5A.js.map → chunk-F5SAYP67.js.map} +1 -1
  34. package/dist/{chunk-I46PN4JU.js → chunk-F6WCSBHX.js} +2 -5
  35. package/dist/chunk-F6WCSBHX.js.map +1 -0
  36. package/dist/{chunk-25DJGLNU.js → chunk-FWYDZVFS.js} +9 -10
  37. package/dist/chunk-FWYDZVFS.js.map +1 -0
  38. package/dist/{chunk-75K2SCNC.js → chunk-HXAIYFI4.js} +3 -6
  39. package/dist/chunk-HXAIYFI4.js.map +1 -0
  40. package/dist/{chunk-7QJBDRTL.js → chunk-IFXBZY6Q.js} +3 -6
  41. package/dist/chunk-IFXBZY6Q.js.map +1 -0
  42. package/dist/{chunk-UIXR5GF3.js → chunk-ITKSPHYO.js} +2 -2
  43. package/dist/{chunk-HOROLWBY.js → chunk-J4X3CA3V.js} +2 -4
  44. package/dist/chunk-J4X3CA3V.js.map +1 -0
  45. package/dist/{chunk-GP4XI5KB.js → chunk-L5UKZAA4.js} +3 -3
  46. package/dist/{chunk-VTANFZKG.js → chunk-LGAHTK5V.js} +5 -7
  47. package/dist/chunk-LGAHTK5V.js.map +1 -0
  48. package/dist/{chunk-EWXK56WQ.js → chunk-LNG736CV.js} +1 -1
  49. package/dist/{chunk-DQB4WY5T.js → chunk-LVA77T4L.js} +4 -6
  50. package/dist/chunk-LVA77T4L.js.map +1 -0
  51. package/dist/{chunk-WY2F7475.js → chunk-NNYLSQ2X.js} +9 -10
  52. package/dist/chunk-NNYLSQ2X.js.map +1 -0
  53. package/dist/{chunk-CBR5NTFM.js → chunk-OCFX4MBQ.js} +10 -11
  54. package/dist/chunk-OCFX4MBQ.js.map +1 -0
  55. package/dist/{chunk-XTLFZ77E.js → chunk-OMAJKLVW.js} +18 -20
  56. package/dist/chunk-OMAJKLVW.js.map +1 -0
  57. package/dist/{chunk-DRAUYDZ5.js → chunk-OUBYTCTD.js} +2 -4
  58. package/dist/chunk-OUBYTCTD.js.map +1 -0
  59. package/dist/{chunk-KL2XZKDU.js → chunk-Q5RYLX6Z.js} +2 -5
  60. package/dist/chunk-Q5RYLX6Z.js.map +1 -0
  61. package/dist/{chunk-OT2H5EHA.js → chunk-RGGHVAAK.js} +2 -5
  62. package/dist/chunk-RGGHVAAK.js.map +1 -0
  63. package/dist/{chunk-22WSB5V2.js → chunk-RI647FTV.js} +9 -10
  64. package/dist/chunk-RI647FTV.js.map +1 -0
  65. package/dist/{chunk-QRYUUXNJ.js → chunk-SCSRGIEL.js} +4 -7
  66. package/dist/chunk-SCSRGIEL.js.map +1 -0
  67. package/dist/chunk-SEBNQYIE.js +30 -0
  68. package/dist/chunk-SEBNQYIE.js.map +1 -0
  69. package/dist/{chunk-GWRMQSME.js → chunk-VQYNQ5X7.js} +7 -11
  70. package/dist/chunk-VQYNQ5X7.js.map +1 -0
  71. package/dist/{chunk-NPA7L57G.js → chunk-WG5H5PTL.js} +4 -4
  72. package/dist/chunk-WG5H5PTL.js.map +1 -0
  73. package/dist/{chunk-5FNUPWPO.js → chunk-WLKT5YFP.js} +12 -5
  74. package/dist/chunk-WLKT5YFP.js.map +1 -0
  75. package/dist/{chunk-2BF2JIDK.js → chunk-WM2ETQIY.js} +9 -10
  76. package/dist/chunk-WM2ETQIY.js.map +1 -0
  77. package/dist/{chunk-MPZAPUVR.js → chunk-WTWZOQTD.js} +4 -6
  78. package/dist/chunk-WTWZOQTD.js.map +1 -0
  79. package/dist/{chunk-VWGOCWRF.js → chunk-X6FJMSL3.js} +9 -10
  80. package/dist/chunk-X6FJMSL3.js.map +1 -0
  81. package/dist/{chunk-R7VVXH5U.js → chunk-YPFDH2E7.js} +3 -6
  82. package/dist/chunk-YPFDH2E7.js.map +1 -0
  83. package/dist/{chunk-LYCBL2W3.js → chunk-Z47HLNM4.js} +4 -7
  84. package/dist/chunk-Z47HLNM4.js.map +1 -0
  85. package/dist/{chunk-ZIUAYN37.js → chunk-ZHRM4QOO.js} +2 -2
  86. package/dist/components/auth/countdown.js +3 -3
  87. package/dist/components/auth/forgot-password.js +4 -3
  88. package/dist/components/auth/reset-password-form.js +4 -3
  89. package/dist/components/auth/set-password.js +4 -3
  90. package/dist/components/auth/sign-in.js +4 -3
  91. package/dist/components/auth/sign-up.js +4 -3
  92. package/dist/components/auth/verification-form.js +4 -4
  93. package/dist/components/auth/verify-email.js +6 -5
  94. package/dist/components/auth/verify-phone.js +6 -5
  95. package/dist/components/authorization/deny.js +1 -2
  96. package/dist/components/authorization/grant.js +1 -2
  97. package/dist/components/iam/domains-page.js +7 -6
  98. package/dist/components/iam/iam-guard.js +2 -3
  99. package/dist/components/iam/permission-selector.js +1 -2
  100. package/dist/components/iam/permissions-page.js +3 -4
  101. package/dist/components/iam/permissions.js +1 -2
  102. package/dist/components/iam/role-detail-layout.js +2 -2
  103. package/dist/components/iam/role-detail-page.js +3 -4
  104. package/dist/components/iam/role-permissions-page.js +4 -5
  105. package/dist/components/iam/roles-page.js +7 -6
  106. package/dist/components/iam/roles.js +1 -2
  107. package/dist/components/iam/sessions-page.js +7 -6
  108. package/dist/components/iam/sessions.js +1 -2
  109. package/dist/components/iam/tenants-page.js +8 -7
  110. package/dist/components/iam/tenants.js +1 -2
  111. package/dist/components/iam/users-page.js +8 -7
  112. package/dist/components/iam/users.js +1 -2
  113. package/dist/components/profile/account.js +1 -2
  114. package/dist/components/profile/change-email-form.js +8 -8
  115. package/dist/components/profile/change-password-form.js +1 -2
  116. package/dist/components/profile/change-phone-form.js +8 -8
  117. package/dist/components/profile/otp-verification-modal.js +5 -5
  118. package/dist/components/profile/profile-layout.js +4 -3
  119. package/dist/components/profile/request-change-email-form.js +1 -2
  120. package/dist/components/profile/request-change-phone-form.js +1 -2
  121. package/dist/components/profile/security.js +13 -13
  122. package/dist/components/profile/verify-change-email-form.js +6 -6
  123. package/dist/components/profile/verify-change-phone-form.js +6 -6
  124. package/dist/index.js +66 -61
  125. package/dist/index.js.map +1 -1
  126. package/dist/pages/auth/layout.js +11 -9
  127. package/dist/pages/auth/layout.js.map +1 -1
  128. package/dist/pages/auth/route.d.ts +4 -0
  129. package/dist/pages/auth/route.js +44 -0
  130. package/dist/pages/auth/route.js.map +1 -0
  131. package/dist/pages/iam/shared/navigation.d.ts +1 -1
  132. package/dist/pages/iam/tenants/tenant-selector.d.ts +1 -0
  133. package/dist/pages/iam/tenants/tenant-selector.js +5 -5
  134. package/dist/pages/iam/tenants/tenants-data.d.ts +1 -0
  135. package/dist/pages/iam/tenants/tenants-data.js +1 -1
  136. package/dist/pages/iam/users/user-selector.d.ts +1 -0
  137. package/dist/pages/iam/users/user-selector.js +5 -5
  138. package/dist/pages/iam/users/users-data.d.ts +1 -0
  139. package/dist/pages/profile/account.js +1 -3
  140. package/dist/pages/profile/account.js.map +1 -1
  141. package/dist/pages/profile/security.js +1 -3
  142. package/dist/pages/profile/security.js.map +1 -1
  143. package/dist/providers/nuqs-adapter.d.ts +6 -0
  144. package/dist/utils/navigation.d.ts +5 -0
  145. package/package.json +43 -8
  146. package/dist/chunk-22WSB5V2.js.map +0 -1
  147. package/dist/chunk-25DJGLNU.js.map +0 -1
  148. package/dist/chunk-2BF2JIDK.js.map +0 -1
  149. package/dist/chunk-4YPLJ2P6.js.map +0 -1
  150. package/dist/chunk-5FNUPWPO.js.map +0 -1
  151. package/dist/chunk-75K2SCNC.js.map +0 -1
  152. package/dist/chunk-7QJBDRTL.js.map +0 -1
  153. package/dist/chunk-B7BS57X7.js.map +0 -1
  154. package/dist/chunk-CBR5NTFM.js.map +0 -1
  155. package/dist/chunk-DQB4WY5T.js.map +0 -1
  156. package/dist/chunk-DRAUYDZ5.js.map +0 -1
  157. package/dist/chunk-G2RWFKGF.js.map +0 -1
  158. package/dist/chunk-GWRMQSME.js.map +0 -1
  159. package/dist/chunk-HOROLWBY.js.map +0 -1
  160. package/dist/chunk-I46PN4JU.js.map +0 -1
  161. package/dist/chunk-IUCTHMVY.js.map +0 -1
  162. package/dist/chunk-KL2XZKDU.js.map +0 -1
  163. package/dist/chunk-LI7WPOVY.js.map +0 -1
  164. package/dist/chunk-LYCBL2W3.js.map +0 -1
  165. package/dist/chunk-M2K6O5CN.js.map +0 -1
  166. package/dist/chunk-M677DPBR.js.map +0 -1
  167. package/dist/chunk-MPZAPUVR.js.map +0 -1
  168. package/dist/chunk-NJGVOQIU.js.map +0 -1
  169. package/dist/chunk-NPA7L57G.js.map +0 -1
  170. package/dist/chunk-ORQZZUVL.js.map +0 -1
  171. package/dist/chunk-OT2H5EHA.js.map +0 -1
  172. package/dist/chunk-QRYUUXNJ.js.map +0 -1
  173. package/dist/chunk-R7VVXH5U.js.map +0 -1
  174. package/dist/chunk-SLIIENXJ.js +0 -34
  175. package/dist/chunk-SLIIENXJ.js.map +0 -1
  176. package/dist/chunk-TT3V6PC7.js.map +0 -1
  177. package/dist/chunk-UV7JR3YU.js.map +0 -1
  178. package/dist/chunk-VTANFZKG.js.map +0 -1
  179. package/dist/chunk-VWGOCWRF.js.map +0 -1
  180. package/dist/chunk-WAMZL5CS.js.map +0 -1
  181. package/dist/chunk-WY2F7475.js.map +0 -1
  182. package/dist/chunk-XTLFZ77E.js.map +0 -1
  183. package/dist/chunk-Y6KURGWG.js.map +0 -1
  184. /package/dist/{chunk-J7NROVB4.js.map → chunk-CY3MODZU.js.map} +0 -0
  185. /package/dist/{chunk-UIXR5GF3.js.map → chunk-ITKSPHYO.js.map} +0 -0
  186. /package/dist/{chunk-GP4XI5KB.js.map → chunk-L5UKZAA4.js.map} +0 -0
  187. /package/dist/{chunk-EWXK56WQ.js.map → chunk-LNG736CV.js.map} +0 -0
  188. /package/dist/{chunk-ZIUAYN37.js.map → chunk-ZHRM4QOO.js.map} +0 -0
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  Security
4
- } from "./chunk-VTANFZKG.js";
4
+ } from "./chunk-LGAHTK5V.js";
5
5
  import {
6
6
  AuthFormSkeleton
7
7
  } from "./chunk-5M7I7WNH.js";
@@ -11,53 +11,53 @@ import {
11
11
  import {
12
12
  getSafeRedirectFromSearch
13
13
  } from "./chunk-G2XRGSQE.js";
14
- import "./chunk-DQB4WY5T.js";
15
- import "./chunk-75K2SCNC.js";
16
- import "./chunk-IUCTHMVY.js";
17
- import "./chunk-MPZAPUVR.js";
18
- import "./chunk-R7VVXH5U.js";
19
- import "./chunk-UIXR5GF3.js";
14
+ import "./chunk-LVA77T4L.js";
15
+ import "./chunk-HXAIYFI4.js";
16
+ import "./chunk-5YAYZDKX.js";
17
+ import "./chunk-WTWZOQTD.js";
18
+ import "./chunk-YPFDH2E7.js";
19
+ import "./chunk-ITKSPHYO.js";
20
20
  import {
21
21
  ProfileLayout,
22
22
  ProfileSidebar
23
- } from "./chunk-22KICA5N.js";
24
- import "./chunk-M677DPBR.js";
25
- import "./chunk-4YPLJ2P6.js";
23
+ } from "./chunk-ABIQ2NM3.js";
24
+ import "./chunk-AKJ3EHND.js";
25
+ import "./chunk-57G5Z44Y.js";
26
26
  import {
27
27
  Roles
28
- } from "./chunk-UV7JR3YU.js";
28
+ } from "./chunk-5PGLBU4A.js";
29
29
  import {
30
30
  SessionsPage
31
- } from "./chunk-LYCBL2W3.js";
31
+ } from "./chunk-Z47HLNM4.js";
32
32
  import {
33
33
  Sessions
34
- } from "./chunk-HOROLWBY.js";
34
+ } from "./chunk-J4X3CA3V.js";
35
35
  import {
36
36
  TenantsPage
37
- } from "./chunk-NJGVOQIU.js";
37
+ } from "./chunk-5O6VWABF.js";
38
38
  import {
39
39
  str as str2
40
- } from "./chunk-EWXK56WQ.js";
40
+ } from "./chunk-LNG736CV.js";
41
41
  import {
42
42
  Tenants
43
- } from "./chunk-Y6KURGWG.js";
43
+ } from "./chunk-34AJJ2CI.js";
44
44
  import {
45
45
  UsersPage
46
- } from "./chunk-GWRMQSME.js";
47
- import "./chunk-XTLFZ77E.js";
46
+ } from "./chunk-VQYNQ5X7.js";
47
+ import "./chunk-OMAJKLVW.js";
48
48
  import {
49
49
  Users
50
- } from "./chunk-ORQZZUVL.js";
50
+ } from "./chunk-2SYBZ6TR.js";
51
51
  import {
52
52
  Account
53
- } from "./chunk-G2RWFKGF.js";
53
+ } from "./chunk-6HVUVXQB.js";
54
54
  import "./chunk-C5ZW7FD2.js";
55
55
  import {
56
56
  PermissionsPage
57
- } from "./chunk-LI7WPOVY.js";
57
+ } from "./chunk-323NYGKW.js";
58
58
  import {
59
59
  Permissions
60
- } from "./chunk-DRAUYDZ5.js";
60
+ } from "./chunk-OUBYTCTD.js";
61
61
  import {
62
62
  DataTable
63
63
  } from "./chunk-TFVBER3Y.js";
@@ -66,75 +66,83 @@ import {
66
66
  } from "./chunk-RT5C7IAE.js";
67
67
  import {
68
68
  RoleDetailLayout
69
- } from "./chunk-5FNUPWPO.js";
69
+ } from "./chunk-WLKT5YFP.js";
70
70
  import {
71
71
  RoleDetailPage
72
- } from "./chunk-7QJBDRTL.js";
72
+ } from "./chunk-IFXBZY6Q.js";
73
73
  import {
74
74
  RolePermissionsPage
75
- } from "./chunk-TT3V6PC7.js";
75
+ } from "./chunk-AHWUP6LB.js";
76
76
  import {
77
77
  PermissionSelector
78
- } from "./chunk-I46PN4JU.js";
78
+ } from "./chunk-F6WCSBHX.js";
79
79
  import {
80
80
  RoleCard,
81
81
  RolesList,
82
82
  RolesPage
83
- } from "./chunk-QRYUUXNJ.js";
83
+ } from "./chunk-SCSRGIEL.js";
84
84
  import {
85
85
  str
86
86
  } from "./chunk-OW75JENQ.js";
87
87
  import {
88
88
  SignUp
89
- } from "./chunk-WY2F7475.js";
89
+ } from "./chunk-NNYLSQ2X.js";
90
90
  import {
91
91
  VerifyEmail
92
- } from "./chunk-CBR5NTFM.js";
92
+ } from "./chunk-OCFX4MBQ.js";
93
93
  import {
94
94
  VerifyPhone
95
- } from "./chunk-B7BS57X7.js";
95
+ } from "./chunk-7FSFDTQR.js";
96
96
  import {
97
97
  VerificationForm
98
- } from "./chunk-GP4XI5KB.js";
98
+ } from "./chunk-L5UKZAA4.js";
99
99
  import {
100
100
  Deny
101
- } from "./chunk-OT2H5EHA.js";
101
+ } from "./chunk-RGGHVAAK.js";
102
102
  import {
103
103
  AuthErrorBoundary,
104
104
  ErrorBoundary
105
105
  } from "./chunk-7KXTL6NT.js";
106
106
  import {
107
107
  DomainsPage
108
- } from "./chunk-WAMZL5CS.js";
108
+ } from "./chunk-4O3LAHTY.js";
109
109
  import {
110
110
  authApi$
111
- } from "./chunk-QNPK2H5A.js";
112
- import "./chunk-SLIIENXJ.js";
111
+ } from "./chunk-F5SAYP67.js";
112
+ import {
113
+ MesobAuthProvider,
114
+ getSessionCookieName,
115
+ hasAuthCookie,
116
+ useApi,
117
+ useConfig,
118
+ useHasAuthCookie,
119
+ useSession
120
+ } from "./chunk-6BLYK6D6.js";
113
121
  import {
114
122
  defaultEntityQueryOptions
115
123
  } from "./chunk-NPW7D2HZ.js";
116
124
  import {
117
125
  IAMGuard
118
- } from "./chunk-ZIUAYN37.js";
126
+ } from "./chunk-ZHRM4QOO.js";
119
127
  import {
120
128
  Grant
121
- } from "./chunk-KL2XZKDU.js";
129
+ } from "./chunk-Q5RYLX6Z.js";
122
130
  import {
123
131
  AuthCard
124
132
  } from "./chunk-G2AW2H36.js";
125
- import "./chunk-J7NROVB4.js";
133
+ import "./chunk-CY3MODZU.js";
126
134
  import {
127
135
  ForgotPassword
128
- } from "./chunk-22WSB5V2.js";
136
+ } from "./chunk-RI647FTV.js";
129
137
  import {
130
138
  ResetPasswordForm
131
- } from "./chunk-2BF2JIDK.js";
139
+ } from "./chunk-WM2ETQIY.js";
132
140
  import {
133
141
  SetPassword
134
- } from "./chunk-VWGOCWRF.js";
142
+ } from "./chunk-X6FJMSL3.js";
135
143
  import {
136
144
  SignIn
137
- } from "./chunk-25DJGLNU.js";
145
+ } from "./chunk-FWYDZVFS.js";
138
146
  import {
139
147
  normalizeEmail
140
148
  } from "./chunk-YR6SS2CC.js";
@@ -144,23 +152,17 @@ import {
144
152
  import {
145
153
  handleError
146
154
  } from "./chunk-W7UHDTBI.js";
155
+ import "./chunk-6YHUCPJ4.js";
147
156
  import "./chunk-DPH2PHK3.js";
148
157
  import {
149
158
  useTranslator
150
- } from "./chunk-NPA7L57G.js";
151
- import {
152
- MesobAuthProvider,
153
- getSessionCookieName,
154
- hasAuthCookie,
155
- useApi,
156
- useConfig,
157
- useHasAuthCookie,
158
- useSession
159
- } from "./chunk-M2K6O5CN.js";
159
+ } from "./chunk-WG5H5PTL.js";
160
+ import "./chunk-SEBNQYIE.js";
160
161
 
161
162
  // src/hooks/use-session-cookie-name.ts
163
+ import { useConfig as useConfig2 } from "@mesob/auth-react";
162
164
  function useSessionCookieName() {
163
- const { config } = useConfig();
165
+ const { config } = useConfig2();
164
166
  return getSessionCookieName(config);
165
167
  }
166
168
 
@@ -509,6 +511,7 @@ function RoleUsersPageContent({ roleId }) {
509
511
  }
510
512
 
511
513
  // src/pages/iam/tenants/tenant-detail-page-content.tsx
514
+ import { useApi as useApi2, useConfig as useConfig3 } from "@mesob/auth-react";
512
515
  import { IAMGuard as IAMGuard3 } from "@mesob/auth-react/components/iam/iam-guard";
513
516
  import {
514
517
  Button as Button2,
@@ -532,8 +535,8 @@ function TenantDetailPageContent({
532
535
  function TenantDetailPageContentInner({
533
536
  tenantId
534
537
  }) {
535
- const { hooks } = useApi();
536
- const { config } = useConfig();
538
+ const { hooks } = useApi2();
539
+ const { config } = useConfig3();
537
540
  const homeHref = config.navigation?.defaultRedirectUrl || "/";
538
541
  const qc = useQueryClient2();
539
542
  const { data, isLoading } = hooks.useQuery(
@@ -644,6 +647,7 @@ function TenantDetailPageContentInner({
644
647
  }
645
648
 
646
649
  // src/pages/iam/users/_components/user-detail-layout-content.tsx
650
+ import { useApi as useApi3, useConfig as useConfig4 } from "@mesob/auth-react";
647
651
  import { IAMGuard as IAMGuard4 } from "@mesob/auth-react/components/iam/iam-guard";
648
652
  import { toTitleCase } from "@mesob/common";
649
653
  import {
@@ -665,8 +669,8 @@ function UserDetailLayoutContentInner({
665
669
  userId,
666
670
  children
667
671
  }) {
668
- const { hooks } = useApi();
669
- const { config } = useConfig();
672
+ const { hooks } = useApi3();
673
+ const { config } = useConfig4();
670
674
  const homeHref = config.navigation?.defaultRedirectUrl || "/";
671
675
  const { data, isLoading } = hooks.useQuery(
672
676
  "get",
@@ -704,6 +708,7 @@ function UserDetailLayoutContentInner({
704
708
  {
705
709
  title,
706
710
  icon: /* @__PURE__ */ jsx3(IconUser2, {}),
711
+ backHref: "/iam/users",
707
712
  tabs,
708
713
  loading: isLoading,
709
714
  actions: /* @__PURE__ */ jsx3(Button3, { children: "Test Button" })
@@ -714,6 +719,7 @@ function UserDetailLayoutContentInner({
714
719
  }
715
720
 
716
721
  // src/pages/iam/users/_components/user-detail-page-content.tsx
722
+ import { useApi as useApi4 } from "@mesob/auth-react";
717
723
  import { IAMGuard as IAMGuard5 } from "@mesob/auth-react/components/iam/iam-guard";
718
724
  import {
719
725
  Card as Card2,
@@ -730,7 +736,7 @@ function UserDetailPageContent({ userId }) {
730
736
  return /* @__PURE__ */ jsx4(IAMGuard5, { children: /* @__PURE__ */ jsx4(UserDetailPageContentInner, { userId }) });
731
737
  }
732
738
  function UserDetailPageContentInner({ userId }) {
733
- const { hooks } = useApi();
739
+ const { hooks } = useApi4();
734
740
  const { data, isLoading } = hooks.useQuery(
735
741
  "get",
736
742
  "/users/{id}",
@@ -1080,10 +1086,9 @@ function UserActivityPageContentInner({
1080
1086
  }
1081
1087
 
1082
1088
  // src/providers/nuqs-adapter.tsx
1083
- import { NuqsAdapter } from "nuqs/adapters/next/app";
1084
- import { jsx as jsx8 } from "react/jsx-runtime";
1089
+ import { Fragment as Fragment4, jsx as jsx8 } from "react/jsx-runtime";
1085
1090
  function NuqsAdapterWrapper({ children }) {
1086
- return /* @__PURE__ */ jsx8(NuqsAdapter, { children });
1091
+ return /* @__PURE__ */ jsx8(Fragment4, { children });
1087
1092
  }
1088
1093
  export {
1089
1094
  Account,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks/use-session-cookie-name.ts","../src/pages/iam/roles/users/_components/role-users-page.tsx","../src/pages/iam/tenants/tenant-detail-page-content.tsx","../src/pages/iam/users/_components/user-detail-layout-content.tsx","../src/pages/iam/users/_components/user-detail-page-content.tsx","../src/pages/iam/users/activity/user-activity-page-content.tsx","../src/pages/iam/users/activity/_components/role-section.tsx","../src/pages/iam/roles/_components/role-selector.tsx","../src/providers/nuqs-adapter.tsx"],"sourcesContent":["import { useConfig } from '../provider';\nimport { getSessionCookieName } from '../utils/cookie';\n\nexport function useSessionCookieName(): string {\n const { config } = useConfig();\n return getSessionCookieName(config);\n}\n","'use client';\n\nimport { IAMGuard } from '@mesob/auth-react/components/iam/iam-guard';\nimport { UserSelector } from '@mesob/auth-react/pages/iam/users/user-selector';\nimport type { User } from '@mesob/auth-react/pages/iam/users/users-data';\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n Badge,\n Button,\n DataTablePagination,\n DeleteConfirmButton,\n DisplayTable,\n EntityEmptyState,\n EntityFilter,\n EntityHeader,\n EntityLoadingState,\n EntitySearch,\n EntitySort,\n EntityViewToggle,\n PageBody,\n Tbody,\n Td,\n Th,\n Thead,\n Tr,\n useEntityPagination,\n useEntityParams,\n} from '@mesob/ui/components';\nimport { IconPlus, IconUser, IconUsers } from '@tabler/icons-react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport type { ReactNode } from 'react';\nimport { useMemo } from 'react';\nimport { toast } from 'sonner';\nimport type { paths } from '../../../../../data/openapi';\nimport { authApi$ } from '../../../shared/page-helpers';\n\ntype RoleUsersPageProps = {\n roleId: string;\n};\n\nconst TABLE_COLUMN_COUNT = 4;\n\nfunction initials(user: User) {\n return user.fullName\n .split(' ')\n .filter(Boolean)\n .slice(0, 2)\n .map((part: string) => part[0]?.toUpperCase() ?? '')\n .join('');\n}\n\nfunction UserIdentity({ user }: { user: User }) {\n return (\n <div className=\"flex items-center gap-3\">\n <Avatar className=\"h-9 w-9\">\n <AvatarImage src={user.image ?? undefined} />\n <AvatarFallback>{initials(user)}</AvatarFallback>\n </Avatar>\n <div>\n <p className=\"font-medium\">{user.fullName}</p>\n </div>\n </div>\n );\n}\n\nfunction UserContact({ user }: { user: User }) {\n return (\n <div className=\"space-y-1\">\n {user.email ? (\n <div className=\"flex items-center gap-2\">\n <span>{user.email}</span>\n {user.emailVerified ? (\n <Badge variant=\"outline\">Verified</Badge>\n ) : null}\n </div>\n ) : null}\n {user.phone ? (\n <div className=\"flex items-center gap-2\">\n <span>{user.phone}</span>\n {user.phoneVerified ? (\n <Badge variant=\"outline\">Verified</Badge>\n ) : null}\n </div>\n ) : null}\n {user.email || user.phone ? null : (\n <span className=\"text-muted-foreground\">—</span>\n )}\n </div>\n );\n}\n\nfunction UserRemoveButton({\n roleId,\n userId,\n onRemove,\n}: {\n roleId: string;\n userId: string;\n onRemove: (roleId: string, userId: string) => void;\n}) {\n return (\n <DeleteConfirmButton\n entityName=\"user\"\n onConfirm={() => onRemove(roleId, userId)}\n triggerClassName=\"size-8 text-destructive hover:text-destructive\"\n />\n );\n}\n\nfunction RoleUsersTable({\n roleId,\n users,\n onRemove,\n}: {\n roleId: string;\n users: User[];\n onRemove: (roleId: string, userId: string) => void;\n}) {\n return (\n <DisplayTable withTableBorder>\n <Thead>\n <Tr>\n <Th>User</Th>\n <Th>Contact</Th>\n <Th>Last sign in</Th>\n <Th className=\"w-[60px]\" />\n </Tr>\n </Thead>\n <Tbody>\n {users.map((user) => (\n <Tr key={user.id}>\n <Td>\n <UserIdentity user={user} />\n </Td>\n <Td>\n <UserContact user={user} />\n </Td>\n <Td>\n {user.lastSignInAt\n ? new Date(user.lastSignInAt).toLocaleDateString()\n : 'Never'}\n </Td>\n <Td>\n <UserRemoveButton\n roleId={roleId}\n userId={user.id}\n onRemove={onRemove}\n />\n </Td>\n </Tr>\n ))}\n </Tbody>\n </DisplayTable>\n );\n}\n\nfunction RoleUsersCards({\n roleId,\n users,\n onRemove,\n}: {\n roleId: string;\n users: User[];\n onRemove: (roleId: string, userId: string) => void;\n}) {\n return (\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3\">\n {users.map((user) => (\n <div\n key={user.id}\n className=\"rounded-xl border border-border/60 bg-card p-4 shadow-sm\"\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3\">\n <Avatar className=\"h-10 w-10\">\n <AvatarImage src={user.image ?? undefined} />\n <AvatarFallback>{initials(user)}</AvatarFallback>\n </Avatar>\n <div>\n <p className=\"font-semibold\">{user.fullName}</p>\n </div>\n </div>\n <div className=\"space-y-1 text-sm text-muted-foreground\">\n <p>{user.email ?? user.phone ?? 'No contact info'}</p>\n <p>\n Last sign in{' '}\n {user.lastSignInAt\n ? new Date(user.lastSignInAt).toLocaleDateString()\n : 'never'}\n </p>\n </div>\n </div>\n <UserRemoveButton\n roleId={roleId}\n userId={user.id}\n onRemove={onRemove}\n />\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nexport function RoleUsersPage({ roleId }: RoleUsersPageProps) {\n return (\n <IAMGuard>\n <RoleUsersPageContent roleId={roleId} />\n </IAMGuard>\n );\n}\n\nfunction RoleUsersPageContent({ roleId }: RoleUsersPageProps) {\n const qc = useQueryClient();\n const { queryConfig, params, setParams } = useEntityParams({\n searchKey: 'search',\n defaultSort: 'fullName',\n defaultOrder: 'asc',\n });\n const usersQuery = useMemo(\n () =>\n ({\n params: {\n path: { id: roleId },\n query: queryConfig.params.query,\n },\n }) as {\n params: {\n path: { id: string };\n query: NonNullable<\n paths['/roles/{id}/users']['get']['parameters']['query']\n >;\n };\n },\n [queryConfig, roleId],\n );\n\n const { data, isPending, isFetching } = authApi$.useQuery(\n 'get',\n '/roles/{id}/users',\n usersQuery,\n { enabled: !!roleId },\n );\n const assignUsers = authApi$.useMutation('post', '/roles/{id}/users', {\n onSuccess: (result: { created?: number } | undefined) => {\n qc.invalidateQueries({ queryKey: ['get', '/roles'] });\n qc.invalidateQueries({ queryKey: ['get', '/roles/{id}'] });\n qc.invalidateQueries({ queryKey: ['get', '/roles/{id}/users'] });\n toast.success(\n result?.created ? `${result.created} user(s) added` : 'No changes',\n );\n },\n onError: () => {\n toast.error('Failed to assign users');\n },\n });\n const revokeUser = authApi$.useMutation(\n 'delete',\n '/roles/{id}/users/{userId}',\n {\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: ['get', '/roles'] });\n qc.invalidateQueries({ queryKey: ['get', '/roles/{id}'] });\n qc.invalidateQueries({ queryKey: ['get', '/roles/{id}/users'] });\n toast.success('User removed');\n },\n onError: () => {\n toast.error('Failed to remove user');\n },\n },\n );\n\n const users = (data?.users ?? []) as User[];\n const { total, pageCount } = useEntityPagination({\n items: users,\n total: data?.total,\n pageSize: params.pageSize,\n });\n const isLoading = isPending || isFetching;\n const currentView = (params.view || 'table') as 'table' | 'card';\n const handleRemoveUser = (targetRoleId: string, userId: string) => {\n revokeUser.mutate({\n params: {\n path: { id: targetRoleId, userId },\n },\n });\n };\n\n if (!roleId) {\n return null;\n }\n\n let content: ReactNode;\n if (isLoading) {\n content = (\n <EntityLoadingState\n view={currentView}\n rowCount={params.pageSize}\n columnCount={TABLE_COLUMN_COUNT}\n cardCount={params.pageSize}\n />\n );\n } else if (total === 0) {\n content = (\n <EntityEmptyState\n icon={IconUsers}\n entityName=\"user\"\n title=\"No users assigned\"\n description=\"Assign users from the selector to add them to this role.\"\n />\n );\n } else if (currentView === 'table') {\n content = (\n <div className=\"space-y-4\">\n <RoleUsersTable\n roleId={roleId}\n users={users}\n onRemove={handleRemoveUser}\n />\n <DataTablePagination\n pageIndex={params.page - 1}\n pageSize={params.pageSize}\n pageCount={pageCount}\n totalRows={total}\n onPageChange={(page) => setParams({ page: page + 1 })}\n onPageSizeChange={(pageSize) => setParams({ pageSize, page: 1 })}\n />\n </div>\n );\n } else {\n content = (\n <div className=\"space-y-4\">\n <RoleUsersCards\n roleId={roleId}\n users={users}\n onRemove={handleRemoveUser}\n />\n <DataTablePagination\n pageIndex={params.page - 1}\n pageSize={params.pageSize}\n pageCount={pageCount}\n totalRows={total}\n onPageChange={(page) => setParams({ page: page + 1 })}\n onPageSizeChange={(pageSize) => setParams({ pageSize, page: 1 })}\n />\n </div>\n );\n }\n\n return (\n <PageBody className=\"px-0 pb-6\">\n <EntityHeader\n icon={<IconUser className=\"h-5 w-5\" />}\n title=\"Role users\"\n actions={\n <UserSelector\n trigger={\n <Button size=\"sm\" loading={assignUsers.isPending}>\n <IconPlus className=\"h-4 w-4\" />\n Add users\n </Button>\n }\n multiple\n excludeIds={users.map((user) => user.id)}\n onSelect={(selectedUsers: User[]) => {\n if (!selectedUsers.length) {\n return;\n }\n\n assignUsers.mutate({\n params: { path: { id: roleId } },\n body: {\n userIds: selectedUsers.map((user: User) => user.id),\n },\n });\n }}\n />\n }\n search={\n <EntitySearch\n paramKey=\"search\"\n placeholder=\"Search assigned users...\"\n />\n }\n filter={\n <EntityFilter\n options={[\n { label: 'All', value: '' },\n { label: 'Name', value: 'fullName' },\n { label: 'Email', value: 'email' },\n { label: 'Phone', value: 'phone' },\n ]}\n placeholder=\"Search field\"\n />\n }\n sort={\n <EntitySort\n defaultSort=\"fullName\"\n defaultOrder=\"asc\"\n options={[\n { label: 'Created', value: 'createdAt' },\n { label: 'Updated', value: 'updatedAt' },\n { label: 'Name', value: 'fullName' },\n { label: 'Last Sign In', value: 'lastSignInAt' },\n ]}\n />\n }\n view={<EntityViewToggle views={['table', 'card']} />}\n />\n {content}\n </PageBody>\n );\n}\n","'use client';\n\nimport { IAMGuard } from '@mesob/auth-react/components/iam/iam-guard';\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 return (\n <IAMGuard>\n <TenantDetailPageContentInner tenantId={tenantId} />\n </IAMGuard>\n );\n}\n\nfunction TenantDetailPageContentInner({\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","'use client';\n\nimport { IAMGuard } from '@mesob/auth-react/components/iam/iam-guard';\nimport { toTitleCase } from '@mesob/common';\nimport {\n Button,\n EntityDetailHeader,\n PageContainer,\n type TabItem,\n useBreadcrumbs,\n} from '@mesob/ui/components';\nimport { IconUser } from '@tabler/icons-react';\nimport { useMemo } from 'react';\nimport { useApi, useConfig } from '../../../../provider';\n\ntype UserDetailLayoutContentProps = {\n userId: string;\n children: React.ReactNode;\n};\n\nexport function UserDetailLayoutContent({\n userId,\n children,\n}: UserDetailLayoutContentProps) {\n return (\n <IAMGuard>\n <UserDetailLayoutContentInner userId={userId}>\n {children}\n </UserDetailLayoutContentInner>\n </IAMGuard>\n );\n}\n\nfunction UserDetailLayoutContentInner({\n userId,\n children,\n}: UserDetailLayoutContentProps) {\n const { hooks } = useApi();\n const { config } = useConfig();\n const homeHref = config.navigation?.defaultRedirectUrl || '/';\n const { data, isLoading } = hooks.useQuery(\n 'get',\n '/users/{id}',\n { params: { path: { id: userId } } },\n { enabled: !!userId },\n );\n const user = data?.user;\n\n const title = toTitleCase(user?.fullName || userId || 'User');\n\n useBreadcrumbs({\n items: [\n { label: 'Home', href: homeHref },\n { label: 'IAM', href: '/iam' },\n { label: 'Users', href: '/iam/users' },\n { label: title },\n ],\n });\n\n const tabs: TabItem[] = useMemo(\n () => [\n { value: 'detail', name: 'Detail', href: `/iam/users/${userId}` },\n {\n value: 'activity',\n name: 'Activity',\n href: `/iam/users/${userId}/activity`,\n },\n ],\n [userId],\n );\n\n if (!userId) {\n return null;\n }\n\n return (\n <PageContainer>\n <EntityDetailHeader\n title={title}\n icon={<IconUser />}\n tabs={tabs}\n loading={isLoading}\n actions={<Button>Test Button</Button>}\n />\n {children}\n </PageContainer>\n );\n}\n","'use client';\n\nimport { IAMGuard } from '@mesob/auth-react/components/iam/iam-guard';\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@mesob/ui/components';\nimport { IconCircleCheck } from '@tabler/icons-react';\nimport { useApi } from '../../../../provider';\n\ntype UserDetailPageContentProps = {\n userId: string;\n};\n\nexport function UserDetailPageContent({ userId }: UserDetailPageContentProps) {\n return (\n <IAMGuard>\n <UserDetailPageContentInner userId={userId} />\n </IAMGuard>\n );\n}\n\nfunction UserDetailPageContentInner({ userId }: UserDetailPageContentProps) {\n const { hooks } = useApi();\n const { data, isLoading } = hooks.useQuery(\n 'get',\n '/users/{id}',\n { params: { path: { id: userId } } },\n { enabled: !!userId },\n );\n const user = data?.user;\n\n if (!userId) {\n return null;\n }\n if (isLoading || !user) {\n return <div className=\"h-32 animate-pulse rounded-xl bg-muted mt-4\" />;\n }\n\n return (\n <Card>\n <CardHeader>\n <CardTitle>User details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2 text-sm\">\n <p>\n <span className=\"text-muted-foreground\">Name:</span>{' '}\n {user.fullName || '—'}\n </p>\n <p>\n <span className=\"text-muted-foreground\">Email:</span>{' '}\n {user.email ?? '—'}{' '}\n {user.emailVerified && (\n <Tooltip>\n <TooltipTrigger>\n <IconCircleCheck className=\"inline size-4 text-muted-foreground\" />\n </TooltipTrigger>\n <TooltipContent>Email verified</TooltipContent>\n </Tooltip>\n )}\n </p>\n <p>\n <span className=\"text-muted-foreground\">Phone:</span>{' '}\n {user.phone ?? '—'}{' '}\n {user.phoneVerified && (\n <Tooltip>\n <TooltipTrigger>\n <IconCircleCheck className=\"inline size-4 text-muted-foreground\" />\n </TooltipTrigger>\n <TooltipContent>Phone verified</TooltipContent>\n </Tooltip>\n )}\n </p>\n <p>\n <span className=\"text-muted-foreground\">Last sign in:</span>{' '}\n {user.lastSignInAt\n ? new Date(user.lastSignInAt).toLocaleString()\n : 'Never'}\n </p>\n {user.roleCodes?.length ? (\n <p>\n <span className=\"text-muted-foreground\">Roles:</span>{' '}\n {user.roleCodes.join(', ')}\n </p>\n ) : null}\n </CardContent>\n </Card>\n );\n}\n","'use client';\n\nimport { IAMGuard } from '@mesob/auth-react/components/iam/iam-guard';\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Section,\n} from '@mesob/ui/components';\nimport { IconCalendar } from '@tabler/icons-react';\nimport { RoleSection } from './_components/role-section';\n\ntype UserActivityPageContentProps = {\n userId: string;\n};\n\nexport function UserActivityPageContent({\n userId,\n}: UserActivityPageContentProps) {\n return (\n <IAMGuard>\n <UserActivityPageContentInner userId={userId} />\n </IAMGuard>\n );\n}\n\nfunction UserActivityPageContentInner({\n userId,\n}: UserActivityPageContentProps) {\n if (!userId) {\n return null;\n }\n\n return (\n <div className=\"space-y-4\">\n <Card>\n <CardHeader>\n <CardTitle>Activity</CardTitle>\n </CardHeader>\n <CardContent className=\"flex items-center gap-2 text-muted-foreground text-sm\">\n <IconCalendar className=\"h-4 w-4\" />\n Activity (placeholder)\n </CardContent>\n </Card>\n <RoleSection userId={userId} />\n <Section title=\"Permissions\">test</Section>\n <Section title=\"Groups\">test</Section>\n </div>\n );\n}\n","'use client';\n\nimport {\n Button,\n EntityEmptyState,\n EntityLoadingState,\n EntitySection,\n useEntitySectionState,\n} from '@mesob/ui/components';\nimport { IconPlus, IconShield } from '@tabler/icons-react';\nimport { useMemo, useState } from 'react';\nimport { RoleSelector } from '../../../roles/_components/role-selector';\nimport type { Role } from '../../../roles/_components/roles-data';\nimport { str } from '../../../roles/_components/roles-data';\nimport { RolesList } from '../../../roles/_components/roles-list';\nimport {\n authApi$,\n defaultEntityQueryOptions,\n} from '../../../shared/page-helpers';\n\nconst LIMIT = 100;\nconst TABLE_COLUMN_COUNT = 4;\n\nfunction filterAndSort(\n roles: Role[],\n search: string,\n sort: string,\n order: 'asc' | 'desc',\n) {\n let out = roles;\n if (search.trim()) {\n const q = search.trim().toLowerCase();\n out = out.filter(\n (r) =>\n str(r.name).toLowerCase().includes(q) ||\n r.code.toLowerCase().includes(q),\n );\n }\n const mult = order === 'asc' ? 1 : -1;\n const by = sort === 'code' ? 'code' : 'createdAt';\n out = [...out].sort((a, b) =>\n by === 'code'\n ? mult * a.code.localeCompare(b.code)\n : mult *\n (new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()),\n );\n return out;\n}\n\nexport function RoleSection({ userId }: { userId: string }) {\n const [open, setOpen] = useState(false);\n const sectionState = useEntitySectionState({\n defaultSort: 'createdAt',\n defaultOrder: 'desc',\n defaultPageSize: 10,\n filterOptions: [\n { label: 'All', value: '' },\n { label: 'By Code', value: 'code' },\n ],\n sortOptions: [\n { label: 'Created', value: 'createdAt' },\n { label: 'Updated', value: 'updatedAt' },\n { label: 'Code', value: 'code' },\n ],\n views: ['table', 'card'],\n });\n\n const { data, isPending, isFetching } = authApi$.useQuery(\n 'get',\n '/roles',\n { params: { query: { limit: LIMIT } } },\n { ...defaultEntityQueryOptions, enabled: open },\n );\n const isLoading = isPending || isFetching;\n const roles = data?.roles ?? [];\n\n const filtered = useMemo(\n () =>\n filterAndSort(\n roles,\n sectionState.search,\n sectionState.sort,\n sectionState.order,\n ),\n [roles, sectionState.search, sectionState.sort, sectionState.order],\n );\n const pageCount = Math.ceil(filtered.length / sectionState.pageSize) || 1;\n const pageIndex = Math.min(sectionState.page - 1, Math.max(0, pageCount - 1));\n const paginated = useMemo(\n () =>\n filtered.slice(\n pageIndex * sectionState.pageSize,\n pageIndex * sectionState.pageSize + sectionState.pageSize,\n ),\n [filtered, pageIndex, sectionState.pageSize],\n );\n\n return (\n <EntitySection\n title=\"Role\"\n state={sectionState}\n onOpenChange={setOpen}\n actions={\n <RoleSelector\n trigger={\n <Button variant=\"outline\" size=\"sm\">\n <IconPlus className=\"h-4 w-4\" />\n Add role\n </Button>\n }\n multiple\n onSelect={(roles) => {\n // TODO: assign roles to user; logging for now\n // biome-ignore lint/suspicious/noConsole: intentional for now\n console.log('Selected roles:', userId, roles);\n }}\n />\n }\n config={{\n searchPlaceholder: 'Search roles...',\n filterOptions: sectionState.filterOptions,\n sortOptions: sectionState.sortOptions,\n views: sectionState.views,\n }}\n >\n {(state) => (\n <>\n {isLoading && (\n <EntityLoadingState\n view={state.view as 'table' | 'card'}\n rowCount={state.pageSize}\n columnCount={TABLE_COLUMN_COUNT}\n cardCount={state.pageSize}\n />\n )}\n {!isLoading && filtered.length === 0 && (\n <EntityEmptyState\n icon={IconShield}\n entityName=\"role\"\n title=\"No roles\"\n description={\n roles.length === 0 ? 'No roles in tenant.' : 'No matches.'\n }\n />\n )}\n {!isLoading && filtered.length > 0 && (\n <RolesList\n data={paginated}\n view={state.view as 'table' | 'card'}\n pageIndex={pageIndex}\n pageSize={state.pageSize}\n pageCount={pageCount}\n totalRows={filtered.length}\n onPageChange={(p) => state.setPage(p + 1)}\n onPageSizeChange={(size) => {\n state.setPageSize(size);\n state.setPage(1);\n }}\n />\n )}\n </>\n )}\n </EntitySection>\n );\n}\n","'use client';\n\nimport {\n EntitySelector,\n type EntitySelectorColumn,\n type EntitySelectorConfig,\n useEntitySectionState,\n} from '@mesob/ui/components';\nimport { cn } from '@mesob/ui/lib/utils';\nimport { IconCalendar, IconShield } from '@tabler/icons-react';\nimport type { ReactNode } from 'react';\nimport type { paths } from '../../../../data/openapi';\nimport { authApi$, defaultEntityQueryOptions } from '../../shared/page-helpers';\nimport { RoleCard } from './role-card';\nimport type { Role } from './roles-data';\nimport { str } from './roles-data';\n\nfunction SelectableRoleCard({\n role,\n selected,\n onToggle,\n}: {\n role: Role;\n selected: boolean;\n onToggle: () => void;\n}) {\n return (\n // biome-ignore lint/a11y/useSemanticElements: div to avoid nested buttons from RoleCard\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onToggle}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n onToggle();\n }\n }}\n className={cn(\n 'cursor-pointer rounded-lg transition-shadow focus:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n selected && 'ring-primary ring-2',\n )}\n >\n <RoleCard role={role} mode=\"static\" />\n </div>\n );\n}\n\nconst roleColumns: EntitySelectorColumn<Role>[] = [\n {\n key: 'role',\n header: 'Role',\n cell: (role) => (\n <>\n <p className=\"font-medium\">{str(role.name) || role.code}</p>\n <p className=\"text-sm text-muted-foreground\">{role.code}</p>\n </>\n ),\n },\n {\n key: 'description',\n header: 'Description',\n cell: (role) => (\n <span className=\"text-muted-foreground line-clamp-1 max-w-[200px]\">\n {str(role.description) || '—'}\n </span>\n ),\n },\n {\n key: 'created',\n header: 'Created',\n cell: (role) => (\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 ),\n },\n];\n\ntype RoleSelectorProps = {\n trigger: ReactNode;\n multiple?: boolean;\n onSelect: (roles: Role[]) => void;\n modalSize?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n contentClassName?: string;\n};\n\nexport function RoleSelector({\n trigger,\n multiple = true,\n onSelect,\n modalSize = 'xl',\n contentClassName,\n}: RoleSelectorProps) {\n const state = useEntitySectionState({\n defaultSort: 'createdAt',\n defaultOrder: 'desc',\n defaultPageSize: 10,\n searchParamName: 'search',\n });\n const rolesQuery = state.queryConfig as {\n params: {\n query: NonNullable<paths['/roles']['get']['parameters']['query']>;\n };\n };\n\n const { data, isPending, isFetching } = authApi$.useQuery(\n 'get',\n '/roles',\n rolesQuery,\n defaultEntityQueryOptions,\n );\n\n const roles = data?.roles ?? [];\n\n const config: EntitySelectorConfig<Role> = {\n title: 'Select role(s)',\n modalSize,\n contentClassName,\n multiple,\n entityName: 'role',\n entityIcon: IconShield,\n columns: roleColumns,\n columnCount: 3,\n getItemLabel: (role) => str(role.name) || role.code,\n searchPlaceholder: 'Search roles...',\n wrapHeaderInCard: false,\n filterOptions: [\n { label: 'All', value: '' },\n { label: 'By Code', value: 'code' },\n ],\n sortOptions: [\n { label: 'Created', value: 'createdAt' },\n { label: 'Updated', value: 'updatedAt' },\n { label: 'Code', value: 'code' },\n ],\n showViewToggle: false,\n renderCard: (role, selected, onToggle) => (\n <SelectableRoleCard role={role} selected={selected} onToggle={onToggle} />\n ),\n };\n\n return (\n <EntitySelector<Role>\n trigger={trigger}\n config={config}\n onSelect={onSelect}\n items={roles}\n total={data?.total}\n isLoading={isPending || isFetching}\n state={state}\n />\n );\n}\n","'use client';\n\nimport { NuqsAdapter } from 'nuqs/adapters/next/app';\nimport type { ReactNode } from 'react';\n\ntype NuqsAdapterWrapperProps = {\n children: ReactNode;\n};\n\nexport function NuqsAdapterWrapper({ children }: NuqsAdapterWrapperProps) {\n return <NuqsAdapter>{children}</NuqsAdapter>;\n}\n"],"mappings":"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","names":["IAMGuard","IAMGuard","IAMGuard","Button","useQueryClient","useMemo","jsx","jsxs","IAMGuard","useQueryClient","str","useMemo","Button","IAMGuard","Button","EntityDetailHeader","PageContainer","useBreadcrumbs","IconUser","useMemo","jsx","jsxs","IAMGuard","useBreadcrumbs","useMemo","PageContainer","EntityDetailHeader","IconUser","Button","IAMGuard","Card","CardContent","CardHeader","CardTitle","jsx","jsxs","IAMGuard","Card","CardHeader","CardTitle","CardContent","IAMGuard","Card","CardContent","CardHeader","CardTitle","IconCalendar","Button","EntityEmptyState","EntityLoadingState","useEntitySectionState","IconPlus","IconShield","useMemo","Fragment","jsx","jsxs","Fragment","jsx","jsxs","TABLE_COLUMN_COUNT","useEntitySectionState","useMemo","Button","IconPlus","roles","EntityLoadingState","EntityEmptyState","IconShield","jsx","jsxs","IAMGuard","Card","CardHeader","CardTitle","CardContent","IconCalendar","jsx"]}
1
+ {"version":3,"sources":["../src/hooks/use-session-cookie-name.ts","../src/pages/iam/roles/users/_components/role-users-page.tsx","../src/pages/iam/tenants/tenant-detail-page-content.tsx","../src/pages/iam/users/_components/user-detail-layout-content.tsx","../src/pages/iam/users/_components/user-detail-page-content.tsx","../src/pages/iam/users/activity/user-activity-page-content.tsx","../src/pages/iam/users/activity/_components/role-section.tsx","../src/pages/iam/roles/_components/role-selector.tsx","../src/providers/nuqs-adapter.tsx"],"sourcesContent":["import { useConfig } from '@mesob/auth-react';\nimport { getSessionCookieName } from '../utils/cookie';\n\nexport function useSessionCookieName(): string {\n const { config } = useConfig();\n return getSessionCookieName(config);\n}\n","'use client';\n\nimport { IAMGuard } from '@mesob/auth-react/components/iam/iam-guard';\nimport { UserSelector } from '@mesob/auth-react/pages/iam/users/user-selector';\nimport type { User } from '@mesob/auth-react/pages/iam/users/users-data';\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n Badge,\n Button,\n DataTablePagination,\n DeleteConfirmButton,\n DisplayTable,\n EntityEmptyState,\n EntityFilter,\n EntityHeader,\n EntityLoadingState,\n EntitySearch,\n EntitySort,\n EntityViewToggle,\n PageBody,\n Tbody,\n Td,\n Th,\n Thead,\n Tr,\n useEntityPagination,\n useEntityParams,\n} from '@mesob/ui/components';\nimport { IconPlus, IconUser, IconUsers } from '@tabler/icons-react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport type { ReactNode } from 'react';\nimport { useMemo } from 'react';\nimport { toast } from 'sonner';\nimport type { paths } from '../../../../../data/openapi';\nimport { authApi$ } from '../../../shared/page-helpers';\n\ntype RoleUsersPageProps = {\n roleId: string;\n};\n\nconst TABLE_COLUMN_COUNT = 4;\n\nfunction initials(user: User) {\n return user.fullName\n .split(' ')\n .filter(Boolean)\n .slice(0, 2)\n .map((part: string) => part[0]?.toUpperCase() ?? '')\n .join('');\n}\n\nfunction UserIdentity({ user }: { user: User }) {\n return (\n <div className=\"flex items-center gap-3\">\n <Avatar className=\"h-9 w-9\">\n <AvatarImage src={user.image ?? undefined} />\n <AvatarFallback>{initials(user)}</AvatarFallback>\n </Avatar>\n <div>\n <p className=\"font-medium\">{user.fullName}</p>\n </div>\n </div>\n );\n}\n\nfunction UserContact({ user }: { user: User }) {\n return (\n <div className=\"space-y-1\">\n {user.email ? (\n <div className=\"flex items-center gap-2\">\n <span>{user.email}</span>\n {user.emailVerified ? (\n <Badge variant=\"outline\">Verified</Badge>\n ) : null}\n </div>\n ) : null}\n {user.phone ? (\n <div className=\"flex items-center gap-2\">\n <span>{user.phone}</span>\n {user.phoneVerified ? (\n <Badge variant=\"outline\">Verified</Badge>\n ) : null}\n </div>\n ) : null}\n {user.email || user.phone ? null : (\n <span className=\"text-muted-foreground\">—</span>\n )}\n </div>\n );\n}\n\nfunction UserRemoveButton({\n roleId,\n userId,\n onRemove,\n}: {\n roleId: string;\n userId: string;\n onRemove: (roleId: string, userId: string) => void;\n}) {\n return (\n <DeleteConfirmButton\n entityName=\"user\"\n onConfirm={() => onRemove(roleId, userId)}\n triggerClassName=\"size-8 text-destructive hover:text-destructive\"\n />\n );\n}\n\nfunction RoleUsersTable({\n roleId,\n users,\n onRemove,\n}: {\n roleId: string;\n users: User[];\n onRemove: (roleId: string, userId: string) => void;\n}) {\n return (\n <DisplayTable withTableBorder>\n <Thead>\n <Tr>\n <Th>User</Th>\n <Th>Contact</Th>\n <Th>Last sign in</Th>\n <Th className=\"w-[60px]\" />\n </Tr>\n </Thead>\n <Tbody>\n {users.map((user) => (\n <Tr key={user.id}>\n <Td>\n <UserIdentity user={user} />\n </Td>\n <Td>\n <UserContact user={user} />\n </Td>\n <Td>\n {user.lastSignInAt\n ? new Date(user.lastSignInAt).toLocaleDateString()\n : 'Never'}\n </Td>\n <Td>\n <UserRemoveButton\n roleId={roleId}\n userId={user.id}\n onRemove={onRemove}\n />\n </Td>\n </Tr>\n ))}\n </Tbody>\n </DisplayTable>\n );\n}\n\nfunction RoleUsersCards({\n roleId,\n users,\n onRemove,\n}: {\n roleId: string;\n users: User[];\n onRemove: (roleId: string, userId: string) => void;\n}) {\n return (\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3\">\n {users.map((user) => (\n <div\n key={user.id}\n className=\"rounded-xl border border-border/60 bg-card p-4 shadow-sm\"\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3\">\n <Avatar className=\"h-10 w-10\">\n <AvatarImage src={user.image ?? undefined} />\n <AvatarFallback>{initials(user)}</AvatarFallback>\n </Avatar>\n <div>\n <p className=\"font-semibold\">{user.fullName}</p>\n </div>\n </div>\n <div className=\"space-y-1 text-sm text-muted-foreground\">\n <p>{user.email ?? user.phone ?? 'No contact info'}</p>\n <p>\n Last sign in{' '}\n {user.lastSignInAt\n ? new Date(user.lastSignInAt).toLocaleDateString()\n : 'never'}\n </p>\n </div>\n </div>\n <UserRemoveButton\n roleId={roleId}\n userId={user.id}\n onRemove={onRemove}\n />\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nexport function RoleUsersPage({ roleId }: RoleUsersPageProps) {\n return (\n <IAMGuard>\n <RoleUsersPageContent roleId={roleId} />\n </IAMGuard>\n );\n}\n\nfunction RoleUsersPageContent({ roleId }: RoleUsersPageProps) {\n const qc = useQueryClient();\n const { queryConfig, params, setParams } = useEntityParams({\n searchKey: 'search',\n defaultSort: 'fullName',\n defaultOrder: 'asc',\n });\n const usersQuery = useMemo(\n () =>\n ({\n params: {\n path: { id: roleId },\n query: queryConfig.params.query,\n },\n }) as {\n params: {\n path: { id: string };\n query: NonNullable<\n paths['/roles/{id}/users']['get']['parameters']['query']\n >;\n };\n },\n [queryConfig, roleId],\n );\n\n const { data, isPending, isFetching } = authApi$.useQuery(\n 'get',\n '/roles/{id}/users',\n usersQuery,\n { enabled: !!roleId },\n );\n const assignUsers = authApi$.useMutation('post', '/roles/{id}/users', {\n onSuccess: (result: { created?: number } | undefined) => {\n qc.invalidateQueries({ queryKey: ['get', '/roles'] });\n qc.invalidateQueries({ queryKey: ['get', '/roles/{id}'] });\n qc.invalidateQueries({ queryKey: ['get', '/roles/{id}/users'] });\n toast.success(\n result?.created ? `${result.created} user(s) added` : 'No changes',\n );\n },\n onError: () => {\n toast.error('Failed to assign users');\n },\n });\n const revokeUser = authApi$.useMutation(\n 'delete',\n '/roles/{id}/users/{userId}',\n {\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: ['get', '/roles'] });\n qc.invalidateQueries({ queryKey: ['get', '/roles/{id}'] });\n qc.invalidateQueries({ queryKey: ['get', '/roles/{id}/users'] });\n toast.success('User removed');\n },\n onError: () => {\n toast.error('Failed to remove user');\n },\n },\n );\n\n const users = (data?.users ?? []) as User[];\n const { total, pageCount } = useEntityPagination({\n items: users,\n total: data?.total,\n pageSize: params.pageSize,\n });\n const isLoading = isPending || isFetching;\n const currentView = (params.view || 'table') as 'table' | 'card';\n const handleRemoveUser = (targetRoleId: string, userId: string) => {\n revokeUser.mutate({\n params: {\n path: { id: targetRoleId, userId },\n },\n });\n };\n\n if (!roleId) {\n return null;\n }\n\n let content: ReactNode;\n if (isLoading) {\n content = (\n <EntityLoadingState\n view={currentView}\n rowCount={params.pageSize}\n columnCount={TABLE_COLUMN_COUNT}\n cardCount={params.pageSize}\n />\n );\n } else if (total === 0) {\n content = (\n <EntityEmptyState\n icon={IconUsers}\n entityName=\"user\"\n title=\"No users assigned\"\n description=\"Assign users from the selector to add them to this role.\"\n />\n );\n } else if (currentView === 'table') {\n content = (\n <div className=\"space-y-4\">\n <RoleUsersTable\n roleId={roleId}\n users={users}\n onRemove={handleRemoveUser}\n />\n <DataTablePagination\n pageIndex={params.page - 1}\n pageSize={params.pageSize}\n pageCount={pageCount}\n totalRows={total}\n onPageChange={(page) => setParams({ page: page + 1 })}\n onPageSizeChange={(pageSize) => setParams({ pageSize, page: 1 })}\n />\n </div>\n );\n } else {\n content = (\n <div className=\"space-y-4\">\n <RoleUsersCards\n roleId={roleId}\n users={users}\n onRemove={handleRemoveUser}\n />\n <DataTablePagination\n pageIndex={params.page - 1}\n pageSize={params.pageSize}\n pageCount={pageCount}\n totalRows={total}\n onPageChange={(page) => setParams({ page: page + 1 })}\n onPageSizeChange={(pageSize) => setParams({ pageSize, page: 1 })}\n />\n </div>\n );\n }\n\n return (\n <PageBody className=\"px-0 pb-6\">\n <EntityHeader\n icon={<IconUser className=\"h-5 w-5\" />}\n title=\"Role users\"\n actions={\n <UserSelector\n trigger={\n <Button size=\"sm\" loading={assignUsers.isPending}>\n <IconPlus className=\"h-4 w-4\" />\n Add users\n </Button>\n }\n multiple\n excludeIds={users.map((user) => user.id)}\n onSelect={(selectedUsers: User[]) => {\n if (!selectedUsers.length) {\n return;\n }\n\n assignUsers.mutate({\n params: { path: { id: roleId } },\n body: {\n userIds: selectedUsers.map((user: User) => user.id),\n },\n });\n }}\n />\n }\n search={\n <EntitySearch\n paramKey=\"search\"\n placeholder=\"Search assigned users...\"\n />\n }\n filter={\n <EntityFilter\n options={[\n { label: 'All', value: '' },\n { label: 'Name', value: 'fullName' },\n { label: 'Email', value: 'email' },\n { label: 'Phone', value: 'phone' },\n ]}\n placeholder=\"Search field\"\n />\n }\n sort={\n <EntitySort\n defaultSort=\"fullName\"\n defaultOrder=\"asc\"\n options={[\n { label: 'Created', value: 'createdAt' },\n { label: 'Updated', value: 'updatedAt' },\n { label: 'Name', value: 'fullName' },\n { label: 'Last Sign In', value: 'lastSignInAt' },\n ]}\n />\n }\n view={<EntityViewToggle views={['table', 'card']} />}\n />\n {content}\n </PageBody>\n );\n}\n","'use client';\n\nimport { useApi, useConfig } from '@mesob/auth-react';\nimport { IAMGuard } from '@mesob/auth-react/components/iam/iam-guard';\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 { str } from './_components/tenants-data';\n\ntype TenantDetailPageContentProps = {\n tenantId: string;\n};\n\nexport function TenantDetailPageContent({\n tenantId,\n}: TenantDetailPageContentProps) {\n return (\n <IAMGuard>\n <TenantDetailPageContentInner tenantId={tenantId} />\n </IAMGuard>\n );\n}\n\nfunction TenantDetailPageContentInner({\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","'use client';\n\nimport { useApi, useConfig } from '@mesob/auth-react';\nimport { IAMGuard } from '@mesob/auth-react/components/iam/iam-guard';\nimport { toTitleCase } from '@mesob/common';\nimport {\n Button,\n EntityDetailHeader,\n PageContainer,\n type TabItem,\n useBreadcrumbs,\n} from '@mesob/ui/components';\nimport { IconUser } from '@tabler/icons-react';\nimport { useMemo } from 'react';\n\ntype UserDetailLayoutContentProps = {\n userId: string;\n children: React.ReactNode;\n};\n\nexport function UserDetailLayoutContent({\n userId,\n children,\n}: UserDetailLayoutContentProps) {\n return (\n <IAMGuard>\n <UserDetailLayoutContentInner userId={userId}>\n {children}\n </UserDetailLayoutContentInner>\n </IAMGuard>\n );\n}\n\nfunction UserDetailLayoutContentInner({\n userId,\n children,\n}: UserDetailLayoutContentProps) {\n const { hooks } = useApi();\n const { config } = useConfig();\n const homeHref = config.navigation?.defaultRedirectUrl || '/';\n const { data, isLoading } = hooks.useQuery(\n 'get',\n '/users/{id}',\n { params: { path: { id: userId } } },\n { enabled: !!userId },\n );\n const user = data?.user;\n\n const title = toTitleCase(user?.fullName || userId || 'User');\n\n useBreadcrumbs({\n items: [\n { label: 'Home', href: homeHref },\n { label: 'IAM', href: '/iam' },\n { label: 'Users', href: '/iam/users' },\n { label: title },\n ],\n });\n\n const tabs: TabItem[] = useMemo(\n () => [\n { value: 'detail', name: 'Detail', href: `/iam/users/${userId}` },\n {\n value: 'activity',\n name: 'Activity',\n href: `/iam/users/${userId}/activity`,\n },\n ],\n [userId],\n );\n\n if (!userId) {\n return null;\n }\n\n return (\n <PageContainer>\n <EntityDetailHeader\n title={title}\n icon={<IconUser />}\n backHref=\"/iam/users\"\n tabs={tabs}\n loading={isLoading}\n actions={<Button>Test Button</Button>}\n />\n {children}\n </PageContainer>\n );\n}\n","'use client';\n\nimport { useApi } from '@mesob/auth-react';\nimport { IAMGuard } from '@mesob/auth-react/components/iam/iam-guard';\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@mesob/ui/components';\nimport { IconCircleCheck } from '@tabler/icons-react';\n\ntype UserDetailPageContentProps = {\n userId: string;\n};\n\nexport function UserDetailPageContent({ userId }: UserDetailPageContentProps) {\n return (\n <IAMGuard>\n <UserDetailPageContentInner userId={userId} />\n </IAMGuard>\n );\n}\n\nfunction UserDetailPageContentInner({ userId }: UserDetailPageContentProps) {\n const { hooks } = useApi();\n const { data, isLoading } = hooks.useQuery(\n 'get',\n '/users/{id}',\n { params: { path: { id: userId } } },\n { enabled: !!userId },\n );\n const user = data?.user;\n\n if (!userId) {\n return null;\n }\n if (isLoading || !user) {\n return <div className=\"h-32 animate-pulse rounded-xl bg-muted mt-4\" />;\n }\n\n return (\n <Card>\n <CardHeader>\n <CardTitle>User details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2 text-sm\">\n <p>\n <span className=\"text-muted-foreground\">Name:</span>{' '}\n {user.fullName || '—'}\n </p>\n <p>\n <span className=\"text-muted-foreground\">Email:</span>{' '}\n {user.email ?? '—'}{' '}\n {user.emailVerified && (\n <Tooltip>\n <TooltipTrigger>\n <IconCircleCheck className=\"inline size-4 text-muted-foreground\" />\n </TooltipTrigger>\n <TooltipContent>Email verified</TooltipContent>\n </Tooltip>\n )}\n </p>\n <p>\n <span className=\"text-muted-foreground\">Phone:</span>{' '}\n {user.phone ?? '—'}{' '}\n {user.phoneVerified && (\n <Tooltip>\n <TooltipTrigger>\n <IconCircleCheck className=\"inline size-4 text-muted-foreground\" />\n </TooltipTrigger>\n <TooltipContent>Phone verified</TooltipContent>\n </Tooltip>\n )}\n </p>\n <p>\n <span className=\"text-muted-foreground\">Last sign in:</span>{' '}\n {user.lastSignInAt\n ? new Date(user.lastSignInAt).toLocaleString()\n : 'Never'}\n </p>\n {user.roleCodes?.length ? (\n <p>\n <span className=\"text-muted-foreground\">Roles:</span>{' '}\n {user.roleCodes.join(', ')}\n </p>\n ) : null}\n </CardContent>\n </Card>\n );\n}\n","'use client';\n\nimport { IAMGuard } from '@mesob/auth-react/components/iam/iam-guard';\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Section,\n} from '@mesob/ui/components';\nimport { IconCalendar } from '@tabler/icons-react';\nimport { RoleSection } from './_components/role-section';\n\ntype UserActivityPageContentProps = {\n userId: string;\n};\n\nexport function UserActivityPageContent({\n userId,\n}: UserActivityPageContentProps) {\n return (\n <IAMGuard>\n <UserActivityPageContentInner userId={userId} />\n </IAMGuard>\n );\n}\n\nfunction UserActivityPageContentInner({\n userId,\n}: UserActivityPageContentProps) {\n if (!userId) {\n return null;\n }\n\n return (\n <div className=\"space-y-4\">\n <Card>\n <CardHeader>\n <CardTitle>Activity</CardTitle>\n </CardHeader>\n <CardContent className=\"flex items-center gap-2 text-muted-foreground text-sm\">\n <IconCalendar className=\"h-4 w-4\" />\n Activity (placeholder)\n </CardContent>\n </Card>\n <RoleSection userId={userId} />\n <Section title=\"Permissions\">test</Section>\n <Section title=\"Groups\">test</Section>\n </div>\n );\n}\n","'use client';\n\nimport {\n Button,\n EntityEmptyState,\n EntityLoadingState,\n EntitySection,\n useEntitySectionState,\n} from '@mesob/ui/components';\nimport { IconPlus, IconShield } from '@tabler/icons-react';\nimport { useMemo, useState } from 'react';\nimport { RoleSelector } from '../../../roles/_components/role-selector';\nimport type { Role } from '../../../roles/_components/roles-data';\nimport { str } from '../../../roles/_components/roles-data';\nimport { RolesList } from '../../../roles/_components/roles-list';\nimport {\n authApi$,\n defaultEntityQueryOptions,\n} from '../../../shared/page-helpers';\n\nconst LIMIT = 100;\nconst TABLE_COLUMN_COUNT = 4;\n\nfunction filterAndSort(\n roles: Role[],\n search: string,\n sort: string,\n order: 'asc' | 'desc',\n) {\n let out = roles;\n if (search.trim()) {\n const q = search.trim().toLowerCase();\n out = out.filter(\n (r) =>\n str(r.name).toLowerCase().includes(q) ||\n r.code.toLowerCase().includes(q),\n );\n }\n const mult = order === 'asc' ? 1 : -1;\n const by = sort === 'code' ? 'code' : 'createdAt';\n out = [...out].sort((a, b) =>\n by === 'code'\n ? mult * a.code.localeCompare(b.code)\n : mult *\n (new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()),\n );\n return out;\n}\n\nexport function RoleSection({ userId }: { userId: string }) {\n const [open, setOpen] = useState(false);\n const sectionState = useEntitySectionState({\n defaultSort: 'createdAt',\n defaultOrder: 'desc',\n defaultPageSize: 10,\n filterOptions: [\n { label: 'All', value: '' },\n { label: 'By Code', value: 'code' },\n ],\n sortOptions: [\n { label: 'Created', value: 'createdAt' },\n { label: 'Updated', value: 'updatedAt' },\n { label: 'Code', value: 'code' },\n ],\n views: ['table', 'card'],\n });\n\n const { data, isPending, isFetching } = authApi$.useQuery(\n 'get',\n '/roles',\n { params: { query: { limit: LIMIT } } },\n { ...defaultEntityQueryOptions, enabled: open },\n );\n const isLoading = isPending || isFetching;\n const roles = data?.roles ?? [];\n\n const filtered = useMemo(\n () =>\n filterAndSort(\n roles,\n sectionState.search,\n sectionState.sort,\n sectionState.order,\n ),\n [roles, sectionState.search, sectionState.sort, sectionState.order],\n );\n const pageCount = Math.ceil(filtered.length / sectionState.pageSize) || 1;\n const pageIndex = Math.min(sectionState.page - 1, Math.max(0, pageCount - 1));\n const paginated = useMemo(\n () =>\n filtered.slice(\n pageIndex * sectionState.pageSize,\n pageIndex * sectionState.pageSize + sectionState.pageSize,\n ),\n [filtered, pageIndex, sectionState.pageSize],\n );\n\n return (\n <EntitySection\n title=\"Role\"\n state={sectionState}\n onOpenChange={setOpen}\n actions={\n <RoleSelector\n trigger={\n <Button variant=\"outline\" size=\"sm\">\n <IconPlus className=\"h-4 w-4\" />\n Add role\n </Button>\n }\n multiple\n onSelect={(roles) => {\n // TODO: assign roles to user; logging for now\n // biome-ignore lint/suspicious/noConsole: intentional for now\n console.log('Selected roles:', userId, roles);\n }}\n />\n }\n config={{\n searchPlaceholder: 'Search roles...',\n filterOptions: sectionState.filterOptions,\n sortOptions: sectionState.sortOptions,\n views: sectionState.views,\n }}\n >\n {(state) => (\n <>\n {isLoading && (\n <EntityLoadingState\n view={state.view as 'table' | 'card'}\n rowCount={state.pageSize}\n columnCount={TABLE_COLUMN_COUNT}\n cardCount={state.pageSize}\n />\n )}\n {!isLoading && filtered.length === 0 && (\n <EntityEmptyState\n icon={IconShield}\n entityName=\"role\"\n title=\"No roles\"\n description={\n roles.length === 0 ? 'No roles in tenant.' : 'No matches.'\n }\n />\n )}\n {!isLoading && filtered.length > 0 && (\n <RolesList\n data={paginated}\n view={state.view as 'table' | 'card'}\n pageIndex={pageIndex}\n pageSize={state.pageSize}\n pageCount={pageCount}\n totalRows={filtered.length}\n onPageChange={(p) => state.setPage(p + 1)}\n onPageSizeChange={(size) => {\n state.setPageSize(size);\n state.setPage(1);\n }}\n />\n )}\n </>\n )}\n </EntitySection>\n );\n}\n","'use client';\n\nimport {\n EntitySelector,\n type EntitySelectorColumn,\n type EntitySelectorConfig,\n useEntitySectionState,\n} from '@mesob/ui/components';\nimport { cn } from '@mesob/ui/lib/utils';\nimport { IconCalendar, IconShield } from '@tabler/icons-react';\nimport type { ReactNode } from 'react';\nimport type { paths } from '../../../../data/openapi';\nimport { authApi$, defaultEntityQueryOptions } from '../../shared/page-helpers';\nimport { RoleCard } from './role-card';\nimport type { Role } from './roles-data';\nimport { str } from './roles-data';\n\nfunction SelectableRoleCard({\n role,\n selected,\n onToggle,\n}: {\n role: Role;\n selected: boolean;\n onToggle: () => void;\n}) {\n return (\n // biome-ignore lint/a11y/useSemanticElements: div to avoid nested buttons from RoleCard\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onToggle}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n onToggle();\n }\n }}\n className={cn(\n 'cursor-pointer rounded-lg transition-shadow focus:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n selected && 'ring-primary ring-2',\n )}\n >\n <RoleCard role={role} mode=\"static\" />\n </div>\n );\n}\n\nconst roleColumns: EntitySelectorColumn<Role>[] = [\n {\n key: 'role',\n header: 'Role',\n cell: (role) => (\n <>\n <p className=\"font-medium\">{str(role.name) || role.code}</p>\n <p className=\"text-sm text-muted-foreground\">{role.code}</p>\n </>\n ),\n },\n {\n key: 'description',\n header: 'Description',\n cell: (role) => (\n <span className=\"text-muted-foreground line-clamp-1 max-w-[200px]\">\n {str(role.description) || '—'}\n </span>\n ),\n },\n {\n key: 'created',\n header: 'Created',\n cell: (role) => (\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 ),\n },\n];\n\ntype RoleSelectorProps = {\n trigger: ReactNode;\n multiple?: boolean;\n onSelect: (roles: Role[]) => void;\n modalSize?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n contentClassName?: string;\n};\n\nexport function RoleSelector({\n trigger,\n multiple = true,\n onSelect,\n modalSize = 'xl',\n contentClassName,\n}: RoleSelectorProps) {\n const state = useEntitySectionState({\n defaultSort: 'createdAt',\n defaultOrder: 'desc',\n defaultPageSize: 10,\n searchParamName: 'search',\n });\n const rolesQuery = state.queryConfig as {\n params: {\n query: NonNullable<paths['/roles']['get']['parameters']['query']>;\n };\n };\n\n const { data, isPending, isFetching } = authApi$.useQuery(\n 'get',\n '/roles',\n rolesQuery,\n defaultEntityQueryOptions,\n );\n\n const roles = data?.roles ?? [];\n\n const config: EntitySelectorConfig<Role> = {\n title: 'Select role(s)',\n modalSize,\n contentClassName,\n multiple,\n entityName: 'role',\n entityIcon: IconShield,\n columns: roleColumns,\n columnCount: 3,\n getItemLabel: (role) => str(role.name) || role.code,\n searchPlaceholder: 'Search roles...',\n wrapHeaderInCard: false,\n filterOptions: [\n { label: 'All', value: '' },\n { label: 'By Code', value: 'code' },\n ],\n sortOptions: [\n { label: 'Created', value: 'createdAt' },\n { label: 'Updated', value: 'updatedAt' },\n { label: 'Code', value: 'code' },\n ],\n showViewToggle: false,\n renderCard: (role, selected, onToggle) => (\n <SelectableRoleCard role={role} selected={selected} onToggle={onToggle} />\n ),\n };\n\n return (\n <EntitySelector<Role>\n trigger={trigger}\n config={config}\n onSelect={onSelect}\n items={roles}\n total={data?.total}\n isLoading={isPending || isFetching}\n state={state}\n />\n );\n}\n","'use client';\n\nimport type { ReactNode } from 'react';\n\ntype NuqsAdapterWrapperProps = {\n children: ReactNode;\n};\n\n/**\n * No-op wrapper: mount a real `NuqsAdapter` from your app root.\n * - Next.js: `nuqs/adapters/next/app` (see nextjs-demo `providers/nuqs-adapter.tsx`).\n * - TanStack Router / Start: `nuqs/adapters/tanstack-router` (see start-demo\n * `NuqsTanstackProvider` + `__root.tsx`).\n */\nexport function NuqsAdapterWrapper({ children }: NuqsAdapterWrapperProps) {\n return <>{children}</>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,aAAAA,kBAAiB;AAGnB,SAAS,uBAA+B;AAC7C,QAAM,EAAE,OAAO,IAAIC,WAAU;AAC7B,SAAO,qBAAqB,MAAM;AACpC;;;ACJA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,oBAAoB;AAE7B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,UAAU,UAAU,iBAAiB;AAC9C,SAAS,sBAAsB;AAE/B,SAAS,eAAe;AACxB,SAAS,aAAa;AAsBhB,SACE,KADF;AAdN,IAAM,qBAAqB;AAE3B,SAAS,SAAS,MAAY;AAC5B,SAAO,KAAK,SACT,MAAM,GAAG,EACT,OAAO,OAAO,EACd,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,SAAiB,KAAK,CAAC,GAAG,YAAY,KAAK,EAAE,EAClD,KAAK,EAAE;AACZ;AAEA,SAAS,aAAa,EAAE,KAAK,GAAmB;AAC9C,SACE,qBAAC,SAAI,WAAU,2BACb;AAAA,yBAAC,UAAO,WAAU,WAChB;AAAA,0BAAC,eAAY,KAAK,KAAK,SAAS,QAAW;AAAA,MAC3C,oBAAC,kBAAgB,mBAAS,IAAI,GAAE;AAAA,OAClC;AAAA,IACA,oBAAC,SACC,8BAAC,OAAE,WAAU,eAAe,eAAK,UAAS,GAC5C;AAAA,KACF;AAEJ;AAEA,SAAS,YAAY,EAAE,KAAK,GAAmB;AAC7C,SACE,qBAAC,SAAI,WAAU,aACZ;AAAA,SAAK,QACJ,qBAAC,SAAI,WAAU,2BACb;AAAA,0BAAC,UAAM,eAAK,OAAM;AAAA,MACjB,KAAK,gBACJ,oBAAC,SAAM,SAAQ,WAAU,sBAAQ,IAC/B;AAAA,OACN,IACE;AAAA,IACH,KAAK,QACJ,qBAAC,SAAI,WAAU,2BACb;AAAA,0BAAC,UAAM,eAAK,OAAM;AAAA,MACjB,KAAK,gBACJ,oBAAC,SAAM,SAAQ,WAAU,sBAAQ,IAC/B;AAAA,OACN,IACE;AAAA,IACH,KAAK,SAAS,KAAK,QAAQ,OAC1B,oBAAC,UAAK,WAAU,yBAAwB,oBAAC;AAAA,KAE7C;AAEJ;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,YAAW;AAAA,MACX,WAAW,MAAM,SAAS,QAAQ,MAAM;AAAA,MACxC,kBAAiB;AAAA;AAAA,EACnB;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACE,qBAAC,gBAAa,iBAAe,MAC3B;AAAA,wBAAC,SACC,+BAAC,MACC;AAAA,0BAAC,MAAG,kBAAI;AAAA,MACR,oBAAC,MAAG,qBAAO;AAAA,MACX,oBAAC,MAAG,0BAAY;AAAA,MAChB,oBAAC,MAAG,WAAU,YAAW;AAAA,OAC3B,GACF;AAAA,IACA,oBAAC,SACE,gBAAM,IAAI,CAAC,SACV,qBAAC,MACC;AAAA,0BAAC,MACC,8BAAC,gBAAa,MAAY,GAC5B;AAAA,MACA,oBAAC,MACC,8BAAC,eAAY,MAAY,GAC3B;AAAA,MACA,oBAAC,MACE,eAAK,eACF,IAAI,KAAK,KAAK,YAAY,EAAE,mBAAmB,IAC/C,SACN;AAAA,MACA,oBAAC,MACC;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,QAAQ,KAAK;AAAA,UACb;AAAA;AAAA,MACF,GACF;AAAA,SAlBO,KAAK,EAmBd,CACD,GACH;AAAA,KACF;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACE,oBAAC,SAAI,WAAU,wDACZ,gBAAM,IAAI,CAAC,SACV;AAAA,IAAC;AAAA;AAAA,MAEC,WAAU;AAAA,MAEV,+BAAC,SAAI,WAAU,0CACb;AAAA,6BAAC,SAAI,WAAU,aACb;AAAA,+BAAC,SAAI,WAAU,2BACb;AAAA,iCAAC,UAAO,WAAU,aAChB;AAAA,kCAAC,eAAY,KAAK,KAAK,SAAS,QAAW;AAAA,cAC3C,oBAAC,kBAAgB,mBAAS,IAAI,GAAE;AAAA,eAClC;AAAA,YACA,oBAAC,SACC,8BAAC,OAAE,WAAU,iBAAiB,eAAK,UAAS,GAC9C;AAAA,aACF;AAAA,UACA,qBAAC,SAAI,WAAU,2CACb;AAAA,gCAAC,OAAG,eAAK,SAAS,KAAK,SAAS,mBAAkB;AAAA,YAClD,qBAAC,OAAE;AAAA;AAAA,cACY;AAAA,cACZ,KAAK,eACF,IAAI,KAAK,KAAK,YAAY,EAAE,mBAAmB,IAC/C;AAAA,eACN;AAAA,aACF;AAAA,WACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,QAAQ,KAAK;AAAA,YACb;AAAA;AAAA,QACF;AAAA,SACF;AAAA;AAAA,IA7BK,KAAK;AAAA,EA8BZ,CACD,GACH;AAEJ;AAEO,SAAS,cAAc,EAAE,OAAO,GAAuB;AAC5D,SACE,oBAACC,WAAA,EACC,8BAAC,wBAAqB,QAAgB,GACxC;AAEJ;AAEA,SAAS,qBAAqB,EAAE,OAAO,GAAuB;AAC5D,QAAM,KAAK,eAAe;AAC1B,QAAM,EAAE,aAAa,QAAQ,UAAU,IAAI,gBAAgB;AAAA,IACzD,WAAW;AAAA,IACX,aAAa;AAAA,IACb,cAAc;AAAA,EAChB,CAAC;AACD,QAAM,aAAa;AAAA,IACjB,OACG;AAAA,MACC,QAAQ;AAAA,QACN,MAAM,EAAE,IAAI,OAAO;AAAA,QACnB,OAAO,YAAY,OAAO;AAAA,MAC5B;AAAA,IACF;AAAA,IAQF,CAAC,aAAa,MAAM;AAAA,EACtB;AAEA,QAAM,EAAE,MAAM,WAAW,WAAW,IAAI,SAAS;AAAA,IAC/C;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,SAAS,CAAC,CAAC,OAAO;AAAA,EACtB;AACA,QAAM,cAAc,SAAS,YAAY,QAAQ,qBAAqB;AAAA,IACpE,WAAW,CAAC,WAA6C;AACvD,SAAG,kBAAkB,EAAE,UAAU,CAAC,OAAO,QAAQ,EAAE,CAAC;AACpD,SAAG,kBAAkB,EAAE,UAAU,CAAC,OAAO,aAAa,EAAE,CAAC;AACzD,SAAG,kBAAkB,EAAE,UAAU,CAAC,OAAO,mBAAmB,EAAE,CAAC;AAC/D,YAAM;AAAA,QACJ,QAAQ,UAAU,GAAG,OAAO,OAAO,mBAAmB;AAAA,MACxD;AAAA,IACF;AAAA,IACA,SAAS,MAAM;AACb,YAAM,MAAM,wBAAwB;AAAA,IACtC;AAAA,EACF,CAAC;AACD,QAAM,aAAa,SAAS;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAW,MAAM;AACf,WAAG,kBAAkB,EAAE,UAAU,CAAC,OAAO,QAAQ,EAAE,CAAC;AACpD,WAAG,kBAAkB,EAAE,UAAU,CAAC,OAAO,aAAa,EAAE,CAAC;AACzD,WAAG,kBAAkB,EAAE,UAAU,CAAC,OAAO,mBAAmB,EAAE,CAAC;AAC/D,cAAM,QAAQ,cAAc;AAAA,MAC9B;AAAA,MACA,SAAS,MAAM;AACb,cAAM,MAAM,uBAAuB;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAS,MAAM,SAAS,CAAC;AAC/B,QAAM,EAAE,OAAO,UAAU,IAAI,oBAAoB;AAAA,IAC/C,OAAO;AAAA,IACP,OAAO,MAAM;AAAA,IACb,UAAU,OAAO;AAAA,EACnB,CAAC;AACD,QAAM,YAAY,aAAa;AAC/B,QAAM,cAAe,OAAO,QAAQ;AACpC,QAAM,mBAAmB,CAAC,cAAsB,WAAmB;AACjE,eAAW,OAAO;AAAA,MAChB,QAAQ;AAAA,QACN,MAAM,EAAE,IAAI,cAAc,OAAO;AAAA,MACnC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI,WAAW;AACb,cACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,UAAU,OAAO;AAAA,QACjB,aAAa;AAAA,QACb,WAAW,OAAO;AAAA;AAAA,IACpB;AAAA,EAEJ,WAAW,UAAU,GAAG;AACtB,cACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,YAAW;AAAA,QACX,OAAM;AAAA,QACN,aAAY;AAAA;AAAA,IACd;AAAA,EAEJ,WAAW,gBAAgB,SAAS;AAClC,cACE,qBAAC,SAAI,WAAU,aACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA,UAAU;AAAA;AAAA,MACZ;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,OAAO,OAAO;AAAA,UACzB,UAAU,OAAO;AAAA,UACjB;AAAA,UACA,WAAW;AAAA,UACX,cAAc,CAAC,SAAS,UAAU,EAAE,MAAM,OAAO,EAAE,CAAC;AAAA,UACpD,kBAAkB,CAAC,aAAa,UAAU,EAAE,UAAU,MAAM,EAAE,CAAC;AAAA;AAAA,MACjE;AAAA,OACF;AAAA,EAEJ,OAAO;AACL,cACE,qBAAC,SAAI,WAAU,aACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA,UAAU;AAAA;AAAA,MACZ;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,OAAO,OAAO;AAAA,UACzB,UAAU,OAAO;AAAA,UACjB;AAAA,UACA,WAAW;AAAA,UACX,cAAc,CAAC,SAAS,UAAU,EAAE,MAAM,OAAO,EAAE,CAAC;AAAA,UACpD,kBAAkB,CAAC,aAAa,UAAU,EAAE,UAAU,MAAM,EAAE,CAAC;AAAA;AAAA,MACjE;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,qBAAC,YAAS,WAAU,aAClB;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,oBAAC,YAAS,WAAU,WAAU;AAAA,QACpC,OAAM;AAAA,QACN,SACE;AAAA,UAAC;AAAA;AAAA,YACC,SACE,qBAAC,UAAO,MAAK,MAAK,SAAS,YAAY,WACrC;AAAA,kCAAC,YAAS,WAAU,WAAU;AAAA,cAAE;AAAA,eAElC;AAAA,YAEF,UAAQ;AAAA,YACR,YAAY,MAAM,IAAI,CAAC,SAAS,KAAK,EAAE;AAAA,YACvC,UAAU,CAAC,kBAA0B;AACnC,kBAAI,CAAC,cAAc,QAAQ;AACzB;AAAA,cACF;AAEA,0BAAY,OAAO;AAAA,gBACjB,QAAQ,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE;AAAA,gBAC/B,MAAM;AAAA,kBACJ,SAAS,cAAc,IAAI,CAAC,SAAe,KAAK,EAAE;AAAA,gBACpD;AAAA,cACF,CAAC;AAAA,YACH;AAAA;AAAA,QACF;AAAA,QAEF,QACE;AAAA,UAAC;AAAA;AAAA,YACC,UAAS;AAAA,YACT,aAAY;AAAA;AAAA,QACd;AAAA,QAEF,QACE;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,cACP,EAAE,OAAO,OAAO,OAAO,GAAG;AAAA,cAC1B,EAAE,OAAO,QAAQ,OAAO,WAAW;AAAA,cACnC,EAAE,OAAO,SAAS,OAAO,QAAQ;AAAA,cACjC,EAAE,OAAO,SAAS,OAAO,QAAQ;AAAA,YACnC;AAAA,YACA,aAAY;AAAA;AAAA,QACd;AAAA,QAEF,MACE;AAAA,UAAC;AAAA;AAAA,YACC,aAAY;AAAA,YACZ,cAAa;AAAA,YACb,SAAS;AAAA,cACP,EAAE,OAAO,WAAW,OAAO,YAAY;AAAA,cACvC,EAAE,OAAO,WAAW,OAAO,YAAY;AAAA,cACvC,EAAE,OAAO,QAAQ,OAAO,WAAW;AAAA,cACnC,EAAE,OAAO,gBAAgB,OAAO,eAAe;AAAA,YACjD;AAAA;AAAA,QACF;AAAA,QAEF,MAAM,oBAAC,oBAAiB,OAAO,CAAC,SAAS,MAAM,GAAG;AAAA;AAAA,IACpD;AAAA,IACC;AAAA,KACH;AAEJ;;;AC7ZA,SAAS,UAAAC,SAAQ,aAAAC,kBAAiB;AAClC,SAAS,YAAAC,iBAAgB;AACzB;AAAA,EACE,UAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AACP,SAAS,oBAAoB;AAC7B,SAAS,kBAAAC,uBAAsB;AAC/B,SAAS,WAAAC,gBAAe;AAYlB,SAkDU,UAlDV,OAAAC,MAmDY,QAAAC,aAnDZ;AALC,SAAS,wBAAwB;AAAA,EACtC;AACF,GAAiC;AAC/B,SACE,gBAAAD,KAACE,WAAA,EACC,0BAAAF,KAAC,gCAA6B,UAAoB,GACpD;AAEJ;AAEA,SAAS,6BAA6B;AAAA,EACpC;AACF,GAAiC;AAC/B,QAAM,EAAE,MAAM,IAAIG,QAAO;AACzB,QAAM,EAAE,OAAO,IAAIC,WAAU;AAC7B,QAAM,WAAW,OAAO,YAAY,sBAAsB;AAC1D,QAAM,KAAKC,gBAAe;AAE1B,QAAM,EAAE,MAAM,UAAU,IAAI,MAAM;AAAA,IAChC;AAAA,IACA;AAAA,IACA,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,SAAS,EAAE,EAAE;AAAA,IACrC,EAAE,SAAS,CAAC,CAAC,SAAS;AAAA,EACxB;AACA,QAAM,SAAS,MAAM;AAErB,QAAM,eAAe,MAAM,YAAY,OAAO,iBAAiB;AAAA,IAC7D,WAAW,MAAM;AACf,SAAG,kBAAkB,EAAE,UAAU,CAAC,OAAO,eAAe,EAAE,CAAC;AAC3D,SAAG,kBAAkB,EAAE,UAAU,CAAC,OAAO,UAAU,EAAE,CAAC;AAAA,IACxD;AAAA,EACF,CAAC;AAED,QAAM,QAAQ,SAASC,KAAI,OAAO,IAAI,KAAK,OAAO,KAAM,YAAY;AACpE,iBAAe;AAAA,IACb,OAAO;AAAA,MACL,EAAE,OAAO,QAAQ,MAAM,SAAS;AAAA,MAChC,EAAE,OAAO,OAAO,MAAM,OAAO;AAAA,MAC7B,EAAE,OAAO,WAAW,MAAM,eAAe;AAAA,MACzC,EAAE,OAAO,MAAM;AAAA,IACjB;AAAA,EACF,CAAC;AAED,QAAM,OAAkBC;AAAA,IACtB,MAAM;AAAA,MACJ;AAAA,QACE,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SACE,gBAAAN,MAAC,QAAK,WAAU,QACd;AAAA,0BAAAD,KAAC,cACC,0BAAAA,KAAC,aAAU,4BAAc,GAC3B;AAAA,UACA,gBAAAA,KAAC,eAAY,WAAU,qBACpB,oBACC,gBAAAC,MAAA,YACE;AAAA,4BAAAA,MAAC,OACC;AAAA,8BAAAD,KAAC,UAAK,WAAU,yBAAwB,mBAAK;AAAA,cAAQ;AAAA,cACpDM,KAAI,OAAO,IAAI,KAAK;AAAA,eACvB;AAAA,YACA,gBAAAL,MAAC,OACC;AAAA,8BAAAD,KAAC,UAAK,WAAU,yBAAwB,0BAAY;AAAA,cAAQ;AAAA,cAC3DM,KAAI,OAAO,WAAW,KAAK;AAAA,eAC9B;AAAA,YACA,gBAAAL,MAAC,OACC;AAAA,8BAAAD,KAAC,UAAK,WAAU,yBAAwB,uBAAS;AAAA,cAAQ;AAAA,cACxD,OAAO,mBAAmB;AAAA,eAC7B;AAAA,YACA,gBAAAC,MAAC,OACC;AAAA,8BAAAD,KAAC,UAAK,WAAU,yBAAwB,uBAAS;AAAA,cAAQ;AAAA,cACxD,OAAO,mBAAmB;AAAA,eAC7B;AAAA,YACA,gBAAAC,MAAC,OACC;AAAA,8BAAAD,KAAC,UAAK,WAAU,yBAAwB,uBAAS;AAAA,cAAQ;AAAA,cACxD,OAAO,YAAY;AAAA,eACtB;AAAA,aACF,GAEJ;AAAA,WACF;AAAA,MAEJ;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SACE,gBAAAC,MAAC,QAAK,WAAU,QACd;AAAA,0BAAAD,KAAC,cACC,0BAAAA,KAAC,aAAU,mBAAK,GAClB;AAAA,UACA,gBAAAA,KAAC,eAAY,WAAU,iCAAgC,0CAEvD;AAAA,WACF;AAAA,MAEJ;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SACE,gBAAAC,MAAC,QAAK,WAAU,QACd;AAAA,0BAAAD,KAAC,cACC,0BAAAA,KAAC,aAAU,sBAAQ,GACrB;AAAA,UACA,gBAAAA,KAAC,eAAY,WAAU,iCAAgC,2CAEvD;AAAA,WACF;AAAA,MAEJ;AAAA,IACF;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,UAAU,UACd,gBAAAA;AAAA,IAACQ;AAAA,IAAA;AAAA,MACC,SAAS,OAAO,WAAW,cAAc;AAAA,MACzC,MAAK;AAAA,MACL,SAAS,MACP,aAAa,OAAO;AAAA,QAClB,QAAQ,EAAE,MAAM,EAAE,IAAI,SAAS,EAAE;AAAA,QACjC,MAAM,EAAE,UAAU,CAAC,OAAO,SAAS;AAAA,MACrC,CAAC;AAAA,MAEH,UAAU,aAAa;AAAA,MAEtB,iBAAO,WAAW,eAAe;AAAA;AAAA,EACpC;AAGF,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,MAAI,aAAa,CAAC,QAAQ;AACxB,WACE,gBAAAR,KAAC,SAAI,WAAU,uCACb,0BAAAA,KAAC,SAAI,WAAU,0CAAyC,GAC1D;AAAA,EAEJ;AAEA,SACE,gBAAAA,KAAC,iBAAc,WAAU,uCACvB,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAM,gBAAAA,KAAC,gBAAa,WAAU,iCAAgC;AAAA,MAC9D;AAAA,MACA;AAAA;AAAA,EACF,GACF;AAEJ;;;AC7KA,SAAS,UAAAS,SAAQ,aAAAC,kBAAiB;AAClC,SAAS,YAAAC,iBAAgB;AACzB,SAAS,mBAAmB;AAC5B;AAAA,EACE,UAAAC;AAAA,EACA,sBAAAC;AAAA,EACA,iBAAAC;AAAA,EAEA,kBAAAC;AAAA,OACK;AACP,SAAS,YAAAC,iBAAgB;AACzB,SAAS,WAAAC,gBAAe;AAalB,gBAAAC,MAkDF,QAAAC,aAlDE;AANC,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AACF,GAAiC;AAC/B,SACE,gBAAAD,KAACP,WAAA,EACC,0BAAAO,KAAC,gCAA6B,QAC3B,UACH,GACF;AAEJ;AAEA,SAAS,6BAA6B;AAAA,EACpC;AAAA,EACA;AACF,GAAiC;AAC/B,QAAM,EAAE,MAAM,IAAIT,QAAO;AACzB,QAAM,EAAE,OAAO,IAAIC,WAAU;AAC7B,QAAM,WAAW,OAAO,YAAY,sBAAsB;AAC1D,QAAM,EAAE,MAAM,UAAU,IAAI,MAAM;AAAA,IAChC;AAAA,IACA;AAAA,IACA,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,EAAE;AAAA,IACnC,EAAE,SAAS,CAAC,CAAC,OAAO;AAAA,EACtB;AACA,QAAM,OAAO,MAAM;AAEnB,QAAM,QAAQ,YAAY,MAAM,YAAY,UAAU,MAAM;AAE5D,EAAAK,gBAAe;AAAA,IACb,OAAO;AAAA,MACL,EAAE,OAAO,QAAQ,MAAM,SAAS;AAAA,MAChC,EAAE,OAAO,OAAO,MAAM,OAAO;AAAA,MAC7B,EAAE,OAAO,SAAS,MAAM,aAAa;AAAA,MACrC,EAAE,OAAO,MAAM;AAAA,IACjB;AAAA,EACF,CAAC;AAED,QAAM,OAAkBE;AAAA,IACtB,MAAM;AAAA,MACJ,EAAE,OAAO,UAAU,MAAM,UAAU,MAAM,cAAc,MAAM,GAAG;AAAA,MAChE;AAAA,QACE,OAAO;AAAA,QACP,MAAM;AAAA,QACN,MAAM,cAAc,MAAM;AAAA,MAC5B;AAAA,IACF;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,SACE,gBAAAE,MAACL,gBAAA,EACC;AAAA,oBAAAI;AAAA,MAACL;AAAA,MAAA;AAAA,QACC;AAAA,QACA,MAAM,gBAAAK,KAACF,WAAA,EAAS;AAAA,QAChB,UAAS;AAAA,QACT;AAAA,QACA,SAAS;AAAA,QACT,SAAS,gBAAAE,KAACN,SAAA,EAAO,yBAAW;AAAA;AAAA,IAC9B;AAAA,IACC;AAAA,KACH;AAEJ;;;ACtFA,SAAS,UAAAQ,eAAc;AACvB,SAAS,YAAAC,iBAAgB;AACzB;AAAA,EACE,QAAAC;AAAA,EACA,eAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,uBAAuB;AAS1B,gBAAAC,MA4BE,QAAAC,aA5BF;AAHC,SAAS,sBAAsB,EAAE,OAAO,GAA+B;AAC5E,SACE,gBAAAD,KAACL,WAAA,EACC,0BAAAK,KAAC,8BAA2B,QAAgB,GAC9C;AAEJ;AAEA,SAAS,2BAA2B,EAAE,OAAO,GAA+B;AAC1E,QAAM,EAAE,MAAM,IAAIN,QAAO;AACzB,QAAM,EAAE,MAAM,UAAU,IAAI,MAAM;AAAA,IAChC;AAAA,IACA;AAAA,IACA,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,EAAE;AAAA,IACnC,EAAE,SAAS,CAAC,CAAC,OAAO;AAAA,EACtB;AACA,QAAM,OAAO,MAAM;AAEnB,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AACA,MAAI,aAAa,CAAC,MAAM;AACtB,WAAO,gBAAAM,KAAC,SAAI,WAAU,+CAA8C;AAAA,EACtE;AAEA,SACE,gBAAAC,MAACL,OAAA,EACC;AAAA,oBAAAI,KAACF,aAAA,EACC,0BAAAE,KAACD,YAAA,EAAU,0BAAY,GACzB;AAAA,IACA,gBAAAE,MAACJ,cAAA,EAAY,WAAU,qBACrB;AAAA,sBAAAI,MAAC,OACC;AAAA,wBAAAD,KAAC,UAAK,WAAU,yBAAwB,mBAAK;AAAA,QAAQ;AAAA,QACpD,KAAK,YAAY;AAAA,SACpB;AAAA,MACA,gBAAAC,MAAC,OACC;AAAA,wBAAAD,KAAC,UAAK,WAAU,yBAAwB,oBAAM;AAAA,QAAQ;AAAA,QACrD,KAAK,SAAS;AAAA,QAAK;AAAA,QACnB,KAAK,iBACJ,gBAAAC,MAAC,WACC;AAAA,0BAAAD,KAAC,kBACC,0BAAAA,KAAC,mBAAgB,WAAU,uCAAsC,GACnE;AAAA,UACA,gBAAAA,KAAC,kBAAe,4BAAc;AAAA,WAChC;AAAA,SAEJ;AAAA,MACA,gBAAAC,MAAC,OACC;AAAA,wBAAAD,KAAC,UAAK,WAAU,yBAAwB,oBAAM;AAAA,QAAQ;AAAA,QACrD,KAAK,SAAS;AAAA,QAAK;AAAA,QACnB,KAAK,iBACJ,gBAAAC,MAAC,WACC;AAAA,0BAAAD,KAAC,kBACC,0BAAAA,KAAC,mBAAgB,WAAU,uCAAsC,GACnE;AAAA,UACA,gBAAAA,KAAC,kBAAe,4BAAc;AAAA,WAChC;AAAA,SAEJ;AAAA,MACA,gBAAAC,MAAC,OACC;AAAA,wBAAAD,KAAC,UAAK,WAAU,yBAAwB,2BAAa;AAAA,QAAQ;AAAA,QAC5D,KAAK,eACF,IAAI,KAAK,KAAK,YAAY,EAAE,eAAe,IAC3C;AAAA,SACN;AAAA,MACC,KAAK,WAAW,SACf,gBAAAC,MAAC,OACC;AAAA,wBAAAD,KAAC,UAAK,WAAU,yBAAwB,oBAAM;AAAA,QAAQ;AAAA,QACrD,KAAK,UAAU,KAAK,IAAI;AAAA,SAC3B,IACE;AAAA,OACN;AAAA,KACF;AAEJ;;;AC3FA,SAAS,YAAAE,iBAAgB;AACzB;AAAA,EACE,QAAAC;AAAA,EACA,eAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,OACK;AACP,SAAS,gBAAAC,qBAAoB;;;ACR7B;AAAA,EACE,UAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,sBAAAC;AAAA,EACA;AAAA,EACA,yBAAAC;AAAA,OACK;AACP,SAAS,YAAAC,WAAU,cAAAC,mBAAkB;AACrC,SAAS,WAAAC,UAAS,gBAAgB;;;ACRlC;AAAA,EACE;AAAA,EAGA;AAAA,OACK;AACP,SAAS,UAAU;AACnB,SAAS,cAAc,kBAAkB;AAiCnC,SAUA,YAAAC,WAVA,OAAAC,MAUA,QAAAC,aAVA;AAzBN,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD;AAAA;AAAA,IAEE,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,QACT,WAAW,CAAC,MAAM;AAChB,cAAI,EAAE,QAAQ,SAAS;AACrB,qBAAS;AAAA,UACX;AAAA,QACF;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA,YAAY;AAAA,QACd;AAAA,QAEA,0BAAAA,KAAC,YAAS,MAAY,MAAK,UAAS;AAAA;AAAA,IACtC;AAAA;AAEJ;AAEA,IAAM,cAA4C;AAAA,EAChD;AAAA,IACE,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,MAAM,CAAC,SACL,gBAAAC,MAAAF,WAAA,EACE;AAAA,sBAAAC,KAAC,OAAE,WAAU,eAAe,cAAI,KAAK,IAAI,KAAK,KAAK,MAAK;AAAA,MACxD,gBAAAA,KAAC,OAAE,WAAU,iCAAiC,eAAK,MAAK;AAAA,OAC1D;AAAA,EAEJ;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,MAAM,CAAC,SACL,gBAAAA,KAAC,UAAK,WAAU,oDACb,cAAI,KAAK,WAAW,KAAK,UAC5B;AAAA,EAEJ;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,MAAM,CAAC,SACL,gBAAAC,MAAC,SAAI,WAAU,iDACb;AAAA,sBAAAD,KAAC,gBAAa,WAAU,WAAU;AAAA,MACjC,IAAI,KAAK,KAAK,SAAS,EAAE,mBAAmB;AAAA,OAC/C;AAAA,EAEJ;AACF;AAUO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,YAAY;AAAA,EACZ;AACF,GAAsB;AACpB,QAAM,QAAQ,sBAAsB;AAAA,IAClC,aAAa;AAAA,IACb,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,EACnB,CAAC;AACD,QAAM,aAAa,MAAM;AAMzB,QAAM,EAAE,MAAM,WAAW,WAAW,IAAI,SAAS;AAAA,IAC/C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,QAAQ,MAAM,SAAS,CAAC;AAE9B,QAAM,SAAqC;AAAA,IACzC,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,aAAa;AAAA,IACb,cAAc,CAAC,SAAS,IAAI,KAAK,IAAI,KAAK,KAAK;AAAA,IAC/C,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB,eAAe;AAAA,MACb,EAAE,OAAO,OAAO,OAAO,GAAG;AAAA,MAC1B,EAAE,OAAO,WAAW,OAAO,OAAO;AAAA,IACpC;AAAA,IACA,aAAa;AAAA,MACX,EAAE,OAAO,WAAW,OAAO,YAAY;AAAA,MACvC,EAAE,OAAO,WAAW,OAAO,YAAY;AAAA,MACvC,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,IACjC;AAAA,IACA,gBAAgB;AAAA,IAChB,YAAY,CAAC,MAAM,UAAU,aAC3B,gBAAAA,KAAC,sBAAmB,MAAY,UAAoB,UAAoB;AAAA,EAE5E;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,OAAO,MAAM;AAAA,MACb,WAAW,aAAa;AAAA,MACxB;AAAA;AAAA,EACF;AAEJ;;;ADhDY,SAqBJ,YAAAE,WApBM,OAAAC,MADF,QAAAC,aAAA;AArFZ,IAAM,QAAQ;AACd,IAAMC,sBAAqB;AAE3B,SAAS,cACP,OACA,QACA,MACA,OACA;AACA,MAAI,MAAM;AACV,MAAI,OAAO,KAAK,GAAG;AACjB,UAAM,IAAI,OAAO,KAAK,EAAE,YAAY;AACpC,UAAM,IAAI;AAAA,MACR,CAAC,MACC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,CAAC,KACpC,EAAE,KAAK,YAAY,EAAE,SAAS,CAAC;AAAA,IACnC;AAAA,EACF;AACA,QAAM,OAAO,UAAU,QAAQ,IAAI;AACnC,QAAM,KAAK,SAAS,SAAS,SAAS;AACtC,QAAM,CAAC,GAAG,GAAG,EAAE;AAAA,IAAK,CAAC,GAAG,MACtB,OAAO,SACH,OAAO,EAAE,KAAK,cAAc,EAAE,IAAI,IAClC,QACC,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ;AAAA,EACvE;AACA,SAAO;AACT;AAEO,SAAS,YAAY,EAAE,OAAO,GAAuB;AAC1D,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,eAAeC,uBAAsB;AAAA,IACzC,aAAa;AAAA,IACb,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,eAAe;AAAA,MACb,EAAE,OAAO,OAAO,OAAO,GAAG;AAAA,MAC1B,EAAE,OAAO,WAAW,OAAO,OAAO;AAAA,IACpC;AAAA,IACA,aAAa;AAAA,MACX,EAAE,OAAO,WAAW,OAAO,YAAY;AAAA,MACvC,EAAE,OAAO,WAAW,OAAO,YAAY;AAAA,MACvC,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,IACjC;AAAA,IACA,OAAO,CAAC,SAAS,MAAM;AAAA,EACzB,CAAC;AAED,QAAM,EAAE,MAAM,WAAW,WAAW,IAAI,SAAS;AAAA,IAC/C;AAAA,IACA;AAAA,IACA,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,MAAM,EAAE,EAAE;AAAA,IACtC,EAAE,GAAG,2BAA2B,SAAS,KAAK;AAAA,EAChD;AACA,QAAM,YAAY,aAAa;AAC/B,QAAM,QAAQ,MAAM,SAAS,CAAC;AAE9B,QAAM,WAAWC;AAAA,IACf,MACE;AAAA,MACE;AAAA,MACA,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AAAA,IACF,CAAC,OAAO,aAAa,QAAQ,aAAa,MAAM,aAAa,KAAK;AAAA,EACpE;AACA,QAAM,YAAY,KAAK,KAAK,SAAS,SAAS,aAAa,QAAQ,KAAK;AACxE,QAAM,YAAY,KAAK,IAAI,aAAa,OAAO,GAAG,KAAK,IAAI,GAAG,YAAY,CAAC,CAAC;AAC5E,QAAM,YAAYA;AAAA,IAChB,MACE,SAAS;AAAA,MACP,YAAY,aAAa;AAAA,MACzB,YAAY,aAAa,WAAW,aAAa;AAAA,IACnD;AAAA,IACF,CAAC,UAAU,WAAW,aAAa,QAAQ;AAAA,EAC7C;AAEA,SACE,gBAAAJ;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,OAAO;AAAA,MACP,cAAc;AAAA,MACd,SACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,SACE,gBAAAC,MAACI,SAAA,EAAO,SAAQ,WAAU,MAAK,MAC7B;AAAA,4BAAAL,KAACM,WAAA,EAAS,WAAU,WAAU;AAAA,YAAE;AAAA,aAElC;AAAA,UAEF,UAAQ;AAAA,UACR,UAAU,CAACC,WAAU;AAGnB,oBAAQ,IAAI,mBAAmB,QAAQA,MAAK;AAAA,UAC9C;AAAA;AAAA,MACF;AAAA,MAEF,QAAQ;AAAA,QACN,mBAAmB;AAAA,QACnB,eAAe,aAAa;AAAA,QAC5B,aAAa,aAAa;AAAA,QAC1B,OAAO,aAAa;AAAA,MACtB;AAAA,MAEC,WAAC,UACA,gBAAAN,MAAAF,WAAA,EACG;AAAA,qBACC,gBAAAC;AAAA,UAACQ;AAAA,UAAA;AAAA,YACC,MAAM,MAAM;AAAA,YACZ,UAAU,MAAM;AAAA,YAChB,aAAaN;AAAA,YACb,WAAW,MAAM;AAAA;AAAA,QACnB;AAAA,QAED,CAAC,aAAa,SAAS,WAAW,KACjC,gBAAAF;AAAA,UAACS;AAAA,UAAA;AAAA,YACC,MAAMC;AAAA,YACN,YAAW;AAAA,YACX,OAAM;AAAA,YACN,aACE,MAAM,WAAW,IAAI,wBAAwB;AAAA;AAAA,QAEjD;AAAA,QAED,CAAC,aAAa,SAAS,SAAS,KAC/B,gBAAAV;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,MAAM,MAAM;AAAA,YACZ;AAAA,YACA,UAAU,MAAM;AAAA,YAChB;AAAA,YACA,WAAW,SAAS;AAAA,YACpB,cAAc,CAAC,MAAM,MAAM,QAAQ,IAAI,CAAC;AAAA,YACxC,kBAAkB,CAAC,SAAS;AAC1B,oBAAM,YAAY,IAAI;AACtB,oBAAM,QAAQ,CAAC;AAAA,YACjB;AAAA;AAAA,QACF;AAAA,SAEJ;AAAA;AAAA,EAEJ;AAEJ;;;AD9IM,gBAAAW,MAkBE,QAAAC,aAlBF;AALC,SAAS,wBAAwB;AAAA,EACtC;AACF,GAAiC;AAC/B,SACE,gBAAAD,KAACE,WAAA,EACC,0BAAAF,KAAC,gCAA6B,QAAgB,GAChD;AAEJ;AAEA,SAAS,6BAA6B;AAAA,EACpC;AACF,GAAiC;AAC/B,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,SACE,gBAAAC,MAAC,SAAI,WAAU,aACb;AAAA,oBAAAA,MAACE,OAAA,EACC;AAAA,sBAAAH,KAACI,aAAA,EACC,0BAAAJ,KAACK,YAAA,EAAU,sBAAQ,GACrB;AAAA,MACA,gBAAAJ,MAACK,cAAA,EAAY,WAAU,yDACrB;AAAA,wBAAAN,KAACO,eAAA,EAAa,WAAU,WAAU;AAAA,QAAE;AAAA,SAEtC;AAAA,OACF;AAAA,IACA,gBAAAP,KAAC,eAAY,QAAgB;AAAA,IAC7B,gBAAAA,KAAC,WAAQ,OAAM,eAAc,kBAAI;AAAA,IACjC,gBAAAA,KAAC,WAAQ,OAAM,UAAS,kBAAI;AAAA,KAC9B;AAEJ;;;AGnCS,qBAAAQ,WAAA,OAAAC,YAAA;AADF,SAAS,mBAAmB,EAAE,SAAS,GAA4B;AACxE,SAAO,gBAAAA,KAAAD,WAAA,EAAG,UAAS;AACrB;","names":["useConfig","useConfig","IAMGuard","IAMGuard","useApi","useConfig","IAMGuard","Button","useQueryClient","useMemo","jsx","jsxs","IAMGuard","useApi","useConfig","useQueryClient","str","useMemo","Button","useApi","useConfig","IAMGuard","Button","EntityDetailHeader","PageContainer","useBreadcrumbs","IconUser","useMemo","jsx","jsxs","useApi","IAMGuard","Card","CardContent","CardHeader","CardTitle","jsx","jsxs","IAMGuard","Card","CardContent","CardHeader","CardTitle","IconCalendar","Button","EntityEmptyState","EntityLoadingState","useEntitySectionState","IconPlus","IconShield","useMemo","Fragment","jsx","jsxs","Fragment","jsx","jsxs","TABLE_COLUMN_COUNT","useEntitySectionState","useMemo","Button","IconPlus","roles","EntityLoadingState","EntityEmptyState","IconShield","jsx","jsxs","IAMGuard","Card","CardHeader","CardTitle","CardContent","IconCalendar","Fragment","jsx"]}
@@ -3,31 +3,33 @@ import {
3
3
  getSafeRedirectFromSearch
4
4
  } from "../../chunk-G2XRGSQE.js";
5
5
  import {
6
- useConfig,
7
- useSession
8
- } from "../../chunk-M2K6O5CN.js";
6
+ createNavigate
7
+ } from "../../chunk-6YHUCPJ4.js";
9
8
 
10
9
  // src/pages/auth/layout.tsx
10
+ import { useConfig, useSession } from "@mesob/auth-react";
11
11
  import { AuthCard } from "@mesob/auth-react/components/auth/auth-card";
12
12
  import { Spinner } from "@mesob/ui/components";
13
+ import { useMesob } from "@mesob/ui/providers";
13
14
  import { useEffect, useRef } from "react";
14
15
  import { jsx } from "react/jsx-runtime";
15
16
  function AuthLayout({ children }) {
16
17
  const { isLoading, isAuthenticated } = useSession();
17
18
  const { config } = useConfig();
19
+ const mesob = useMesob();
18
20
  const hasRedirected = useRef(false);
21
+ const navigate = createNavigate({
22
+ onNavigate: config.navigation?.onNavigate,
23
+ mesobNavigate: mesob?.navigate
24
+ });
19
25
  useEffect(() => {
20
26
  if (isAuthenticated && !hasRedirected.current) {
21
27
  hasRedirected.current = true;
22
28
  const fromQuery = getSafeRedirectFromSearch(window.location.search);
23
29
  const redirectUrl = fromQuery ?? (config.navigation?.defaultRedirectUrl || "/");
24
- if (config.navigation?.onNavigate) {
25
- config.navigation.onNavigate(redirectUrl);
26
- } else {
27
- window.location.href = redirectUrl;
28
- }
30
+ navigate(redirectUrl);
29
31
  }
30
- }, [config.navigation, isAuthenticated]);
32
+ }, [config.navigation, isAuthenticated, navigate]);
31
33
  if (isLoading) {
32
34
  return /* @__PURE__ */ jsx("div", { className: "flex min-h-svh items-center justify-center", children: /* @__PURE__ */ jsx(Spinner, { className: "size-8" }) });
33
35
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/pages/auth/layout.tsx"],"sourcesContent":["'use client';\n\nimport { AuthCard } from '@mesob/auth-react/components/auth/auth-card';\nimport { Spinner } from '@mesob/ui/components';\nimport type { ReactNode } from 'react';\nimport { useEffect, useRef } from 'react';\nimport { useConfig, useSession } from '../../provider';\nimport { getSafeRedirectFromSearch } from '../../utils/safe-redirect';\n\nexport default function AuthLayout({ children }: { children: ReactNode }) {\n const { isLoading, isAuthenticated } = useSession();\n const { config } = useConfig();\n const hasRedirected = useRef(false);\n\n useEffect(() => {\n if (isAuthenticated && !hasRedirected.current) {\n hasRedirected.current = true;\n const fromQuery = getSafeRedirectFromSearch(window.location.search);\n const redirectUrl =\n fromQuery ?? (config.navigation?.defaultRedirectUrl || '/');\n\n if (config.navigation?.onNavigate) {\n config.navigation.onNavigate(redirectUrl);\n } else {\n window.location.href = redirectUrl;\n }\n }\n }, [config.navigation, isAuthenticated]);\n\n if (isLoading) {\n return (\n <div className=\"flex min-h-svh items-center justify-center\">\n <Spinner className=\"size-8\" />\n </div>\n );\n }\n\n if (isAuthenticated) {\n return null;\n }\n\n return (\n <div className=\"bg-primary/5\">\n <AuthCard>{children}</AuthCard>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;AAEA,SAAS,gBAAgB;AACzB,SAAS,eAAe;AAExB,SAAS,WAAW,cAAc;AA2B1B;AAvBO,SAAR,WAA4B,EAAE,SAAS,GAA4B;AACxE,QAAM,EAAE,WAAW,gBAAgB,IAAI,WAAW;AAClD,QAAM,EAAE,OAAO,IAAI,UAAU;AAC7B,QAAM,gBAAgB,OAAO,KAAK;AAElC,YAAU,MAAM;AACd,QAAI,mBAAmB,CAAC,cAAc,SAAS;AAC7C,oBAAc,UAAU;AACxB,YAAM,YAAY,0BAA0B,OAAO,SAAS,MAAM;AAClE,YAAM,cACJ,cAAc,OAAO,YAAY,sBAAsB;AAEzD,UAAI,OAAO,YAAY,YAAY;AACjC,eAAO,WAAW,WAAW,WAAW;AAAA,MAC1C,OAAO;AACL,eAAO,SAAS,OAAO;AAAA,MACzB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,OAAO,YAAY,eAAe,CAAC;AAEvC,MAAI,WAAW;AACb,WACE,oBAAC,SAAI,WAAU,8CACb,8BAAC,WAAQ,WAAU,UAAS,GAC9B;AAAA,EAEJ;AAEA,MAAI,iBAAiB;AACnB,WAAO;AAAA,EACT;AAEA,SACE,oBAAC,SAAI,WAAU,gBACb,8BAAC,YAAU,UAAS,GACtB;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/pages/auth/layout.tsx"],"sourcesContent":["'use client';\n\nimport { useConfig, useSession } from '@mesob/auth-react';\nimport { AuthCard } from '@mesob/auth-react/components/auth/auth-card';\nimport { Spinner } from '@mesob/ui/components';\nimport { useMesob } from '@mesob/ui/providers';\nimport type { ReactNode } from 'react';\nimport { useEffect, useRef } from 'react';\nimport { createNavigate } from '../../utils/navigation';\nimport { getSafeRedirectFromSearch } from '../../utils/safe-redirect';\n\nexport default function AuthLayout({ children }: { children: ReactNode }) {\n const { isLoading, isAuthenticated } = useSession();\n const { config } = useConfig();\n const mesob = useMesob();\n const hasRedirected = useRef(false);\n const navigate = createNavigate({\n onNavigate: config.navigation?.onNavigate,\n mesobNavigate: mesob?.navigate,\n });\n\n useEffect(() => {\n if (isAuthenticated && !hasRedirected.current) {\n hasRedirected.current = true;\n const fromQuery = getSafeRedirectFromSearch(window.location.search);\n const redirectUrl =\n fromQuery ?? (config.navigation?.defaultRedirectUrl || '/');\n\n navigate(redirectUrl);\n }\n }, [config.navigation, isAuthenticated, navigate]);\n\n if (isLoading) {\n return (\n <div className=\"flex min-h-svh items-center justify-center\">\n <Spinner className=\"size-8\" />\n </div>\n );\n }\n\n if (isAuthenticated) {\n return null;\n }\n\n return (\n <div className=\"bg-primary/5\">\n <AuthCard>{children}</AuthCard>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAEA,SAAS,WAAW,kBAAkB;AACtC,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,SAAS,gBAAgB;AAEzB,SAAS,WAAW,cAAc;AA4B1B;AAxBO,SAAR,WAA4B,EAAE,SAAS,GAA4B;AACxE,QAAM,EAAE,WAAW,gBAAgB,IAAI,WAAW;AAClD,QAAM,EAAE,OAAO,IAAI,UAAU;AAC7B,QAAM,QAAQ,SAAS;AACvB,QAAM,gBAAgB,OAAO,KAAK;AAClC,QAAM,WAAW,eAAe;AAAA,IAC9B,YAAY,OAAO,YAAY;AAAA,IAC/B,eAAe,OAAO;AAAA,EACxB,CAAC;AAED,YAAU,MAAM;AACd,QAAI,mBAAmB,CAAC,cAAc,SAAS;AAC7C,oBAAc,UAAU;AACxB,YAAM,YAAY,0BAA0B,OAAO,SAAS,MAAM;AAClE,YAAM,cACJ,cAAc,OAAO,YAAY,sBAAsB;AAEzD,eAAS,WAAW;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,OAAO,YAAY,iBAAiB,QAAQ,CAAC;AAEjD,MAAI,WAAW;AACb,WACE,oBAAC,SAAI,WAAU,8CACb,8BAAC,WAAQ,WAAU,UAAS,GAC9B;AAAA,EAEJ;AAEA,MAAI,iBAAiB;AACnB,WAAO;AAAA,EACT;AAEA,SACE,oBAAC,SAAI,WAAU,gBACb,8BAAC,YAAU,UAAS,GACtB;AAEJ;","names":[]}
@@ -0,0 +1,4 @@
1
+ import type { ReactNode } from 'react';
2
+ export default function AuthLayout({ children }: {
3
+ children: ReactNode;
4
+ }): import("react/jsx-runtime").JSX.Element | null;