@dragonmastery/dragoncore-vue 0.0.19 → 0.0.21
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/AppLink-CHMMrSFI.js +54 -0
- package/dist/AppLink-CHMMrSFI.js.map +1 -0
- package/dist/Appearance-D5pwxuf4.js +3 -0
- package/dist/{Appearance-BfPdKMXw.js → Appearance-DxWTyx1M.js} +1 -1
- package/dist/{Appearance-BfPdKMXw.js.map → Appearance-DxWTyx1M.js.map} +1 -1
- package/dist/{ChangePasswordPage-DXzU3NI9.js → ChangePasswordPage--3XwluwE.js} +2 -2
- package/dist/{ChangePasswordPage-DXzU3NI9.js.map → ChangePasswordPage--3XwluwE.js.map} +1 -1
- package/dist/ChangePasswordPage-CpDPmEml.js +6 -0
- package/dist/ConsentRequired-C4IRMA0c.js +213 -0
- package/dist/ConsentRequired-C4IRMA0c.js.map +1 -0
- package/dist/CreateTeamForm-B4cIuYAf.js +35 -0
- package/dist/CreateTeamMemberForm-Chrw1y00.js +35 -0
- package/dist/{CreateUserPage-bwR6fq5C.js → CreateUserPage-DLwXeLAq.js} +2 -2
- package/dist/{CreateUserPage-bwR6fq5C.js.map → CreateUserPage-DLwXeLAq.js.map} +1 -1
- package/dist/CreateUserPage-WruMs7WP.js +6 -0
- package/dist/CreditBalanceDashboard-CkcsrZ_e.js +35 -0
- package/dist/CreditManagement-Ddvu9dMw.js +35 -0
- package/dist/CustomerCreateSupportTicketForm-BKperKGS.js +35 -0
- package/dist/{CustomerSupportTicketDetailPage-D_1t2EpN.js → CustomerSupportTicketDetailPage-BdyaKG1v.js} +9 -9
- package/dist/{CustomerSupportTicketDetailPage-D_1t2EpN.js.map → CustomerSupportTicketDetailPage-BdyaKG1v.js.map} +1 -1
- package/dist/CustomerSupportTicketList-DcbrjDa9.js +35 -0
- package/dist/CustomerSupportTicketParent-BeNzUwuP.js +7 -0
- package/dist/{CustomerSupportTicketParent-B09_iFpJ.js → CustomerSupportTicketParent-HIxwSVdu.js} +4 -4
- package/dist/{CustomerSupportTicketParent-B09_iFpJ.js.map → CustomerSupportTicketParent-HIxwSVdu.js.map} +1 -1
- package/dist/CustomerSupportTicketSuccess-CC967u3y.js +35 -0
- package/dist/EditTeamForm-B5Tee5wL.js +35 -0
- package/dist/{EditTeamMemberForm-DJW7yRQW.js → EditTeamMemberForm-CaS2GLjV.js} +2 -2
- package/dist/{EditTeamMemberForm-DJW7yRQW.js.map → EditTeamMemberForm-CaS2GLjV.js.map} +1 -1
- package/dist/EditTeamMemberForm-OtcS8QWt.js +6 -0
- package/dist/{EditUserPage-aDygGmfD.js → EditUserPage-DURc5rmi.js} +4 -4
- package/dist/{EditUserPage-aDygGmfD.js.map → EditUserPage-DURc5rmi.js.map} +1 -1
- package/dist/EditUserPage-T4DQlKhf.js +7 -0
- package/dist/ForgotPassword-CUifhmqP.js +7 -0
- package/dist/{ForgotPassword-CJjzm9GK.js → ForgotPassword-OjIPi9s9.js} +4 -3
- package/dist/{ForgotPassword-CJjzm9GK.js.map → ForgotPassword-OjIPi9s9.js.map} +1 -1
- package/dist/LoginForm-9UFnA-fO.js +118 -0
- package/dist/LoginForm-9UFnA-fO.js.map +1 -0
- package/dist/LoginForm-Bg7GoZEA.js +7 -0
- package/dist/Logout-Bs92csWH.js +7 -0
- package/dist/{Logout-Cm9kEzgH.js → Logout-YgTgOFUH.js} +5 -4
- package/dist/{Logout-Cm9kEzgH.js.map → Logout-YgTgOFUH.js.map} +1 -1
- package/dist/MfaSetup-BACX5XP-.js +8 -0
- package/dist/{MfaSetup-Ch0w-gTN.js → MfaSetup-RtFMY_dj.js} +5 -4
- package/dist/{MfaSetup-Ch0w-gTN.js.map → MfaSetup-RtFMY_dj.js.map} +1 -1
- package/dist/{MfaVerify-BwzjVrTj.js → MfaVerify-Cvhe8bEM.js} +6 -5
- package/dist/{MfaVerify-BwzjVrTj.js.map → MfaVerify-Cvhe8bEM.js.map} +1 -1
- package/dist/MfaVerify-ak4iSdQ2.js +8 -0
- package/dist/RecordVersionViewer-BWZ78vvE.js +490 -0
- package/dist/RecordVersionViewer-BWZ78vvE.js.map +1 -0
- package/dist/{ResetPassword-DuLuXaNp.js → ResetPassword-BE4mXK9q.js} +4 -3
- package/dist/{ResetPassword-DuLuXaNp.js.map → ResetPassword-BE4mXK9q.js.map} +1 -1
- package/dist/ResetPassword-pY1uhTdl.js +7 -0
- package/dist/{SavedFiltersPage-CawED9Oz.js → SavedFiltersPage-DQt6uc8m.js} +33 -30
- package/dist/{SavedFiltersPage-CawED9Oz.js.map → SavedFiltersPage-DQt6uc8m.js.map} +1 -1
- package/dist/Signup-9TjMMnU4.js +204 -0
- package/dist/Signup-9TjMMnU4.js.map +1 -0
- package/dist/Signup-Bq-G3D-s.js +9 -0
- package/dist/SignupConsentFlow-QUZGKjdB.js +269 -0
- package/dist/SignupConsentFlow-QUZGKjdB.js.map +1 -0
- package/dist/SignupRequirementsPage-DfbYmpQD.js +360 -0
- package/dist/SignupRequirementsPage-DfbYmpQD.js.map +1 -0
- package/dist/StaffCreateSupportTicketForm-D0ZuisDk.js +35 -0
- package/dist/{StaffSupportTicketDetailPage-DZZN3jmt.js → StaffSupportTicketDetailPage-DQdfh6H1.js} +11 -11
- package/dist/{StaffSupportTicketDetailPage-DZZN3jmt.js.map → StaffSupportTicketDetailPage-DQdfh6H1.js.map} +1 -1
- package/dist/StaffSupportTicketList-CiqC05XB.js +35 -0
- package/dist/{StaffSupportTicketParent-BYxQPuhI.js → StaffSupportTicketParent-CilR4RGM.js} +4 -4
- package/dist/{StaffSupportTicketParent-BYxQPuhI.js.map → StaffSupportTicketParent-CilR4RGM.js.map} +1 -1
- package/dist/StaffSupportTicketParent-DkV329NI.js +7 -0
- package/dist/StaffSupportTicketSuccess-CUYnimaI.js +35 -0
- package/dist/{SupportStaffPage-B05UR5LK.js → SupportStaffPage-KKugAnFm.js} +7 -7
- package/dist/{SupportStaffPage-B05UR5LK.js.map → SupportStaffPage-KKugAnFm.js.map} +1 -1
- package/dist/{SupportTicketDevLifecycleBadge-Ba-Rm6QW.js → SupportTicketDevLifecycleBadge-EMrQHfyG.js} +1 -1
- package/dist/{SupportTicketDevLifecycleBadge-Ba-Rm6QW.js.map → SupportTicketDevLifecycleBadge-EMrQHfyG.js.map} +1 -1
- package/dist/{SupportTicketMaintenancePage-BoZpjcAF.js → SupportTicketMaintenancePage-smItdkrD.js} +4 -4
- package/dist/{SupportTicketMaintenancePage-BoZpjcAF.js.map → SupportTicketMaintenancePage-smItdkrD.js.map} +1 -1
- package/dist/TeamAttachmentsTab-DUtCD1Yi.js +35 -0
- package/dist/TeamHistoryTab-BsUoH4VK.js +4 -0
- package/dist/{TeamHistoryTab-BrC6FFIw.js → TeamHistoryTab-D5biUPmq.js} +3 -3
- package/dist/{TeamHistoryTab-BrC6FFIw.js.map → TeamHistoryTab-D5biUPmq.js.map} +1 -1
- package/dist/TeamList-BkPIqZ8V.js +35 -0
- package/dist/TeamMemberList-1mxUGCNa.js +35 -0
- package/dist/TeamMemberParent-DzeBIElY.js +35 -0
- package/dist/{TeamNotesTab-B2eETkAz.js → TeamNotesTab-BzGZZ1h8.js} +5 -5
- package/dist/{TeamNotesTab-B2eETkAz.js.map → TeamNotesTab-BzGZZ1h8.js.map} +1 -1
- package/dist/TeamNotesTab-ClHl2nXd.js +7 -0
- package/dist/TeamParent-DJa9UZTP.js +35 -0
- package/dist/{TimelineNoteInput-C0a0WRQC.js → TimelineNoteInput-0p-M4Qie.js} +2 -2
- package/dist/{TimelineNoteInput-C0a0WRQC.js.map → TimelineNoteInput-0p-M4Qie.js.map} +1 -1
- package/dist/{TimelineSystemEvent-Dj2TMOF6.js → TimelineSystemEvent-BHzFr46C.js} +4 -4
- package/dist/{TimelineSystemEvent-Dj2TMOF6.js.map → TimelineSystemEvent-BHzFr46C.js.map} +1 -1
- package/dist/UserListPage-BTLE4J0s.js +4 -0
- package/dist/{UserListPage-QSdxrJT6.js → UserListPage-DUE5gJTo.js} +3 -3
- package/dist/{UserListPage-QSdxrJT6.js.map → UserListPage-DUE5gJTo.js.map} +1 -1
- package/dist/{UserProfilePage-X4z2lG-J.js → UserProfilePage-C3b93Keh.js} +4 -4
- package/dist/{UserProfilePage-X4z2lG-J.js.map → UserProfilePage-C3b93Keh.js.map} +1 -1
- package/dist/UserProfilePage-CVTORtSx.js +7 -0
- package/dist/VerifyEmail-DCP4DWIw.js +9 -0
- package/dist/VerifyEmail-DlOmWGG-.js +257 -0
- package/dist/VerifyEmail-DlOmWGG-.js.map +1 -0
- package/dist/ViewTeam-DVfnLMhV.js +35 -0
- package/dist/ViewTeamMember-L4v3gCIn.js +35 -0
- package/dist/{convertToLocalDateTime-DOSGtMn8.js → convertToLocalDateTime-CFhtN6PI.js} +12 -2
- package/dist/convertToLocalDateTime-CFhtN6PI.js.map +1 -0
- package/dist/{displayIdFormatter-B1ZKgofu.js → displayIdFormatter-Dz900Awr.js} +1 -1
- package/dist/{displayIdFormatter-B1ZKgofu.js.map → displayIdFormatter-Dz900Awr.js.map} +1 -1
- package/dist/{extractRpcErrorMessage-C_UbKgHL.js → extractRpcErrorMessage-Di8E8-Wh.js} +1 -1
- package/dist/{extractRpcErrorMessage-C_UbKgHL.js.map → extractRpcErrorMessage-Di8E8-Wh.js.map} +1 -1
- package/dist/index.d.ts +62 -17
- package/dist/index.js +37 -33
- package/dist/{mfaSchema-nfNCcEhM.js → mfaSchema-BnRWf0ma.js} +1 -1
- package/dist/{mfaSchema-nfNCcEhM.js.map → mfaSchema-BnRWf0ma.js.map} +1 -1
- package/dist/{src-CkgUIye9.js → src-QZJyMfGX.js} +422 -812
- package/dist/src-QZJyMfGX.js.map +1 -0
- package/dist/{useBreadcrumbs-DmgSucoe.js → useBreadcrumbs-qB6ghsAf.js} +1 -1
- package/dist/{useBreadcrumbs-DmgSucoe.js.map → useBreadcrumbs-qB6ghsAf.js.map} +1 -1
- package/dist/useEmailVerificationChannel-BNi926Ho.js +37 -0
- package/dist/useEmailVerificationChannel-BNi926Ho.js.map +1 -0
- package/dist/{useMutation-DbzXtqf1.js → useMutation-BTsyHKyn.js} +3 -3
- package/dist/{useMutation-DbzXtqf1.js.map → useMutation-BTsyHKyn.js.map} +1 -1
- package/dist/{useQuery-BKb5JXVS.js → useQuery-BggIE52P.js} +5 -5
- package/dist/useQuery-BggIE52P.js.map +1 -0
- package/dist/{useQueryCache-CHG4-HGF.js → useQueryCache-Bjm-S8v5.js} +2 -2
- package/dist/{useQueryCache-CHG4-HGF.js.map → useQueryCache-Bjm-S8v5.js.map} +1 -1
- package/dist/{useReturnUrl-Da8PpLb9.js → useReturnUrl-qFeazn-G.js} +2 -54
- package/dist/useReturnUrl-qFeazn-G.js.map +1 -0
- package/dist/{useRpcAuth-8Byr6SSI.js → useRpcAuth-rmHf7bYx.js} +42 -2
- package/dist/useRpcAuth-rmHf7bYx.js.map +1 -0
- package/dist/useSignupPendingData-BWHwUHhL.js +47 -0
- package/dist/useSignupPendingData-BWHwUHhL.js.map +1 -0
- package/package.json +5 -2
- package/src/daisyui.css +1 -0
- package/dist/Appearance-C3WguxT-.js +0 -3
- package/dist/ChangePasswordPage-BuVNYC_G.js +0 -6
- package/dist/CreateTeamForm-BuMrZ169.js +0 -32
- package/dist/CreateTeamMemberForm-D0xqR9me.js +0 -32
- package/dist/CreateUserPage-BWIvFF-4.js +0 -6
- package/dist/CreditBalanceDashboard-BR-er7gs.js +0 -32
- package/dist/CreditManagement-CyjrE1ep.js +0 -32
- package/dist/CustomerCreateSupportTicketForm-C9-CLRRQ.js +0 -32
- package/dist/CustomerSupportTicketList-B0dC7lgD.js +0 -32
- package/dist/CustomerSupportTicketParent-D0wLnKXf.js +0 -7
- package/dist/CustomerSupportTicketSuccess-BvuBglg8.js +0 -32
- package/dist/EditTeamForm-BJlOKEkI.js +0 -32
- package/dist/EditTeamMemberForm-CbDvTLXI.js +0 -6
- package/dist/EditUserPage-CsHl1h_g.js +0 -7
- package/dist/ForgotPassword-DJjmzU_m.js +0 -7
- package/dist/LoginForm-BeiI_y3E.js +0 -7
- package/dist/LoginForm-IEP-hEh0.js +0 -115
- package/dist/LoginForm-IEP-hEh0.js.map +0 -1
- package/dist/Logout-DmZTNQDP.js +0 -7
- package/dist/MfaSetup-BwkenBRD.js +0 -8
- package/dist/MfaVerify-BaUROEol.js +0 -8
- package/dist/ResetPassword-DEFj1pgV.js +0 -7
- package/dist/Signup-C94alv87.js +0 -166
- package/dist/Signup-C94alv87.js.map +0 -1
- package/dist/Signup-CFUbdrYs.js +0 -7
- package/dist/StaffCreateSupportTicketForm-AxprwWRv.js +0 -32
- package/dist/StaffSupportTicketList-DYKysNs3.js +0 -32
- package/dist/StaffSupportTicketParent-CT8oYFd6.js +0 -7
- package/dist/StaffSupportTicketSuccess-zWEagE4E.js +0 -32
- package/dist/TeamAttachmentsTab-BFRMbPlZ.js +0 -32
- package/dist/TeamHistoryTab-CYrt5KnE.js +0 -4
- package/dist/TeamList-CF5BQhfx.js +0 -32
- package/dist/TeamMemberList-Dfi2iKOH.js +0 -32
- package/dist/TeamMemberParent-DXcumR-Q.js +0 -32
- package/dist/TeamNotesTab-Bv_HPC6f.js +0 -7
- package/dist/TeamParent-DLoNn-mW.js +0 -32
- package/dist/UserListPage-CBwfXo15.js +0 -4
- package/dist/UserProfilePage-cTrZuwOT.js +0 -7
- package/dist/VerifyEmail-8bsvoDdM.js +0 -175
- package/dist/VerifyEmail-8bsvoDdM.js.map +0 -1
- package/dist/VerifyEmail-Cpc0umIu.js +0 -7
- package/dist/VerifyEmailRequired-CN1FU1AE.js +0 -74
- package/dist/VerifyEmailRequired-CN1FU1AE.js.map +0 -1
- package/dist/ViewTeam-DpjnoTwo.js +0 -32
- package/dist/ViewTeamMember-CRb2oBHG.js +0 -32
- package/dist/convertToLocalDateTime-DOSGtMn8.js.map +0 -1
- package/dist/src-CkgUIye9.js.map +0 -1
- package/dist/useQuery-BKb5JXVS.js.map +0 -1
- package/dist/useReturnUrl-Da8PpLb9.js.map +0 -1
- package/dist/useRpcAuth-8Byr6SSI.js.map +0 -1
- /package/dist/{TeamMembersTab-DTJxmb-M.js → TeamMembersTab-CBB2Yl_I.js} +0 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { l as useUserSessionStore, m as useEnv } from "./useRpcAuth-rmHf7bYx.js";
|
|
2
|
+
import { t as useMutation } from "./useMutation-BTsyHKyn.js";
|
|
3
|
+
import { t as AppLink_default } from "./AppLink-CHMMrSFI.js";
|
|
4
|
+
import { o as withReturnUrl, r as getValidReturnUrl } from "./useReturnUrl-qFeazn-G.js";
|
|
5
|
+
import { computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, ref, toDisplayString, unref, withCtx } from "vue";
|
|
6
|
+
import { useRoute, useRouter } from "vue-router";
|
|
7
|
+
import { loginSchema } from "@dragonmastery/dragoncore-shared";
|
|
8
|
+
import { useForm, withMetadata } from "@dragonmastery/zinia-forms-core";
|
|
9
|
+
|
|
10
|
+
//#region src/slices/auth/features/login/loginSchema.ts
|
|
11
|
+
const loginSchemaWithMetadata = withMetadata(loginSchema, "loginSchema", {
|
|
12
|
+
email: {
|
|
13
|
+
inputType: "email",
|
|
14
|
+
placeholder: "you@example.com",
|
|
15
|
+
helpText: "Enter the email address you used to register",
|
|
16
|
+
autocomplete: "username",
|
|
17
|
+
className: "login-field",
|
|
18
|
+
autofocus: true
|
|
19
|
+
},
|
|
20
|
+
password: {
|
|
21
|
+
inputType: "password",
|
|
22
|
+
placeholder: "••••••••",
|
|
23
|
+
helpText: "Must be at least 8 characters",
|
|
24
|
+
autocomplete: "current-password",
|
|
25
|
+
className: "login-field"
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
//#endregion
|
|
30
|
+
//#region src/slices/auth/features/login/LoginForm.vue
|
|
31
|
+
const _hoisted_1 = { class: "max-w-md mx-auto bg-base-200 p-6 rounded-xl shadow-md container" };
|
|
32
|
+
const _hoisted_2 = {
|
|
33
|
+
key: 0,
|
|
34
|
+
class: "mt-4 p-4 rounded-lg bg-error/15 text-error"
|
|
35
|
+
};
|
|
36
|
+
const _hoisted_3 = { class: "text-sm" };
|
|
37
|
+
const _hoisted_4 = { class: "mt-2" };
|
|
38
|
+
const _hoisted_5 = {
|
|
39
|
+
key: 1,
|
|
40
|
+
class: "text-center mt-2"
|
|
41
|
+
};
|
|
42
|
+
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
43
|
+
__name: "LoginForm",
|
|
44
|
+
setup(__props) {
|
|
45
|
+
const { allowUserSignup, emailVerificationMode } = useEnv();
|
|
46
|
+
const route = useRoute();
|
|
47
|
+
const returnUrl = computed(() => route.query.returnUrl);
|
|
48
|
+
const forgotPasswordLink = computed(() => withReturnUrl("/auth/forgot-password", returnUrl.value));
|
|
49
|
+
const signupLink = computed(() => withReturnUrl("/auth/signup", returnUrl.value));
|
|
50
|
+
const loginBannerMessage = ref(null);
|
|
51
|
+
const { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(loginSchemaWithMetadata, {
|
|
52
|
+
storeName: "login-form",
|
|
53
|
+
persistToLocalStorage: false,
|
|
54
|
+
renderStyle: "daisy_ui"
|
|
55
|
+
});
|
|
56
|
+
const sessionStore = useUserSessionStore();
|
|
57
|
+
const router = useRouter();
|
|
58
|
+
const { mutate: loginMutate } = useMutation((api, input) => api.userSessions.login(input), { credentials: "include" });
|
|
59
|
+
const handleSubmit = async (data) => {
|
|
60
|
+
loginBannerMessage.value = null;
|
|
61
|
+
const loginData = await loginMutate(data);
|
|
62
|
+
if (!loginData) throw new Error("Login failed");
|
|
63
|
+
const { access_token, user_details_token } = loginData;
|
|
64
|
+
if (!access_token || !user_details_token) throw new Error("Invalid login response");
|
|
65
|
+
return loginData;
|
|
66
|
+
};
|
|
67
|
+
const handleSuccess = async (data) => {
|
|
68
|
+
sessionStore.setSession(data.user_details_token);
|
|
69
|
+
sessionStore.setAccessToken(data.access_token);
|
|
70
|
+
form.reset();
|
|
71
|
+
loginBannerMessage.value = null;
|
|
72
|
+
const emailVerified = data.frontend_session?.user?.email_verified ?? true;
|
|
73
|
+
const targetPath = emailVerificationMode === "strict" && !emailVerified ? withReturnUrl("/auth/verify-email", returnUrl.value) : getValidReturnUrl(router.currentRoute.value, "/");
|
|
74
|
+
await router.push(targetPath);
|
|
75
|
+
};
|
|
76
|
+
const handleError = (error) => {
|
|
77
|
+
loginBannerMessage.value = error instanceof Error ? error.message : "Invalid username or password was entered.";
|
|
78
|
+
};
|
|
79
|
+
return (_ctx, _cache) => {
|
|
80
|
+
return openBlock(), createElementBlock("div", _hoisted_1, [_cache[3] || (_cache[3] = createElementVNode("h1", { class: "text-2xl font-bold mb-6 text-center" }, "Login", -1)), createVNode(unref(ZiniaForm), {
|
|
81
|
+
onHandleSubmit: handleSubmit,
|
|
82
|
+
onSuccess: handleSuccess,
|
|
83
|
+
onError: handleError
|
|
84
|
+
}, {
|
|
85
|
+
default: withCtx(() => [
|
|
86
|
+
createVNode(unref(zinia).EmailField),
|
|
87
|
+
createVNode(unref(zinia).PasswordField),
|
|
88
|
+
createVNode(unref(ZiniaSubmitButton), {
|
|
89
|
+
submitText: "Login",
|
|
90
|
+
submittingText: "Logging in..."
|
|
91
|
+
}),
|
|
92
|
+
createCommentVNode(" Error banner underneath login button - backend owns the message "),
|
|
93
|
+
loginBannerMessage.value ? (openBlock(), createElementBlock("div", _hoisted_2, [createElementVNode("p", _hoisted_3, toDisplayString(loginBannerMessage.value), 1)])) : createCommentVNode("v-if", true),
|
|
94
|
+
createElementVNode("div", _hoisted_4, [createVNode(AppLink_default, {
|
|
95
|
+
to: forgotPasswordLink.value,
|
|
96
|
+
class: "link-accent link"
|
|
97
|
+
}, {
|
|
98
|
+
default: withCtx(() => [..._cache[0] || (_cache[0] = [createTextVNode(" Forgot your password? ", -1)])]),
|
|
99
|
+
_: 1
|
|
100
|
+
}, 8, ["to"])]),
|
|
101
|
+
unref(allowUserSignup) ? (openBlock(), createElementBlock("div", _hoisted_5, [createElementVNode("p", null, [_cache[2] || (_cache[2] = createTextVNode(" Don't have an account? ", -1)), createVNode(AppLink_default, {
|
|
102
|
+
class: "link-accent link",
|
|
103
|
+
to: signupLink.value
|
|
104
|
+
}, {
|
|
105
|
+
default: withCtx(() => [..._cache[1] || (_cache[1] = [createTextVNode("Sign up", -1)])]),
|
|
106
|
+
_: 1
|
|
107
|
+
}, 8, ["to"])])])) : createCommentVNode("v-if", true)
|
|
108
|
+
]),
|
|
109
|
+
_: 1
|
|
110
|
+
})]);
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
var LoginForm_default = _sfc_main;
|
|
115
|
+
|
|
116
|
+
//#endregion
|
|
117
|
+
export { loginSchemaWithMetadata as n, LoginForm_default as t };
|
|
118
|
+
//# sourceMappingURL=LoginForm-9UFnA-fO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LoginForm-9UFnA-fO.js","names":[],"sources":["../src/slices/auth/features/login/loginSchema.ts","../src/slices/auth/features/login/LoginForm.vue"],"sourcesContent":["import { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { loginSchema } from '@dragonmastery/dragoncore-shared';\nimport { z } from 'zod';\n\n// Define the login form type\nexport type LoginForm = z.infer<typeof loginSchema>;\n\n// Enhance the schema with metadata\nexport const loginSchemaWithMetadata = withMetadata(loginSchema, 'loginSchema', {\n email: {\n inputType: 'email',\n placeholder: 'you@example.com',\n helpText: 'Enter the email address you used to register',\n autocomplete: 'username',\n className: 'login-field',\n autofocus: true,\n },\n\n password: {\n inputType: 'password',\n placeholder: '••••••••',\n helpText: 'Must be at least 8 characters',\n autocomplete: 'current-password',\n className: 'login-field',\n },\n});\n","<template>\n <div class=\"max-w-md mx-auto bg-base-200 p-6 rounded-xl shadow-md container\">\n <h1 class=\"text-2xl font-bold mb-6 text-center\">Login</h1>\n\n <ZiniaForm @handle-submit=\"handleSubmit\" @success=\"handleSuccess\" @error=\"handleError\">\n <zinia.EmailField />\n <zinia.PasswordField />\n\n <ZiniaSubmitButton submitText=\"Login\" submittingText=\"Logging in...\" />\n\n <!-- Error banner underneath login button - backend owns the message -->\n <div\n v-if=\"loginBannerMessage\"\n class=\"mt-4 p-4 rounded-lg bg-error/15 text-error\"\n >\n <p class=\"text-sm\">{{ loginBannerMessage }}</p>\n </div>\n\n <div class=\"mt-2\">\n <AppLink :to=\"forgotPasswordLink\" class=\"link-accent link\">\n Forgot your password?\n </AppLink>\n </div>\n <div v-if=\"allowUserSignup\" class=\"text-center mt-2\">\n <p>\n Don't have an account?\n <AppLink class=\"link-accent link\" :to=\"signupLink\">Sign up</AppLink>\n </p>\n </div>\n </ZiniaForm>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport AppLink from '../../../../components/AppLink.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useEnv } from '../../../../composables/useEnv';\nimport { useUserSessionStore } from '../../../../composables/useUserSessionStore';\nimport { getValidReturnUrl, withReturnUrl } from '../../../../utils/useReturnUrl';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { computed, ref } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { z } from 'zod';\nimport { loginSchemaWithMetadata } from './loginSchema';\n\nconst { allowUserSignup, emailVerificationMode } = useEnv();\nconst route = useRoute();\nconst returnUrl = computed(() => route.query.returnUrl as string | undefined);\nconst forgotPasswordLink = computed(() => withReturnUrl('/auth/forgot-password', returnUrl.value));\nconst signupLink = computed(() => withReturnUrl('/auth/signup', returnUrl.value));\n\nconst loginBannerMessage = ref<string | null>(null);\n\n// Create a type-safe form using our schema with metadata\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(loginSchemaWithMetadata, {\n storeName: 'login-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n});\n\nconst sessionStore = useUserSessionStore();\nconst router = useRouter();\nconst { mutate: loginMutate } = useMutation(\n (api, input: z.infer<typeof loginSchemaWithMetadata>) => api.userSessions.login(input),\n { credentials: 'include' }, // Include credentials to allow cookies\n);\n\n// Handle form submission\nconst handleSubmit = async (data: z.infer<typeof loginSchemaWithMetadata>) => {\n loginBannerMessage.value = null;\n\n const loginData = await loginMutate(data);\n if (!loginData) throw new Error('Login failed');\n const { access_token, user_details_token } = loginData;\n if (!access_token || !user_details_token) throw new Error('Invalid login response');\n\n return loginData;\n};\n\n// Handle success\nconst handleSuccess = async (data: {\n access_token: string;\n user_details_token: string;\n frontend_session?: { user?: { email_verified?: boolean } };\n}) => {\n sessionStore.setSession(data.user_details_token);\n sessionStore.setAccessToken(data.access_token);\n\n form.reset();\n loginBannerMessage.value = null;\n\n const emailVerified = data.frontend_session?.user?.email_verified ?? true;\n const needsVerification =\n emailVerificationMode === 'strict' && !emailVerified;\n\n const targetPath = needsVerification\n ? withReturnUrl('/auth/verify-email', returnUrl.value)\n : getValidReturnUrl(router.currentRoute.value, '/');\n\n await router.push(targetPath);\n};\n\n// Handle error - display backend message (backend owns error messaging)\nconst handleError = (error: unknown) => {\n loginBannerMessage.value =\n error instanceof Error ? error.message : 'Invalid username or password was entered.';\n};\n</script>\n"],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { l as useUserSessionStore } from "./useRpcAuth-
|
|
2
|
-
import { t as useMutation } from "./useMutation-
|
|
3
|
-
import {
|
|
1
|
+
import { l as useUserSessionStore } from "./useRpcAuth-rmHf7bYx.js";
|
|
2
|
+
import { t as useMutation } from "./useMutation-BTsyHKyn.js";
|
|
3
|
+
import { t as AppLink_default } from "./AppLink-CHMMrSFI.js";
|
|
4
|
+
import { r as getValidReturnUrl } from "./useReturnUrl-qFeazn-G.js";
|
|
4
5
|
import { computed, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, onMounted, openBlock, ref, toDisplayString, withCtx } from "vue";
|
|
5
6
|
import { useRoute, useRouter } from "vue-router";
|
|
6
7
|
import { toast } from "vue3-toastify";
|
|
@@ -67,4 +68,4 @@ var Logout_default = _sfc_main;
|
|
|
67
68
|
|
|
68
69
|
//#endregion
|
|
69
70
|
export { Logout_default as t };
|
|
70
|
-
//# sourceMappingURL=Logout-
|
|
71
|
+
//# sourceMappingURL=Logout-YgTgOFUH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Logout-
|
|
1
|
+
{"version":3,"file":"Logout-YgTgOFUH.js","names":["error: unknown"],"sources":["../src/slices/auth/features/Logout.vue"],"sourcesContent":["<template>\n <div class=\"min-h-screen flex items-center justify-center bg-base-100\">\n <div class=\"max-w-md mx-auto bg-base-200 p-8 rounded-xl shadow-md text-center\">\n <div v-if=\"status === 'loading'\" class=\"space-y-4\">\n <div class=\"flex justify-center\">\n <span class=\"loading loading-spinner loading-lg text-primary\"></span>\n </div>\n <h2 class=\"text-2xl font-bold mb-2\">Logging out...</h2>\n <p class=\"text-base-content/70\">Please wait while we securely log you out</p>\n </div>\n <div v-else class=\"space-y-4\">\n <h2 class=\"text-2xl font-bold mb-2\">\n {{ status === 'success' ? 'Logged out' : 'Logout failed' }}\n </h2>\n <p class=\"text-base-content/70\">\n {{ status === 'success'\n ? 'Redirecting you...'\n : 'Redirecting you to login...' }}\n </p>\n <p class=\"text-sm text-base-content/60\">\n If you aren't redirected automatically,\n <AppLink :to=\"redirectTo\" class=\"link link-primary\">click here</AppLink>.\n </p>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport AppLink from '../../../components/AppLink.vue';\nimport { useMutation } from '../../../composables/useMutation';\nimport { useUserSessionStore } from '../../../composables/useUserSessionStore';\nimport { getValidReturnUrl } from '../../../utils/useReturnUrl';\nimport { onMounted, computed, ref } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\n\nconst sessionStore = useUserSessionStore();\nconst route = useRoute();\nconst router = useRouter();\nconst status = ref<'loading' | 'success' | 'error'>('loading');\n\nconst redirectTo = computed(() =>\n getValidReturnUrl(route, '/auth/login'),\n);\n\nconst { mutate: logoutMutate } = useMutation(\n (api) => api.userSessions.logout(),\n { credentials: 'include' }, // Include credentials to allow cookies\n);\n\nonMounted(async () => {\n try {\n await logoutMutate(undefined);\n sessionStore.clearSession();\n status.value = 'success';\n setTimeout(() => router.push(redirectTo.value), 1000);\n } catch (error: unknown) {\n status.value = 'error';\n toast.error(error instanceof Error ? error.message : 'Failed to logout', {\n autoClose: 2000,\n });\n setTimeout(() => router.push(redirectTo.value), 2000);\n }\n});\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;EAqCA,MAAM,eAAe,qBAAqB;EAC1C,MAAM,QAAQ,UAAU;EACxB,MAAM,SAAS,WAAW;EAC1B,MAAM,SAAS,IAAqC,UAAU;EAE9D,MAAM,aAAa,eACjB,kBAAkB,OAAO,cAAc,CACxC;EAED,MAAM,EAAE,QAAQ,iBAAiB,aAC9B,QAAQ,IAAI,aAAa,QAAQ,EAClC,EAAE,aAAa,WAAW,CAC3B;AAED,YAAU,YAAY;AACpB,OAAI;AACF,UAAM,aAAa,OAAU;AAC7B,iBAAa,cAAc;AAC3B,WAAO,QAAQ;AACf,qBAAiB,OAAO,KAAK,WAAW,MAAM,EAAE,IAAK;YAC9CA,OAAgB;AACvB,WAAO,QAAQ;AACf,UAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,oBAAoB,EACvE,WAAW,KACZ,CAAC;AACF,qBAAiB,OAAO,KAAK,WAAW,MAAM,EAAE,IAAK;;IAEvD;;uBA/DA,mBAwBM,OAxBN,YAwBM,CAvBJ,mBAsBM,OAtBN,YAsBM,CArBO,OAAA,UAAM,aAAA,WAAA,EAAjB,mBAMM,OANN,YAMM,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA;IALJ,mBAEM,OAAA,EAFD,OAAM,uBAAqB,EAAA,CAC9B,mBAAqE,QAAA,EAA/D,OAAM,mDAAiD,CAAA,CAAA;IAE/D,mBAAuD,MAAA,EAAnD,OAAM,2BAAyB,EAAC,kBAAc,GAAA;IAClD,mBAA6E,KAAA,EAA1E,OAAM,wBAAsB,EAAC,6CAAyC,GAAA;yBAE3E,mBAaM,OAbN,YAaM;IAZJ,mBAEK,MAFL,YAEK,gBADA,OAAA,UAAM,YAAA,eAAA,gBAAA,EAAA,EAAA;IAEX,mBAII,KAJJ,YAII,gBAHC,OAAA,UAAM,YAAA,uBAAA,8BAAA;IAIX,mBAGI,KAHJ,YAGI;+CAHoC,6CAEtC,GAAA;KAAA,YAAwE,iBAAA;MAA9D,IAAI,WAAA;MAAY,OAAM;;6BAA8B,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAAV,cAAU,GAAA,CAAA,EAAA,CAAA;;;+CAAU,MAC1E,GAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import "./useRpcAuth-rmHf7bYx.js";
|
|
2
|
+
import "./useQueryCache-Bjm-S8v5.js";
|
|
3
|
+
import "./useMutation-BTsyHKyn.js";
|
|
4
|
+
import "./AppLink-CHMMrSFI.js";
|
|
5
|
+
import "./mfaSchema-BnRWf0ma.js";
|
|
6
|
+
import { t as MfaSetup_default } from "./MfaSetup-RtFMY_dj.js";
|
|
7
|
+
|
|
8
|
+
export { MfaSetup_default as default };
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { t as useMutation } from "./useMutation-
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { t as useMutation } from "./useMutation-BTsyHKyn.js";
|
|
2
|
+
import { t as AppLink_default } from "./AppLink-CHMMrSFI.js";
|
|
3
|
+
import { o as withReturnUrl, r as getValidReturnUrl } from "./useReturnUrl-qFeazn-G.js";
|
|
4
|
+
import { t as mfaSetupConfirmSchemaWithMetadata } from "./mfaSchema-BnRWf0ma.js";
|
|
4
5
|
import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, ref, toDisplayString, unref, withCtx } from "vue";
|
|
5
6
|
import { useRoute, useRouter } from "vue-router";
|
|
6
7
|
import { toast } from "vue3-toastify";
|
|
@@ -109,4 +110,4 @@ var MfaSetup_default = _sfc_main;
|
|
|
109
110
|
|
|
110
111
|
//#endregion
|
|
111
112
|
export { MfaSetup_default as t };
|
|
112
|
-
//# sourceMappingURL=MfaSetup-
|
|
113
|
+
//# sourceMappingURL=MfaSetup-RtFMY_dj.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MfaSetup-
|
|
1
|
+
{"version":3,"file":"MfaSetup-RtFMY_dj.js","names":[],"sources":["../src/slices/auth/features/mfa/MfaSetup.vue"],"sourcesContent":["<template>\n <div class=\"max-w-md mx-auto bg-base-200 p-6 rounded-xl shadow-md container\">\n <h1 class=\"text-2xl font-bold mb-6 text-center\">Set Up Two-Factor Authentication</h1>\n\n <div v-if=\"!setupData\" class=\"space-y-4\">\n <p class=\"text-base-content/80\">\n Add an extra layer of security to your account by enabling two-factor authentication (2FA).\n </p>\n <button\n type=\"button\"\n class=\"btn btn-primary w-full\"\n :disabled=\"loading\"\n @click=\"startSetup\"\n >\n {{ loading ? 'Starting...' : 'Begin Setup' }}\n </button>\n </div>\n\n <ZiniaForm\n v-else\n @handle-submit=\"handleConfirm\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n >\n <div class=\"space-y-4 mb-4\">\n <p class=\"text-sm text-base-content/80\">\n Scan this QR code with your authenticator app (Google Authenticator, Authy, etc.):\n </p>\n <div v-if=\"setupData.qrCodeUrl\" class=\"flex justify-center\">\n <img\n :src=\"setupData.qrCodeUrl\"\n alt=\"MFA QR Code\"\n class=\"w-48 h-48 border rounded-lg\"\n />\n </div>\n <p class=\"text-sm text-base-content/80\">\n Or enter this secret manually: <code class=\"bg-base-300 px-2 py-1 rounded text-sm break-all\">{{ setupData.secret }}</code>\n </p>\n </div>\n <zinia.CodeField />\n <ZiniaSubmitButton submitText=\"Verify & Enable\" submittingText=\"Verifying...\" />\n\n <div class=\"text-center mt-2\">\n <AppLink class=\"link-accent link\" :to=\"loginLink\">Back to Login</AppLink>\n </div>\n </ZiniaForm>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport AppLink from '../../../../components/AppLink.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { getValidReturnUrl, withReturnUrl } from '../../../../utils/useReturnUrl';\nimport { computed, ref } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport { z } from 'zod';\nimport type { DragoncoreApi, MfaApi } from '@dragonmastery/dragoncore-shared';\nimport { mfaSetupConfirmSchemaWithMetadata } from './mfaSchema';\n\nconst router = useRouter();\nconst route = useRoute();\nconst returnUrl = computed(() => route.query.returnUrl as string | undefined);\nconst loginLink = computed(() => withReturnUrl('/auth/login', returnUrl.value));\nconst setupData = ref<{ secret: string; qrCodeUrl: string } | null>(null);\n\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(\n mfaSetupConfirmSchemaWithMetadata,\n {\n storeName: 'mfa-setup-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n },\n);\n\nconst { mutate: startSetupMutate, loading } = useMutation(\n (api, _input?: unknown) => {\n const mfa = (api as DragoncoreApi).mfa;\n if (!mfa) throw new Error('MFA is not configured for this application');\n return (mfa as MfaApi).startSetup();\n },\n { skipAuthCheck: false },\n);\n\nconst { mutate: confirmSetupMutate } = useMutation(\n (api, code: string) => {\n const mfa = (api as DragoncoreApi).mfa;\n if (!mfa) throw new Error('MFA is not configured for this application');\n return (mfa as MfaApi).confirmSetup(code);\n },\n { skipAuthCheck: false },\n);\n\nconst startSetup = async () => {\n const result = await startSetupMutate(undefined);\n if (result) setupData.value = result;\n};\n\nconst handleConfirm = async (data: z.infer<typeof mfaSetupConfirmSchemaWithMetadata>) => {\n const result = await confirmSetupMutate(data.code);\n if (!result?.ok) throw new Error('MFA setup verification failed');\n return result;\n};\n\nconst handleSuccess = async (data: { ok: boolean; recoveryCodes?: string[] }) => {\n form.reset();\n setupData.value = null;\n if (data.recoveryCodes?.length) {\n toast.success(\n 'MFA enabled! Save your recovery codes in a safe place. You will need them if you lose access to your authenticator.',\n );\n } else {\n toast.success('Two-factor authentication has been enabled.');\n }\n const targetPath = getValidReturnUrl(route, '/');\n await router.push(targetPath);\n};\n\nconst handleError = (error: Error) => {\n toast.error(error.message || 'MFA setup failed');\n};\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6DA,MAAM,SAAS,WAAW;EAC1B,MAAM,QAAQ,UAAU;EACxB,MAAM,YAAY,eAAe,MAAM,MAAM,UAAgC;EAC7E,MAAM,YAAY,eAAe,cAAc,eAAe,UAAU,MAAM,CAAC;EAC/E,MAAM,YAAY,IAAkD,KAAK;EAEzE,MAAM,EAAE,MAAM,OAAO,WAAW,sBAAsB,QACpD,mCACA;GACE,WAAW;GACX,uBAAuB;GACvB,aAAa;GACd,CACF;EAED,MAAM,EAAE,QAAQ,kBAAkB,YAAY,aAC3C,KAAK,WAAqB;GACzB,MAAM,MAAO,IAAsB;AACnC,OAAI,CAAC,IAAK,OAAM,IAAI,MAAM,6CAA6C;AACvE,UAAQ,IAAe,YAAY;KAErC,EAAE,eAAe,OAAO,CACzB;EAED,MAAM,EAAE,QAAQ,uBAAuB,aACpC,KAAK,SAAiB;GACrB,MAAM,MAAO,IAAsB;AACnC,OAAI,CAAC,IAAK,OAAM,IAAI,MAAM,6CAA6C;AACvE,UAAQ,IAAe,aAAa,KAAK;KAE3C,EAAE,eAAe,OAAO,CACzB;EAED,MAAM,aAAa,YAAY;GAC7B,MAAM,SAAS,MAAM,iBAAiB,OAAU;AAChD,OAAI,OAAQ,WAAU,QAAQ;;EAGhC,MAAM,gBAAgB,OAAO,SAA4D;GACvF,MAAM,SAAS,MAAM,mBAAmB,KAAK,KAAK;AAClD,OAAI,CAAC,QAAQ,GAAI,OAAM,IAAI,MAAM,gCAAgC;AACjE,UAAO;;EAGT,MAAM,gBAAgB,OAAO,SAAoD;AAC/E,QAAK,OAAO;AACZ,aAAU,QAAQ;AAClB,OAAI,KAAK,eAAe,OACtB,OAAM,QACJ,sHACD;OAED,OAAM,QAAQ,8CAA8C;GAE9D,MAAM,aAAa,kBAAkB,OAAO,IAAI;AAChD,SAAM,OAAO,KAAK,WAAW;;EAG/B,MAAM,eAAe,UAAiB;AACpC,SAAM,MAAM,MAAM,WAAW,mBAAmB;;;uBAvHhD,mBA6CM,OA7CN,YA6CM,CAAA,OAAA,OAAA,OAAA,KA5CJ,mBAAqF,MAAA,EAAjF,OAAM,uCAAqC,EAAC,oCAAgC,GAAA,GAAA,CAEpE,UAAA,SAAA,WAAA,EAAZ,mBAYM,OAZN,YAYM,CAAA,OAAA,OAAA,OAAA,KAXJ,mBAEI,KAAA,EAFD,OAAM,wBAAsB,EAAC,iGAEhC,GAAA,GACA,mBAOS,UAAA;IANP,MAAK;IACL,OAAM;IACL,UAAU,MAAA,QAAO;IACjB,SAAO;sBAEL,MAAA,QAAO,GAAA,gBAAA,cAAA,EAAA,GAAA,WAAA,CAAA,CAAA,KAAA,WAAA,EAId,YA2BY,MAAA,UAAA,EAAA;;IAzBT,gBAAe;IACf,WAAS;IACT,SAAO;;2BAgBF;KAdN,mBAcM,OAdN,YAcM;gCAbJ,mBAEI,KAAA,EAFD,OAAM,gCAA8B,EAAC,wFAExC,GAAA;MACW,UAAA,MAAU,aAAA,WAAA,EAArB,mBAMM,OANN,YAMM,CALJ,mBAIE,OAAA;OAHC,KAAK,UAAA,MAAU;OAChB,KAAI;OACJ,OAAM;;MAGV,mBAEI,KAFJ,YAEI,CAAA,OAAA,OAAA,OAAA,KAAA,gBAFoC,oCACP,GAAA,GAAA,mBAA2F,QAA3F,YAA2F,gBAA1B,UAAA,MAAU,OAAM,EAAA,EAAA,CAAA,CAAA;;KAGpH,YAAmB,MAAA,MAAA,CAAA,UAAA;KACnB,YAAgF,MAAA,kBAAA,EAAA;MAA7D,YAAW;MAAkB,gBAAe;;KAE/D,mBAEM,OAFN,YAEM,CADJ,YAAyE,iBAAA;MAAhE,OAAM;MAAoB,IAAI,UAAA;;6BAAwB,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAAb,iBAAa,GAAA,CAAA,EAAA,CAAA"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { l as useUserSessionStore } from "./useRpcAuth-
|
|
2
|
-
import { t as useMutation } from "./useMutation-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { l as useUserSessionStore } from "./useRpcAuth-rmHf7bYx.js";
|
|
2
|
+
import { t as useMutation } from "./useMutation-BTsyHKyn.js";
|
|
3
|
+
import { t as AppLink_default } from "./AppLink-CHMMrSFI.js";
|
|
4
|
+
import { o as withReturnUrl, r as getValidReturnUrl } from "./useReturnUrl-qFeazn-G.js";
|
|
5
|
+
import { n as mfaVerifySchemaWithMetadata } from "./mfaSchema-BnRWf0ma.js";
|
|
5
6
|
import { computed, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, unref, withCtx } from "vue";
|
|
6
7
|
import { useRoute, useRouter } from "vue-router";
|
|
7
8
|
import { toast } from "vue3-toastify";
|
|
@@ -82,4 +83,4 @@ var MfaVerify_default = _sfc_main;
|
|
|
82
83
|
|
|
83
84
|
//#endregion
|
|
84
85
|
export { MfaVerify_default as t };
|
|
85
|
-
//# sourceMappingURL=MfaVerify-
|
|
86
|
+
//# sourceMappingURL=MfaVerify-Cvhe8bEM.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MfaVerify-
|
|
1
|
+
{"version":3,"file":"MfaVerify-Cvhe8bEM.js","names":[],"sources":["../src/slices/auth/features/mfa/MfaVerify.vue"],"sourcesContent":["<template>\n <div class=\"max-w-md mx-auto bg-base-200 p-6 rounded-xl shadow-md container\">\n <h1 class=\"text-2xl font-bold mb-6 text-center\">Two-Factor Authentication</h1>\n\n <p class=\"text-base-content/80 mb-4\">\n Enter the 6-digit code from your authenticator app to complete sign in.\n </p>\n\n <ZiniaForm @handle-submit=\"handleSubmit\" @success=\"handleSuccess\" @error=\"handleError\">\n <zinia.CodeField />\n <ZiniaSubmitButton submitText=\"Verify\" submittingText=\"Verifying...\" />\n\n <div class=\"text-center mt-2\">\n <AppLink class=\"link-accent link\" :to=\"loginLink\">Back to Login</AppLink>\n </div>\n </ZiniaForm>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport AppLink from '../../../../components/AppLink.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useUserSessionStore } from '../../../../composables/useUserSessionStore';\nimport { getValidReturnUrl, withReturnUrl } from '../../../../utils/useReturnUrl';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { computed } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport type { DragoncoreApi } from '@dragonmastery/dragoncore-shared';\nimport type { MfaApi } from '@dragonmastery/dragoncore-shared';\nimport { z } from 'zod';\nimport { mfaVerifySchemaWithMetadata } from './mfaSchema';\n\nconst router = useRouter();\nconst route = useRoute();\nconst sessionStore = useUserSessionStore();\n\nconst returnUrl = computed(() => route.query.returnUrl as string | undefined);\nconst loginLink = computed(() => withReturnUrl('/auth/login', returnUrl.value));\nconst mfaSessionId = route.query.mfaSessionId as string;\n\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton } = useForm(mfaVerifySchemaWithMetadata, {\n storeName: 'mfa-verify-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n});\n\nconst { mutate: verifyMutate } = useMutation(\n (api, input: { mfaSessionId: string; code: string }) => {\n const mfa = (api as DragoncoreApi).mfa;\n if (!mfa) throw new Error('MFA is not configured for this application');\n return (mfa as MfaApi).verify(input.mfaSessionId, input.code);\n },\n { credentials: 'include' },\n);\n\nconst handleSubmit = async (data: z.infer<typeof mfaVerifySchemaWithMetadata>) => {\n if (!mfaSessionId) throw new Error('Invalid MFA session. Please try logging in again.');\n const result = await verifyMutate({ mfaSessionId, code: data.code });\n if (!result?.access_token || !result?.user_details_token) throw new Error('Verification failed');\n return result;\n};\n\nconst handleSuccess = async (data: { access_token: string; user_details_token: string }) => {\n sessionStore.setSession(data.user_details_token);\n sessionStore.setAccessToken(data.access_token);\n form.reset();\n\n const targetPath = getValidReturnUrl(route, '/');\n await router.push(targetPath);\n toast.success('You are now logged in!');\n};\n\nconst handleError = (error: Error) => {\n toast.error(error.message || 'Verification failed');\n};\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;EAiCA,MAAM,SAAS,WAAW;EAC1B,MAAM,QAAQ,UAAU;EACxB,MAAM,eAAe,qBAAqB;EAE1C,MAAM,YAAY,eAAe,MAAM,MAAM,UAAgC;EAC7E,MAAM,YAAY,eAAe,cAAc,eAAe,UAAU,MAAM,CAAC;EAC/E,MAAM,eAAe,MAAM,MAAM;EAEjC,MAAM,EAAE,MAAM,OAAO,WAAW,sBAAsB,QAAQ,6BAA6B;GACzF,WAAW;GACX,uBAAuB;GACvB,aAAa;GACd,CAAC;EAEF,MAAM,EAAE,QAAQ,iBAAiB,aAC9B,KAAK,UAAkD;GACtD,MAAM,MAAO,IAAsB;AACnC,OAAI,CAAC,IAAK,OAAM,IAAI,MAAM,6CAA6C;AACvE,UAAQ,IAAe,OAAO,MAAM,cAAc,MAAM,KAAK;KAE/D,EAAE,aAAa,WAAW,CAC3B;EAED,MAAM,eAAe,OAAO,SAAsD;AAChF,OAAI,CAAC,aAAc,OAAM,IAAI,MAAM,oDAAoD;GACvF,MAAM,SAAS,MAAM,aAAa;IAAE;IAAc,MAAM,KAAK;IAAM,CAAC;AACpE,OAAI,CAAC,QAAQ,gBAAgB,CAAC,QAAQ,mBAAoB,OAAM,IAAI,MAAM,sBAAsB;AAChG,UAAO;;EAGT,MAAM,gBAAgB,OAAO,SAA+D;AAC1F,gBAAa,WAAW,KAAK,mBAAmB;AAChD,gBAAa,eAAe,KAAK,aAAa;AAC9C,QAAK,OAAO;GAEZ,MAAM,aAAa,kBAAkB,OAAO,IAAI;AAChD,SAAM,OAAO,KAAK,WAAW;AAC7B,SAAM,QAAQ,yBAAyB;;EAGzC,MAAM,eAAe,UAAiB;AACpC,SAAM,MAAM,MAAM,WAAW,sBAAsB;;;uBAzEnD,mBAeM,OAfN,YAeM;8BAdJ,mBAA8E,MAAA,EAA1E,OAAM,uCAAqC,EAAC,6BAAyB,GAAA;8BAEzE,mBAEI,KAAA,EAFD,OAAM,6BAA2B,EAAC,6EAErC,GAAA;IAEA,YAOY,MAAA,UAAA,EAAA;KAPA,gBAAe;KAAe,WAAS;KAAgB,SAAO;;4BACrD;MAAnB,YAAmB,MAAA,MAAA,CAAA,UAAA;MACnB,YAAuE,MAAA,kBAAA,EAAA;OAApD,YAAW;OAAS,gBAAe;;MAEtD,mBAEM,OAFN,YAEM,CADJ,YAAyE,iBAAA;OAAhE,OAAM;OAAoB,IAAI,UAAA;;8BAAwB,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAAb,iBAAa,GAAA,CAAA,EAAA,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import "./useRpcAuth-rmHf7bYx.js";
|
|
2
|
+
import "./useQueryCache-Bjm-S8v5.js";
|
|
3
|
+
import "./useMutation-BTsyHKyn.js";
|
|
4
|
+
import "./AppLink-CHMMrSFI.js";
|
|
5
|
+
import "./mfaSchema-BnRWf0ma.js";
|
|
6
|
+
import { t as MfaVerify_default } from "./MfaVerify-Cvhe8bEM.js";
|
|
7
|
+
|
|
8
|
+
export { MfaVerify_default as default };
|