@mesob/auth-react 0.4.1 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-KWG4DSB5.js → chunk-3HV5KQFZ.js} +2 -2
- package/dist/{chunk-MELNS4QH.js → chunk-4BFHC4JI.js} +2 -2
- package/dist/{chunk-JUHBVG5Q.js → chunk-4QMUNU5E.js} +3 -3
- package/dist/{chunk-ISNNPMF7.js → chunk-5NKPFZ2Q.js} +3 -3
- package/dist/{chunk-35TCGAW3.js → chunk-6F5LEXYI.js} +2 -2
- package/dist/{chunk-S3CXCCKL.js → chunk-ABF34UFW.js} +7 -4
- package/dist/chunk-ABF34UFW.js.map +1 -0
- package/dist/{chunk-C26NPUPI.js → chunk-AKEBT5PJ.js} +2 -2
- package/dist/{chunk-GP7GIUI3.js → chunk-BMZTYXGO.js} +2 -2
- package/dist/{chunk-EQ4346FE.js → chunk-CC3HI442.js} +3 -3
- package/dist/{chunk-L4CGIO2I.js → chunk-CDECLPL4.js} +8 -5
- package/dist/chunk-CDECLPL4.js.map +1 -0
- package/dist/{chunk-JZZJCBAE.js → chunk-DXTZQ2VY.js} +2 -2
- package/dist/{chunk-SOCZK4CV.js → chunk-EGZYJMSA.js} +7 -4
- package/dist/chunk-EGZYJMSA.js.map +1 -0
- package/dist/{chunk-ZESFGO3K.js → chunk-EKZYBYZQ.js} +2 -2
- package/dist/{chunk-GXKBVCVS.js → chunk-F6IMR5XS.js} +4 -3
- package/dist/chunk-F6IMR5XS.js.map +1 -0
- package/dist/{chunk-II5MLBSB.js → chunk-GB3Q5IWT.js} +4 -4
- package/dist/{chunk-FHOLUOOZ.js → chunk-GIGXCAGH.js} +3 -3
- package/dist/{chunk-PSRIZMWJ.js → chunk-GYFHM72X.js} +3 -3
- package/dist/{chunk-GRT6EBR6.js → chunk-HH347MJI.js} +2 -2
- package/dist/{chunk-OHIIMUQC.js → chunk-HM4MAF2I.js} +3 -3
- package/dist/{chunk-JB6XVST4.js → chunk-JED4SG3W.js} +8 -5
- package/dist/chunk-JED4SG3W.js.map +1 -0
- package/dist/{chunk-T6P7UHVP.js → chunk-JRHJNMG3.js} +2 -2
- package/dist/{chunk-MS2JUZ3N.js → chunk-KM5GOJ75.js} +4 -4
- package/dist/{chunk-C2KFZ57H.js → chunk-KTZSXSHV.js} +2 -2
- package/dist/{chunk-OQGJX37L.js → chunk-L2W6FXSZ.js} +2 -2
- package/dist/{chunk-OAN4EXU4.js → chunk-M6ZUEZJT.js} +3 -3
- package/dist/{chunk-OYHH7HQG.js → chunk-NFBOIG3D.js} +5 -5
- package/dist/{chunk-ZG6WFZHX.js → chunk-ODDTS4RN.js} +3 -3
- package/dist/{chunk-QNCE2B5O.js → chunk-OK7WPIHQ.js} +2 -2
- package/dist/{chunk-FFR5UHTS.js → chunk-PS2KBGDB.js} +3 -3
- package/dist/{chunk-3BZC4VVD.js → chunk-QJVZHT27.js} +3 -3
- package/dist/{chunk-AIMD6R6U.js → chunk-REHGRIUT.js} +2 -2
- package/dist/{chunk-5F5FZMHE.js → chunk-RJBNA7OH.js} +4 -4
- package/dist/{chunk-HOO2VLNM.js → chunk-RXHL7LUV.js} +3 -3
- package/dist/{chunk-OFLSINVU.js → chunk-RZFSMM3X.js} +7 -4
- package/dist/chunk-RZFSMM3X.js.map +1 -0
- package/dist/{chunk-45UCLKH2.js → chunk-S3KIMVDE.js} +4 -4
- package/dist/{chunk-NJPNTAAT.js → chunk-SJHJ63HK.js} +2 -2
- package/dist/{chunk-LSYKVFJA.js → chunk-SYT5Z7EF.js} +2 -2
- package/dist/{chunk-BZ42QPXE.js → chunk-UCNNUST6.js} +2 -2
- package/dist/{chunk-RLPZFLAS.js → chunk-V4VX55TT.js} +2 -2
- package/dist/{chunk-LZR4YUDV.js → chunk-VA2XUED4.js} +2 -2
- package/dist/{chunk-YZ264S2L.js → chunk-VU4Z2XSQ.js} +3 -3
- package/dist/{chunk-FAHN63DA.js → chunk-WD2COCQW.js} +8 -5
- package/dist/chunk-WD2COCQW.js.map +1 -0
- package/dist/{chunk-72YRO3A7.js → chunk-XCJ3ZH7D.js} +8 -5
- package/dist/chunk-XCJ3ZH7D.js.map +1 -0
- package/dist/{chunk-G7SCXCCM.js → chunk-XEFPJKBB.js} +2 -2
- package/dist/{chunk-UXOZ2TME.js → chunk-YHZLPAYD.js} +2 -2
- package/dist/{chunk-FBABIA5J.js → chunk-YLWCA2WK.js} +4 -11
- package/dist/chunk-YLWCA2WK.js.map +1 -0
- package/dist/{chunk-BGSHXIHI.js → chunk-ZE3R37PI.js} +9 -6
- package/dist/chunk-ZE3R37PI.js.map +1 -0
- package/dist/components/auth/countdown.js +3 -3
- package/dist/components/auth/forgot-password.js +3 -3
- package/dist/components/auth/reset-password-form.js +3 -3
- package/dist/components/auth/set-password.js +3 -3
- package/dist/components/auth/sign-in.js +3 -3
- package/dist/components/auth/sign-up.js +3 -3
- package/dist/components/auth/verification-form.js +4 -4
- package/dist/components/auth/verify-email.js +5 -5
- package/dist/components/auth/verify-phone.js +5 -5
- package/dist/components/authorization/deny.js +2 -2
- package/dist/components/authorization/grant.js +2 -2
- package/dist/components/iam/permission-selector.js +2 -2
- package/dist/components/iam/permissions-page.js +2 -2
- package/dist/components/iam/permissions.js +2 -2
- package/dist/components/iam/role-detail-layout.js +2 -2
- package/dist/components/iam/role-detail-page.js +2 -2
- package/dist/components/iam/role-permissions-page.js +3 -3
- package/dist/components/iam/roles-page.js +5 -5
- package/dist/components/iam/roles.js +2 -2
- package/dist/components/iam/sessions-page.js +4 -4
- package/dist/components/iam/sessions.js +2 -2
- package/dist/components/iam/tenants-page.js +4 -4
- package/dist/components/iam/tenants.js +2 -2
- package/dist/components/iam/users-page.js +5 -5
- package/dist/components/iam/users.js +2 -2
- package/dist/components/profile/account.js +2 -2
- package/dist/components/profile/change-email-form.js +8 -8
- package/dist/components/profile/change-password-form.js +2 -2
- package/dist/components/profile/change-phone-form.js +8 -8
- package/dist/components/profile/otp-verification-modal.js +5 -5
- package/dist/components/profile/profile-layout.js +3 -3
- package/dist/components/profile/request-change-email-form.js +2 -2
- package/dist/components/profile/request-change-phone-form.js +2 -2
- package/dist/components/profile/security.js +13 -13
- package/dist/components/profile/verify-change-email-form.js +6 -6
- package/dist/components/profile/verify-change-phone-form.js +6 -6
- package/dist/index.js +47 -47
- package/dist/pages/auth/forgot-password.js +3 -3
- package/dist/pages/auth/layout.js +4 -3
- package/dist/pages/auth/layout.js.map +1 -1
- package/dist/pages/auth/reset-password.js +3 -3
- package/dist/pages/auth/set-password.js +3 -3
- package/dist/pages/auth/sign-in.js +3 -3
- package/dist/pages/auth/sign-up.js +3 -3
- package/dist/pages/auth/verify-email.js +5 -5
- package/dist/pages/auth/verify-phone.js +5 -5
- package/dist/pages/iam/permissions.js +2 -2
- package/dist/pages/iam/role-detail-layout.js +2 -2
- package/dist/pages/iam/role-detail.js +2 -2
- package/dist/pages/iam/role-permissions.js +3 -3
- package/dist/pages/iam/role-users.js +5 -5
- package/dist/pages/iam/roles.js +5 -5
- package/dist/pages/iam/sessions.js +4 -4
- package/dist/pages/iam/tenant-detail.js +2 -2
- package/dist/pages/iam/tenants.js +4 -4
- package/dist/pages/iam/user-activity.js +5 -5
- package/dist/pages/iam/user-detail-layout.js +2 -2
- package/dist/pages/iam/user-detail.js +2 -2
- package/dist/pages/iam/users.js +5 -5
- package/dist/pages/profile/account.js +7 -3
- package/dist/pages/profile/account.js.map +1 -1
- package/dist/pages/profile/layout.js +3 -3
- package/dist/pages/profile/security.js +18 -14
- package/dist/pages/profile/security.js.map +1 -1
- package/package.json +3 -3
- package/dist/chunk-72YRO3A7.js.map +0 -1
- package/dist/chunk-BGSHXIHI.js.map +0 -1
- package/dist/chunk-FAHN63DA.js.map +0 -1
- package/dist/chunk-FBABIA5J.js.map +0 -1
- package/dist/chunk-GXKBVCVS.js.map +0 -1
- package/dist/chunk-JB6XVST4.js.map +0 -1
- package/dist/chunk-L4CGIO2I.js.map +0 -1
- package/dist/chunk-OFLSINVU.js.map +0 -1
- package/dist/chunk-S3CXCCKL.js.map +0 -1
- package/dist/chunk-SOCZK4CV.js.map +0 -1
- /package/dist/{chunk-KWG4DSB5.js.map → chunk-3HV5KQFZ.js.map} +0 -0
- /package/dist/{chunk-MELNS4QH.js.map → chunk-4BFHC4JI.js.map} +0 -0
- /package/dist/{chunk-JUHBVG5Q.js.map → chunk-4QMUNU5E.js.map} +0 -0
- /package/dist/{chunk-ISNNPMF7.js.map → chunk-5NKPFZ2Q.js.map} +0 -0
- /package/dist/{chunk-35TCGAW3.js.map → chunk-6F5LEXYI.js.map} +0 -0
- /package/dist/{chunk-C26NPUPI.js.map → chunk-AKEBT5PJ.js.map} +0 -0
- /package/dist/{chunk-GP7GIUI3.js.map → chunk-BMZTYXGO.js.map} +0 -0
- /package/dist/{chunk-EQ4346FE.js.map → chunk-CC3HI442.js.map} +0 -0
- /package/dist/{chunk-JZZJCBAE.js.map → chunk-DXTZQ2VY.js.map} +0 -0
- /package/dist/{chunk-ZESFGO3K.js.map → chunk-EKZYBYZQ.js.map} +0 -0
- /package/dist/{chunk-II5MLBSB.js.map → chunk-GB3Q5IWT.js.map} +0 -0
- /package/dist/{chunk-FHOLUOOZ.js.map → chunk-GIGXCAGH.js.map} +0 -0
- /package/dist/{chunk-PSRIZMWJ.js.map → chunk-GYFHM72X.js.map} +0 -0
- /package/dist/{chunk-GRT6EBR6.js.map → chunk-HH347MJI.js.map} +0 -0
- /package/dist/{chunk-OHIIMUQC.js.map → chunk-HM4MAF2I.js.map} +0 -0
- /package/dist/{chunk-T6P7UHVP.js.map → chunk-JRHJNMG3.js.map} +0 -0
- /package/dist/{chunk-MS2JUZ3N.js.map → chunk-KM5GOJ75.js.map} +0 -0
- /package/dist/{chunk-C2KFZ57H.js.map → chunk-KTZSXSHV.js.map} +0 -0
- /package/dist/{chunk-OQGJX37L.js.map → chunk-L2W6FXSZ.js.map} +0 -0
- /package/dist/{chunk-OAN4EXU4.js.map → chunk-M6ZUEZJT.js.map} +0 -0
- /package/dist/{chunk-OYHH7HQG.js.map → chunk-NFBOIG3D.js.map} +0 -0
- /package/dist/{chunk-ZG6WFZHX.js.map → chunk-ODDTS4RN.js.map} +0 -0
- /package/dist/{chunk-QNCE2B5O.js.map → chunk-OK7WPIHQ.js.map} +0 -0
- /package/dist/{chunk-FFR5UHTS.js.map → chunk-PS2KBGDB.js.map} +0 -0
- /package/dist/{chunk-3BZC4VVD.js.map → chunk-QJVZHT27.js.map} +0 -0
- /package/dist/{chunk-AIMD6R6U.js.map → chunk-REHGRIUT.js.map} +0 -0
- /package/dist/{chunk-5F5FZMHE.js.map → chunk-RJBNA7OH.js.map} +0 -0
- /package/dist/{chunk-HOO2VLNM.js.map → chunk-RXHL7LUV.js.map} +0 -0
- /package/dist/{chunk-45UCLKH2.js.map → chunk-S3KIMVDE.js.map} +0 -0
- /package/dist/{chunk-NJPNTAAT.js.map → chunk-SJHJ63HK.js.map} +0 -0
- /package/dist/{chunk-LSYKVFJA.js.map → chunk-SYT5Z7EF.js.map} +0 -0
- /package/dist/{chunk-BZ42QPXE.js.map → chunk-UCNNUST6.js.map} +0 -0
- /package/dist/{chunk-RLPZFLAS.js.map → chunk-V4VX55TT.js.map} +0 -0
- /package/dist/{chunk-LZR4YUDV.js.map → chunk-VA2XUED4.js.map} +0 -0
- /package/dist/{chunk-YZ264S2L.js.map → chunk-VU4Z2XSQ.js.map} +0 -0
- /package/dist/{chunk-G7SCXCCM.js.map → chunk-XEFPJKBB.js.map} +0 -0
- /package/dist/{chunk-UXOZ2TME.js.map → chunk-YHZLPAYD.js.map} +0 -0
|
@@ -6,11 +6,11 @@ import {
|
|
|
6
6
|
} from "./chunk-DPH2PHK3.js";
|
|
7
7
|
import {
|
|
8
8
|
useTranslator
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-OK7WPIHQ.js";
|
|
10
10
|
import {
|
|
11
11
|
useApi,
|
|
12
12
|
useConfig
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-XCJ3ZH7D.js";
|
|
14
14
|
|
|
15
15
|
// src/components/auth/sign-up.tsx
|
|
16
16
|
import { zodResolver } from "@hookform/resolvers/zod";
|
|
@@ -307,4 +307,4 @@ var SignUp = ({
|
|
|
307
307
|
export {
|
|
308
308
|
SignUp
|
|
309
309
|
};
|
|
310
|
-
//# sourceMappingURL=chunk-
|
|
310
|
+
//# sourceMappingURL=chunk-M6ZUEZJT.js.map
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ChangePhoneForm
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-RJBNA7OH.js";
|
|
4
4
|
import {
|
|
5
5
|
ChangeEmailForm
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-KM5GOJ75.js";
|
|
7
7
|
import {
|
|
8
8
|
ChangePasswordForm
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-L2W6FXSZ.js";
|
|
10
10
|
import {
|
|
11
11
|
useSession
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-XCJ3ZH7D.js";
|
|
13
13
|
|
|
14
14
|
// src/components/profile/security.tsx
|
|
15
15
|
import { Badge, Card, CardContent, Separator } from "@mesob/ui/components";
|
|
@@ -62,4 +62,4 @@ function Security() {
|
|
|
62
62
|
export {
|
|
63
63
|
Security
|
|
64
64
|
};
|
|
65
|
-
//# sourceMappingURL=chunk-
|
|
65
|
+
//# sourceMappingURL=chunk-NFBOIG3D.js.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
OtpVerificationModal
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-3HV5KQFZ.js";
|
|
4
4
|
import {
|
|
5
5
|
useApi,
|
|
6
6
|
useSession
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-XCJ3ZH7D.js";
|
|
8
8
|
|
|
9
9
|
// src/components/profile/verify-change-phone-form.tsx
|
|
10
10
|
import { useState } from "react";
|
|
@@ -140,4 +140,4 @@ function VerifyChangePhoneForm({
|
|
|
140
140
|
export {
|
|
141
141
|
VerifyChangePhoneForm
|
|
142
142
|
};
|
|
143
|
-
//# sourceMappingURL=chunk-
|
|
143
|
+
//# sourceMappingURL=chunk-ODDTS4RN.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createTranslator,
|
|
3
3
|
useConfig
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-XCJ3ZH7D.js";
|
|
5
5
|
|
|
6
6
|
// src/hooks/use-translator.ts
|
|
7
7
|
import { useMesob } from "@mesob/ui/providers";
|
|
@@ -20,4 +20,4 @@ function useTranslator(namespace) {
|
|
|
20
20
|
export {
|
|
21
21
|
useTranslator
|
|
22
22
|
};
|
|
23
|
-
//# sourceMappingURL=chunk-
|
|
23
|
+
//# sourceMappingURL=chunk-OK7WPIHQ.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Countdown
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-BMZTYXGO.js";
|
|
4
4
|
import {
|
|
5
5
|
useTranslator
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-OK7WPIHQ.js";
|
|
7
7
|
|
|
8
8
|
// src/components/auth/verification-form.tsx
|
|
9
9
|
import { zodResolver } from "@hookform/resolvers/zod";
|
|
@@ -96,4 +96,4 @@ var VerificationForm = ({
|
|
|
96
96
|
export {
|
|
97
97
|
VerificationForm
|
|
98
98
|
};
|
|
99
|
-
//# sourceMappingURL=chunk-
|
|
99
|
+
//# sourceMappingURL=chunk-PS2KBGDB.js.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
AppLink,
|
|
3
3
|
useNavigate
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-JRHJNMG3.js";
|
|
5
5
|
import {
|
|
6
6
|
useApi
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-XCJ3ZH7D.js";
|
|
8
8
|
|
|
9
9
|
// src/pages/iam/shared/page-helpers.tsx
|
|
10
10
|
import { jsx } from "react/jsx-runtime";
|
|
@@ -33,4 +33,4 @@ export {
|
|
|
33
33
|
Link,
|
|
34
34
|
useRouter
|
|
35
35
|
};
|
|
36
|
-
//# sourceMappingURL=chunk-
|
|
36
|
+
//# sourceMappingURL=chunk-QJVZHT27.js.map
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
Link,
|
|
3
3
|
authApi$,
|
|
4
4
|
useRouter
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-QJVZHT27.js";
|
|
6
6
|
|
|
7
7
|
// src/pages/iam/roles/_components/role-form.tsx
|
|
8
8
|
import { zodResolver } from "@hookform/resolvers/zod";
|
|
@@ -463,4 +463,4 @@ export {
|
|
|
463
463
|
RoleCard,
|
|
464
464
|
RolesList
|
|
465
465
|
};
|
|
466
|
-
//# sourceMappingURL=chunk-
|
|
466
|
+
//# sourceMappingURL=chunk-REHGRIUT.js.map
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
VerifyChangePhoneForm
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-ODDTS4RN.js";
|
|
4
4
|
import {
|
|
5
5
|
RequestChangePhoneForm
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-AKEBT5PJ.js";
|
|
7
7
|
import {
|
|
8
8
|
useSession
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-XCJ3ZH7D.js";
|
|
10
10
|
|
|
11
11
|
// src/components/profile/change-phone-form.tsx
|
|
12
12
|
import {
|
|
@@ -91,4 +91,4 @@ function ChangePhoneForm() {
|
|
|
91
91
|
export {
|
|
92
92
|
ChangePhoneForm
|
|
93
93
|
};
|
|
94
|
-
//# sourceMappingURL=chunk-
|
|
94
|
+
//# sourceMappingURL=chunk-RJBNA7OH.js.map
|
|
@@ -9,11 +9,11 @@ import {
|
|
|
9
9
|
} from "./chunk-DPH2PHK3.js";
|
|
10
10
|
import {
|
|
11
11
|
useTranslator
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-OK7WPIHQ.js";
|
|
13
13
|
import {
|
|
14
14
|
useApi,
|
|
15
15
|
useConfig
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-XCJ3ZH7D.js";
|
|
17
17
|
|
|
18
18
|
// src/components/auth/set-password.tsx
|
|
19
19
|
import { zodResolver } from "@hookform/resolvers/zod";
|
|
@@ -302,4 +302,4 @@ var SetPassword = function SetPassword2({
|
|
|
302
302
|
export {
|
|
303
303
|
SetPassword
|
|
304
304
|
};
|
|
305
|
-
//# sourceMappingURL=chunk-
|
|
305
|
+
//# sourceMappingURL=chunk-RXHL7LUV.js.map
|
|
@@ -2,8 +2,9 @@ import {
|
|
|
2
2
|
str
|
|
3
3
|
} from "./chunk-LNG736CV.js";
|
|
4
4
|
import {
|
|
5
|
-
useApi
|
|
6
|
-
|
|
5
|
+
useApi,
|
|
6
|
+
useConfig
|
|
7
|
+
} from "./chunk-XCJ3ZH7D.js";
|
|
7
8
|
|
|
8
9
|
// src/pages/iam/tenants/tenant-detail-page-content.tsx
|
|
9
10
|
import {
|
|
@@ -24,6 +25,8 @@ function TenantDetailPageContent({
|
|
|
24
25
|
tenantId
|
|
25
26
|
}) {
|
|
26
27
|
const { hooks } = useApi();
|
|
28
|
+
const { config } = useConfig();
|
|
29
|
+
const homeHref = config.navigation?.defaultRedirectUrl || "/";
|
|
27
30
|
const qc = useQueryClient();
|
|
28
31
|
const { data, isLoading } = hooks.useQuery(
|
|
29
32
|
"get",
|
|
@@ -41,7 +44,7 @@ function TenantDetailPageContent({
|
|
|
41
44
|
const title = tenant ? str(tenant.name) || tenant.id : tenantId ?? "Tenant";
|
|
42
45
|
useBreadcrumbs({
|
|
43
46
|
items: [
|
|
44
|
-
{ label: "Home", href:
|
|
47
|
+
{ label: "Home", href: homeHref },
|
|
45
48
|
{ label: "IAM", href: "/iam" },
|
|
46
49
|
{ label: "Tenants", href: "/iam/tenants" },
|
|
47
50
|
{ label: title }
|
|
@@ -135,4 +138,4 @@ function TenantDetailPageContent({
|
|
|
135
138
|
export {
|
|
136
139
|
TenantDetailPageContent
|
|
137
140
|
};
|
|
138
|
-
//# sourceMappingURL=chunk-
|
|
141
|
+
//# sourceMappingURL=chunk-RZFSMM3X.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/pages/iam/tenants/tenant-detail-page-content.tsx"],"sourcesContent":["'use client';\n\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n EntityDetailHeader,\n PageContainer,\n type TabItem,\n useBreadcrumbs,\n} from '@mesob/ui/components';\nimport { IconBuilding } from '@tabler/icons-react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useMemo } from 'react';\nimport { useApi, useConfig } from '../../../provider';\nimport { str } from './_components/tenants-data';\n\ntype TenantDetailPageContentProps = {\n tenantId: string;\n};\n\nexport function TenantDetailPageContent({\n tenantId,\n}: TenantDetailPageContentProps) {\n const { hooks } = useApi();\n const { config } = useConfig();\n const homeHref = config.navigation?.defaultRedirectUrl || '/';\n const qc = useQueryClient();\n\n const { data, isLoading } = hooks.useQuery(\n 'get',\n '/tenants/{id}',\n { params: { path: { id: tenantId } } },\n { enabled: !!tenantId },\n );\n const tenant = data?.tenant;\n\n const toggleActive = hooks.useMutation('put', '/tenants/{id}', {\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: ['get', '/tenants/{id}'] });\n qc.invalidateQueries({ queryKey: ['get', '/tenants'] });\n },\n });\n\n const title = tenant ? str(tenant.name) || tenant.id : (tenantId ?? 'Tenant');\n useBreadcrumbs({\n items: [\n { label: 'Home', href: homeHref },\n { label: 'IAM', href: '/iam' },\n { label: 'Tenants', href: '/iam/tenants' },\n { label: title },\n ],\n });\n\n const tabs: TabItem[] = useMemo(\n () => [\n {\n value: 'detail',\n name: 'Detail',\n content: (\n <Card className=\"mt-4\">\n <CardHeader>\n <CardTitle>Tenant details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2 text-sm\">\n {tenant && (\n <>\n <p>\n <span className=\"text-muted-foreground\">Name:</span>{' '}\n {str(tenant.name) || '—'}\n </p>\n <p>\n <span className=\"text-muted-foreground\">Description:</span>{' '}\n {str(tenant.description) || '—'}\n </p>\n <p>\n <span className=\"text-muted-foreground\">Language:</span>{' '}\n {tenant.defaultLanguage ?? '—'}\n </p>\n <p>\n <span className=\"text-muted-foreground\">Currency:</span>{' '}\n {tenant.defaultCurrency ?? '—'}\n </p>\n <p>\n <span className=\"text-muted-foreground\">Timezone:</span>{' '}\n {tenant.timezone ?? '—'}\n </p>\n </>\n )}\n </CardContent>\n </Card>\n ),\n },\n {\n value: 'theme',\n name: 'Theme',\n content: (\n <Card className=\"mt-4\">\n <CardHeader>\n <CardTitle>Theme</CardTitle>\n </CardHeader>\n <CardContent className=\"text-muted-foreground text-sm\">\n Theme settings (placeholder)\n </CardContent>\n </Card>\n ),\n },\n {\n value: 'settings',\n name: 'Settings',\n content: (\n <Card className=\"mt-4\">\n <CardHeader>\n <CardTitle>Settings</CardTitle>\n </CardHeader>\n <CardContent className=\"text-muted-foreground text-sm\">\n Tenant settings (placeholder)\n </CardContent>\n </Card>\n ),\n },\n ],\n [tenant],\n );\n\n const actions = tenant && (\n <Button\n variant={tenant.isActive ? 'secondary' : 'default'}\n size=\"sm\"\n onClick={() =>\n toggleActive.mutate({\n params: { path: { id: tenantId } },\n body: { isActive: !tenant.isActive },\n })\n }\n disabled={toggleActive.isPending}\n >\n {tenant.isActive ? 'Deactivate' : 'Activate'}\n </Button>\n );\n\n if (!tenantId) {\n return null;\n }\n if (isLoading || !tenant) {\n return (\n <div className=\"flex flex-1 flex-col gap-4 p-4 pt-0\">\n <div className=\"h-24 animate-pulse rounded-xl bg-muted\" />\n </div>\n );\n }\n\n return (\n <PageContainer className=\"flex flex-1 flex-col gap-4 p-4 pt-0\">\n <EntityDetailHeader\n title={title}\n icon={<IconBuilding className=\"h-5 w-5 text-muted-foreground\" />}\n actions={actions}\n tabs={tabs}\n />\n </PageContainer>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
VerificationForm
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-PS2KBGDB.js";
|
|
4
4
|
import {
|
|
5
5
|
handleError
|
|
6
6
|
} from "./chunk-55BMNC4S.js";
|
|
@@ -9,11 +9,11 @@ import {
|
|
|
9
9
|
} from "./chunk-DPH2PHK3.js";
|
|
10
10
|
import {
|
|
11
11
|
useTranslator
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-OK7WPIHQ.js";
|
|
13
13
|
import {
|
|
14
14
|
useApi,
|
|
15
15
|
useConfig
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-XCJ3ZH7D.js";
|
|
17
17
|
|
|
18
18
|
// src/components/auth/verify-phone.tsx
|
|
19
19
|
import { Alert, AlertDescription, AlertTitle } from "@mesob/ui/components";
|
|
@@ -185,4 +185,4 @@ var VerifyPhone = ({
|
|
|
185
185
|
export {
|
|
186
186
|
VerifyPhone
|
|
187
187
|
};
|
|
188
|
-
//# sourceMappingURL=chunk-
|
|
188
|
+
//# sourceMappingURL=chunk-S3KIMVDE.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
useApi
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-XCJ3ZH7D.js";
|
|
4
4
|
|
|
5
5
|
// src/pages/iam/users/_components/user-detail-page-content.tsx
|
|
6
6
|
import {
|
|
@@ -65,4 +65,4 @@ function UserDetailPageContent({ userId }) {
|
|
|
65
65
|
export {
|
|
66
66
|
UserDetailPageContent
|
|
67
67
|
};
|
|
68
|
-
//# sourceMappingURL=chunk-
|
|
68
|
+
//# sourceMappingURL=chunk-SJHJ63HK.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-TFVBER3Y.js";
|
|
4
4
|
import {
|
|
5
5
|
useApi
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-XCJ3ZH7D.js";
|
|
7
7
|
|
|
8
8
|
// src/components/iam/sessions.tsx
|
|
9
9
|
import { Button } from "@mesob/ui/components";
|
|
@@ -95,4 +95,4 @@ function Sessions() {
|
|
|
95
95
|
export {
|
|
96
96
|
Sessions
|
|
97
97
|
};
|
|
98
|
-
//# sourceMappingURL=chunk-
|
|
98
|
+
//# sourceMappingURL=chunk-SYT5Z7EF.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Link,
|
|
3
3
|
authApi$
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-QJVZHT27.js";
|
|
5
5
|
|
|
6
6
|
// src/pages/iam/users/_components/user-form.tsx
|
|
7
7
|
import { zodResolver } from "@hookform/resolvers/zod";
|
|
@@ -268,4 +268,4 @@ export {
|
|
|
268
268
|
UserForm,
|
|
269
269
|
UserCard
|
|
270
270
|
};
|
|
271
|
-
//# sourceMappingURL=chunk-
|
|
271
|
+
//# sourceMappingURL=chunk-UCNNUST6.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
useSession
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-XCJ3ZH7D.js";
|
|
4
4
|
|
|
5
5
|
// src/components/authorization/deny.tsx
|
|
6
6
|
import { deny as canDeny } from "@mesob/common";
|
|
@@ -20,4 +20,4 @@ function Deny({ permissions, userPermissions, children }) {
|
|
|
20
20
|
export {
|
|
21
21
|
Deny
|
|
22
22
|
};
|
|
23
|
-
//# sourceMappingURL=chunk-
|
|
23
|
+
//# sourceMappingURL=chunk-V4VX55TT.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-TFVBER3Y.js";
|
|
4
4
|
import {
|
|
5
5
|
useApi
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-XCJ3ZH7D.js";
|
|
7
7
|
|
|
8
8
|
// src/components/iam/users.tsx
|
|
9
9
|
import { Badge, Button } from "@mesob/ui/components";
|
|
@@ -104,4 +104,4 @@ function Users() {
|
|
|
104
104
|
export {
|
|
105
105
|
Users
|
|
106
106
|
};
|
|
107
|
-
//# sourceMappingURL=chunk-
|
|
107
|
+
//# sourceMappingURL=chunk-VA2XUED4.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
PermissionSelector
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-HH347MJI.js";
|
|
4
4
|
import {
|
|
5
5
|
useApi
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-XCJ3ZH7D.js";
|
|
7
7
|
|
|
8
8
|
// src/components/iam/role-permissions-page.tsx
|
|
9
9
|
import {
|
|
@@ -283,4 +283,4 @@ function RolePermissionsPage({ roleId }) {
|
|
|
283
283
|
export {
|
|
284
284
|
RolePermissionsPage
|
|
285
285
|
};
|
|
286
|
-
//# sourceMappingURL=chunk-
|
|
286
|
+
//# sourceMappingURL=chunk-VU4Z2XSQ.js.map
|
|
@@ -4,13 +4,14 @@ import {
|
|
|
4
4
|
import {
|
|
5
5
|
Link,
|
|
6
6
|
authApi$
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-QJVZHT27.js";
|
|
8
8
|
import {
|
|
9
9
|
defaultEntityQueryOptions
|
|
10
10
|
} from "./chunk-NPW7D2HZ.js";
|
|
11
11
|
import {
|
|
12
|
-
useApi
|
|
13
|
-
|
|
12
|
+
useApi,
|
|
13
|
+
useConfig
|
|
14
|
+
} from "./chunk-XCJ3ZH7D.js";
|
|
14
15
|
|
|
15
16
|
// src/components/iam/tenants-page.tsx
|
|
16
17
|
import {
|
|
@@ -439,9 +440,11 @@ function TenantsList({
|
|
|
439
440
|
import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
440
441
|
function TenantsPage() {
|
|
441
442
|
const { hooks } = useApi();
|
|
443
|
+
const { config } = useConfig();
|
|
444
|
+
const homeHref = config.navigation?.defaultRedirectUrl || "/";
|
|
442
445
|
useBreadcrumbs({
|
|
443
446
|
items: [
|
|
444
|
-
{ label: "Home", href:
|
|
447
|
+
{ label: "Home", href: homeHref },
|
|
445
448
|
{ label: "IAM", href: "/iam/tenants" },
|
|
446
449
|
{ label: "Tenants" }
|
|
447
450
|
]
|
|
@@ -532,4 +535,4 @@ function TenantsPage() {
|
|
|
532
535
|
export {
|
|
533
536
|
TenantsPage
|
|
534
537
|
};
|
|
535
|
-
//# sourceMappingURL=chunk-
|
|
538
|
+
//# sourceMappingURL=chunk-WD2COCQW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/iam/tenants-page.tsx","../src/pages/iam/tenants/_components/tenant-form.tsx","../src/pages/iam/tenants/_components/tenants-list.tsx","../src/pages/iam/tenants/_components/tenant-card.tsx"],"sourcesContent":["'use client';\n\nimport {\n EntityDrawerTrigger,\n EntityFilter,\n EntityHeader,\n EntitySearch,\n EntitySort,\n EntityViewToggle,\n PageBody,\n PageContainer,\n useBreadcrumbs,\n useEntityPagination,\n useEntityParams,\n} from '@mesob/ui/components';\nimport { IconBuilding } from '@tabler/icons-react';\nimport { useState } from 'react';\nimport type { paths } from '../../data/openapi';\nimport { defaultEntityQueryOptions } from '../../lib/query-options';\nimport { TenantForm } from '../../pages/iam/tenants/_components/tenant-form';\nimport { TenantsList } from '../../pages/iam/tenants/_components/tenants-list';\nimport { useApi, useConfig } from '../../provider';\n\nexport function TenantsPage() {\n const { hooks } = useApi();\n const { config } = useConfig();\n const homeHref = config.navigation?.defaultRedirectUrl || '/';\n useBreadcrumbs({\n items: [\n { label: 'Home', href: homeHref },\n { label: 'IAM', href: '/iam/tenants' },\n { label: 'Tenants' },\n ],\n });\n const [createOpen, setCreateOpen] = useState(false);\n\n const { queryConfig, params, setParams } = useEntityParams({\n searchKey: 'search',\n });\n const tenantsQuery = queryConfig as {\n params: {\n query: NonNullable<paths['/tenants']['get']['parameters']['query']>;\n };\n };\n\n const { data, error, isPending, isFetching } = hooks.useQuery(\n 'get',\n '/tenants',\n tenantsQuery,\n defaultEntityQueryOptions,\n );\n\n const isLoading = isPending || isFetching;\n const tenants = data?.tenants ?? [];\n const { total, pageCount } = useEntityPagination({\n items: tenants,\n total: data?.total,\n pageSize: params.pageSize,\n });\n const errorStatus = (error as { status?: number } | null)?.status;\n const hasAccessError = errorStatus === 401 || errorStatus === 403;\n const hasError = Boolean(error) && !isLoading;\n\n return (\n <PageContainer className=\"flex flex-1 flex-col gap-4 p-4 pt-0\">\n <PageBody className=\"px-0\">\n <EntityHeader\n icon={<IconBuilding className=\"size-5\" />}\n title=\"Tenants\"\n actions={\n hasAccessError ? null : (\n <EntityDrawerTrigger\n mode=\"new\"\n entity=\"Tenant\"\n open={createOpen}\n onOpenChange={setCreateOpen}\n >\n {(open, onClose) => (\n <TenantForm mode=\"new\" open={open} onClose={onClose} />\n )}\n </EntityDrawerTrigger>\n )\n }\n search={\n hasAccessError ? null : (\n <EntitySearch paramKey=\"search\" placeholder=\"Search tenants...\" />\n )\n }\n filter={\n hasAccessError ? null : (\n <EntityFilter\n options={[\n { label: 'All', value: '' },\n { label: 'Active', value: 'isActive:true' },\n { label: 'Inactive', value: 'isActive:false' },\n ]}\n placeholder=\"Filter\"\n />\n )\n }\n sort={\n hasAccessError ? null : (\n <EntitySort\n options={[\n { label: 'Created', value: 'createdAt' },\n { label: 'Updated', value: 'updatedAt' },\n { label: 'Name', value: 'name' },\n ]}\n />\n )\n }\n view={\n hasAccessError ? null : (\n <EntityViewToggle views={['table', 'card']} />\n )\n }\n />\n {hasError ? (\n <div className=\"rounded-[1.75rem] border border-border/60 bg-muted/20 p-8\">\n <div className=\"text-lg font-semibold\">\n {hasAccessError\n ? 'Tenant access denied'\n : 'Unable to load tenants'}\n </div>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n {hasAccessError\n ? 'This account does not have permission to view or manage tenants.'\n : 'The tenants page returned an unexpected error. Retry after the API is healthy.'}\n </p>\n </div>\n ) : (\n <TenantsList\n data={tenants}\n isLoading={isLoading}\n view={(params.view || 'table') as 'table' | 'card'}\n pageIndex={params.page - 1}\n pageSize={params.pageSize}\n pageCount={pageCount}\n totalRows={total}\n onCreateNew={() => setCreateOpen(true)}\n onPageChange={(p) => setParams({ page: p + 1 })}\n onPageSizeChange={(size) => setParams({ pageSize: size, page: 1 })}\n />\n )}\n </PageBody>\n </PageContainer>\n );\n}\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport {\n EntityDrawer,\n EntityFormActions,\n Input,\n Label,\n Skeleton,\n Textarea,\n} from '@mesob/ui/components';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useEffect } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { z } from 'zod';\nimport { authApi$ } from '../../shared/page-helpers';\nimport { str } from './tenants-data';\n\nconst schema = z.object({\n id: z.string().min(1).max(30),\n name: z.string().optional(),\n description: z.string().optional(),\n isActive: z.boolean(),\n});\n\ntype FormData = z.infer<typeof schema>;\n\nconst defaults: FormData = {\n id: '',\n name: '',\n description: '',\n isActive: true,\n};\n\ntype TenantFormProps = {\n mode: 'new' | 'edit';\n tenantId?: string;\n open: boolean;\n onClose: () => void;\n onSuccess?: () => void;\n};\n\nexport function TenantForm({\n mode,\n tenantId,\n open,\n onClose,\n onSuccess,\n}: TenantFormProps) {\n const qc = useQueryClient();\n const { data, isLoading } = authApi$.useQuery(\n 'get',\n '/tenants/{id}',\n { params: { path: { id: tenantId ?? '' } } },\n { enabled: mode === 'edit' && !!tenantId },\n );\n const create = authApi$.useMutation('post', '/tenants', {\n onSuccess: () => qc.invalidateQueries({ queryKey: ['get', '/tenants'] }),\n });\n const update = authApi$.useMutation('put', '/tenants/{id}', {\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: ['get', '/tenants'] });\n if (tenantId) {\n qc.invalidateQueries({ queryKey: ['get', '/tenants/{id}'] });\n }\n },\n });\n const del = authApi$.useMutation('delete', '/tenants/{id}', {\n onSuccess: () => qc.invalidateQueries({ queryKey: ['get', '/tenants'] }),\n });\n\n const form = useForm<FormData>({\n resolver: zodResolver(schema),\n defaultValues: defaults,\n });\n\n const { reset, formState, register } = form;\n\n useEffect(() => {\n if (!open) {\n return;\n }\n if (mode === 'edit' && data?.tenant && !isLoading) {\n const t = data.tenant;\n reset({\n id: t.id,\n name: str(t.name) || '',\n description: str(t.description) || '',\n isActive: t.isActive,\n });\n } else {\n reset(defaults);\n }\n }, [mode, data, open, isLoading, reset]);\n\n const onSubmit = form.handleSubmit(async (d) => {\n const body = {\n id: d.id,\n name: d.name || undefined,\n description: d.description || undefined,\n isActive: d.isActive,\n };\n if (mode === 'new') {\n await create.mutateAsync({ body });\n } else if (tenantId) {\n await update.mutateAsync({\n params: { path: { id: tenantId } },\n body: {\n name: d.name || undefined,\n description: d.description || undefined,\n isActive: d.isActive,\n },\n });\n }\n onSuccess?.();\n onClose();\n });\n\n const onDelete = async () => {\n if (!tenantId) {\n return;\n }\n await del.mutateAsync({ params: { path: { id: tenantId } } });\n onSuccess?.();\n onClose();\n };\n\n return (\n <EntityDrawer\n title={mode === 'new' ? 'New tenant' : 'Edit tenant'}\n open={open}\n onClose={onClose}\n isDirty={formState.isDirty}\n size=\"md\"\n form={\n isLoading ? (\n <FormSkeleton />\n ) : (\n <form onSubmit={onSubmit} className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"id\">\n ID <span className=\"text-destructive\">*</span>\n </Label>\n <Input\n id=\"id\"\n placeholder=\"e.g. acme\"\n {...register('id')}\n disabled={mode === 'edit'}\n />\n {formState.errors.id && (\n <p className=\"text-sm text-destructive\">\n {formState.errors.id.message}\n </p>\n )}\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"name\">Name</Label>\n <Input\n id=\"name\"\n placeholder=\"Display name\"\n {...register('name')}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"description\">Description</Label>\n <Textarea\n id=\"description\"\n placeholder=\"Description\"\n rows={3}\n {...register('description')}\n />\n </div>\n {mode === 'edit' && (\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n id=\"isActive\"\n {...register('isActive', {\n setValueAs: (v) => v === true || v === 'on',\n })}\n className=\"h-4 w-4\"\n />\n <Label htmlFor=\"isActive\">Active</Label>\n </div>\n )}\n </form>\n )\n }\n actions={\n <EntityFormActions\n mode={mode}\n onSubmit={onSubmit}\n onReset={mode === 'new' ? () => reset(defaults) : undefined}\n onDelete={mode === 'edit' ? onDelete : undefined}\n isSubmitting={create.isPending || update.isPending}\n isDeleting={del.isPending}\n disabled={isLoading}\n itemName=\"tenant\"\n />\n }\n />\n );\n}\n\nfunction FormSkeleton() {\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-12\" />\n <Skeleton className=\"h-10 w-full\" />\n </div>\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-16\" />\n <Skeleton className=\"h-10 w-full\" />\n </div>\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-20 w-full\" />\n </div>\n </div>\n );\n}\n","'use client';\n\nimport {\n Badge,\n DataTableAction,\n DataTablePagination,\n DisplayTable,\n EntityEmptyState,\n EntityLoadingState,\n Tbody,\n Td,\n Th,\n Thead,\n Tr,\n} from '@mesob/ui/components';\nimport { IconBuilding, IconCalendar } from '@tabler/icons-react';\nimport { useState } from 'react';\nimport { Link } from '../../shared/page-helpers';\nimport { TenantCard } from './tenant-card';\nimport { TenantForm } from './tenant-form';\nimport type { Tenant } from './tenants-data';\nimport { str } from './tenants-data';\n\nconst TABLE_COLUMN_COUNT = 5;\n\ntype TenantsListProps = {\n data: Tenant[];\n isLoading?: boolean;\n view: 'table' | 'card';\n pageIndex: number;\n pageSize: number;\n pageCount: number;\n totalRows: number;\n onPageChange: (page: number) => void;\n onPageSizeChange: (size: number) => void;\n onCreateNew?: () => void;\n};\n\nexport function TenantsList({\n data,\n isLoading,\n view,\n pageIndex,\n pageSize,\n pageCount,\n totalRows,\n onPageChange,\n onPageSizeChange,\n onCreateNew,\n}: TenantsListProps) {\n const [editingTenantId, setEditingTenantId] = useState<string | null>(null);\n\n if (isLoading) {\n return (\n <EntityLoadingState\n view={view}\n rowCount={pageSize}\n columnCount={TABLE_COLUMN_COUNT}\n cardCount={pageSize}\n />\n );\n }\n if (totalRows === 0) {\n return (\n <EntityEmptyState\n icon={IconBuilding}\n entityName=\"tenant\"\n title=\"No tenants yet\"\n description=\"Create your first tenant to get started.\"\n onAction={onCreateNew}\n />\n );\n }\n if (view === 'table') {\n return (\n <div className=\"space-y-4\">\n {editingTenantId && (\n <TenantForm\n mode=\"edit\"\n tenantId={editingTenantId}\n open\n onClose={() => setEditingTenantId(null)}\n />\n )}\n <DisplayTable withTableBorder>\n <Thead>\n <Tr>\n <Th>Tenant</Th>\n <Th>Description</Th>\n <Th>Status</Th>\n <Th>Created</Th>\n <Th className=\"w-[50px]\" />\n </Tr>\n </Thead>\n <Tbody>\n {data.map((tenant) => (\n <Tr key={tenant.id} className=\"group\">\n <Td>\n <Link\n href={`/iam/tenants/${tenant.id}`}\n className=\"block text-left font-medium hover:text-primary hover:underline cursor-pointer\"\n >\n <p>{str(tenant.name) || tenant.id}</p>\n <p className=\"text-sm text-muted-foreground\">{tenant.id}</p>\n </Link>\n </Td>\n <Td>\n <span className=\"text-muted-foreground line-clamp-1 max-w-[200px]\">\n {str(tenant.description) || '—'}\n </span>\n </Td>\n <Td>\n <Badge variant={tenant.isActive ? 'default' : 'secondary'}>\n {tenant.isActive ? 'Active' : 'Inactive'}\n </Badge>\n </Td>\n <Td>\n <div className=\"flex items-center gap-1 text-muted-foreground\">\n <IconCalendar className=\"h-4 w-4\" />\n {new Date(tenant.createdAt).toLocaleDateString()}\n </div>\n </Td>\n <Td>\n <DataTableAction\n onClick={() => setEditingTenantId(tenant.id)}\n />\n </Td>\n </Tr>\n ))}\n </Tbody>\n </DisplayTable>\n <DataTablePagination\n pageIndex={pageIndex}\n pageSize={pageSize}\n pageCount={pageCount}\n totalRows={totalRows}\n onPageChange={onPageChange}\n onPageSizeChange={onPageSizeChange}\n />\n </div>\n );\n }\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\">\n {data.map((t) => (\n <TenantCard key={t.id} tenant={t} />\n ))}\n </div>\n <DataTablePagination\n pageIndex={pageIndex}\n pageSize={pageSize}\n pageCount={pageCount}\n totalRows={totalRows}\n onPageChange={onPageChange}\n onPageSizeChange={onPageSizeChange}\n />\n </div>\n );\n}\n","'use client';\n\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n} from '@mesob/ui/components';\nimport { IconDots, IconPencil } from '@tabler/icons-react';\nimport { useState } from 'react';\nimport { Link } from '../../shared/page-helpers';\nimport { TenantForm } from './tenant-form';\nimport { str, type Tenant } from './tenants-data';\n\ntype TenantCardProps = { tenant: Tenant };\n\nexport function TenantCard({ tenant }: TenantCardProps) {\n const [editOpen, setEditOpen] = useState(false);\n return (\n <>\n <Card className=\"group hover:shadow-md transition-shadow\">\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-start justify-between\">\n <Link\n href={`/iam/tenants/${tenant.id}`}\n className=\"text-left font-semibold hover:text-primary hover:underline\"\n >\n {str(tenant.name) || tenant.id}\n </Link>\n <DropdownMenu>\n <DropdownMenuTrigger\n render={\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 opacity-0 group-hover:opacity-100 transition-opacity\"\n />\n }\n >\n <IconDots className=\"h-4 w-4\" />\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent>\n <DropdownMenuItem onClick={() => setEditOpen(true)}>\n <IconPencil className=\"mr-2 h-4 w-4\" />\n Edit\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenu>\n </div>\n <p className=\"text-sm text-muted-foreground\">{tenant.id}</p>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n <Badge variant={tenant.isActive ? 'default' : 'secondary'}>\n {tenant.isActive ? 'Active' : 'Inactive'}\n </Badge>\n {str(tenant.description) ? (\n <p className=\"text-sm text-muted-foreground line-clamp-2\">\n {str(tenant.description)}\n </p>\n ) : null}\n <p className=\"text-xs text-muted-foreground\">\n Created {new Date(tenant.createdAt).toLocaleDateString()}\n </p>\n </CardContent>\n </Card>\n {editOpen ? (\n <TenantForm\n mode=\"edit\"\n tenantId={tenant.id}\n open={editOpen}\n onClose={() => setEditOpen(false)}\n />\n ) : null}\n </>\n );\n}\n"],"mappings":"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","names":["IconBuilding","useState","Badge","useState","jsx","jsxs","jsx","jsxs","useState","Badge","jsx","jsxs","useState","IconBuilding"]}
|
|
@@ -251,10 +251,13 @@ function AuthStateProvider({
|
|
|
251
251
|
await refetch();
|
|
252
252
|
};
|
|
253
253
|
const signOut = async () => {
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
254
|
+
await signOutMutation.mutateAsync({});
|
|
255
|
+
clearAuth();
|
|
256
|
+
const redirectUrl = config.navigation?.defaultRedirectUrl || "/";
|
|
257
|
+
if (config.navigation?.onNavigate) {
|
|
258
|
+
config.navigation.onNavigate(redirectUrl);
|
|
259
|
+
} else if (typeof window !== "undefined") {
|
|
260
|
+
window.location.href = redirectUrl;
|
|
258
261
|
}
|
|
259
262
|
};
|
|
260
263
|
return /* @__PURE__ */ jsx(ConfigContext.Provider, { value: { config, cookieName, t }, children: /* @__PURE__ */ jsx(ApiContext.Provider, { value: { hooks, setAuth, clearAuth, refresh }, children: /* @__PURE__ */ jsx(
|
|
@@ -285,4 +288,4 @@ export {
|
|
|
285
288
|
useHasAuthCookie,
|
|
286
289
|
MesobAuthProvider
|
|
287
290
|
};
|
|
288
|
-
//# sourceMappingURL=chunk-
|
|
291
|
+
//# sourceMappingURL=chunk-XCJ3ZH7D.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/cookie.ts","../src/provider.tsx","../src/lib/translations.ts","../src/types.ts","../src/utils/custom-fetch.ts"],"sourcesContent":["import type { AuthClientConfig } from '../types';\n\nconst isProduction =\n typeof process !== 'undefined' && process.env.NODE_ENV === 'production';\n\nexport const getSessionCookieName = (config: AuthClientConfig): string => {\n const prefix = config.cookiePrefix || '';\n const baseName = 'session_token';\n if (prefix) {\n return `${prefix}_${baseName}`;\n }\n return isProduction ? '__Host-session_token' : baseName;\n};\n","'use client';\n\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { deepmerge } from 'deepmerge-ts';\nimport createFetchClient from 'openapi-fetch';\nimport createClient from 'openapi-react-query';\nimport type { ReactNode } from 'react';\nimport { createContext, useContext, useMemo, useState } from 'react';\nimport type { paths } from './data/openapi';\nimport { createTranslator } from './lib/translations';\nimport {\n type AuthClientConfig,\n type AuthResponse,\n defaultAuthClientConfig,\n type Session,\n type User,\n} from './types';\nimport { getSessionCookieName } from './utils/cookie';\nimport { createCustomFetch } from './utils/custom-fetch';\n\n// biome-ignore lint/suspicious/noExplicitAny: OpenAPI hooks type\ntype OpenApiHooks = any;\n\n// --- Utility: Check if running on server ---\nfunction isServer(): boolean {\n return typeof document === 'undefined';\n}\n\n/**\n * @deprecated Cookie is httpOnly and cannot be read client-side.\n * Use `useSession().isAuthenticated` instead.\n * This function always returns false on client.\n */\nexport function hasAuthCookie(_cookieName: string): boolean {\n // Cookie is httpOnly, can't check client-side\n // Always return false - use useSession() for auth status\n return false;\n}\n\n// --- Types ---\nexport type AuthStatus = 'loading' | 'authenticated' | 'unauthenticated';\n\ntype AuthState = {\n user: User | null;\n session: Session | null;\n status: AuthStatus;\n error: Error | null;\n};\n\ntype SessionContextValue = AuthState & {\n isLoading: boolean;\n isAuthenticated: boolean;\n refresh: () => Promise<void>;\n signOut: () => Promise<void>;\n};\n\ntype ApiContextValue = {\n hooks: OpenApiHooks;\n setAuth: (auth: AuthResponse) => void;\n clearAuth: () => void;\n refresh: () => Promise<void>;\n};\n\ntype ConfigContextValue = {\n config: AuthClientConfig;\n cookieName: string;\n t: (key: string, params?: Record<string, string | number>) => string;\n};\n\nconst SessionContext = createContext<SessionContextValue | null>(null);\nconst ApiContext = createContext<ApiContextValue | null>(null);\nconst ConfigContext = createContext<ConfigContextValue | null>(null);\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n refetchOnWindowFocus: false,\n },\n },\n});\n\n// --- Hooks ---\n\n/**\n * Get session state including user, session, and auth status.\n * - `status`: 'loading' | 'authenticated' | 'unauthenticated'\n * - `isLoading`: true while fetching session\n * - `isAuthenticated`: true if user and session exist\n */\nexport function useSession(): SessionContextValue {\n const context = useContext(SessionContext);\n if (!context) {\n throw new Error('useSession must be used within MesobAuthProvider');\n }\n return context;\n}\n\nexport function useApi(): ApiContextValue {\n const context = useContext(ApiContext);\n if (!context) {\n throw new Error('useApi must be used within MesobAuthProvider');\n }\n return context;\n}\n\nexport function useConfig(): ConfigContextValue {\n const context = useContext(ConfigContext);\n if (!context) {\n throw new Error('useConfig must be used within MesobAuthProvider');\n }\n return context;\n}\n\n/**\n * @deprecated Cookie is httpOnly, can't be checked client-side.\n * Use `useSession().isAuthenticated` instead.\n */\nexport function useHasAuthCookie(): boolean {\n const { status } = useSession();\n return status === 'authenticated' || status === 'loading';\n}\n\n// --- Provider ---\n\ntype MesobAuthProviderProps = {\n config: AuthClientConfig;\n children: ReactNode;\n};\n\nexport function MesobAuthProvider({\n config,\n children,\n}: MesobAuthProviderProps) {\n const mergedConfig = useMemo(\n () =>\n deepmerge(\n { ...defaultAuthClientConfig } as Partial<AuthClientConfig>,\n config,\n ) as AuthClientConfig,\n [config],\n );\n\n const api = useMemo(\n () =>\n createFetchClient<paths>({\n baseUrl: mergedConfig.baseURL,\n fetch: createCustomFetch(mergedConfig),\n }),\n [mergedConfig],\n );\n\n const hooks = useMemo(() => createClient(api), [api]);\n const cookieName = useMemo(\n () => getSessionCookieName(mergedConfig),\n [mergedConfig],\n );\n\n return (\n <QueryClientProvider client={queryClient}>\n <AuthStateProvider\n config={mergedConfig}\n hooks={hooks}\n cookieName={cookieName}\n >\n {children}\n </AuthStateProvider>\n </QueryClientProvider>\n );\n}\n\ntype AuthStateProviderProps = {\n config: AuthClientConfig;\n hooks: OpenApiHooks;\n cookieName: string;\n children: ReactNode;\n};\n\nfunction AuthStateProvider({\n config,\n hooks,\n cookieName,\n children,\n}: AuthStateProviderProps) {\n // Manual override for sign-out / sign-in\n const [override, setOverride] = useState<AuthState | null>(null);\n\n // Always fetch session - cookie is httpOnly, can't check client-side\n // Server will read the cookie and return user/session if valid\n const {\n data: sessionData,\n isLoading,\n isFetched,\n error: sessionError,\n refetch,\n } = hooks.useQuery(\n 'get',\n '/session',\n {},\n {\n enabled: !(override || isServer()),\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n retry: false,\n gcTime: 0,\n staleTime: 0,\n },\n );\n\n // Derive state directly - no useEffect\n const user = override?.user ?? sessionData?.user ?? null;\n const session = override?.session ?? sessionData?.session ?? null;\n const error = override?.error ?? (sessionError as Error | null);\n\n // Check error status code\n const errorStatus = (() => {\n if (!sessionError) {\n return null;\n }\n const err = sessionError as { status?: number };\n return err.status ?? null;\n })();\n\n // Check if error is a network/connection error\n const isNetworkError = (() => {\n if (!sessionError) {\n return false;\n }\n const error = sessionError as Error & { cause?: unknown; data?: unknown };\n const errorMessage =\n error.message || String(error) || JSON.stringify(error);\n // Network errors: TypeError, DOMException, or fetch failures\n if (\n error instanceof TypeError ||\n error instanceof DOMException ||\n error.name === 'TypeError' ||\n errorMessage.includes('Failed to fetch') ||\n errorMessage.includes('ERR_CONNECTION_REFUSED') ||\n errorMessage.includes('NetworkError') ||\n errorMessage.includes('Network request failed') ||\n errorMessage.includes('fetch failed')\n ) {\n return true;\n }\n // Check error cause\n if (error.cause) {\n const causeStr = String(error.cause);\n if (\n causeStr.includes('Failed to fetch') ||\n causeStr.includes('ERR_CONNECTION_REFUSED') ||\n causeStr.includes('NetworkError')\n ) {\n return true;\n }\n }\n return false;\n })();\n\n // Compute status\n // biome-ignore lint: Status determination requires multiple checks\n const status: AuthStatus = (() => {\n if (override) {\n return override.status;\n }\n if (isServer()) {\n return 'loading';\n }\n if (user && session) {\n return 'authenticated';\n }\n // Check for network errors or auth errors first - allow auth page to show\n if (isNetworkError || errorStatus === 401) {\n return 'unauthenticated';\n }\n // If we have an error but it's not a network error, still check loading state\n if (sessionError && !isNetworkError && errorStatus !== 401) {\n if (errorStatus && errorStatus >= 500) {\n return 'authenticated';\n }\n // Other errors mean unauthenticated\n if (isFetched) {\n return 'unauthenticated';\n }\n }\n if (isLoading || !isFetched) {\n return 'loading';\n }\n if (isFetched && !user && !session) {\n return 'unauthenticated';\n }\n return 'unauthenticated';\n })();\n\n const signOutMutation = hooks.useMutation('post', '/sign-out');\n const t = createTranslator(config.messages || {});\n\n const setAuth = (auth: AuthResponse) => {\n setOverride({\n user: auth.user,\n session: auth.session,\n status: 'authenticated',\n error: null,\n });\n };\n\n const clearAuth = () => {\n setOverride({\n user: null,\n session: null,\n status: 'unauthenticated',\n error: null,\n });\n };\n\n const refresh = async () => {\n setOverride(null);\n await refetch();\n };\n\n const signOut = async () => {\n await signOutMutation.mutateAsync({});\n clearAuth();\n\n const redirectUrl = config.navigation?.defaultRedirectUrl || '/';\n\n if (config.navigation?.onNavigate) {\n config.navigation.onNavigate(redirectUrl);\n } else if (typeof window !== 'undefined') {\n window.location.href = redirectUrl;\n }\n };\n\n return (\n <ConfigContext.Provider value={{ config, cookieName, t }}>\n <ApiContext.Provider value={{ hooks, setAuth, clearAuth, refresh }}>\n <SessionContext.Provider\n value={{\n user,\n session,\n status,\n error,\n isLoading: status === 'loading',\n isAuthenticated: status === 'authenticated',\n refresh,\n signOut,\n }}\n >\n {children}\n </SessionContext.Provider>\n </ApiContext.Provider>\n </ConfigContext.Provider>\n );\n}\n","type Messages = Record<string, unknown>;\n\nexport function createTranslator(messages: Messages, namespace?: string) {\n return (key: string, params?: Record<string, string | number>): string => {\n const fullKey = namespace ? `${namespace}.${key}` : key;\n const keys = fullKey.split('.');\n\n let value: unknown = messages;\n for (const k of keys) {\n if (value && typeof value === 'object' && value !== null) {\n value = (value as Record<string, unknown>)[k];\n } else {\n return fullKey;\n }\n }\n\n if (typeof value !== 'string') {\n return fullKey;\n }\n\n // Simple parameter replacement\n if (params) {\n return value.replace(/\\{(\\w+)\\}/g, (_, param) =>\n String(params[param] ?? `{${param}}`),\n );\n }\n\n return value;\n };\n}\n","import type { PermissionTree } from '@mesob/common';\n\nexport type UIConfig = {\n logo: React.ReactNode;\n name: React.ReactNode;\n logoImage?: string;\n};\n\nexport type FeaturesConfig = {\n enableSignup?: boolean;\n enablePasswordReset?: boolean;\n enableEmailSignup?: boolean;\n enablePhoneSignup?: boolean;\n enableSocialSignup?: boolean;\n socialProviders?: string[];\n};\n\nexport type TenantConfig = {\n enabled: boolean;\n tenantId: string;\n};\n\nexport type NavigationConfig = {\n locale?: string;\n defaultRedirectUrl?: string;\n onNavigate?: (path: string) => void;\n linkComponent?: React.ComponentType<\n React.ComponentProps<'a'> & { href: string }\n >;\n links?: {\n signIn?: string;\n signUp?: string;\n forgotPassword?: string;\n setPassword?: string;\n };\n};\n\nexport type AuthClientConfig = {\n baseURL: string;\n ui: UIConfig;\n features?: FeaturesConfig;\n tenant?: TenantConfig;\n permissions?: PermissionTree;\n navigation?: NavigationConfig;\n messages?: Record<string, unknown>;\n cookiePrefix?: string;\n phoneRegex?: RegExp | string;\n};\n\ntype DefaultAuthClientConfig = {\n readonly features: {\n readonly enableSignup: true;\n readonly enablePasswordReset: true;\n readonly enableEmailSignup: true;\n readonly enablePhoneSignup: true;\n readonly enableSocialSignup: false;\n readonly socialProviders: [];\n };\n readonly navigation: {\n readonly locale: 'en';\n };\n readonly cookiePrefix: 'msb';\n readonly phoneRegex: RegExp;\n};\n\nexport const defaultAuthClientConfig: DefaultAuthClientConfig = {\n features: {\n enableSignup: true,\n enablePasswordReset: true,\n enableEmailSignup: true,\n enablePhoneSignup: true,\n enableSocialSignup: false,\n socialProviders: [],\n },\n navigation: {\n locale: 'en',\n },\n cookiePrefix: 'msb',\n phoneRegex: /^(\\+2519|\\+2517|2519|2517|09|07)\\d{8}$/,\n} as const;\n\nexport type User = {\n id: string;\n tenantId: string;\n fullName: string;\n email: string | null;\n phone: string | null;\n handle?: string;\n image: string | null;\n emailVerified: boolean;\n phoneVerified: boolean;\n lastSignInAt?: string | null;\n /** Role IDs */\n roles?: string[] | null;\n roleCodes?: string[] | null;\n permissions?: string[] | null;\n};\n\nexport type Session = {\n id?: string;\n expiresAt: string;\n createdAt?: string;\n userAgent?: string | null;\n ip?: string | null;\n};\n\nexport type AuthResponse = {\n user: User;\n session: Session;\n sessionToken?: string;\n sessionExpiresAt?: string;\n};\n\nexport type AuthErrorCode =\n | 'USER_NOT_FOUND'\n | 'INVALID_PASSWORD'\n | 'USER_EXISTS'\n | 'VERIFICATION_EXPIRED'\n | 'VERIFICATION_MISMATCH'\n | 'VERIFICATION_NOT_FOUND'\n | 'TOO_MANY_ATTEMPTS'\n | 'REQUIRES_VERIFICATION'\n | 'UNAUTHORIZED'\n | 'ACCESS_DENIED'\n | 'HAS_NO_PASSWORD'\n | 'PASSWORD_ALREADY_SET';\n\nexport type AuthError = {\n message: string;\n code?: AuthErrorCode;\n status?: number;\n details?: Record<string, unknown>;\n};\n","import type { AuthClientConfig } from '../types';\n\nexport const createCustomFetch = (_config: AuthClientConfig) => {\n return (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n if (input instanceof Request) {\n return fetch(input, { ...init, credentials: 'include' });\n }\n return fetch(input, { ...init, credentials: 'include' });\n };\n};\n"],"mappings":"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","names":["error"]}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-C5ZW7FD2.js";
|
|
4
4
|
import {
|
|
5
5
|
useSession
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-XCJ3ZH7D.js";
|
|
7
7
|
|
|
8
8
|
// src/components/profile/account.tsx
|
|
9
9
|
import { Badge, Card, CardContent, Separator } from "@mesob/ui/components";
|
|
@@ -86,4 +86,4 @@ function Account() {
|
|
|
86
86
|
export {
|
|
87
87
|
Account
|
|
88
88
|
};
|
|
89
|
-
//# sourceMappingURL=chunk-
|
|
89
|
+
//# sourceMappingURL=chunk-XEFPJKBB.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-TFVBER3Y.js";
|
|
4
4
|
import {
|
|
5
5
|
useApi
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-XCJ3ZH7D.js";
|
|
7
7
|
|
|
8
8
|
// src/components/iam/tenants.tsx
|
|
9
9
|
import { Badge, Button } from "@mesob/ui/components";
|
|
@@ -101,4 +101,4 @@ function Tenants() {
|
|
|
101
101
|
export {
|
|
102
102
|
Tenants
|
|
103
103
|
};
|
|
104
|
-
//# sourceMappingURL=chunk-
|
|
104
|
+
//# sourceMappingURL=chunk-YHZLPAYD.js.map
|
|
@@ -9,11 +9,11 @@ import {
|
|
|
9
9
|
} from "./chunk-DPH2PHK3.js";
|
|
10
10
|
import {
|
|
11
11
|
useTranslator
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-OK7WPIHQ.js";
|
|
13
13
|
import {
|
|
14
14
|
useApi,
|
|
15
15
|
useConfig
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-XCJ3ZH7D.js";
|
|
17
17
|
|
|
18
18
|
// src/components/auth/sign-in.tsx
|
|
19
19
|
import { zodResolver } from "@hookform/resolvers/zod";
|
|
@@ -96,7 +96,7 @@ var SignIn = ({ redirectUrl } = {}) => {
|
|
|
96
96
|
const checkUserMutation = hooks.useMutation("post", "/check-account");
|
|
97
97
|
const signInMutation = hooks.useMutation("post", "/sign-in");
|
|
98
98
|
const phoneRegex = typeof config.phoneRegex === "string" ? new RegExp(config.phoneRegex) : config.phoneRegex || /^(\+2519|\+2517|2519|2517|09|07)\d{8}$/;
|
|
99
|
-
const defaultRedirect = redirectUrl || config.navigation?.defaultRedirectUrl || "/
|
|
99
|
+
const defaultRedirect = redirectUrl || config.navigation?.defaultRedirectUrl || "/";
|
|
100
100
|
const forgotPasswordLink = config.navigation?.links?.forgotPassword || "/auth/forgot-password";
|
|
101
101
|
const signUpLink = config.navigation?.links?.signUp || "/auth/sign-up";
|
|
102
102
|
const setPasswordLink = config.navigation?.links?.setPassword || "/auth/set-password";
|
|
@@ -128,13 +128,6 @@ var SignIn = ({ redirectUrl } = {}) => {
|
|
|
128
128
|
}
|
|
129
129
|
});
|
|
130
130
|
if (result.exists) {
|
|
131
|
-
if (result.requiresPasswordSetup) {
|
|
132
|
-
const redirectParam = defaultRedirect ? `&redirect=${encodeURIComponent(defaultRedirect)}` : "";
|
|
133
|
-
onNavigate(
|
|
134
|
-
`${setPasswordLink}?identifier=${encodeURIComponent(normalizedUsername)}${redirectParam}`
|
|
135
|
-
);
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
131
|
setUsername(normalizedUsername);
|
|
139
132
|
form.setValue("username", normalizedUsername);
|
|
140
133
|
setShowPasswordField(true);
|
|
@@ -342,4 +335,4 @@ var SignIn = ({ redirectUrl } = {}) => {
|
|
|
342
335
|
export {
|
|
343
336
|
SignIn
|
|
344
337
|
};
|
|
345
|
-
//# sourceMappingURL=chunk-
|
|
338
|
+
//# sourceMappingURL=chunk-YLWCA2WK.js.map
|