@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
@@ -1,9 +1,9 @@
1
1
  import {
2
- createTranslator,
3
- useConfig
4
- } from "./chunk-M2K6O5CN.js";
2
+ createTranslator
3
+ } from "./chunk-SEBNQYIE.js";
5
4
 
6
5
  // src/hooks/use-translator.ts
6
+ import { useConfig } from "@mesob/auth-react";
7
7
  import { useMesob } from "@mesob/ui/providers";
8
8
  function useTranslator(namespace) {
9
9
  const mesob = useMesob();
@@ -20,4 +20,4 @@ function useTranslator(namespace) {
20
20
  export {
21
21
  useTranslator
22
22
  };
23
- //# sourceMappingURL=chunk-NPA7L57G.js.map
23
+ //# sourceMappingURL=chunk-WG5H5PTL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/use-translator.ts"],"sourcesContent":["import { useConfig } from '@mesob/auth-react';\nimport { useMesob } from '@mesob/ui/providers';\nimport { createTranslator } from '../lib/translations';\n\nexport function useTranslator(namespace?: string) {\n const mesob = useMesob();\n const { config } = useConfig();\n\n if (mesob?.t) {\n return (key: string, params?: Record<string, string | number>): string => {\n const fullKey = namespace ? `${namespace}.${key}` : key;\n return mesob.t?.(fullKey, params) ?? fullKey;\n };\n }\n\n return createTranslator(config.messages || {}, namespace);\n}\n"],"mappings":";;;;;AAAA,SAAS,iBAAiB;AAC1B,SAAS,gBAAgB;AAGlB,SAAS,cAAc,WAAoB;AAChD,QAAM,QAAQ,SAAS;AACvB,QAAM,EAAE,OAAO,IAAI,UAAU;AAE7B,MAAI,OAAO,GAAG;AACZ,WAAO,CAAC,KAAa,WAAqD;AACxE,YAAM,UAAU,YAAY,GAAG,SAAS,IAAI,GAAG,KAAK;AACpD,aAAO,MAAM,IAAI,SAAS,MAAM,KAAK;AAAA,IACvC;AAAA,EACF;AAEA,SAAO,iBAAiB,OAAO,YAAY,CAAC,GAAG,SAAS;AAC1D;","names":[]}
@@ -1,15 +1,16 @@
1
1
  import {
2
- useApi,
3
- useConfig
4
- } from "./chunk-M2K6O5CN.js";
2
+ createNavigate
3
+ } from "./chunk-6YHUCPJ4.js";
5
4
 
6
5
  // src/components/iam/role-detail-layout.tsx
6
+ import { useApi, useConfig } from "@mesob/auth-react";
7
7
  import {
8
8
  EntityDetailHeader,
9
9
  EntityEmptyState,
10
10
  PageContainer,
11
11
  useBreadcrumbs
12
12
  } from "@mesob/ui/components";
13
+ import { useMesob } from "@mesob/ui/providers";
13
14
  import { IconShield } from "@tabler/icons-react";
14
15
  import { useMemo } from "react";
15
16
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -33,6 +34,11 @@ function RoleDetailLayout({
33
34
  }) {
34
35
  const { hooks } = useApi();
35
36
  const { config } = useConfig();
37
+ const mesob = useMesob();
38
+ const navigate = createNavigate({
39
+ onNavigate: config.navigation?.onNavigate,
40
+ mesobNavigate: mesob?.navigate
41
+ });
36
42
  const homeHref = config.navigation?.defaultRedirectUrl || "/";
37
43
  const { data, isLoading, isFetching, isError } = hooks.useQuery(
38
44
  "get",
@@ -79,7 +85,7 @@ function RoleDetailLayout({
79
85
  title: isError ? "Role unavailable" : "Role not found",
80
86
  description: isError ? "Failed to load this role." : "This role no longer exists.",
81
87
  actionLabel: "Back to roles",
82
- onAction: () => config.navigation?.onNavigate?.(basePath) ?? window.history.back()
88
+ onAction: () => navigate(basePath)
83
89
  }
84
90
  ) });
85
91
  }
@@ -90,6 +96,7 @@ function RoleDetailLayout({
90
96
  title,
91
97
  icon: /* @__PURE__ */ jsx(IconShield, { className: "h-5 w-5" }),
92
98
  loading,
99
+ backHref: basePath,
93
100
  tabs
94
101
  }
95
102
  ),
@@ -100,4 +107,4 @@ function RoleDetailLayout({
100
107
  export {
101
108
  RoleDetailLayout
102
109
  };
103
- //# sourceMappingURL=chunk-5FNUPWPO.js.map
110
+ //# sourceMappingURL=chunk-WLKT5YFP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/iam/role-detail-layout.tsx"],"sourcesContent":["'use client';\n\nimport { useApi, useConfig } from '@mesob/auth-react';\nimport {\n EntityDetailHeader,\n EntityEmptyState,\n PageContainer,\n type TabItem,\n useBreadcrumbs,\n} from '@mesob/ui/components';\nimport { useMesob } from '@mesob/ui/providers';\nimport { IconShield } from '@tabler/icons-react';\nimport type { ReactNode } from 'react';\nimport { useMemo } from 'react';\nimport { createNavigate } from '../../utils/navigation';\n\nfunction str(value: unknown): string {\n if (value == null) {\n return '';\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'object' && value !== null && 'en' in value) {\n const localized = value as { en?: string; am?: string };\n return localized.en ?? localized.am ?? '';\n }\n return String(value);\n}\n\ntype RoleDetailLayoutProps = {\n roleId: string;\n basePath?: string;\n children: ReactNode;\n};\n\nexport function RoleDetailLayout({\n roleId,\n basePath = '/iam/roles',\n children,\n}: RoleDetailLayoutProps) {\n const { hooks } = useApi();\n const { config } = useConfig();\n const mesob = useMesob();\n const navigate = createNavigate({\n onNavigate: config.navigation?.onNavigate,\n mesobNavigate: mesob?.navigate,\n });\n const homeHref = config.navigation?.defaultRedirectUrl || '/';\n const { data, isLoading, isFetching, isError } = hooks.useQuery(\n 'get',\n '/roles/{id}',\n { params: { path: { id: roleId } } },\n { enabled: !!roleId },\n );\n\n const role = data?.role;\n const title = role ? str(role.name) || role.code : (roleId ?? 'Role');\n\n useBreadcrumbs({\n items: [\n { label: 'Home', href: homeHref },\n { label: 'IAM', href: '/iam' },\n { label: 'Roles', href: basePath },\n { label: title },\n ],\n });\n\n const tabs: TabItem[] = useMemo(\n () => [\n { value: 'detail', name: 'Detail', href: `${basePath}/${roleId}` },\n {\n value: 'permissions',\n name: 'Permissions',\n href: `${basePath}/${roleId}/permissions`,\n },\n {\n value: 'users',\n name: 'Users',\n href: `${basePath}/${roleId}/users`,\n },\n ],\n [basePath, roleId],\n );\n\n if (!roleId) {\n return null;\n }\n\n const loading = isLoading || isFetching;\n if (!(loading || role)) {\n return (\n <PageContainer className=\"flex flex-1 flex-col gap-4 p-4 pt-0\">\n <EntityEmptyState\n icon={IconShield}\n entityName=\"role\"\n title={isError ? 'Role unavailable' : 'Role not found'}\n description={\n isError\n ? 'Failed to load this role.'\n : 'This role no longer exists.'\n }\n actionLabel=\"Back to roles\"\n onAction={() => navigate(basePath)}\n />\n </PageContainer>\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={<IconShield className=\"h-5 w-5\" />}\n loading={loading}\n backHref={basePath}\n tabs={tabs}\n />\n {children}\n </PageContainer>\n );\n}\n"],"mappings":";;;;;AAEA,SAAS,QAAQ,iBAAiB;AAClC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AACP,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;AAE3B,SAAS,eAAe;AAgFhB,cAiBJ,YAjBI;AA7ER,SAAS,IAAI,OAAwB;AACnC,MAAI,SAAS,MAAM;AACjB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,QAAQ,OAAO;AAChE,UAAM,YAAY;AAClB,WAAO,UAAU,MAAM,UAAU,MAAM;AAAA,EACzC;AACA,SAAO,OAAO,KAAK;AACrB;AAQO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA,WAAW;AAAA,EACX;AACF,GAA0B;AACxB,QAAM,EAAE,MAAM,IAAI,OAAO;AACzB,QAAM,EAAE,OAAO,IAAI,UAAU;AAC7B,QAAM,QAAQ,SAAS;AACvB,QAAM,WAAW,eAAe;AAAA,IAC9B,YAAY,OAAO,YAAY;AAAA,IAC/B,eAAe,OAAO;AAAA,EACxB,CAAC;AACD,QAAM,WAAW,OAAO,YAAY,sBAAsB;AAC1D,QAAM,EAAE,MAAM,WAAW,YAAY,QAAQ,IAAI,MAAM;AAAA,IACrD;AAAA,IACA;AAAA,IACA,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,EAAE;AAAA,IACnC,EAAE,SAAS,CAAC,CAAC,OAAO;AAAA,EACtB;AAEA,QAAM,OAAO,MAAM;AACnB,QAAM,QAAQ,OAAO,IAAI,KAAK,IAAI,KAAK,KAAK,OAAQ,UAAU;AAE9D,iBAAe;AAAA,IACb,OAAO;AAAA,MACL,EAAE,OAAO,QAAQ,MAAM,SAAS;AAAA,MAChC,EAAE,OAAO,OAAO,MAAM,OAAO;AAAA,MAC7B,EAAE,OAAO,SAAS,MAAM,SAAS;AAAA,MACjC,EAAE,OAAO,MAAM;AAAA,IACjB;AAAA,EACF,CAAC;AAED,QAAM,OAAkB;AAAA,IACtB,MAAM;AAAA,MACJ,EAAE,OAAO,UAAU,MAAM,UAAU,MAAM,GAAG,QAAQ,IAAI,MAAM,GAAG;AAAA,MACjE;AAAA,QACE,OAAO;AAAA,QACP,MAAM;AAAA,QACN,MAAM,GAAG,QAAQ,IAAI,MAAM;AAAA,MAC7B;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,MAAM;AAAA,QACN,MAAM,GAAG,QAAQ,IAAI,MAAM;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,CAAC,UAAU,MAAM;AAAA,EACnB;AAEA,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,aAAa;AAC7B,MAAI,EAAE,WAAW,OAAO;AACtB,WACE,oBAAC,iBAAc,WAAU,uCACvB;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,YAAW;AAAA,QACX,OAAO,UAAU,qBAAqB;AAAA,QACtC,aACE,UACI,8BACA;AAAA,QAEN,aAAY;AAAA,QACZ,UAAU,MAAM,SAAS,QAAQ;AAAA;AAAA,IACnC,GACF;AAAA,EAEJ;AAEA,SACE,qBAAC,iBAAc,WAAU,uCACvB;AAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAM,oBAAC,cAAW,WAAU,WAAU;AAAA,QACtC;AAAA,QACA,UAAU;AAAA,QACV;AAAA;AAAA,IACF;AAAA,IACC;AAAA,KACH;AAEJ;","names":[]}
@@ -1,19 +1,19 @@
1
1
  import {
2
2
  handleError
3
3
  } from "./chunk-W7UHDTBI.js";
4
+ import {
5
+ createNavigate
6
+ } from "./chunk-6YHUCPJ4.js";
4
7
  import {
5
8
  AuthLayout
6
9
  } from "./chunk-DPH2PHK3.js";
7
10
  import {
8
11
  useTranslator
9
- } from "./chunk-NPA7L57G.js";
10
- import {
11
- useApi,
12
- useConfig
13
- } from "./chunk-M2K6O5CN.js";
12
+ } from "./chunk-WG5H5PTL.js";
14
13
 
15
14
  // src/components/auth/reset-password-form.tsx
16
15
  import { zodResolver } from "@hookform/resolvers/zod";
16
+ import { useApi, useConfig } from "@mesob/auth-react";
17
17
  import {
18
18
  Alert,
19
19
  AlertDescription,
@@ -89,10 +89,9 @@ var ResetPasswordForm = ({
89
89
  const resetPasswordMutation = hooks.useMutation("post", "/password/reset");
90
90
  const signInLink = config.navigation?.links?.signIn || "/auth/sign-in";
91
91
  const forgotPasswordLink = config.navigation?.links?.forgotPassword || "/auth/forgot-password";
92
- const onNavigate = config.navigation?.onNavigate || ((path) => {
93
- if (typeof window !== "undefined") {
94
- window.location.href = path;
95
- }
92
+ const onNavigate = createNavigate({
93
+ onNavigate: config.navigation?.onNavigate,
94
+ mesobNavigate: mesob?.navigate
96
95
  });
97
96
  const logoImage = config.ui.logoImage;
98
97
  const defaultRedirect = redirectUrl || config.navigation?.defaultRedirectUrl || "/";
@@ -283,4 +282,4 @@ var ResetPasswordForm = ({
283
282
  export {
284
283
  ResetPasswordForm
285
284
  };
286
- //# sourceMappingURL=chunk-2BF2JIDK.js.map
285
+ //# sourceMappingURL=chunk-WM2ETQIY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/auth/reset-password-form.tsx"],"sourcesContent":["'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { useApi, useConfig } from '@mesob/auth-react';\nimport {\n Alert,\n AlertDescription,\n AlertTitle,\n Button,\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n Input,\n InputOTP,\n InputOTPGroup,\n InputOTPSlot,\n useFormField,\n} from '@mesob/ui/components';\nimport { useMesob } from '@mesob/ui/providers';\nimport { IconAlertCircle, IconEye, IconEyeOff } from '@tabler/icons-react';\nimport type { ChangeEvent, ComponentProps } from 'react';\nimport { useEffect, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\nimport { useTranslator } from '../../hooks/use-translator';\nimport type { AuthErrorContent } from '../../utils/handle-error';\nimport { handleError } from '../../utils/handle-error';\nimport { createNavigate } from '../../utils/navigation';\nimport { AuthLayout } from './auth-layout';\n\ntype PasswordInputProps = {\n field: ComponentProps<'input'> & {\n value: string;\n onChange: (e: ChangeEvent<HTMLInputElement>) => void;\n onBlur: () => void;\n };\n show: boolean;\n onToggle: () => void;\n};\n\nfunction PasswordInput({ field, show, onToggle }: PasswordInputProps) {\n const { formItemId, error } = useFormField();\n return (\n <div className=\"relative\">\n <Input\n {...field}\n id={formItemId}\n type={show ? 'text' : 'password'}\n aria-invalid={!!error}\n className=\"pr-10\"\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute right-0 top-0 h-full px-3 text-muted-foreground hover:text-foreground\"\n onClick={onToggle}\n aria-label={show ? 'Hide password' : 'Show password'}\n >\n {show ? (\n <IconEyeOff className=\"h-4 w-4\" />\n ) : (\n <IconEye className=\"h-4 w-4\" />\n )}\n </Button>\n </div>\n );\n}\n\ntype ResetPasswordFormValues = {\n code: string;\n password: string;\n confirmPassword: string;\n};\n\ntype ResetPasswordFormProps = {\n verificationId: string;\n redirectUrl?: string;\n};\n\nconst resetPasswordSchema = (t: (key: string) => string) =>\n z\n .object({\n code: z.string().length(6, t('errors.codeLength')),\n password: z.string().min(8, t('errors.passwordLength')),\n confirmPassword: z.string(),\n })\n .refine((data) => data.password === data.confirmPassword, {\n message: t('errors.passwordsMismatch'),\n path: ['confirmPassword'],\n });\n\nexport const ResetPasswordForm = ({\n verificationId,\n redirectUrl,\n}: ResetPasswordFormProps) => {\n const { hooks, refresh } = useApi();\n const { config } = useConfig();\n const mesob = useMesob();\n const Link = mesob?.navigation?.Link;\n const t = useTranslator('Auth.resetPassword');\n const common = useTranslator('Common');\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthErrorContent | null>(null);\n const [showPassword, setShowPassword] = useState(false);\n\n const resetPasswordMutation = hooks.useMutation('post', '/password/reset');\n\n const signInLink = config.navigation?.links?.signIn || '/auth/sign-in';\n const forgotPasswordLink =\n config.navigation?.links?.forgotPassword || '/auth/forgot-password';\n const onNavigate = createNavigate({\n onNavigate: config.navigation?.onNavigate,\n mesobNavigate: mesob?.navigate,\n });\n const logoImage = config.ui.logoImage;\n const defaultRedirect =\n redirectUrl || config.navigation?.defaultRedirectUrl || '/';\n\n const form = useForm<ResetPasswordFormValues>({\n resolver: zodResolver(resetPasswordSchema(t)),\n defaultValues: {\n code: '',\n password: '',\n confirmPassword: '',\n },\n });\n\n useEffect(() => {\n if (error) {\n toast.error(error.title || 'Error', {\n description: error.description,\n });\n }\n }, [error]);\n\n const handleSubmit = form.handleSubmit(async (values) => {\n if (!verificationId) {\n setError({\n title: t('errors.fallback'),\n description: t('errors.missingVerificationId'),\n });\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n await resetPasswordMutation.mutateAsync({\n body: {\n verificationId,\n code: values.code,\n password: values.password,\n },\n });\n await refresh();\n onNavigate(defaultRedirect);\n } catch (err) {\n handleError(err, setError, t);\n } finally {\n setIsLoading(false);\n }\n });\n\n if (!verificationId) {\n return (\n <AuthLayout\n title={common('invalidLinkTitle')}\n description={common('invalidLinkDescription')}\n logoImage={logoImage}\n footer={\n <Link\n href={forgotPasswordLink}\n className=\"text-primary hover:underline\"\n >\n {t('footer.requestNew')}\n </Link>\n }\n >\n <div />\n </AuthLayout>\n );\n }\n\n let errorContent: AuthErrorContent | null = null;\n if (error) {\n if (typeof error === 'string') {\n errorContent = { title: 'Error', description: error };\n } else {\n errorContent = error;\n }\n }\n\n return (\n <AuthLayout\n title={config.ui.name}\n description={t('description')}\n logoImage={logoImage}\n footer={\n <div className=\"flex items-center justify-between w-full gap-2\">\n <Link href={signInLink} className=\"text-primary hover:underline\">\n {t('footer.backToSignIn')}\n </Link>\n <Link\n href={forgotPasswordLink}\n className=\"text-primary hover:underline\"\n >\n {t('footer.changeAccount')}\n </Link>\n </div>\n }\n >\n <Form {...form}>\n <form\n id=\"reset-password-form\"\n onSubmit={handleSubmit}\n className=\"space-y-4\"\n >\n <FormField\n control={form.control}\n name=\"code\"\n render={({ field }) => (\n <FormItem>\n <div className=\"flex justify-center\">\n <FormLabel>{t('form.codeLabel')}</FormLabel>\n </div>\n <FormControl>\n <InputOTP\n maxLength={6}\n value={field.value}\n onChange={field.onChange}\n onBlur={field.onBlur}\n containerClassName=\"gap-4 flex justify-center mt-2\"\n >\n <InputOTPGroup className=\"gap-3 *:data-[slot=input-otp-slot]:h-12 *:data-[slot=input-otp-slot]:w-12 *:data-[slot=input-otp-slot]:rounded-md *:data-[slot=input-otp-slot]:border *:data-[slot=input-otp-slot]:text-xl\">\n <InputOTPSlot className=\"h-12\" index={0} />\n <InputOTPSlot className=\"h-12\" index={1} />\n <InputOTPSlot className=\"h-12\" index={2} />\n <InputOTPSlot className=\"h-12\" index={3} />\n <InputOTPSlot className=\"h-12\" index={4} />\n <InputOTPSlot className=\"h-12\" index={5} />\n </InputOTPGroup>\n </InputOTP>\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={form.control}\n name=\"password\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>{t('form.passwordLabel')}</FormLabel>\n <PasswordInput\n field={field}\n show={showPassword}\n onToggle={() => setShowPassword(!showPassword)}\n />\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={form.control}\n name=\"confirmPassword\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>{t('form.confirmPasswordLabel')}</FormLabel>\n <PasswordInput\n field={field}\n show={showPassword}\n onToggle={() => setShowPassword(!showPassword)}\n />\n <FormMessage />\n </FormItem>\n )}\n />\n <Button\n type=\"submit\"\n form=\"reset-password-form\"\n className=\"w-full\"\n disabled={isLoading || resetPasswordMutation.isPending}\n loading={isLoading || resetPasswordMutation.isPending}\n >\n {isLoading || resetPasswordMutation.isPending\n ? t('form.submitting')\n : t('form.submit')}\n </Button>\n </form>\n </Form>\n {errorContent && (\n <Alert variant=\"destructive\" className=\"mt-4\">\n <IconAlertCircle className=\"h-4 w-4\" />\n <AlertTitle>{errorContent.title}</AlertTitle>\n <AlertDescription>{errorContent.description}</AlertDescription>\n </Alert>\n )}\n </AuthLayout>\n );\n};\n"],"mappings":"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","names":[]}
@@ -1,14 +1,12 @@
1
1
  import {
2
2
  VerifyChangePhoneForm
3
- } from "./chunk-R7VVXH5U.js";
3
+ } from "./chunk-YPFDH2E7.js";
4
4
  import {
5
5
  RequestChangePhoneForm
6
- } from "./chunk-4YPLJ2P6.js";
7
- import {
8
- useSession
9
- } from "./chunk-M2K6O5CN.js";
6
+ } from "./chunk-57G5Z44Y.js";
10
7
 
11
8
  // src/components/profile/change-phone-form.tsx
9
+ import { useSession } from "@mesob/auth-react";
12
10
  import {
13
11
  Button,
14
12
  Collapsible,
@@ -91,4 +89,4 @@ function ChangePhoneForm() {
91
89
  export {
92
90
  ChangePhoneForm
93
91
  };
94
- //# sourceMappingURL=chunk-MPZAPUVR.js.map
92
+ //# sourceMappingURL=chunk-WTWZOQTD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/profile/change-phone-form.tsx"],"sourcesContent":["'use client';\n\nimport { useSession } from '@mesob/auth-react';\nimport {\n Button,\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from '@mesob/ui/components';\nimport { IconChevronDown } from '@tabler/icons-react';\nimport { useState } from 'react';\nimport { RequestChangePhoneForm } from './request-change-phone-form';\nimport { VerifyChangePhoneForm } from './verify-change-phone-form';\n\nexport function ChangePhoneForm() {\n const { user } = useSession();\n const [isOpen, setIsOpen] = useState(false);\n const [showOtp, setShowOtp] = useState(false);\n const [verificationId, setVerificationId] = useState<string | null>(null);\n const [newPhone, setNewPhone] = useState<string>('');\n\n const resetForms = () => {\n setShowOtp(false);\n setVerificationId(null);\n setNewPhone('');\n };\n\n const handleRequestSuccess = (id: string, phone: string) => {\n setVerificationId(id);\n setNewPhone(phone);\n setShowOtp(true);\n };\n\n const handleVerifySuccess = () => {\n resetForms();\n setIsOpen(false);\n };\n\n const handleCancel = () => {\n resetForms();\n setIsOpen(false);\n };\n\n const title = user?.phone ? 'Change Phone' : 'Add Phone';\n const description = user?.phone\n ? 'Update your phone number'\n : 'Add a phone number to your account';\n\n return (\n <Collapsible open={isOpen} onOpenChange={setIsOpen}>\n <div className=\"border rounded-lg\">\n <CollapsibleTrigger\n render={\n <Button\n variant=\"ghost\"\n className=\"w-full justify-between p-4 h-auto\"\n />\n }\n >\n <div className=\"flex flex-col items-start\">\n <span className=\"font-medium\">{title}</span>\n <span className=\"text-sm text-muted-foreground\">{description}</span>\n </div>\n <IconChevronDown\n className={`h-4 w-4 transition-transform ${\n isOpen ? 'rotate-180' : ''\n }`}\n />\n </CollapsibleTrigger>\n\n <CollapsibleContent>\n {showOtp ? (\n <VerifyChangePhoneForm\n phone={newPhone}\n verificationId={verificationId}\n onSuccess={handleVerifySuccess}\n onCancel={handleCancel}\n />\n ) : (\n <RequestChangePhoneForm\n onSuccess={handleRequestSuccess}\n onCancel={handleCancel}\n buttonText={title}\n />\n )}\n </CollapsibleContent>\n </div>\n </Collapsible>\n );\n}\n"],"mappings":";;;;;;;;AAEA,SAAS,kBAAkB;AAC3B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,uBAAuB;AAChC,SAAS,gBAAgB;AA2Cb,cAMF,YANE;AAvCL,SAAS,kBAAkB;AAChC,QAAM,EAAE,KAAK,IAAI,WAAW;AAC5B,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAwB,IAAI;AACxE,QAAM,CAAC,UAAU,WAAW,IAAI,SAAiB,EAAE;AAEnD,QAAM,aAAa,MAAM;AACvB,eAAW,KAAK;AAChB,sBAAkB,IAAI;AACtB,gBAAY,EAAE;AAAA,EAChB;AAEA,QAAM,uBAAuB,CAAC,IAAY,UAAkB;AAC1D,sBAAkB,EAAE;AACpB,gBAAY,KAAK;AACjB,eAAW,IAAI;AAAA,EACjB;AAEA,QAAM,sBAAsB,MAAM;AAChC,eAAW;AACX,cAAU,KAAK;AAAA,EACjB;AAEA,QAAM,eAAe,MAAM;AACzB,eAAW;AACX,cAAU,KAAK;AAAA,EACjB;AAEA,QAAM,QAAQ,MAAM,QAAQ,iBAAiB;AAC7C,QAAM,cAAc,MAAM,QACtB,6BACA;AAEJ,SACE,oBAAC,eAAY,MAAM,QAAQ,cAAc,WACvC,+BAAC,SAAI,WAAU,qBACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,QACE;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,WAAU;AAAA;AAAA,QACZ;AAAA,QAGF;AAAA,+BAAC,SAAI,WAAU,6BACb;AAAA,gCAAC,UAAK,WAAU,eAAe,iBAAM;AAAA,YACrC,oBAAC,UAAK,WAAU,iCAAiC,uBAAY;AAAA,aAC/D;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,gCACT,SAAS,eAAe,EAC1B;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF;AAAA,IAEA,oBAAC,sBACE,oBACC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP;AAAA,QACA,WAAW;AAAA,QACX,UAAU;AAAA;AAAA,IACZ,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,QACX,UAAU;AAAA,QACV,YAAY;AAAA;AAAA,IACd,GAEJ;AAAA,KACF,GACF;AAEJ;","names":[]}
@@ -7,19 +7,19 @@ import {
7
7
  import {
8
8
  handleError
9
9
  } from "./chunk-W7UHDTBI.js";
10
+ import {
11
+ createNavigate
12
+ } from "./chunk-6YHUCPJ4.js";
10
13
  import {
11
14
  AuthLayout
12
15
  } from "./chunk-DPH2PHK3.js";
13
16
  import {
14
17
  useTranslator
15
- } from "./chunk-NPA7L57G.js";
16
- import {
17
- useApi,
18
- useConfig
19
- } from "./chunk-M2K6O5CN.js";
18
+ } from "./chunk-WG5H5PTL.js";
20
19
 
21
20
  // src/components/auth/set-password.tsx
22
21
  import { zodResolver } from "@hookform/resolvers/zod";
22
+ import { useApi, useConfig } from "@mesob/auth-react";
23
23
  import {
24
24
  Alert,
25
25
  AlertDescription,
@@ -102,10 +102,9 @@ var SetPassword = function SetPassword2({
102
102
  const [account, setAccount] = useState(null);
103
103
  const checkAccountMutation = hooks.useMutation("post", "/check-account");
104
104
  const setPasswordMutation = hooks.useMutation("post", "/password/set");
105
- const onNavigate = config.navigation?.onNavigate || ((path) => {
106
- if (typeof window !== "undefined") {
107
- window.location.href = path;
108
- }
105
+ const onNavigate = createNavigate({
106
+ onNavigate: config.navigation?.onNavigate,
107
+ mesobNavigate: mesob?.navigate
109
108
  });
110
109
  const signInLink = config.navigation?.links?.signIn || "/auth/sign-in";
111
110
  const logoImage = config.ui.logoImage;
@@ -305,4 +304,4 @@ var SetPassword = function SetPassword2({
305
304
  export {
306
305
  SetPassword
307
306
  };
308
- //# sourceMappingURL=chunk-VWGOCWRF.js.map
307
+ //# sourceMappingURL=chunk-X6FJMSL3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/auth/set-password.tsx"],"sourcesContent":["'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { useApi, useConfig } from '@mesob/auth-react';\nimport {\n Alert,\n AlertDescription,\n AlertTitle,\n Button,\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n Input,\n useFormField,\n} from '@mesob/ui/components';\nimport { useMesob } from '@mesob/ui/providers';\nimport { IconAlertCircle, IconEye, IconEyeOff } from '@tabler/icons-react';\nimport type { ChangeEvent, ComponentProps } from 'react';\nimport { useEffect, useEffectEvent, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\nimport { useTranslator } from '../../hooks/use-translator';\nimport type { AuthErrorContent } from '../../utils/handle-error';\nimport { handleError } from '../../utils/handle-error';\nimport { createNavigate } from '../../utils/navigation';\nimport { normalizeEmail } from '../../utils/normalize-email';\nimport { normalizePhone } from '../../utils/normalize-phone';\nimport { AuthLayout } from './auth-layout';\n\ntype PasswordInputProps = {\n field: ComponentProps<'input'> & {\n value: string;\n onChange: (e: ChangeEvent<HTMLInputElement>) => void;\n onBlur: () => void;\n };\n show: boolean;\n onToggle: () => void;\n};\n\nfunction PasswordInput({ field, show, onToggle }: PasswordInputProps) {\n const { formItemId, error } = useFormField();\n return (\n <div className=\"relative\">\n <Input\n {...field}\n id={formItemId}\n type={show ? 'text' : 'password'}\n aria-invalid={!!error}\n className=\"pr-10\"\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute right-0 top-0 h-full px-3 text-muted-foreground hover:text-foreground\"\n onClick={onToggle}\n aria-label={show ? 'Hide password' : 'Show password'}\n >\n {show ? (\n <IconEyeOff className=\"h-4 w-4\" />\n ) : (\n <IconEye className=\"h-4 w-4\" />\n )}\n </Button>\n </div>\n );\n}\n\nconst setPasswordSchema = (t: (key: string) => string) =>\n z\n .object({\n password: z\n .string()\n .min(8, t('errors.passwordLength'))\n .max(128, t('errors.longPasswordError')),\n confirmPassword: z.string(),\n })\n .refine((data) => data.password === data.confirmPassword, {\n message: t('errors.passwordsMismatch'),\n path: ['confirmPassword'],\n });\n\ntype SetPasswordFormValues = z.infer<ReturnType<typeof setPasswordSchema>>;\n\ntype SetPasswordProps = {\n identifier?: string;\n redirectUrl?: string;\n};\n\ntype AccountState = {\n fullName: string;\n email: string | null;\n phone: string | null;\n};\n\nconst getPhoneRegex = (phoneRegex: RegExp | string | undefined) => {\n if (typeof phoneRegex === 'string') {\n return new RegExp(phoneRegex);\n }\n\n return phoneRegex || /^\\+251[79]\\d{8}$/;\n};\n\nconst normalizeIdentifier = (\n identifier: string,\n phoneRegex: RegExp | string | undefined,\n) => {\n const resolvedPhoneRegex = getPhoneRegex(phoneRegex);\n return resolvedPhoneRegex.test(normalizePhone(identifier))\n ? normalizePhone(identifier)\n : normalizeEmail(identifier);\n};\n\nexport const SetPassword = function SetPassword({\n identifier,\n redirectUrl,\n}: SetPasswordProps = {}) {\n const { hooks, setAuth } = useApi();\n const { config } = useConfig();\n const mesob = useMesob();\n const t = useTranslator('Auth.setPassword');\n const Link = mesob?.navigation?.Link;\n const [error, setError] = useState<AuthErrorContent | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isChecking, setIsChecking] = useState(true);\n const [showPassword, setShowPassword] = useState(false);\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\n const [account, setAccount] = useState<AccountState | null>(null);\n\n const checkAccountMutation = hooks.useMutation('post', '/check-account');\n const setPasswordMutation = hooks.useMutation('post', '/password/set');\n\n const onNavigate = createNavigate({\n onNavigate: config.navigation?.onNavigate,\n mesobNavigate: mesob?.navigate,\n });\n const signInLink = config.navigation?.links?.signIn || '/auth/sign-in';\n const logoImage = config.ui.logoImage;\n const defaultRedirect =\n redirectUrl || config.navigation?.defaultRedirectUrl || '/';\n const form = useForm<SetPasswordFormValues>({\n resolver: zodResolver(setPasswordSchema(t)),\n defaultValues: {\n password: '',\n confirmPassword: '',\n },\n });\n\n useEffect(() => {\n if (error) {\n toast.error(error.title || 'Error', {\n description: error.description,\n });\n }\n }, [error]);\n\n const loadAccount = useEffectEvent(async () => {\n if (!identifier) {\n setError({\n title: t('errors.fallback'),\n description: t('errors.missingIdentifier'),\n });\n setIsChecking(false);\n return;\n }\n\n try {\n const normalizedIdentifier = normalizeIdentifier(\n identifier,\n config.phoneRegex,\n );\n const res = await checkAccountMutation.mutateAsync({\n body: { username: normalizedIdentifier },\n });\n\n if (!(res.exists && res.account && res.requiresPasswordSetup)) {\n setError({\n title: t('errors.fallback'),\n description: t('errors.accountNotEligible'),\n });\n setIsChecking(false);\n return;\n }\n\n setAccount({\n fullName: res.account.fullName,\n email: res.account.email,\n phone: res.account.phone,\n });\n } catch {\n setError({\n title: t('errors.fallback'),\n description: t('errors.accountLookupFailed'),\n });\n } finally {\n setIsChecking(false);\n }\n });\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: rerun only when route identifier changes\n useEffect(() => {\n loadAccount().catch(() => {\n setIsChecking(false);\n });\n }, [identifier]);\n\n const handleSubmit = form.handleSubmit(async (values) => {\n if (!identifier) {\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const normalizedIdentifier = normalizeIdentifier(\n identifier,\n config.phoneRegex,\n );\n const res = await setPasswordMutation.mutateAsync({\n body: {\n identifier: normalizedIdentifier,\n password: values.password,\n },\n });\n\n if ('user' in res && 'session' in res) {\n setAuth(res);\n }\n onNavigate(defaultRedirect);\n } catch (err) {\n handleError(err, setError, t);\n } finally {\n setIsLoading(false);\n }\n });\n\n const accountLabel = account?.email\n ? t('form.emailLabel')\n : t('form.phoneLabel');\n const accountValue = account?.email || account?.phone || identifier || '';\n\n let errorContent: AuthErrorContent | null = null;\n if (error) {\n errorContent =\n typeof error === 'string'\n ? { title: 'Error', description: error }\n : error;\n }\n const showError = !isChecking && !!errorContent;\n const errorAlert = showError && errorContent && (\n <Alert variant=\"destructive\" className=\"mt-4\">\n <IconAlertCircle className=\"h-4 w-4\" />\n <AlertTitle>{errorContent.title}</AlertTitle>\n <AlertDescription>{errorContent.description}</AlertDescription>\n </Alert>\n );\n\n return (\n <AuthLayout\n title={config.ui.name}\n description={t('description')}\n logoImage={logoImage}\n footer={\n <p>\n {t('footer.hasPassword')}{' '}\n {Link ? (\n <Link href={signInLink} className=\"text-primary hover:underline\">\n {t('footer.signInCta')}\n </Link>\n ) : (\n <a\n href={signInLink}\n onClick={(e) => {\n e.preventDefault();\n onNavigate(signInLink);\n }}\n className=\"text-primary hover:underline\"\n >\n {t('footer.signInCta')}\n </a>\n )}\n </p>\n }\n >\n <Form {...form}>\n <form\n id=\"set-password-form\"\n onSubmit={handleSubmit}\n className=\"space-y-4\"\n >\n <FormItem>\n <FormLabel>{t('form.fullNameLabel')}</FormLabel>\n <FormControl>\n <Input value={account?.fullName || ''} disabled />\n </FormControl>\n </FormItem>\n <FormItem>\n <FormLabel>{accountLabel}</FormLabel>\n <FormControl>\n <Input value={accountValue} disabled />\n </FormControl>\n </FormItem>\n <FormField\n control={form.control}\n name=\"password\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>{t('form.passwordLabel')}</FormLabel>\n <PasswordInput\n field={field}\n show={showPassword}\n onToggle={() => setShowPassword(!showPassword)}\n />\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={form.control}\n name=\"confirmPassword\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>{t('form.confirmPasswordLabel')}</FormLabel>\n <PasswordInput\n field={field}\n show={showConfirmPassword}\n onToggle={() => setShowConfirmPassword(!showConfirmPassword)}\n />\n <FormMessage />\n </FormItem>\n )}\n />\n <Button\n type=\"submit\"\n form=\"set-password-form\"\n className=\"w-full\"\n disabled={\n isChecking ||\n !account ||\n isLoading ||\n setPasswordMutation.isPending\n }\n >\n {isLoading || setPasswordMutation.isPending\n ? t('form.submitting')\n : t('form.submit')}\n </Button>\n </form>\n </Form>\n {errorAlert}\n </AuthLayout>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAEA,SAAS,mBAAmB;AAC5B,SAAS,QAAQ,iBAAiB;AAClC;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,OACK;AACP,SAAS,gBAAgB;AACzB,SAAS,iBAAiB,SAAS,kBAAkB;AAErD,SAAS,WAAW,gBAAgB,gBAAgB;AACpD,SAAS,eAAe;AACxB,SAAS,aAAa;AACtB,SAAS,SAAS;AAsBd,SACE,KADF;AAHJ,SAAS,cAAc,EAAE,OAAO,MAAM,SAAS,GAAuB;AACpE,QAAM,EAAE,YAAY,MAAM,IAAI,aAAa;AAC3C,SACE,qBAAC,SAAI,WAAU,YACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM,OAAO,SAAS;AAAA,QACtB,gBAAc,CAAC,CAAC;AAAA,QAChB,WAAU;AAAA;AAAA,IACZ;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS;AAAA,QACT,cAAY,OAAO,kBAAkB;AAAA,QAEpC,iBACC,oBAAC,cAAW,WAAU,WAAU,IAEhC,oBAAC,WAAQ,WAAU,WAAU;AAAA;AAAA,IAEjC;AAAA,KACF;AAEJ;AAEA,IAAM,oBAAoB,CAAC,MACzB,EACG,OAAO;AAAA,EACN,UAAU,EACP,OAAO,EACP,IAAI,GAAG,EAAE,uBAAuB,CAAC,EACjC,IAAI,KAAK,EAAE,0BAA0B,CAAC;AAAA,EACzC,iBAAiB,EAAE,OAAO;AAC5B,CAAC,EACA,OAAO,CAAC,SAAS,KAAK,aAAa,KAAK,iBAAiB;AAAA,EACxD,SAAS,EAAE,0BAA0B;AAAA,EACrC,MAAM,CAAC,iBAAiB;AAC1B,CAAC;AAeL,IAAM,gBAAgB,CAAC,eAA4C;AACjE,MAAI,OAAO,eAAe,UAAU;AAClC,WAAO,IAAI,OAAO,UAAU;AAAA,EAC9B;AAEA,SAAO,cAAc;AACvB;AAEA,IAAM,sBAAsB,CAC1B,YACA,eACG;AACH,QAAM,qBAAqB,cAAc,UAAU;AACnD,SAAO,mBAAmB,KAAK,eAAe,UAAU,CAAC,IACrD,eAAe,UAAU,IACzB,eAAe,UAAU;AAC/B;AAEO,IAAM,cAAc,SAASA,aAAY;AAAA,EAC9C;AAAA,EACA;AACF,IAAsB,CAAC,GAAG;AACxB,QAAM,EAAE,OAAO,QAAQ,IAAI,OAAO;AAClC,QAAM,EAAE,OAAO,IAAI,UAAU;AAC7B,QAAM,QAAQ,SAAS;AACvB,QAAM,IAAI,cAAc,kBAAkB;AAC1C,QAAM,OAAO,OAAO,YAAY;AAChC,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAkC,IAAI;AAChE,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAChD,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,IAAI;AACjD,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,KAAK;AACtD,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,SAAS,KAAK;AACpE,QAAM,CAAC,SAAS,UAAU,IAAI,SAA8B,IAAI;AAEhE,QAAM,uBAAuB,MAAM,YAAY,QAAQ,gBAAgB;AACvE,QAAM,sBAAsB,MAAM,YAAY,QAAQ,eAAe;AAErE,QAAM,aAAa,eAAe;AAAA,IAChC,YAAY,OAAO,YAAY;AAAA,IAC/B,eAAe,OAAO;AAAA,EACxB,CAAC;AACD,QAAM,aAAa,OAAO,YAAY,OAAO,UAAU;AACvD,QAAM,YAAY,OAAO,GAAG;AAC5B,QAAM,kBACJ,eAAe,OAAO,YAAY,sBAAsB;AAC1D,QAAM,OAAO,QAA+B;AAAA,IAC1C,UAAU,YAAY,kBAAkB,CAAC,CAAC;AAAA,IAC1C,eAAe;AAAA,MACb,UAAU;AAAA,MACV,iBAAiB;AAAA,IACnB;AAAA,EACF,CAAC;AAED,YAAU,MAAM;AACd,QAAI,OAAO;AACT,YAAM,MAAM,MAAM,SAAS,SAAS;AAAA,QAClC,aAAa,MAAM;AAAA,MACrB,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,cAAc,eAAe,YAAY;AAC7C,QAAI,CAAC,YAAY;AACf,eAAS;AAAA,QACP,OAAO,EAAE,iBAAiB;AAAA,QAC1B,aAAa,EAAE,0BAA0B;AAAA,MAC3C,CAAC;AACD,oBAAc,KAAK;AACnB;AAAA,IACF;AAEA,QAAI;AACF,YAAM,uBAAuB;AAAA,QAC3B;AAAA,QACA,OAAO;AAAA,MACT;AACA,YAAM,MAAM,MAAM,qBAAqB,YAAY;AAAA,QACjD,MAAM,EAAE,UAAU,qBAAqB;AAAA,MACzC,CAAC;AAED,UAAI,EAAE,IAAI,UAAU,IAAI,WAAW,IAAI,wBAAwB;AAC7D,iBAAS;AAAA,UACP,OAAO,EAAE,iBAAiB;AAAA,UAC1B,aAAa,EAAE,2BAA2B;AAAA,QAC5C,CAAC;AACD,sBAAc,KAAK;AACnB;AAAA,MACF;AAEA,iBAAW;AAAA,QACT,UAAU,IAAI,QAAQ;AAAA,QACtB,OAAO,IAAI,QAAQ;AAAA,QACnB,OAAO,IAAI,QAAQ;AAAA,MACrB,CAAC;AAAA,IACH,QAAQ;AACN,eAAS;AAAA,QACP,OAAO,EAAE,iBAAiB;AAAA,QAC1B,aAAa,EAAE,4BAA4B;AAAA,MAC7C,CAAC;AAAA,IACH,UAAE;AACA,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF,CAAC;AAGD,YAAU,MAAM;AACd,gBAAY,EAAE,MAAM,MAAM;AACxB,oBAAc,KAAK;AAAA,IACrB,CAAC;AAAA,EACH,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,eAAe,KAAK,aAAa,OAAO,WAAW;AACvD,QAAI,CAAC,YAAY;AACf;AAAA,IACF;AAEA,iBAAa,IAAI;AACjB,aAAS,IAAI;AAEb,QAAI;AACF,YAAM,uBAAuB;AAAA,QAC3B;AAAA,QACA,OAAO;AAAA,MACT;AACA,YAAM,MAAM,MAAM,oBAAoB,YAAY;AAAA,QAChD,MAAM;AAAA,UACJ,YAAY;AAAA,UACZ,UAAU,OAAO;AAAA,QACnB;AAAA,MACF,CAAC;AAED,UAAI,UAAU,OAAO,aAAa,KAAK;AACrC,gBAAQ,GAAG;AAAA,MACb;AACA,iBAAW,eAAe;AAAA,IAC5B,SAAS,KAAK;AACZ,kBAAY,KAAK,UAAU,CAAC;AAAA,IAC9B,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,CAAC;AAED,QAAM,eAAe,SAAS,QAC1B,EAAE,iBAAiB,IACnB,EAAE,iBAAiB;AACvB,QAAM,eAAe,SAAS,SAAS,SAAS,SAAS,cAAc;AAEvE,MAAI,eAAwC;AAC5C,MAAI,OAAO;AACT,mBACE,OAAO,UAAU,WACb,EAAE,OAAO,SAAS,aAAa,MAAM,IACrC;AAAA,EACR;AACA,QAAM,YAAY,CAAC,cAAc,CAAC,CAAC;AACnC,QAAM,aAAa,aAAa,gBAC9B,qBAAC,SAAM,SAAQ,eAAc,WAAU,QACrC;AAAA,wBAAC,mBAAgB,WAAU,WAAU;AAAA,IACrC,oBAAC,cAAY,uBAAa,OAAM;AAAA,IAChC,oBAAC,oBAAkB,uBAAa,aAAY;AAAA,KAC9C;AAGF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,OAAO,GAAG;AAAA,MACjB,aAAa,EAAE,aAAa;AAAA,MAC5B;AAAA,MACA,QACE,qBAAC,OACE;AAAA,UAAE,oBAAoB;AAAA,QAAG;AAAA,QACzB,OACC,oBAAC,QAAK,MAAM,YAAY,WAAU,gCAC/B,YAAE,kBAAkB,GACvB,IAEA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,SAAS,CAAC,MAAM;AACd,gBAAE,eAAe;AACjB,yBAAW,UAAU;AAAA,YACvB;AAAA,YACA,WAAU;AAAA,YAET,YAAE,kBAAkB;AAAA;AAAA,QACvB;AAAA,SAEJ;AAAA,MAGF;AAAA,4BAAC,QAAM,GAAG,MACR;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,UAAU;AAAA,YACV,WAAU;AAAA,YAEV;AAAA,mCAAC,YACC;AAAA,oCAAC,aAAW,YAAE,oBAAoB,GAAE;AAAA,gBACpC,oBAAC,eACC,8BAAC,SAAM,OAAO,SAAS,YAAY,IAAI,UAAQ,MAAC,GAClD;AAAA,iBACF;AAAA,cACA,qBAAC,YACC;AAAA,oCAAC,aAAW,wBAAa;AAAA,gBACzB,oBAAC,eACC,8BAAC,SAAM,OAAO,cAAc,UAAQ,MAAC,GACvC;AAAA,iBACF;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS,KAAK;AAAA,kBACd,MAAK;AAAA,kBACL,QAAQ,CAAC,EAAE,MAAM,MACf,qBAAC,YACC;AAAA,wCAAC,aAAW,YAAE,oBAAoB,GAAE;AAAA,oBACpC;AAAA,sBAAC;AAAA;AAAA,wBACC;AAAA,wBACA,MAAM;AAAA,wBACN,UAAU,MAAM,gBAAgB,CAAC,YAAY;AAAA;AAAA,oBAC/C;AAAA,oBACA,oBAAC,eAAY;AAAA,qBACf;AAAA;AAAA,cAEJ;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS,KAAK;AAAA,kBACd,MAAK;AAAA,kBACL,QAAQ,CAAC,EAAE,MAAM,MACf,qBAAC,YACC;AAAA,wCAAC,aAAW,YAAE,2BAA2B,GAAE;AAAA,oBAC3C;AAAA,sBAAC;AAAA;AAAA,wBACC;AAAA,wBACA,MAAM;AAAA,wBACN,UAAU,MAAM,uBAAuB,CAAC,mBAAmB;AAAA;AAAA,oBAC7D;AAAA,oBACA,oBAAC,eAAY;AAAA,qBACf;AAAA;AAAA,cAEJ;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,UACE,cACA,CAAC,WACD,aACA,oBAAoB;AAAA,kBAGrB,uBAAa,oBAAoB,YAC9B,EAAE,iBAAiB,IACnB,EAAE,aAAa;AAAA;AAAA,cACrB;AAAA;AAAA;AAAA,QACF,GACF;AAAA,QACC;AAAA;AAAA;AAAA,EACH;AAEJ;","names":["SetPassword"]}
@@ -1,12 +1,9 @@
1
1
  import {
2
2
  OtpVerificationModal
3
- } from "./chunk-UIXR5GF3.js";
4
- import {
5
- useApi,
6
- useSession
7
- } from "./chunk-M2K6O5CN.js";
3
+ } from "./chunk-ITKSPHYO.js";
8
4
 
9
5
  // src/components/profile/verify-change-phone-form.tsx
6
+ import { useApi, useSession } from "@mesob/auth-react";
10
7
  import { useState } from "react";
11
8
  import { toast } from "sonner";
12
9
  import { jsx } from "react/jsx-runtime";
@@ -140,4 +137,4 @@ function VerifyChangePhoneForm({
140
137
  export {
141
138
  VerifyChangePhoneForm
142
139
  };
143
- //# sourceMappingURL=chunk-R7VVXH5U.js.map
140
+ //# sourceMappingURL=chunk-YPFDH2E7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/profile/verify-change-phone-form.tsx"],"sourcesContent":["'use client';\n\nimport { useApi, useSession } from '@mesob/auth-react';\nimport { useState } from 'react';\nimport { toast } from 'sonner';\nimport { OtpVerificationModal } from './otp-verification-modal';\n\ntype AuthErrorLike = {\n code?: string;\n message?: string;\n name?: string;\n};\n\nfunction isAuthError(error: unknown): error is AuthErrorLike {\n return (\n typeof error === 'object' &&\n error !== null &&\n ('code' in error || 'message' in error || 'name' in error)\n );\n}\n\nfunction getErrorCode(error: AuthErrorLike): string | undefined {\n if (error.code) {\n return error.code;\n }\n if (error.message) {\n const upperMessage = error.message.toUpperCase().trim();\n const validCodes = [\n 'USER_NOT_FOUND',\n 'USER_EXISTS',\n 'INVALID_PASSWORD',\n 'VERIFICATION_EXPIRED',\n 'VERIFICATION_MISMATCH',\n 'VERIFICATION_NOT_FOUND',\n 'TOO_MANY_ATTEMPTS',\n 'UNAUTHORIZED',\n ];\n if (validCodes.includes(upperMessage)) {\n return upperMessage;\n }\n }\n return undefined;\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (isAuthError(error)) {\n const errorCode = getErrorCode(error);\n switch (errorCode) {\n case 'USER_EXISTS':\n return 'This phone number is already taken. Please use a different number.';\n case 'VERIFICATION_EXPIRED':\n return 'Verification code has expired. Please request a new one.';\n case 'VERIFICATION_MISMATCH':\n return 'Invalid verification code. Please try again.';\n case 'VERIFICATION_NOT_FOUND':\n return 'Verification not found. Please request a new code.';\n default:\n return error.message || 'An error occurred. Please try again.';\n }\n }\n if (error instanceof Error) {\n return error.message;\n }\n return 'An error occurred. Please try again.';\n}\n\ntype VerifyChangePhoneFormProps = {\n phone: string;\n verificationId: string | null;\n onSuccess: () => void;\n onCancel: () => void;\n};\n\nexport function VerifyChangePhoneForm({\n phone,\n verificationId,\n onSuccess,\n onCancel,\n}: VerifyChangePhoneFormProps) {\n const { refresh } = useSession();\n const { hooks } = useApi();\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [currentVerificationId, setCurrentVerificationId] =\n useState(verificationId);\n\n const verifyPhoneOtpMutation = hooks.useMutation(\n 'post',\n '/phone/verification/confirm',\n );\n const updatePhoneMutation = hooks.useMutation('put', '/profile/phone');\n const requestPhoneOtpMutation = hooks.useMutation(\n 'post',\n '/phone/verification/request',\n );\n\n const onOtpSubmit = async (code: string) => {\n if (!currentVerificationId) {\n toast.error('Verification not found. Please request a new code.');\n return;\n }\n try {\n setIsSubmitting(true);\n\n // Verify phone\n await verifyPhoneOtpMutation.mutateAsync({\n body: {\n verificationId: currentVerificationId,\n code,\n context: 'change-phone',\n },\n });\n\n // Update phone via auth client\n await updatePhoneMutation.mutateAsync({\n body: { phone },\n });\n\n toast.success('Phone number updated successfully');\n await refresh();\n onSuccess();\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n toast.error(errorMessage);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n if (!currentVerificationId) {\n toast.error('Verification not found. Please request a new code.');\n return null;\n }\n\n return (\n <OtpVerificationModal\n open\n title=\"Verify phone\"\n description={`Enter the verification code sent to ${phone}`}\n verificationId={currentVerificationId}\n isLoading={isSubmitting}\n onSubmit={onOtpSubmit}\n onResend={async () => {\n try {\n setIsSubmitting(true);\n const next = await requestPhoneOtpMutation.mutateAsync({\n body: {\n phone,\n context: 'change-phone',\n },\n });\n setCurrentVerificationId(next.data?.verificationId ?? null);\n toast.success('Verification code resent');\n } catch (error) {\n toast.error(getErrorMessage(error));\n } finally {\n setIsSubmitting(false);\n }\n }}\n onCancel={onCancel}\n />\n );\n}\n"],"mappings":";;;;;AAEA,SAAS,QAAQ,kBAAkB;AACnC,SAAS,gBAAgB;AACzB,SAAS,aAAa;AAkIlB;AAzHJ,SAAS,YAAY,OAAwC;AAC3D,SACE,OAAO,UAAU,YACjB,UAAU,SACT,UAAU,SAAS,aAAa,SAAS,UAAU;AAExD;AAEA,SAAS,aAAa,OAA0C;AAC9D,MAAI,MAAM,MAAM;AACd,WAAO,MAAM;AAAA,EACf;AACA,MAAI,MAAM,SAAS;AACjB,UAAM,eAAe,MAAM,QAAQ,YAAY,EAAE,KAAK;AACtD,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,WAAW,SAAS,YAAY,GAAG;AACrC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAwB;AAC/C,MAAI,YAAY,KAAK,GAAG;AACtB,UAAM,YAAY,aAAa,KAAK;AACpC,YAAQ,WAAW;AAAA,MACjB,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO,MAAM,WAAW;AAAA,IAC5B;AAAA,EACF;AACA,MAAI,iBAAiB,OAAO;AAC1B,WAAO,MAAM;AAAA,EACf;AACA,SAAO;AACT;AASO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA+B;AAC7B,QAAM,EAAE,QAAQ,IAAI,WAAW;AAC/B,QAAM,EAAE,MAAM,IAAI,OAAO;AACzB,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,KAAK;AACtD,QAAM,CAAC,uBAAuB,wBAAwB,IACpD,SAAS,cAAc;AAEzB,QAAM,yBAAyB,MAAM;AAAA,IACnC;AAAA,IACA;AAAA,EACF;AACA,QAAM,sBAAsB,MAAM,YAAY,OAAO,gBAAgB;AACrE,QAAM,0BAA0B,MAAM;AAAA,IACpC;AAAA,IACA;AAAA,EACF;AAEA,QAAM,cAAc,OAAO,SAAiB;AAC1C,QAAI,CAAC,uBAAuB;AAC1B,YAAM,MAAM,oDAAoD;AAChE;AAAA,IACF;AACA,QAAI;AACF,sBAAgB,IAAI;AAGpB,YAAM,uBAAuB,YAAY;AAAA,QACvC,MAAM;AAAA,UACJ,gBAAgB;AAAA,UAChB;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF,CAAC;AAGD,YAAM,oBAAoB,YAAY;AAAA,QACpC,MAAM,EAAE,MAAM;AAAA,MAChB,CAAC;AAED,YAAM,QAAQ,mCAAmC;AACjD,YAAM,QAAQ;AACd,gBAAU;AAAA,IACZ,SAAS,OAAO;AACd,YAAM,eAAe,gBAAgB,KAAK;AAC1C,YAAM,MAAM,YAAY;AAAA,IAC1B,UAAE;AACA,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF;AAEA,MAAI,CAAC,uBAAuB;AAC1B,UAAM,MAAM,oDAAoD;AAChE,WAAO;AAAA,EACT;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAI;AAAA,MACJ,OAAM;AAAA,MACN,aAAa,uCAAuC,KAAK;AAAA,MACzD,gBAAgB;AAAA,MAChB,WAAW;AAAA,MACX,UAAU;AAAA,MACV,UAAU,YAAY;AACpB,YAAI;AACF,0BAAgB,IAAI;AACpB,gBAAM,OAAO,MAAM,wBAAwB,YAAY;AAAA,YACrD,MAAM;AAAA,cACJ;AAAA,cACA,SAAS;AAAA,YACX;AAAA,UACF,CAAC;AACD,mCAAyB,KAAK,MAAM,kBAAkB,IAAI;AAC1D,gBAAM,QAAQ,0BAA0B;AAAA,QAC1C,SAAS,OAAO;AACd,gBAAM,MAAM,gBAAgB,KAAK,CAAC;AAAA,QACpC,UAAE;AACA,0BAAgB,KAAK;AAAA,QACvB;AAAA,MACF;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -1,18 +1,15 @@
1
1
  import {
2
2
  authApi$
3
- } from "./chunk-QNPK2H5A.js";
3
+ } from "./chunk-F5SAYP67.js";
4
4
  import {
5
5
  defaultEntityQueryOptions
6
6
  } from "./chunk-NPW7D2HZ.js";
7
7
  import {
8
8
  IAMGuard
9
- } from "./chunk-ZIUAYN37.js";
10
- import {
11
- useApi,
12
- useConfig
13
- } from "./chunk-M2K6O5CN.js";
9
+ } from "./chunk-ZHRM4QOO.js";
14
10
 
15
11
  // src/components/iam/sessions-page.tsx
12
+ import { useApi, useConfig } from "@mesob/auth-react";
16
13
  import {
17
14
  EntityFilter,
18
15
  EntityHeader,
@@ -271,4 +268,4 @@ function SessionsPageContent() {
271
268
  export {
272
269
  SessionsPage
273
270
  };
274
- //# sourceMappingURL=chunk-LYCBL2W3.js.map
271
+ //# sourceMappingURL=chunk-Z47HLNM4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/iam/sessions-page.tsx","../src/pages/iam/sessions/_components/sessions-list.tsx","../src/pages/iam/sessions/_components/session-card.tsx"],"sourcesContent":["'use client';\n\nimport { useApi, useConfig } from '@mesob/auth-react';\nimport {\n EntityFilter,\n EntityHeader,\n EntitySort,\n EntityViewToggle,\n PageBody,\n PageContainer,\n useBreadcrumbs,\n useEntityPagination,\n useEntityParams,\n} from '@mesob/ui/components';\nimport { IconDeviceDesktop } from '@tabler/icons-react';\nimport { defaultEntityQueryOptions } from '../../lib/query-options';\nimport { SessionsList } from '../../pages/iam/sessions/_components/sessions-list';\nimport { IAMGuard } from './iam-guard';\n\nexport function SessionsPage() {\n return (\n <IAMGuard>\n <SessionsPageContent />\n </IAMGuard>\n );\n}\n\nfunction SessionsPageContent() {\n const { hooks } = useApi();\n const { config } = useConfig();\n const homeHref = config.navigation?.defaultRedirectUrl || '/';\n useBreadcrumbs({\n items: [\n { label: 'Home', href: homeHref },\n { label: 'IAM', href: '/iam/sessions' },\n { label: 'Sessions' },\n ],\n });\n const { queryConfig, params, setParams } = useEntityParams();\n\n const { data, isPending, isFetching } = hooks.useQuery(\n 'get',\n '/sessions',\n queryConfig,\n defaultEntityQueryOptions,\n );\n\n const isLoading = isPending || isFetching;\n const sessions = data?.sessions ?? [];\n const { total, pageCount } = useEntityPagination({\n items: sessions,\n total: data?.total,\n pageSize: params.pageSize,\n });\n\n return (\n <PageContainer className=\"flex flex-1 flex-col gap-4 p-4 pt-0\">\n <PageBody className=\"px-0\">\n <EntityHeader\n icon={<IconDeviceDesktop className=\"h-5 w-5\" />}\n title=\"Sessions\"\n filter={\n <EntityFilter\n options={[\n { label: 'All', value: '' },\n { label: 'Active', value: 'active' },\n { label: 'Expired', value: 'expired' },\n ]}\n placeholder=\"Filter\"\n />\n }\n sort={\n <EntitySort\n options={[\n { label: 'Created', value: 'createdAt' },\n { label: 'Updated', value: 'updatedAt' },\n { label: 'Expires', value: 'expiresAt' },\n ]}\n />\n }\n view={<EntityViewToggle views={['table', 'card']} />}\n />\n <SessionsList\n data={sessions}\n isLoading={isLoading}\n view={(params.view || 'table') as 'table' | 'card'}\n pageIndex={params.page - 1}\n pageSize={params.pageSize}\n pageCount={pageCount}\n totalRows={total}\n onPageChange={(p) => setParams({ page: p + 1 })}\n onPageSizeChange={(size) => setParams({ pageSize: size, page: 1 })}\n />\n </PageBody>\n </PageContainer>\n );\n}\n","'use client';\n\nimport {\n DataTableAction,\n DataTablePagination,\n DisplayTable,\n EntityEmptyState,\n EntityLoadingState,\n Tbody,\n Td,\n Th,\n Thead,\n Tr,\n} from '@mesob/ui/components';\nimport { IconCalendar, IconDeviceDesktop } from '@tabler/icons-react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { authApi$ } from '../../shared/page-helpers';\nimport { SessionCard } from './session-card';\nimport type { Session } from './sessions-data';\n\nconst TABLE_COLUMN_COUNT = 5;\n\nfunction SessionRevokeButton({ sessionId }: { sessionId: string }) {\n const qc = useQueryClient();\n const revoke = authApi$.useMutation('delete', '/sessions/{id}', {\n onSuccess: () => qc.invalidateQueries({ queryKey: ['get', '/sessions'] }),\n });\n return (\n <DataTableAction\n onClick={async () => {\n await revoke.mutateAsync({\n params: { path: { id: sessionId } },\n });\n }}\n disabled={revoke.isPending}\n aria-label=\"Revoke session\"\n />\n );\n}\n\ntype SessionsListProps = {\n data: Session[];\n isLoading?: boolean;\n view: 'table' | 'card';\n pageIndex: number;\n pageSize: number;\n pageCount: number;\n totalRows: number;\n onPageChange: (page: number) => void;\n onPageSizeChange: (size: number) => void;\n};\n\nexport function SessionsList({\n data,\n isLoading,\n view,\n pageIndex,\n pageSize,\n pageCount,\n totalRows,\n onPageChange,\n onPageSizeChange,\n}: SessionsListProps) {\n if (isLoading) {\n return (\n <EntityLoadingState\n view={view}\n rowCount={pageSize}\n columnCount={TABLE_COLUMN_COUNT}\n cardCount={pageSize}\n />\n );\n }\n if (totalRows === 0) {\n return (\n <EntityEmptyState\n icon={IconDeviceDesktop}\n entityName=\"session\"\n title=\"No active sessions\"\n description=\"Active sessions will appear here.\"\n />\n );\n }\n if (view === 'table') {\n return (\n <div className=\"space-y-4\">\n <DisplayTable withTableBorder>\n <Thead>\n <Tr>\n <Th>Created</Th>\n <Th>Expires</Th>\n <Th>Device</Th>\n <Th>IP</Th>\n <Th className=\"w-[50px]\" />\n </Tr>\n </Thead>\n <Tbody>\n {data.map((session) => (\n <Tr key={session.id} className=\"group\">\n <Td>\n {session.createdAt ? (\n <div className=\"flex items-center gap-1 text-muted-foreground\">\n <IconCalendar className=\"h-4 w-4\" />\n <span>\n {new Date(session.createdAt).toLocaleDateString()}{' '}\n {new Date(session.createdAt).toLocaleTimeString()}\n </span>\n </div>\n ) : (\n '—'\n )}\n </Td>\n <Td>{new Date(session.expiresAt).toLocaleDateString()}</Td>\n <Td>\n <span className=\"max-w-xs truncate block\">\n {session.userAgent || 'Unknown'}\n </span>\n </Td>\n <Td>\n <span className=\"font-mono text-sm\">\n {session.ip || 'Unknown'}\n </span>\n </Td>\n <Td>\n <SessionRevokeButton sessionId={session.id} />\n </Td>\n </Tr>\n ))}\n </Tbody>\n </DisplayTable>\n <DataTablePagination\n pageIndex={pageIndex}\n pageSize={pageSize}\n pageCount={pageCount}\n totalRows={totalRows}\n onPageChange={onPageChange}\n onPageSizeChange={onPageSizeChange}\n />\n </div>\n );\n }\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\">\n {data.map((s) => (\n <SessionCard key={s.id} session={s} />\n ))}\n </div>\n <DataTablePagination\n pageIndex={pageIndex}\n pageSize={pageSize}\n pageCount={pageCount}\n totalRows={totalRows}\n onPageChange={onPageChange}\n onPageSizeChange={onPageSizeChange}\n />\n </div>\n );\n}\n","'use client';\n\nimport { Button, Card, CardContent, CardHeader } from '@mesob/ui/components';\nimport { IconTrash } from '@tabler/icons-react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { authApi$ } from '../../shared/page-helpers';\nimport type { Session } from './sessions-data';\n\ntype SessionCardProps = { session: Session };\n\nexport function SessionCard({ session }: SessionCardProps) {\n const qc = useQueryClient();\n const revoke = authApi$.useMutation('delete', '/sessions/{id}', {\n onSuccess: () => qc.invalidateQueries({ queryKey: ['get', '/sessions'] }),\n });\n const created = session.createdAt ? new Date(session.createdAt) : null;\n return (\n <Card className=\"hover:shadow-md transition-shadow\">\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-start justify-between\">\n <p className=\"font-semibold\">\n {created\n ? `${created.toLocaleDateString()} ${created.toLocaleTimeString()}`\n : '—'}\n </p>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-destructive hover:text-destructive\"\n onClick={async () => {\n await revoke.mutateAsync({\n params: { path: { id: session.id } },\n });\n }}\n disabled={revoke.isPending}\n >\n <IconTrash className=\"h-4 w-4\" />\n </Button>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-1 text-sm\">\n <p className=\"text-muted-foreground\">\n Expires {new Date(session.expiresAt).toLocaleDateString()}\n </p>\n <p className=\"truncate\">{session.userAgent || 'Unknown device'}</p>\n <p className=\"font-mono\">{session.ip || 'Unknown IP'}</p>\n </CardContent>\n </Card>\n );\n}\n"],"mappings":"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","names":["IconDeviceDesktop","useQueryClient","jsx","jsxs","useQueryClient","jsx","jsxs","IconDeviceDesktop"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Grant
3
- } from "./chunk-KL2XZKDU.js";
3
+ } from "./chunk-Q5RYLX6Z.js";
4
4
 
5
5
  // src/components/iam/iam-guard.tsx
6
6
  import { jsx } from "react/jsx-runtime";
@@ -12,4 +12,4 @@ function IAMGuard({ fallback = null, children }) {
12
12
  export {
13
13
  IAMGuard
14
14
  };
15
- //# sourceMappingURL=chunk-ZIUAYN37.js.map
15
+ //# sourceMappingURL=chunk-ZHRM4QOO.js.map
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  import {
3
3
  Countdown
4
- } from "../../chunk-J7NROVB4.js";
5
- import "../../chunk-NPA7L57G.js";
6
- import "../../chunk-M2K6O5CN.js";
4
+ } from "../../chunk-CY3MODZU.js";
5
+ import "../../chunk-WG5H5PTL.js";
6
+ import "../../chunk-SEBNQYIE.js";
7
7
  export {
8
8
  Countdown
9
9
  };
@@ -1,13 +1,14 @@
1
1
  "use client";
2
2
  import {
3
3
  ForgotPassword
4
- } from "../../chunk-22WSB5V2.js";
4
+ } from "../../chunk-RI647FTV.js";
5
5
  import "../../chunk-YR6SS2CC.js";
6
6
  import "../../chunk-DBTKXQV7.js";
7
7
  import "../../chunk-W7UHDTBI.js";
8
+ import "../../chunk-6YHUCPJ4.js";
8
9
  import "../../chunk-DPH2PHK3.js";
9
- import "../../chunk-NPA7L57G.js";
10
- import "../../chunk-M2K6O5CN.js";
10
+ import "../../chunk-WG5H5PTL.js";
11
+ import "../../chunk-SEBNQYIE.js";
11
12
  export {
12
13
  ForgotPassword
13
14
  };
@@ -1,11 +1,12 @@
1
1
  "use client";
2
2
  import {
3
3
  ResetPasswordForm
4
- } from "../../chunk-2BF2JIDK.js";
4
+ } from "../../chunk-WM2ETQIY.js";
5
5
  import "../../chunk-W7UHDTBI.js";
6
+ import "../../chunk-6YHUCPJ4.js";
6
7
  import "../../chunk-DPH2PHK3.js";
7
- import "../../chunk-NPA7L57G.js";
8
- import "../../chunk-M2K6O5CN.js";
8
+ import "../../chunk-WG5H5PTL.js";
9
+ import "../../chunk-SEBNQYIE.js";
9
10
  export {
10
11
  ResetPasswordForm
11
12
  };
@@ -1,13 +1,14 @@
1
1
  "use client";
2
2
  import {
3
3
  SetPassword
4
- } from "../../chunk-VWGOCWRF.js";
4
+ } from "../../chunk-X6FJMSL3.js";
5
5
  import "../../chunk-YR6SS2CC.js";
6
6
  import "../../chunk-DBTKXQV7.js";
7
7
  import "../../chunk-W7UHDTBI.js";
8
+ import "../../chunk-6YHUCPJ4.js";
8
9
  import "../../chunk-DPH2PHK3.js";
9
- import "../../chunk-NPA7L57G.js";
10
- import "../../chunk-M2K6O5CN.js";
10
+ import "../../chunk-WG5H5PTL.js";
11
+ import "../../chunk-SEBNQYIE.js";
11
12
  export {
12
13
  SetPassword
13
14
  };
@@ -1,13 +1,14 @@
1
1
  "use client";
2
2
  import {
3
3
  SignIn
4
- } from "../../chunk-25DJGLNU.js";
4
+ } from "../../chunk-FWYDZVFS.js";
5
5
  import "../../chunk-YR6SS2CC.js";
6
6
  import "../../chunk-DBTKXQV7.js";
7
7
  import "../../chunk-W7UHDTBI.js";
8
+ import "../../chunk-6YHUCPJ4.js";
8
9
  import "../../chunk-DPH2PHK3.js";
9
- import "../../chunk-NPA7L57G.js";
10
- import "../../chunk-M2K6O5CN.js";
10
+ import "../../chunk-WG5H5PTL.js";
11
+ import "../../chunk-SEBNQYIE.js";
11
12
  export {
12
13
  SignIn
13
14
  };
@@ -1,13 +1,14 @@
1
1
  "use client";
2
2
  import {
3
3
  SignUp
4
- } from "../../chunk-WY2F7475.js";
4
+ } from "../../chunk-NNYLSQ2X.js";
5
5
  import "../../chunk-YR6SS2CC.js";
6
6
  import "../../chunk-DBTKXQV7.js";
7
7
  import "../../chunk-W7UHDTBI.js";
8
+ import "../../chunk-6YHUCPJ4.js";
8
9
  import "../../chunk-DPH2PHK3.js";
9
- import "../../chunk-NPA7L57G.js";
10
- import "../../chunk-M2K6O5CN.js";
10
+ import "../../chunk-WG5H5PTL.js";
11
+ import "../../chunk-SEBNQYIE.js";
11
12
  export {
12
13
  SignUp
13
14
  };
@@ -1,10 +1,10 @@
1
1
  "use client";
2
2
  import {
3
3
  VerificationForm
4
- } from "../../chunk-GP4XI5KB.js";
5
- import "../../chunk-J7NROVB4.js";
6
- import "../../chunk-NPA7L57G.js";
7
- import "../../chunk-M2K6O5CN.js";
4
+ } from "../../chunk-L5UKZAA4.js";
5
+ import "../../chunk-CY3MODZU.js";
6
+ import "../../chunk-WG5H5PTL.js";
7
+ import "../../chunk-SEBNQYIE.js";
8
8
  export {
9
9
  VerificationForm
10
10
  };
@@ -1,13 +1,14 @@
1
1
  "use client";
2
2
  import {
3
3
  VerifyEmail
4
- } from "../../chunk-CBR5NTFM.js";
5
- import "../../chunk-GP4XI5KB.js";
6
- import "../../chunk-J7NROVB4.js";
4
+ } from "../../chunk-OCFX4MBQ.js";
5
+ import "../../chunk-L5UKZAA4.js";
6
+ import "../../chunk-CY3MODZU.js";
7
7
  import "../../chunk-W7UHDTBI.js";
8
+ import "../../chunk-6YHUCPJ4.js";
8
9
  import "../../chunk-DPH2PHK3.js";
9
- import "../../chunk-NPA7L57G.js";
10
- import "../../chunk-M2K6O5CN.js";
10
+ import "../../chunk-WG5H5PTL.js";
11
+ import "../../chunk-SEBNQYIE.js";
11
12
  export {
12
13
  VerifyEmail
13
14
  };
@@ -1,13 +1,14 @@
1
1
  "use client";
2
2
  import {
3
3
  VerifyPhone
4
- } from "../../chunk-B7BS57X7.js";
5
- import "../../chunk-GP4XI5KB.js";
6
- import "../../chunk-J7NROVB4.js";
4
+ } from "../../chunk-7FSFDTQR.js";
5
+ import "../../chunk-L5UKZAA4.js";
6
+ import "../../chunk-CY3MODZU.js";
7
7
  import "../../chunk-W7UHDTBI.js";
8
+ import "../../chunk-6YHUCPJ4.js";
8
9
  import "../../chunk-DPH2PHK3.js";
9
- import "../../chunk-NPA7L57G.js";
10
- import "../../chunk-M2K6O5CN.js";
10
+ import "../../chunk-WG5H5PTL.js";
11
+ import "../../chunk-SEBNQYIE.js";
11
12
  export {
12
13
  VerifyPhone
13
14
  };
@@ -1,8 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  Deny
4
- } from "../../chunk-OT2H5EHA.js";
5
- import "../../chunk-M2K6O5CN.js";
4
+ } from "../../chunk-RGGHVAAK.js";
6
5
  export {
7
6
  Deny
8
7
  };
@@ -1,8 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  Grant
4
- } from "../../chunk-KL2XZKDU.js";
5
- import "../../chunk-M2K6O5CN.js";
4
+ } from "../../chunk-Q5RYLX6Z.js";
6
5
  export {
7
6
  Grant
8
7
  };