@mesob/auth-react 0.4.7 → 0.5.2

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 (209) hide show
  1. package/dist/{chunk-5E3XN6SW.js → chunk-22WQJ3NP.js} +4 -4
  2. package/dist/{chunk-ECF6S2Y2.js → chunk-24E7XFGP.js} +2 -2
  3. package/dist/{chunk-AWSAC7RT.js → chunk-2XIZ27DU.js} +4 -1
  4. package/dist/{chunk-AWSAC7RT.js.map → chunk-2XIZ27DU.js.map} +1 -1
  5. package/dist/{chunk-DG6GRTPG.js → chunk-4CUQIZ2Q.js} +2 -2
  6. package/dist/{chunk-5BFG47VF.js → chunk-55WFD2Y2.js} +4 -4
  7. package/dist/{chunk-GVEBIL3O.js → chunk-6L4K26KM.js} +2 -2
  8. package/dist/{chunk-MWMSZVH3.js → chunk-BIP5XEDV.js} +4 -4
  9. package/dist/{chunk-YFQNNSSC.js → chunk-C34HWZA5.js} +2 -2
  10. package/dist/{chunk-T34HJRUW.js → chunk-CDX5V66G.js} +3 -3
  11. package/dist/{chunk-V6ZHX4LT.js → chunk-DJWX4ENN.js} +2 -2
  12. package/dist/chunk-G2XRGSQE.js +22 -0
  13. package/dist/chunk-G2XRGSQE.js.map +1 -0
  14. package/dist/{chunk-6THPM5LB.js → chunk-GXWBGB6G.js} +4 -4
  15. package/dist/{chunk-6IEX2RLA.js → chunk-HVAYVDIM.js} +3 -3
  16. package/dist/{chunk-5HAABEAS.js → chunk-J4Q7RYYY.js} +2 -2
  17. package/dist/{chunk-OXUOGOG3.js → chunk-JNVJWNJT.js} +87 -20
  18. package/dist/chunk-JNVJWNJT.js.map +1 -0
  19. package/dist/{chunk-RMJNENJB.js → chunk-K2523VB5.js} +2 -2
  20. package/dist/{chunk-5AEV7RAN.js → chunk-KWL6FBP7.js} +3 -3
  21. package/dist/{chunk-IQNQGPIT.js → chunk-LJIZEECR.js} +4 -4
  22. package/dist/{chunk-SGDXNT7M.js → chunk-LQX2365R.js} +3 -3
  23. package/dist/{chunk-MVVAPYUD.js → chunk-NLK2J4UG.js} +2 -2
  24. package/dist/{chunk-ZZ6D4KE4.js → chunk-NUCDZRXS.js} +2 -2
  25. package/dist/{chunk-EQWOGD4F.js → chunk-OPSVSBOB.js} +2 -2
  26. package/dist/{chunk-5SDS2E3F.js → chunk-PCBJBXEK.js} +2 -2
  27. package/dist/{chunk-VVKXFEAN.js → chunk-PFUTYTDB.js} +4 -4
  28. package/dist/{chunk-WY2JJNZW.js → chunk-QHHVGLHT.js} +2 -2
  29. package/dist/{chunk-W3D4HG5W.js → chunk-QJOBPOTR.js} +3 -3
  30. package/dist/{chunk-MQI6Q2S4.js → chunk-R6ME7P5U.js} +147 -4
  31. package/dist/chunk-R6ME7P5U.js.map +1 -0
  32. package/dist/{chunk-N4JFMKGK.js → chunk-RPKO5EQ5.js} +5 -5
  33. package/dist/{chunk-CP4TTRV4.js → chunk-RZFCA4YG.js} +2 -2
  34. package/dist/{chunk-7CLKBH5Z.js → chunk-S772WZD7.js} +3 -3
  35. package/dist/{chunk-73ZNGEWU.js → chunk-SBSAOWP5.js} +5 -5
  36. package/dist/{chunk-H7JRQFFI.js → chunk-TEARMXTQ.js} +3 -3
  37. package/dist/{chunk-UY55LEIG.js → chunk-UN6YBSRS.js} +2 -2
  38. package/dist/{chunk-TEHMLZFI.js → chunk-UOQGT574.js} +3 -3
  39. package/dist/{chunk-Y4AH5JY4.js → chunk-VVFBMIIB.js} +92 -16
  40. package/dist/chunk-VVFBMIIB.js.map +1 -0
  41. package/dist/{chunk-TLQMK2QF.js → chunk-WBRGSWKX.js} +4 -4
  42. package/dist/{chunk-Z34NJZRL.js → chunk-WFHQTVY6.js} +3 -3
  43. package/dist/{chunk-X2BHF4KC.js → chunk-WTAKMSWN.js} +2 -2
  44. package/dist/{chunk-UGQP733V.js → chunk-XGE6G3EK.js} +2 -2
  45. package/dist/{chunk-4ABXALRN.js → chunk-XL2DCDFZ.js} +2 -2
  46. package/dist/{chunk-EPEXIGKB.js → chunk-XUV6CYTY.js} +2 -2
  47. package/dist/{chunk-H5PUZDNU.js → chunk-YQLGGIE4.js} +4 -4
  48. package/dist/{chunk-4X3CJHKR.js → chunk-ZGDN6MQA.js} +3 -3
  49. package/dist/{chunk-4NUO6F3J.js → chunk-ZMJUIRZ6.js} +2 -2
  50. package/dist/components/auth/countdown.js +3 -3
  51. package/dist/components/auth/forgot-password.js +3 -3
  52. package/dist/components/auth/reset-password-form.js +3 -3
  53. package/dist/components/auth/set-password.js +3 -3
  54. package/dist/components/auth/sign-in.js +3 -3
  55. package/dist/components/auth/sign-up.js +3 -3
  56. package/dist/components/auth/verification-form.js +4 -4
  57. package/dist/components/auth/verify-email.js +5 -5
  58. package/dist/components/auth/verify-phone.js +5 -5
  59. package/dist/components/authorization/deny.js +2 -2
  60. package/dist/components/authorization/grant.js +2 -2
  61. package/dist/components/error-boundary.d.ts +1 -1
  62. package/dist/components/iam/domains-page.js +6 -6
  63. package/dist/components/iam/iam-guard.js +3 -3
  64. package/dist/components/iam/permission-selector.js +2 -2
  65. package/dist/components/iam/permissions-page.js +4 -4
  66. package/dist/components/iam/permissions.js +2 -2
  67. package/dist/components/iam/role-detail-layout.js +2 -2
  68. package/dist/components/iam/role-detail-page.js +4 -4
  69. package/dist/components/iam/role-permissions-page.js +5 -5
  70. package/dist/components/iam/roles-page.js +6 -7
  71. package/dist/components/iam/roles.js +2 -2
  72. package/dist/components/iam/sessions-page.js +6 -6
  73. package/dist/components/iam/sessions.js +2 -2
  74. package/dist/components/iam/tenants-page.js +6 -6
  75. package/dist/components/iam/tenants.js +2 -2
  76. package/dist/components/iam/users-page.js +7 -7
  77. package/dist/components/iam/users.js +2 -2
  78. package/dist/components/profile/account.js +2 -2
  79. package/dist/components/profile/change-email-form.js +8 -8
  80. package/dist/components/profile/change-password-form.js +2 -2
  81. package/dist/components/profile/change-phone-form.js +8 -8
  82. package/dist/components/profile/otp-verification-modal.js +5 -5
  83. package/dist/components/profile/profile-layout.js +3 -3
  84. package/dist/components/profile/request-change-email-form.js +2 -2
  85. package/dist/components/profile/request-change-phone-form.js +2 -2
  86. package/dist/components/profile/security.js +13 -13
  87. package/dist/components/profile/verify-change-email-form.js +6 -6
  88. package/dist/components/profile/verify-change-phone-form.js +6 -6
  89. package/dist/index.d.ts +1 -0
  90. package/dist/index.js +975 -63
  91. package/dist/index.js.map +1 -1
  92. package/dist/pages/__import_guard_probe.d.ts +4 -0
  93. package/dist/pages/auth/forgot-password.js +1 -8
  94. package/dist/pages/auth/forgot-password.js.map +1 -1
  95. package/dist/pages/auth/layout.js +6 -4
  96. package/dist/pages/auth/layout.js.map +1 -1
  97. package/dist/pages/auth/reset-password.js +1 -8
  98. package/dist/pages/auth/reset-password.js.map +1 -1
  99. package/dist/pages/auth/set-password.js +1 -9
  100. package/dist/pages/auth/set-password.js.map +1 -1
  101. package/dist/pages/auth/sign-in.js +1 -9
  102. package/dist/pages/auth/sign-in.js.map +1 -1
  103. package/dist/pages/auth/sign-up.js +1 -8
  104. package/dist/pages/auth/sign-up.js.map +1 -1
  105. package/dist/pages/auth/verify-email.js +1 -10
  106. package/dist/pages/auth/verify-email.js.map +1 -1
  107. package/dist/pages/auth/verify-phone.js +1 -10
  108. package/dist/pages/auth/verify-phone.js.map +1 -1
  109. package/dist/pages/iam/domains.d.ts +1 -1
  110. package/dist/pages/iam/permissions.d.ts +1 -1
  111. package/dist/pages/iam/permissions.js +3 -7
  112. package/dist/pages/iam/permissions.js.map +1 -1
  113. package/dist/pages/iam/role-detail-layout.js +1 -5
  114. package/dist/pages/iam/role-detail-layout.js.map +1 -1
  115. package/dist/pages/iam/role-detail.js +1 -7
  116. package/dist/pages/iam/role-detail.js.map +1 -1
  117. package/dist/pages/iam/role-permissions.js +1 -8
  118. package/dist/pages/iam/role-permissions.js.map +1 -1
  119. package/dist/pages/iam/role-users.js +1 -13
  120. package/dist/pages/iam/role-users.js.map +1 -1
  121. package/dist/pages/iam/roles.d.ts +1 -1
  122. package/dist/pages/iam/roles.js +3 -11
  123. package/dist/pages/iam/roles.js.map +1 -1
  124. package/dist/pages/iam/sessions.d.ts +1 -1
  125. package/dist/pages/iam/sessions.js +3 -9
  126. package/dist/pages/iam/sessions.js.map +1 -1
  127. package/dist/pages/iam/tenant-detail.js +1 -8
  128. package/dist/pages/iam/tenant-detail.js.map +1 -1
  129. package/dist/pages/iam/tenants/tenant-selector.js +3 -3
  130. package/dist/pages/iam/tenants.d.ts +1 -1
  131. package/dist/pages/iam/tenants.js +3 -10
  132. package/dist/pages/iam/tenants.js.map +1 -1
  133. package/dist/pages/iam/user-activity.js +1 -12
  134. package/dist/pages/iam/user-activity.js.map +1 -1
  135. package/dist/pages/iam/user-detail-layout.js +1 -7
  136. package/dist/pages/iam/user-detail-layout.js.map +1 -1
  137. package/dist/pages/iam/user-detail.js +1 -7
  138. package/dist/pages/iam/user-detail.js.map +1 -1
  139. package/dist/pages/iam/users/user-selector.js +149 -7
  140. package/dist/pages/iam/users/user-selector.js.map +1 -1
  141. package/dist/pages/iam/users.d.ts +1 -1
  142. package/dist/pages/iam/users.js +3 -11
  143. package/dist/pages/iam/users.js.map +1 -1
  144. package/dist/pages/profile/account.js +2 -5
  145. package/dist/pages/profile/account.js.map +1 -1
  146. package/dist/pages/profile/layout.d.ts +1 -1
  147. package/dist/pages/profile/layout.js +3 -5
  148. package/dist/pages/profile/layout.js.map +1 -1
  149. package/dist/pages/profile/security.js +2 -16
  150. package/dist/pages/profile/security.js.map +1 -1
  151. package/dist/types.d.ts +6 -0
  152. package/dist/utils/safe-redirect.d.ts +2 -0
  153. package/package.json +4 -4
  154. package/dist/chunk-GBDNBY6K.js +0 -153
  155. package/dist/chunk-GBDNBY6K.js.map +0 -1
  156. package/dist/chunk-MQI6Q2S4.js.map +0 -1
  157. package/dist/chunk-NFGFJPCX.js +0 -313
  158. package/dist/chunk-NFGFJPCX.js.map +0 -1
  159. package/dist/chunk-NJMNRSJH.js +0 -83
  160. package/dist/chunk-NJMNRSJH.js.map +0 -1
  161. package/dist/chunk-OXUOGOG3.js.map +0 -1
  162. package/dist/chunk-QPEUVMSP.js +0 -149
  163. package/dist/chunk-QPEUVMSP.js.map +0 -1
  164. package/dist/chunk-RCQTWNAG.js +0 -150
  165. package/dist/chunk-RCQTWNAG.js.map +0 -1
  166. package/dist/chunk-SGUROG23.js +0 -356
  167. package/dist/chunk-SGUROG23.js.map +0 -1
  168. package/dist/chunk-X6EUQZSZ.js +0 -81
  169. package/dist/chunk-X6EUQZSZ.js.map +0 -1
  170. package/dist/chunk-Y4AH5JY4.js.map +0 -1
  171. /package/dist/{chunk-5E3XN6SW.js.map → chunk-22WQJ3NP.js.map} +0 -0
  172. /package/dist/{chunk-ECF6S2Y2.js.map → chunk-24E7XFGP.js.map} +0 -0
  173. /package/dist/{chunk-DG6GRTPG.js.map → chunk-4CUQIZ2Q.js.map} +0 -0
  174. /package/dist/{chunk-5BFG47VF.js.map → chunk-55WFD2Y2.js.map} +0 -0
  175. /package/dist/{chunk-GVEBIL3O.js.map → chunk-6L4K26KM.js.map} +0 -0
  176. /package/dist/{chunk-MWMSZVH3.js.map → chunk-BIP5XEDV.js.map} +0 -0
  177. /package/dist/{chunk-YFQNNSSC.js.map → chunk-C34HWZA5.js.map} +0 -0
  178. /package/dist/{chunk-T34HJRUW.js.map → chunk-CDX5V66G.js.map} +0 -0
  179. /package/dist/{chunk-V6ZHX4LT.js.map → chunk-DJWX4ENN.js.map} +0 -0
  180. /package/dist/{chunk-6THPM5LB.js.map → chunk-GXWBGB6G.js.map} +0 -0
  181. /package/dist/{chunk-6IEX2RLA.js.map → chunk-HVAYVDIM.js.map} +0 -0
  182. /package/dist/{chunk-5HAABEAS.js.map → chunk-J4Q7RYYY.js.map} +0 -0
  183. /package/dist/{chunk-RMJNENJB.js.map → chunk-K2523VB5.js.map} +0 -0
  184. /package/dist/{chunk-5AEV7RAN.js.map → chunk-KWL6FBP7.js.map} +0 -0
  185. /package/dist/{chunk-IQNQGPIT.js.map → chunk-LJIZEECR.js.map} +0 -0
  186. /package/dist/{chunk-SGDXNT7M.js.map → chunk-LQX2365R.js.map} +0 -0
  187. /package/dist/{chunk-MVVAPYUD.js.map → chunk-NLK2J4UG.js.map} +0 -0
  188. /package/dist/{chunk-ZZ6D4KE4.js.map → chunk-NUCDZRXS.js.map} +0 -0
  189. /package/dist/{chunk-EQWOGD4F.js.map → chunk-OPSVSBOB.js.map} +0 -0
  190. /package/dist/{chunk-5SDS2E3F.js.map → chunk-PCBJBXEK.js.map} +0 -0
  191. /package/dist/{chunk-VVKXFEAN.js.map → chunk-PFUTYTDB.js.map} +0 -0
  192. /package/dist/{chunk-WY2JJNZW.js.map → chunk-QHHVGLHT.js.map} +0 -0
  193. /package/dist/{chunk-W3D4HG5W.js.map → chunk-QJOBPOTR.js.map} +0 -0
  194. /package/dist/{chunk-N4JFMKGK.js.map → chunk-RPKO5EQ5.js.map} +0 -0
  195. /package/dist/{chunk-CP4TTRV4.js.map → chunk-RZFCA4YG.js.map} +0 -0
  196. /package/dist/{chunk-7CLKBH5Z.js.map → chunk-S772WZD7.js.map} +0 -0
  197. /package/dist/{chunk-73ZNGEWU.js.map → chunk-SBSAOWP5.js.map} +0 -0
  198. /package/dist/{chunk-H7JRQFFI.js.map → chunk-TEARMXTQ.js.map} +0 -0
  199. /package/dist/{chunk-UY55LEIG.js.map → chunk-UN6YBSRS.js.map} +0 -0
  200. /package/dist/{chunk-TEHMLZFI.js.map → chunk-UOQGT574.js.map} +0 -0
  201. /package/dist/{chunk-TLQMK2QF.js.map → chunk-WBRGSWKX.js.map} +0 -0
  202. /package/dist/{chunk-Z34NJZRL.js.map → chunk-WFHQTVY6.js.map} +0 -0
  203. /package/dist/{chunk-X2BHF4KC.js.map → chunk-WTAKMSWN.js.map} +0 -0
  204. /package/dist/{chunk-UGQP733V.js.map → chunk-XGE6G3EK.js.map} +0 -0
  205. /package/dist/{chunk-4ABXALRN.js.map → chunk-XL2DCDFZ.js.map} +0 -0
  206. /package/dist/{chunk-EPEXIGKB.js.map → chunk-XUV6CYTY.js.map} +0 -0
  207. /package/dist/{chunk-H5PUZDNU.js.map → chunk-YQLGGIE4.js.map} +0 -0
  208. /package/dist/{chunk-4X3CJHKR.js.map → chunk-ZGDN6MQA.js.map} +0 -0
  209. /package/dist/{chunk-4NUO6F3J.js.map → chunk-ZMJUIRZ6.js.map} +0 -0
@@ -1,14 +1,7 @@
1
1
  "use client";
2
- import {
3
- TenantsPage
4
- } from "../../chunk-6THPM5LB.js";
5
- import "../../chunk-EWXK56WQ.js";
6
- import "../../chunk-W3D4HG5W.js";
7
- import "../../chunk-WY2JJNZW.js";
8
- import "../../chunk-NPW7D2HZ.js";
9
- import "../../chunk-V6ZHX4LT.js";
10
- import "../../chunk-5SDS2E3F.js";
11
- import "../../chunk-AWSAC7RT.js";
2
+
3
+ // src/pages/iam/tenants.tsx
4
+ import { TenantsPage } from "@mesob/auth-react/components/iam/tenants-page";
12
5
  export {
13
6
  TenantsPage as default
14
7
  };
@@ -1 +1 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
1
+ {"version":3,"sources":["../../../src/pages/iam/tenants.tsx"],"sourcesContent":["'use client';\n\nexport { TenantsPage as default } from '@mesob/auth-react/components/iam/tenants-page';\n"],"mappings":";;;AAEA,SAAwB,mBAAe;","names":[]}
@@ -1,16 +1,5 @@
1
- import {
2
- UserActivityPageContent
3
- } from "../../chunk-NFGFJPCX.js";
4
- import "../../chunk-MQI6Q2S4.js";
5
- import "../../chunk-OW75JENQ.js";
6
- import "../../chunk-W3D4HG5W.js";
7
- import "../../chunk-WY2JJNZW.js";
8
- import "../../chunk-NPW7D2HZ.js";
9
- import "../../chunk-V6ZHX4LT.js";
10
- import "../../chunk-5SDS2E3F.js";
11
- import "../../chunk-AWSAC7RT.js";
12
-
13
1
  // src/pages/iam/user-activity.tsx
2
+ import { UserActivityPageContent } from "@mesob/auth-react";
14
3
  import { jsx } from "react/jsx-runtime";
15
4
  async function UserActivityPage({
16
5
  params
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/pages/iam/user-activity.tsx"],"sourcesContent":["import { UserActivityPageContent } from './users/activity/user-activity-page-content';\n\ntype UserActivityPageProps = {\n params: Promise<{ id: string }>;\n};\n\nexport default async function UserActivityPage({\n params,\n}: UserActivityPageProps) {\n const { id } = await params;\n\n return <UserActivityPageContent userId={id} />;\n}\n"],"mappings":";;;;;;;;;;;;;AAWS;AALT,eAAO,iBAAwC;AAAA,EAC7C;AACF,GAA0B;AACxB,QAAM,EAAE,GAAG,IAAI,MAAM;AAErB,SAAO,oBAAC,2BAAwB,QAAQ,IAAI;AAC9C;","names":[]}
1
+ {"version":3,"sources":["../../../src/pages/iam/user-activity.tsx"],"sourcesContent":["import { UserActivityPageContent } from '@mesob/auth-react';\n\ntype UserActivityPageProps = {\n params: Promise<{ id: string }>;\n};\n\nexport default async function UserActivityPage({\n params,\n}: UserActivityPageProps) {\n const { id } = await params;\n\n return <UserActivityPageContent userId={id} />;\n}\n"],"mappings":";AAAA,SAAS,+BAA+B;AAW/B;AALT,eAAO,iBAAwC;AAAA,EAC7C;AACF,GAA0B;AACxB,QAAM,EAAE,GAAG,IAAI,MAAM;AAErB,SAAO,oBAAC,2BAAwB,QAAQ,IAAI;AAC9C;","names":[]}
@@ -1,11 +1,5 @@
1
- import {
2
- UserDetailLayoutContent
3
- } from "../../chunk-X6EUQZSZ.js";
4
- import "../../chunk-V6ZHX4LT.js";
5
- import "../../chunk-5SDS2E3F.js";
6
- import "../../chunk-AWSAC7RT.js";
7
-
8
1
  // src/pages/iam/user-detail-layout.tsx
2
+ import { UserDetailLayoutContent } from "@mesob/auth-react";
9
3
  import { jsx } from "react/jsx-runtime";
10
4
  async function UserDetailLayoutPage({
11
5
  children,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/pages/iam/user-detail-layout.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { UserDetailLayoutContent } from './users/_components/user-detail-layout-content';\n\ntype UserDetailLayoutPageProps = {\n children: ReactNode;\n params: Promise<{ id: string }>;\n};\n\nexport default async function UserDetailLayoutPage({\n children,\n params,\n}: UserDetailLayoutPageProps) {\n const { id } = await params;\n\n return (\n <UserDetailLayoutContent userId={id}>{children}</UserDetailLayoutContent>\n );\n}\n"],"mappings":";;;;;;;;AAeI;AAPJ,eAAO,qBAA4C;AAAA,EACjD;AAAA,EACA;AACF,GAA8B;AAC5B,QAAM,EAAE,GAAG,IAAI,MAAM;AAErB,SACE,oBAAC,2BAAwB,QAAQ,IAAK,UAAS;AAEnD;","names":[]}
1
+ {"version":3,"sources":["../../../src/pages/iam/user-detail-layout.tsx"],"sourcesContent":["import { UserDetailLayoutContent } from '@mesob/auth-react';\nimport type { ReactNode } from 'react';\n\ntype UserDetailLayoutPageProps = {\n children: ReactNode;\n params: Promise<{ id: string }>;\n};\n\nexport default async function UserDetailLayoutPage({\n children,\n params,\n}: UserDetailLayoutPageProps) {\n const { id } = await params;\n\n return (\n <UserDetailLayoutContent userId={id}>{children}</UserDetailLayoutContent>\n );\n}\n"],"mappings":";AAAA,SAAS,+BAA+B;AAepC;AAPJ,eAAO,qBAA4C;AAAA,EACjD;AAAA,EACA;AACF,GAA8B;AAC5B,QAAM,EAAE,GAAG,IAAI,MAAM;AAErB,SACE,oBAAC,2BAAwB,QAAQ,IAAK,UAAS;AAEnD;","names":[]}
@@ -1,11 +1,5 @@
1
- import {
2
- UserDetailPageContent
3
- } from "../../chunk-NJMNRSJH.js";
4
- import "../../chunk-V6ZHX4LT.js";
5
- import "../../chunk-5SDS2E3F.js";
6
- import "../../chunk-AWSAC7RT.js";
7
-
8
1
  // src/pages/iam/user-detail.tsx
2
+ import { UserDetailPageContent } from "@mesob/auth-react";
9
3
  import { jsx } from "react/jsx-runtime";
10
4
  async function UserDetailPage({ params }) {
11
5
  const { id } = await params;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/pages/iam/user-detail.tsx"],"sourcesContent":["import { UserDetailPageContent } from './users/_components/user-detail-page-content';\n\ntype UserDetailPageProps = {\n params: Promise<{ id: string }>;\n};\n\nexport default async function UserDetailPage({ params }: UserDetailPageProps) {\n const { id } = await params;\n\n return <UserDetailPageContent userId={id} />;\n}\n"],"mappings":";;;;;;;;AASS;AAHT,eAAO,eAAsC,EAAE,OAAO,GAAwB;AAC5E,QAAM,EAAE,GAAG,IAAI,MAAM;AAErB,SAAO,oBAAC,yBAAsB,QAAQ,IAAI;AAC5C;","names":[]}
1
+ {"version":3,"sources":["../../../src/pages/iam/user-detail.tsx"],"sourcesContent":["import { UserDetailPageContent } from '@mesob/auth-react';\n\ntype UserDetailPageProps = {\n params: Promise<{ id: string }>;\n};\n\nexport default async function UserDetailPage({ params }: UserDetailPageProps) {\n const { id } = await params;\n\n return <UserDetailPageContent userId={id} />;\n}\n"],"mappings":";AAAA,SAAS,6BAA6B;AAS7B;AAHT,eAAO,eAAsC,EAAE,OAAO,GAAwB;AAC5E,QAAM,EAAE,GAAG,IAAI,MAAM;AAErB,SAAO,oBAAC,yBAAsB,QAAQ,IAAI;AAC5C;","names":[]}
@@ -1,13 +1,155 @@
1
1
  "use client";
2
2
  import {
3
- UserSelector
4
- } from "../../../chunk-GBDNBY6K.js";
5
- import "../../../chunk-ECF6S2Y2.js";
3
+ UserCard
4
+ } from "../../../chunk-24E7XFGP.js";
6
5
  import "../../../chunk-OW75JENQ.js";
7
- import "../../../chunk-W3D4HG5W.js";
8
- import "../../../chunk-WY2JJNZW.js";
9
- import "../../../chunk-NPW7D2HZ.js";
10
- import "../../../chunk-AWSAC7RT.js";
6
+ import {
7
+ authApi$
8
+ } from "../../../chunk-QJOBPOTR.js";
9
+ import "../../../chunk-QHHVGLHT.js";
10
+ import {
11
+ defaultEntityQueryOptions
12
+ } from "../../../chunk-NPW7D2HZ.js";
13
+ import "../../../chunk-2XIZ27DU.js";
14
+
15
+ // src/pages/iam/users/_components/user-selector.tsx
16
+ import {
17
+ EntitySelector,
18
+ Tooltip,
19
+ TooltipContent,
20
+ TooltipTrigger,
21
+ useEntitySectionState
22
+ } from "@mesob/ui/components";
23
+ import { cn } from "@mesob/ui/lib/utils";
24
+ import { IconCalendar, IconCircleCheck, IconUsers } from "@tabler/icons-react";
25
+ import { jsx, jsxs } from "react/jsx-runtime";
26
+ function SelectableUserCard({
27
+ user,
28
+ selected,
29
+ onToggle
30
+ }) {
31
+ return (
32
+ // biome-ignore lint/a11y/useSemanticElements: div needed to avoid nested buttons from UserCard
33
+ /* @__PURE__ */ jsx(
34
+ "div",
35
+ {
36
+ role: "button",
37
+ tabIndex: 0,
38
+ onClick: onToggle,
39
+ onKeyDown: (e) => {
40
+ if (e.key === "Enter") {
41
+ onToggle();
42
+ }
43
+ },
44
+ className: cn(
45
+ "cursor-pointer rounded-lg transition-shadow focus:outline-none focus-visible:ring-2 focus-visible:ring-ring",
46
+ selected && "ring-primary ring-2"
47
+ ),
48
+ children: /* @__PURE__ */ jsx(UserCard, { user })
49
+ }
50
+ )
51
+ );
52
+ }
53
+ var userColumns = [
54
+ {
55
+ key: "name",
56
+ header: "Name",
57
+ cell: (user) => /* @__PURE__ */ jsx("p", { className: "font-medium", children: user.fullName })
58
+ },
59
+ {
60
+ key: "contact",
61
+ header: "Contact",
62
+ cell: (user) => /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
63
+ user.email && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
64
+ /* @__PURE__ */ jsx("span", { className: "text-sm", children: user.email }),
65
+ user.emailVerified && /* @__PURE__ */ jsxs(Tooltip, { children: [
66
+ /* @__PURE__ */ jsx(TooltipTrigger, { children: /* @__PURE__ */ jsx(IconCircleCheck, { className: "size-4 text-muted-foreground" }) }),
67
+ /* @__PURE__ */ jsx(TooltipContent, { children: "Email verified" })
68
+ ] })
69
+ ] }),
70
+ user.phone && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
71
+ /* @__PURE__ */ jsx("span", { className: "text-sm", children: user.phone }),
72
+ user.phoneVerified && /* @__PURE__ */ jsxs(Tooltip, { children: [
73
+ /* @__PURE__ */ jsx(TooltipTrigger, { children: /* @__PURE__ */ jsx(IconCircleCheck, { className: "size-4 text-muted-foreground" }) }),
74
+ /* @__PURE__ */ jsx(TooltipContent, { children: "Phone verified" })
75
+ ] })
76
+ ] }),
77
+ !(user.email || user.phone) && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "\u2014" })
78
+ ] })
79
+ },
80
+ {
81
+ key: "lastSignIn",
82
+ header: "Last sign in",
83
+ cell: (user) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 text-muted-foreground", children: [
84
+ /* @__PURE__ */ jsx(IconCalendar, { className: "h-4 w-4" }),
85
+ user.lastSignInAt ? new Date(user.lastSignInAt).toLocaleDateString() : "Never"
86
+ ] })
87
+ }
88
+ ];
89
+ var EMPTY_EXCLUDE_IDS = [];
90
+ function UserSelector({
91
+ trigger,
92
+ multiple = false,
93
+ onSelect,
94
+ excludeIds = EMPTY_EXCLUDE_IDS,
95
+ modalSize = "xl",
96
+ contentClassName
97
+ }) {
98
+ const state = useEntitySectionState({
99
+ defaultSort: "createdAt",
100
+ defaultOrder: "desc",
101
+ defaultPageSize: 10,
102
+ searchParamName: "handle"
103
+ });
104
+ const usersQuery = state.queryConfig;
105
+ const { data, isPending, isFetching } = authApi$.useQuery(
106
+ "get",
107
+ "/users",
108
+ usersQuery,
109
+ defaultEntityQueryOptions
110
+ );
111
+ const users = (data?.users ?? []).filter((user) => {
112
+ return !excludeIds.includes(user.id);
113
+ });
114
+ const config = {
115
+ title: "Select user(s)",
116
+ modalSize,
117
+ contentClassName,
118
+ multiple,
119
+ entityName: "user",
120
+ entityIcon: IconUsers,
121
+ columns: userColumns,
122
+ columnCount: 4,
123
+ getItemLabel: (user) => user.fullName,
124
+ searchPlaceholder: "Search users...",
125
+ filterOptions: [
126
+ { label: "All", value: "" },
127
+ { label: "Email Verified", value: "emailVerified" },
128
+ { label: "Phone Verified", value: "phoneVerified" },
129
+ { label: "Not Verified", value: "notVerified" }
130
+ ],
131
+ sortOptions: [
132
+ { label: "Created", value: "createdAt" },
133
+ { label: "Updated", value: "updatedAt" },
134
+ { label: "Name", value: "fullName" },
135
+ { label: "Last Sign In", value: "lastSignInAt" }
136
+ ],
137
+ showViewToggle: false,
138
+ renderCard: (user, selected, onToggle) => /* @__PURE__ */ jsx(SelectableUserCard, { user, selected, onToggle })
139
+ };
140
+ return /* @__PURE__ */ jsx(
141
+ EntitySelector,
142
+ {
143
+ trigger,
144
+ config,
145
+ onSelect,
146
+ items: users,
147
+ total: data?.total,
148
+ isLoading: isPending || isFetching,
149
+ state
150
+ }
151
+ );
152
+ }
11
153
  export {
12
154
  UserSelector
13
155
  };
@@ -1 +1 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
1
+ {"version":3,"sources":["../../../../src/pages/iam/users/_components/user-selector.tsx"],"sourcesContent":["'use client';\n\nimport {\n EntitySelector,\n type EntitySelectorColumn,\n type EntitySelectorConfig,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n useEntitySectionState,\n} from '@mesob/ui/components';\nimport { cn } from '@mesob/ui/lib/utils';\nimport { IconCalendar, IconCircleCheck, IconUsers } from '@tabler/icons-react';\nimport type { ReactNode } from 'react';\nimport type { paths } from '../../../../data/openapi';\nimport { authApi$, defaultEntityQueryOptions } from '../../shared/page-helpers';\nimport { UserCard } from './user-card';\nimport type { User } from './users-data';\n\nfunction SelectableUserCard({\n user,\n selected,\n onToggle,\n}: {\n user: User;\n selected: boolean;\n onToggle: () => void;\n}) {\n return (\n // biome-ignore lint/a11y/useSemanticElements: div needed to avoid nested buttons from UserCard\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onToggle}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n onToggle();\n }\n }}\n className={cn(\n 'cursor-pointer rounded-lg transition-shadow focus:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n selected && 'ring-primary ring-2',\n )}\n >\n <UserCard user={user} />\n </div>\n );\n}\n\nconst userColumns: EntitySelectorColumn<User>[] = [\n {\n key: 'name',\n header: 'Name',\n cell: (user: User) => <p className=\"font-medium\">{user.fullName}</p>,\n },\n {\n key: 'contact',\n header: 'Contact',\n cell: (user: User) => (\n <div className=\"space-y-1\">\n {user.email && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">{user.email}</span>\n {user.emailVerified && (\n <Tooltip>\n <TooltipTrigger>\n <IconCircleCheck className=\"size-4 text-muted-foreground\" />\n </TooltipTrigger>\n <TooltipContent>Email verified</TooltipContent>\n </Tooltip>\n )}\n </div>\n )}\n {user.phone && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">{user.phone}</span>\n {user.phoneVerified && (\n <Tooltip>\n <TooltipTrigger>\n <IconCircleCheck className=\"size-4 text-muted-foreground\" />\n </TooltipTrigger>\n <TooltipContent>Phone verified</TooltipContent>\n </Tooltip>\n )}\n </div>\n )}\n {!(user.email || user.phone) && (\n <span className=\"text-muted-foreground\">—</span>\n )}\n </div>\n ),\n },\n {\n key: 'lastSignIn',\n header: 'Last sign in',\n cell: (user: User) => (\n <div className=\"flex items-center gap-1 text-muted-foreground\">\n <IconCalendar className=\"h-4 w-4\" />\n {user.lastSignInAt\n ? new Date(user.lastSignInAt).toLocaleDateString()\n : 'Never'}\n </div>\n ),\n },\n];\n\nconst EMPTY_EXCLUDE_IDS: string[] = [];\n\ntype UserSelectorProps = {\n trigger: ReactNode;\n multiple?: boolean;\n onSelect: (users: User[]) => void;\n excludeIds?: string[];\n modalSize?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n contentClassName?: string;\n};\n\nexport function UserSelector({\n trigger,\n multiple = false,\n onSelect,\n excludeIds = EMPTY_EXCLUDE_IDS,\n modalSize = 'xl',\n contentClassName,\n}: UserSelectorProps) {\n const state = useEntitySectionState({\n defaultSort: 'createdAt',\n defaultOrder: 'desc',\n defaultPageSize: 10,\n searchParamName: 'handle',\n });\n const usersQuery = state.queryConfig as {\n params: {\n query: NonNullable<paths['/users']['get']['parameters']['query']>;\n };\n };\n\n const { data, isPending, isFetching } = authApi$.useQuery(\n 'get',\n '/users',\n usersQuery,\n defaultEntityQueryOptions,\n );\n\n const users = (data?.users ?? []).filter((user: User) => {\n return !excludeIds.includes(user.id);\n });\n\n const config: EntitySelectorConfig<User> = {\n title: 'Select user(s)',\n modalSize,\n contentClassName,\n multiple,\n entityName: 'user',\n entityIcon: IconUsers,\n columns: userColumns,\n columnCount: 4,\n getItemLabel: (user: User) => user.fullName,\n searchPlaceholder: 'Search users...',\n filterOptions: [\n { label: 'All', value: '' },\n { label: 'Email Verified', value: 'emailVerified' },\n { label: 'Phone Verified', value: 'phoneVerified' },\n { label: 'Not Verified', value: 'notVerified' },\n ],\n sortOptions: [\n { label: 'Created', value: 'createdAt' },\n { label: 'Updated', value: 'updatedAt' },\n { label: 'Name', value: 'fullName' },\n { label: 'Last Sign In', value: 'lastSignInAt' },\n ],\n showViewToggle: false,\n renderCard: (user: User, selected: boolean, onToggle: () => void) => (\n <SelectableUserCard user={user} selected={selected} onToggle={onToggle} />\n ),\n };\n\n return (\n <EntitySelector<User>\n trigger={trigger}\n config={config}\n onSelect={onSelect}\n items={users}\n total={data?.total}\n isLoading={isPending || isFetching}\n state={state}\n />\n );\n}\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- export { UsersPage as default } from '../../components/iam/users-page';
1
+ export { UsersPage as default } from '@mesob/auth-react/components/iam/users-page';
@@ -1,15 +1,7 @@
1
1
  "use client";
2
- import {
3
- UsersPage
4
- } from "../../chunk-N4JFMKGK.js";
5
- import "../../chunk-ECF6S2Y2.js";
6
- import "../../chunk-OW75JENQ.js";
7
- import "../../chunk-W3D4HG5W.js";
8
- import "../../chunk-WY2JJNZW.js";
9
- import "../../chunk-NPW7D2HZ.js";
10
- import "../../chunk-V6ZHX4LT.js";
11
- import "../../chunk-5SDS2E3F.js";
12
- import "../../chunk-AWSAC7RT.js";
2
+
3
+ // src/pages/iam/users.tsx
4
+ import { UsersPage } from "@mesob/auth-react/components/iam/users-page";
13
5
  export {
14
6
  UsersPage as default
15
7
  };
@@ -1 +1 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
1
+ {"version":3,"sources":["../../../src/pages/iam/users.tsx"],"sourcesContent":["'use client';\n\nexport { UsersPage as default } from '@mesob/auth-react/components/iam/users-page';\n"],"mappings":";;;AAEA,SAAsB,iBAAe;","names":[]}
@@ -1,13 +1,10 @@
1
1
  "use client";
2
- import {
3
- Account
4
- } from "../../chunk-4ABXALRN.js";
5
- import "../../chunk-C5ZW7FD2.js";
6
2
  import {
7
3
  useConfig
8
- } from "../../chunk-AWSAC7RT.js";
4
+ } from "../../chunk-2XIZ27DU.js";
9
5
 
10
6
  // src/pages/profile/account.tsx
7
+ import { Account } from "@mesob/auth-react/components/profile/account";
11
8
  import {
12
9
  PageBody,
13
10
  PageContainer,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/pages/profile/account.tsx"],"sourcesContent":["'use client';\n\nimport {\n PageBody,\n PageContainer,\n PageTitle,\n useBreadcrumbs,\n} from '@mesob/ui/components';\nimport { IconUser } from '@tabler/icons-react';\nimport { Account } from '../../components/profile/account';\nimport { useConfig } from '../../provider';\n\nexport default function ProfileAccountPage() {\n const { config } = useConfig();\n const homeHref = config.navigation?.defaultRedirectUrl || '/';\n\n useBreadcrumbs({\n items: [\n { label: 'Home', href: homeHref },\n { label: 'Profile', href: '/profile/account' },\n { label: 'Account' },\n ],\n });\n\n return (\n <PageContainer className=\"flex flex-1 flex-col overflow-auto p-4 pt-0 lg:p-6 lg:pt-0\">\n <PageTitle icon={<IconUser className=\"size-5\" />}>Account</PageTitle>\n <PageBody className=\"px-0 pb-6\">\n <Account />\n </PageBody>\n </PageContainer>\n );\n}\n"],"mappings":";;;;;;;;;;AAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,gBAAgB;AAiBrB,SACmB,KADnB;AAbW,SAAR,qBAAsC;AAC3C,QAAM,EAAE,OAAO,IAAI,UAAU;AAC7B,QAAM,WAAW,OAAO,YAAY,sBAAsB;AAE1D,iBAAe;AAAA,IACb,OAAO;AAAA,MACL,EAAE,OAAO,QAAQ,MAAM,SAAS;AAAA,MAChC,EAAE,OAAO,WAAW,MAAM,mBAAmB;AAAA,MAC7C,EAAE,OAAO,UAAU;AAAA,IACrB;AAAA,EACF,CAAC;AAED,SACE,qBAAC,iBAAc,WAAU,8DACvB;AAAA,wBAAC,aAAU,MAAM,oBAAC,YAAS,WAAU,UAAS,GAAI,qBAAO;AAAA,IACzD,oBAAC,YAAS,WAAU,aAClB,8BAAC,WAAQ,GACX;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/pages/profile/account.tsx"],"sourcesContent":["'use client';\n\nimport { Account } from '@mesob/auth-react/components/profile/account';\nimport {\n PageBody,\n PageContainer,\n PageTitle,\n useBreadcrumbs,\n} from '@mesob/ui/components';\nimport { IconUser } from '@tabler/icons-react';\nimport { useConfig } from '../../provider';\n\nexport default function ProfileAccountPage() {\n const { config } = useConfig();\n const homeHref = config.navigation?.defaultRedirectUrl || '/';\n\n useBreadcrumbs({\n items: [\n { label: 'Home', href: homeHref },\n { label: 'Profile', href: '/profile/account' },\n { label: 'Account' },\n ],\n });\n\n return (\n <PageContainer className=\"flex flex-1 flex-col overflow-auto p-4 pt-0 lg:p-6 lg:pt-0\">\n <PageTitle icon={<IconUser className=\"size-5\" />}>Account</PageTitle>\n <PageBody className=\"px-0 pb-6\">\n <Account />\n </PageBody>\n </PageContainer>\n );\n}\n"],"mappings":";;;;;;AAEA,SAAS,eAAe;AACxB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,gBAAgB;AAgBrB,SACmB,KADnB;AAbW,SAAR,qBAAsC;AAC3C,QAAM,EAAE,OAAO,IAAI,UAAU;AAC7B,QAAM,WAAW,OAAO,YAAY,sBAAsB;AAE1D,iBAAe;AAAA,IACb,OAAO;AAAA,MACL,EAAE,OAAO,QAAQ,MAAM,SAAS;AAAA,MAChC,EAAE,OAAO,WAAW,MAAM,mBAAmB;AAAA,MAC7C,EAAE,OAAO,UAAU;AAAA,IACrB;AAAA,EACF,CAAC;AAED,SACE,qBAAC,iBAAc,WAAU,8DACvB;AAAA,wBAAC,aAAU,MAAM,oBAAC,YAAS,WAAU,UAAS,GAAI,qBAAO;AAAA,IACzD,oBAAC,YAAS,WAAU,aAClB,8BAAC,WAAQ,GACX;AAAA,KACF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- export { ProfileLayout as default } from '../../components/profile/profile-layout';
1
+ export { ProfileLayout as default } from '@mesob/auth-react/components/profile/profile-layout';
@@ -1,9 +1,7 @@
1
1
  "use client";
2
- import {
3
- ProfileLayout
4
- } from "../../chunk-SGDXNT7M.js";
5
- import "../../chunk-WY2JJNZW.js";
6
- import "../../chunk-AWSAC7RT.js";
2
+
3
+ // src/pages/profile/layout.tsx
4
+ import { ProfileLayout } from "@mesob/auth-react/components/profile/profile-layout";
7
5
  export {
8
6
  ProfileLayout as default
9
7
  };
@@ -1 +1 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
1
+ {"version":3,"sources":["../../../src/pages/profile/layout.tsx"],"sourcesContent":["'use client';\n\nexport { ProfileLayout as default } from '@mesob/auth-react/components/profile/profile-layout';\n"],"mappings":";;;AAEA,SAA0B,qBAAe;","names":[]}
@@ -1,24 +1,10 @@
1
1
  "use client";
2
- import {
3
- Security
4
- } from "../../chunk-73ZNGEWU.js";
5
- import "../../chunk-5BFG47VF.js";
6
- import "../../chunk-5AEV7RAN.js";
7
- import "../../chunk-ZZ6D4KE4.js";
8
- import "../../chunk-TLQMK2QF.js";
9
- import "../../chunk-6IEX2RLA.js";
10
- import "../../chunk-UGQP733V.js";
11
- import "../../chunk-X2BHF4KC.js";
12
- import "../../chunk-DG6GRTPG.js";
13
- import "../../chunk-Z34NJZRL.js";
14
- import "../../chunk-RMJNENJB.js";
15
- import "../../chunk-V2W3WPCZ.js";
16
- import "../../chunk-EPEXIGKB.js";
17
2
  import {
18
3
  useConfig
19
- } from "../../chunk-AWSAC7RT.js";
4
+ } from "../../chunk-2XIZ27DU.js";
20
5
 
21
6
  // src/pages/profile/security.tsx
7
+ import { Security } from "@mesob/auth-react/components/profile/security";
22
8
  import {
23
9
  PageBody,
24
10
  PageContainer,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/pages/profile/security.tsx"],"sourcesContent":["'use client';\n\nimport {\n PageBody,\n PageContainer,\n PageTitle,\n useBreadcrumbs,\n} from '@mesob/ui/components';\nimport { IconShieldLock } from '@tabler/icons-react';\nimport { Security } from '../../components/profile/security';\nimport { useConfig } from '../../provider';\n\nexport default function ProfileSecurityPage() {\n const { config } = useConfig();\n const homeHref = config.navigation?.defaultRedirectUrl || '/';\n\n useBreadcrumbs({\n items: [\n { label: 'Home', href: homeHref },\n { label: 'Profile', href: '/profile/security' },\n { label: 'Security' },\n ],\n });\n\n return (\n <PageContainer className=\"flex flex-1 flex-col overflow-auto p-4 pt-0 lg:p-6 lg:pt-0\">\n <PageTitle icon={<IconShieldLock className=\"size-5\" />}>\n Security\n </PageTitle>\n <PageBody className=\"px-0 pb-6\">\n <Security />\n </PageBody>\n </PageContainer>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,sBAAsB;AAiB3B,SACmB,KADnB;AAbW,SAAR,sBAAuC;AAC5C,QAAM,EAAE,OAAO,IAAI,UAAU;AAC7B,QAAM,WAAW,OAAO,YAAY,sBAAsB;AAE1D,iBAAe;AAAA,IACb,OAAO;AAAA,MACL,EAAE,OAAO,QAAQ,MAAM,SAAS;AAAA,MAChC,EAAE,OAAO,WAAW,MAAM,oBAAoB;AAAA,MAC9C,EAAE,OAAO,WAAW;AAAA,IACtB;AAAA,EACF,CAAC;AAED,SACE,qBAAC,iBAAc,WAAU,8DACvB;AAAA,wBAAC,aAAU,MAAM,oBAAC,kBAAe,WAAU,UAAS,GAAI,sBAExD;AAAA,IACA,oBAAC,YAAS,WAAU,aAClB,8BAAC,YAAS,GACZ;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/pages/profile/security.tsx"],"sourcesContent":["'use client';\n\nimport { Security } from '@mesob/auth-react/components/profile/security';\nimport {\n PageBody,\n PageContainer,\n PageTitle,\n useBreadcrumbs,\n} from '@mesob/ui/components';\nimport { IconShieldLock } from '@tabler/icons-react';\nimport { useConfig } from '../../provider';\n\nexport default function ProfileSecurityPage() {\n const { config } = useConfig();\n const homeHref = config.navigation?.defaultRedirectUrl || '/';\n\n useBreadcrumbs({\n items: [\n { label: 'Home', href: homeHref },\n { label: 'Profile', href: '/profile/security' },\n { label: 'Security' },\n ],\n });\n\n return (\n <PageContainer className=\"flex flex-1 flex-col overflow-auto p-4 pt-0 lg:p-6 lg:pt-0\">\n <PageTitle icon={<IconShieldLock className=\"size-5\" />}>\n Security\n </PageTitle>\n <PageBody className=\"px-0 pb-6\">\n <Security />\n </PageBody>\n </PageContainer>\n );\n}\n"],"mappings":";;;;;;AAEA,SAAS,gBAAgB;AACzB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,sBAAsB;AAgB3B,SACmB,KADnB;AAbW,SAAR,sBAAuC;AAC5C,QAAM,EAAE,OAAO,IAAI,UAAU;AAC7B,QAAM,WAAW,OAAO,YAAY,sBAAsB;AAE1D,iBAAe;AAAA,IACb,OAAO;AAAA,MACL,EAAE,OAAO,QAAQ,MAAM,SAAS;AAAA,MAChC,EAAE,OAAO,WAAW,MAAM,oBAAoB;AAAA,MAC9C,EAAE,OAAO,WAAW;AAAA,IACtB;AAAA,EACF,CAAC;AAED,SACE,qBAAC,iBAAc,WAAU,8DACvB;AAAA,wBAAC,aAAU,MAAM,oBAAC,kBAAe,WAAU,UAAS,GAAI,sBAExD;AAAA,IACA,oBAAC,YAAS,WAAU,aAClB,8BAAC,YAAS,GACZ;AAAA,KACF;AAEJ;","names":[]}
package/dist/types.d.ts CHANGED
@@ -9,6 +9,9 @@ export type FeaturesConfig = {
9
9
  enablePasswordReset?: boolean;
10
10
  enableEmailSignup?: boolean;
11
11
  enablePhoneSignup?: boolean;
12
+ enableEmailSignIn?: boolean;
13
+ enablePhoneSignIn?: boolean;
14
+ allowedSignupEmailDomains?: string[];
12
15
  enableSocialSignup?: boolean;
13
16
  socialProviders?: string[];
14
17
  };
@@ -49,6 +52,9 @@ type DefaultAuthClientConfig = {
49
52
  readonly enablePasswordReset: true;
50
53
  readonly enableEmailSignup: true;
51
54
  readonly enablePhoneSignup: true;
55
+ readonly enableEmailSignIn: true;
56
+ readonly enablePhoneSignIn: true;
57
+ readonly allowedSignupEmailDomains: [];
52
58
  readonly enableSocialSignup: false;
53
59
  readonly socialProviders: [];
54
60
  };
@@ -0,0 +1,2 @@
1
+ /** Same-origin path only; blocks //evil open redirects */
2
+ export declare function getSafeRedirectFromSearch(search: string): string | null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mesob/auth-react",
3
- "version": "0.4.7",
3
+ "version": "0.5.2",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -132,8 +132,8 @@
132
132
  ],
133
133
  "dependencies": {
134
134
  "@hookform/resolvers": "^5.2.2",
135
- "@mesob/common": "^0.4.7",
136
- "@mesob/ui": "^0.4.7",
135
+ "@mesob/common": "^0.5.2",
136
+ "@mesob/ui": "^0.5.2",
137
137
  "@tabler/icons-react": "^3.35.0",
138
138
  "deepmerge-ts": "^7.1.5",
139
139
  "nuqs": "^2.8.1",
@@ -141,7 +141,7 @@
141
141
  "openapi-react-query": "^0.5.1",
142
142
  "react-hook-form": "^7.66.1",
143
143
  "sonner": "^2.0.7",
144
- "zod": "^4.1.12"
144
+ "zod": "^4.3.6"
145
145
  },
146
146
  "devDependencies": {
147
147
  "@types/react": "^19",
@@ -1,153 +0,0 @@
1
- import {
2
- UserCard
3
- } from "./chunk-ECF6S2Y2.js";
4
- import {
5
- authApi$
6
- } from "./chunk-W3D4HG5W.js";
7
- import {
8
- defaultEntityQueryOptions
9
- } from "./chunk-NPW7D2HZ.js";
10
-
11
- // src/pages/iam/users/_components/user-selector.tsx
12
- import {
13
- EntitySelector,
14
- Tooltip,
15
- TooltipContent,
16
- TooltipTrigger,
17
- useEntitySectionState
18
- } from "@mesob/ui/components";
19
- import { cn } from "@mesob/ui/lib/utils";
20
- import { IconCalendar, IconCircleCheck, IconUsers } from "@tabler/icons-react";
21
- import { jsx, jsxs } from "react/jsx-runtime";
22
- function SelectableUserCard({
23
- user,
24
- selected,
25
- onToggle
26
- }) {
27
- return (
28
- // biome-ignore lint/a11y/useSemanticElements: div needed to avoid nested buttons from UserCard
29
- /* @__PURE__ */ jsx(
30
- "div",
31
- {
32
- role: "button",
33
- tabIndex: 0,
34
- onClick: onToggle,
35
- onKeyDown: (e) => {
36
- if (e.key === "Enter") {
37
- onToggle();
38
- }
39
- },
40
- className: cn(
41
- "cursor-pointer rounded-lg transition-shadow focus:outline-none focus-visible:ring-2 focus-visible:ring-ring",
42
- selected && "ring-primary ring-2"
43
- ),
44
- children: /* @__PURE__ */ jsx(UserCard, { user })
45
- }
46
- )
47
- );
48
- }
49
- var userColumns = [
50
- {
51
- key: "name",
52
- header: "Name",
53
- cell: (user) => /* @__PURE__ */ jsx("p", { className: "font-medium", children: user.fullName })
54
- },
55
- {
56
- key: "contact",
57
- header: "Contact",
58
- cell: (user) => /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
59
- user.email && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
60
- /* @__PURE__ */ jsx("span", { className: "text-sm", children: user.email }),
61
- user.emailVerified && /* @__PURE__ */ jsxs(Tooltip, { children: [
62
- /* @__PURE__ */ jsx(TooltipTrigger, { children: /* @__PURE__ */ jsx(IconCircleCheck, { className: "size-4 text-muted-foreground" }) }),
63
- /* @__PURE__ */ jsx(TooltipContent, { children: "Email verified" })
64
- ] })
65
- ] }),
66
- user.phone && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
67
- /* @__PURE__ */ jsx("span", { className: "text-sm", children: user.phone }),
68
- user.phoneVerified && /* @__PURE__ */ jsxs(Tooltip, { children: [
69
- /* @__PURE__ */ jsx(TooltipTrigger, { children: /* @__PURE__ */ jsx(IconCircleCheck, { className: "size-4 text-muted-foreground" }) }),
70
- /* @__PURE__ */ jsx(TooltipContent, { children: "Phone verified" })
71
- ] })
72
- ] }),
73
- !(user.email || user.phone) && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "\u2014" })
74
- ] })
75
- },
76
- {
77
- key: "lastSignIn",
78
- header: "Last sign in",
79
- cell: (user) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 text-muted-foreground", children: [
80
- /* @__PURE__ */ jsx(IconCalendar, { className: "h-4 w-4" }),
81
- user.lastSignInAt ? new Date(user.lastSignInAt).toLocaleDateString() : "Never"
82
- ] })
83
- }
84
- ];
85
- var EMPTY_EXCLUDE_IDS = [];
86
- function UserSelector({
87
- trigger,
88
- multiple = false,
89
- onSelect,
90
- excludeIds = EMPTY_EXCLUDE_IDS,
91
- modalSize = "xl",
92
- contentClassName
93
- }) {
94
- const state = useEntitySectionState({
95
- defaultSort: "createdAt",
96
- defaultOrder: "desc",
97
- defaultPageSize: 10,
98
- searchParamName: "handle"
99
- });
100
- const usersQuery = state.queryConfig;
101
- const { data, isPending, isFetching } = authApi$.useQuery(
102
- "get",
103
- "/users",
104
- usersQuery,
105
- defaultEntityQueryOptions
106
- );
107
- const users = (data?.users ?? []).filter((user) => {
108
- return !excludeIds.includes(user.id);
109
- });
110
- const config = {
111
- title: "Select user(s)",
112
- modalSize,
113
- contentClassName,
114
- multiple,
115
- entityName: "user",
116
- entityIcon: IconUsers,
117
- columns: userColumns,
118
- columnCount: 4,
119
- getItemLabel: (user) => user.fullName,
120
- searchPlaceholder: "Search users...",
121
- filterOptions: [
122
- { label: "All", value: "" },
123
- { label: "Email Verified", value: "emailVerified" },
124
- { label: "Phone Verified", value: "phoneVerified" },
125
- { label: "Not Verified", value: "notVerified" }
126
- ],
127
- sortOptions: [
128
- { label: "Created", value: "createdAt" },
129
- { label: "Updated", value: "updatedAt" },
130
- { label: "Name", value: "fullName" },
131
- { label: "Last Sign In", value: "lastSignInAt" }
132
- ],
133
- showViewToggle: false,
134
- renderCard: (user, selected, onToggle) => /* @__PURE__ */ jsx(SelectableUserCard, { user, selected, onToggle })
135
- };
136
- return /* @__PURE__ */ jsx(
137
- EntitySelector,
138
- {
139
- trigger,
140
- config,
141
- onSelect,
142
- items: users,
143
- total: data?.total,
144
- isLoading: isPending || isFetching,
145
- state
146
- }
147
- );
148
- }
149
-
150
- export {
151
- UserSelector
152
- };
153
- //# sourceMappingURL=chunk-GBDNBY6K.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/pages/iam/users/_components/user-selector.tsx"],"sourcesContent":["'use client';\n\nimport {\n EntitySelector,\n type EntitySelectorColumn,\n type EntitySelectorConfig,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n useEntitySectionState,\n} from '@mesob/ui/components';\nimport { cn } from '@mesob/ui/lib/utils';\nimport { IconCalendar, IconCircleCheck, IconUsers } from '@tabler/icons-react';\nimport type { ReactNode } from 'react';\nimport type { paths } from '../../../../data/openapi';\nimport { authApi$, defaultEntityQueryOptions } from '../../shared/page-helpers';\nimport { UserCard } from './user-card';\nimport type { User } from './users-data';\n\nfunction SelectableUserCard({\n user,\n selected,\n onToggle,\n}: {\n user: User;\n selected: boolean;\n onToggle: () => void;\n}) {\n return (\n // biome-ignore lint/a11y/useSemanticElements: div needed to avoid nested buttons from UserCard\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onToggle}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n onToggle();\n }\n }}\n className={cn(\n 'cursor-pointer rounded-lg transition-shadow focus:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n selected && 'ring-primary ring-2',\n )}\n >\n <UserCard user={user} />\n </div>\n );\n}\n\nconst userColumns: EntitySelectorColumn<User>[] = [\n {\n key: 'name',\n header: 'Name',\n cell: (user: User) => <p className=\"font-medium\">{user.fullName}</p>,\n },\n {\n key: 'contact',\n header: 'Contact',\n cell: (user: User) => (\n <div className=\"space-y-1\">\n {user.email && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">{user.email}</span>\n {user.emailVerified && (\n <Tooltip>\n <TooltipTrigger>\n <IconCircleCheck className=\"size-4 text-muted-foreground\" />\n </TooltipTrigger>\n <TooltipContent>Email verified</TooltipContent>\n </Tooltip>\n )}\n </div>\n )}\n {user.phone && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">{user.phone}</span>\n {user.phoneVerified && (\n <Tooltip>\n <TooltipTrigger>\n <IconCircleCheck className=\"size-4 text-muted-foreground\" />\n </TooltipTrigger>\n <TooltipContent>Phone verified</TooltipContent>\n </Tooltip>\n )}\n </div>\n )}\n {!(user.email || user.phone) && (\n <span className=\"text-muted-foreground\">—</span>\n )}\n </div>\n ),\n },\n {\n key: 'lastSignIn',\n header: 'Last sign in',\n cell: (user: User) => (\n <div className=\"flex items-center gap-1 text-muted-foreground\">\n <IconCalendar className=\"h-4 w-4\" />\n {user.lastSignInAt\n ? new Date(user.lastSignInAt).toLocaleDateString()\n : 'Never'}\n </div>\n ),\n },\n];\n\nconst EMPTY_EXCLUDE_IDS: string[] = [];\n\ntype UserSelectorProps = {\n trigger: ReactNode;\n multiple?: boolean;\n onSelect: (users: User[]) => void;\n excludeIds?: string[];\n modalSize?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n contentClassName?: string;\n};\n\nexport function UserSelector({\n trigger,\n multiple = false,\n onSelect,\n excludeIds = EMPTY_EXCLUDE_IDS,\n modalSize = 'xl',\n contentClassName,\n}: UserSelectorProps) {\n const state = useEntitySectionState({\n defaultSort: 'createdAt',\n defaultOrder: 'desc',\n defaultPageSize: 10,\n searchParamName: 'handle',\n });\n const usersQuery = state.queryConfig as {\n params: {\n query: NonNullable<paths['/users']['get']['parameters']['query']>;\n };\n };\n\n const { data, isPending, isFetching } = authApi$.useQuery(\n 'get',\n '/users',\n usersQuery,\n defaultEntityQueryOptions,\n );\n\n const users = (data?.users ?? []).filter((user: User) => {\n return !excludeIds.includes(user.id);\n });\n\n const config: EntitySelectorConfig<User> = {\n title: 'Select user(s)',\n modalSize,\n contentClassName,\n multiple,\n entityName: 'user',\n entityIcon: IconUsers,\n columns: userColumns,\n columnCount: 4,\n getItemLabel: (user: User) => user.fullName,\n searchPlaceholder: 'Search users...',\n filterOptions: [\n { label: 'All', value: '' },\n { label: 'Email Verified', value: 'emailVerified' },\n { label: 'Phone Verified', value: 'phoneVerified' },\n { label: 'Not Verified', value: 'notVerified' },\n ],\n sortOptions: [\n { label: 'Created', value: 'createdAt' },\n { label: 'Updated', value: 'updatedAt' },\n { label: 'Name', value: 'fullName' },\n { label: 'Last Sign In', value: 'lastSignInAt' },\n ],\n showViewToggle: false,\n renderCard: (user: User, selected: boolean, onToggle: () => void) => (\n <SelectableUserCard user={user} selected={selected} onToggle={onToggle} />\n ),\n };\n\n return (\n <EntitySelector<User>\n trigger={trigger}\n config={config}\n onSelect={onSelect}\n items={users}\n total={data?.total}\n isLoading={isPending || isFetching}\n state={state}\n />\n );\n}\n"],"mappings":"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","names":[]}