@unidy.io/sdk 1.1.4 → 1.1.6
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/cjs/{auth-NU3DBc-6.js → auth-B83pzi0f.js} +126 -125
- package/dist/cjs/auth-B83pzi0f.js.map +1 -0
- package/dist/cjs/{auth-store-BaxuIp4z.js → auth-store-DPHWWmXf.js} +2 -4
- package/dist/cjs/auth-store-DPHWWmXf.js.map +1 -0
- package/dist/cjs/index.cjs.js +2 -2
- package/dist/cjs/{newsletter-helpers-DR0vsegt.js → newsletter-helpers-D-V_8kiN.js} +3 -3
- package/dist/cjs/{newsletter-helpers-DR0vsegt.js.map → newsletter-helpers-D-V_8kiN.js.map} +1 -1
- package/dist/cjs/u-conditional-render.cjs.entry.js +3 -3
- package/dist/cjs/u-config.cjs.entry.js +7 -7
- package/dist/cjs/u-config.entry.cjs.js.map +1 -1
- package/dist/cjs/u-email-field.cjs.entry.js +1 -1
- package/dist/cjs/u-error-message.cjs.entry.js +1 -1
- package/dist/cjs/u-logout-button.cjs.entry.js +4 -4
- package/dist/cjs/u-magic-code-field.cjs.entry.js +3 -3
- package/dist/cjs/u-missing-field.cjs.entry.js +1 -1
- package/dist/cjs/u-missing-fields-submit-button.cjs.entry.js +1 -1
- package/dist/cjs/u-newsletter-checkbox.cjs.entry.js +3 -3
- package/dist/cjs/u-newsletter-logout-button.cjs.entry.js +3 -3
- package/dist/cjs/u-newsletter-preference-checkbox.cjs.entry.js +3 -3
- package/dist/cjs/u-newsletter-resend-doi-button.cjs.entry.js +3 -3
- package/dist/cjs/u-newsletter-root.cjs.entry.js +5 -5
- package/dist/cjs/u-newsletter-toggle-subscription-button.cjs.entry.js +3 -3
- package/dist/cjs/u-passkey.cjs.entry.js +3 -3
- package/dist/cjs/u-password-field.cjs.entry.js +1 -1
- package/dist/cjs/u-password-field.entry.cjs.js.map +1 -1
- package/dist/cjs/u-profile.u-submit-button.entry.cjs.js.map +1 -1
- package/dist/cjs/u-profile_2.cjs.entry.js +3 -3
- package/dist/cjs/u-registration-button.cjs.entry.js +1 -1
- package/dist/cjs/u-reset-password-button.cjs.entry.js +3 -3
- package/dist/cjs/u-send-magic-code-button.cjs.entry.js +3 -3
- package/dist/cjs/u-signed-in.cjs.entry.js +1 -1
- package/dist/cjs/u-signin-root.cjs.entry.js +1 -1
- package/dist/cjs/u-signin-step.cjs.entry.js +3 -3
- package/dist/cjs/u-signin-strategy.cjs.entry.js +1 -1
- package/dist/cjs/u-social-login-button.cjs.entry.js +1 -1
- package/dist/cjs/u-spinner.cjs.entry.js +1 -1
- package/dist/cjs/u-spinner.entry.cjs.js.map +1 -1
- package/dist/collection/auth/auth-helpers.js +115 -117
- package/dist/collection/auth/auth-helpers.js.map +1 -1
- package/dist/collection/auth/auth.js +9 -6
- package/dist/collection/auth/auth.js.map +1 -1
- package/dist/collection/auth/components/password-field/password-field.js.map +1 -1
- package/dist/collection/auth/store/auth-store.js +0 -2
- package/dist/collection/auth/store/auth-store.js.map +1 -1
- package/dist/collection/shared/components/config/config.js +6 -6
- package/dist/collection/shared/components/config/config.js.map +1 -1
- package/dist/collection/shared/components/spinner/spinner.css +1 -1
- package/dist/collection/shared/components/submit-button/submit-button.css +1 -1
- package/dist/components/auth-store.js +0 -2
- package/dist/components/auth-store.js.map +1 -1
- package/dist/components/auth.js +124 -123
- package/dist/components/auth.js.map +1 -1
- package/dist/components/spinner.js +1 -1
- package/dist/components/spinner.js.map +1 -1
- package/dist/components/submit-button.js +1 -1
- package/dist/components/submit-button.js.map +1 -1
- package/dist/components/u-config.js +6 -6
- package/dist/components/u-config.js.map +1 -1
- package/dist/components/u-password-field.js.map +1 -1
- package/dist/esm/{auth-nsjRdpvS.js → auth-B0RIcDM-.js} +126 -125
- package/dist/esm/auth-B0RIcDM-.js.map +1 -0
- package/dist/esm/{auth-store-CVvBlKGv.js → auth-store-BGMYm_jK.js} +2 -4
- package/dist/esm/auth-store-BGMYm_jK.js.map +1 -0
- package/dist/esm/index.js +2 -2
- package/dist/esm/{newsletter-helpers-Dc_24im3.js → newsletter-helpers-CONtbKYi.js} +3 -3
- package/dist/esm/{newsletter-helpers-Dc_24im3.js.map → newsletter-helpers-CONtbKYi.js.map} +1 -1
- package/dist/esm/u-conditional-render.entry.js +3 -3
- package/dist/esm/u-config.entry.js +7 -7
- package/dist/esm/u-config.entry.js.map +1 -1
- package/dist/esm/u-email-field.entry.js +1 -1
- package/dist/esm/u-error-message.entry.js +1 -1
- package/dist/esm/u-logout-button.entry.js +4 -4
- package/dist/esm/u-magic-code-field.entry.js +3 -3
- package/dist/esm/u-missing-field.entry.js +1 -1
- package/dist/esm/u-missing-fields-submit-button.entry.js +1 -1
- package/dist/esm/u-newsletter-checkbox.entry.js +3 -3
- package/dist/esm/u-newsletter-logout-button.entry.js +3 -3
- package/dist/esm/u-newsletter-preference-checkbox.entry.js +3 -3
- package/dist/esm/u-newsletter-resend-doi-button.entry.js +3 -3
- package/dist/esm/u-newsletter-root.entry.js +5 -5
- package/dist/esm/u-newsletter-toggle-subscription-button.entry.js +3 -3
- package/dist/esm/u-passkey.entry.js +3 -3
- package/dist/esm/u-password-field.entry.js +1 -1
- package/dist/esm/u-password-field.entry.js.map +1 -1
- package/dist/esm/u-profile.u-submit-button.entry.js.map +1 -1
- package/dist/esm/u-profile_2.entry.js +3 -3
- package/dist/esm/u-registration-button.entry.js +1 -1
- package/dist/esm/u-reset-password-button.entry.js +3 -3
- package/dist/esm/u-send-magic-code-button.entry.js +3 -3
- package/dist/esm/u-signed-in.entry.js +1 -1
- package/dist/esm/u-signin-root.entry.js +1 -1
- package/dist/esm/u-signin-step.entry.js +3 -3
- package/dist/esm/u-signin-strategy.entry.js +1 -1
- package/dist/esm/u-social-login-button.entry.js +1 -1
- package/dist/esm/u-spinner.entry.js +1 -1
- package/dist/esm/u-spinner.entry.js.map +1 -1
- package/dist/sdk/auth-BopPjv7G.js.map +1 -0
- package/dist/sdk/auth-C0vldOq6.js.map +1 -0
- package/dist/sdk/auth-store-DQaam_Qh.js.map +1 -0
- package/dist/sdk/auth-store-sOmplc4z.js.map +1 -0
- package/dist/sdk/component-utils-D1lzXl_Z.js.map +1 -0
- package/dist/sdk/flash-store-Cgu7WoSN.js.map +1 -0
- package/dist/sdk/flash-store-DNcSEn2p.js.map +1 -0
- package/dist/sdk/helpers-BqFCd65h.js.map +1 -0
- package/dist/sdk/helpers-DUHc_Cx7.js.map +1 -0
- package/dist/sdk/i18n-B6rRU-m3.js.map +1 -0
- package/dist/sdk/i18n-CZii1E-s.js.map +1 -0
- package/dist/sdk/index-B1aDcaWd.js.map +1 -0
- package/dist/sdk/index-BnBstyfp.js.map +1 -0
- package/dist/sdk/index-BqL27K_R.js.map +1 -0
- package/dist/sdk/index-C5jZjlU8.js.map +1 -0
- package/dist/sdk/index-Df-7P3r0.js.map +1 -0
- package/dist/sdk/index-Eu7hg2ii.js.map +1 -0
- package/dist/sdk/index-Iulyfmzq.js.map +1 -0
- package/dist/sdk/index-O6h7SI7-.js.map +1 -0
- package/dist/sdk/index.esm.js +1 -1
- package/dist/sdk/newsletter-helpers-8ByV38YW.js.map +1 -0
- package/dist/sdk/newsletter-helpers-B-Md6T9k.js.map +1 -0
- package/dist/sdk/newsletter-store-CqD-GcDC.js.map +1 -0
- package/dist/sdk/newsletter-store-CvULKmsu.js.map +1 -0
- package/dist/sdk/{p-c6816542.entry.js → p-08ff2de2.entry.js} +2 -2
- package/dist/sdk/{p-39b61f33.entry.js → p-1ea49938.entry.js} +2 -2
- package/dist/sdk/{p-bfb04b17.entry.js → p-2a65bcbb.entry.js} +2 -2
- package/dist/sdk/{p-80034205.entry.js → p-2af8b45f.entry.js} +2 -2
- package/dist/sdk/{p-0d324822.entry.js → p-3411c743.entry.js} +2 -2
- package/dist/sdk/{p-4ec3302d.entry.js → p-467c7304.entry.js} +2 -2
- package/dist/sdk/{p-e54d5d38.entry.js → p-56abb377.entry.js} +2 -2
- package/dist/sdk/p-5703102b.entry.js +2 -0
- package/dist/sdk/{p-319c5d3b.entry.js → p-593c6dde.entry.js} +2 -2
- package/dist/sdk/{p-a4f5940f.entry.js → p-5b627aea.entry.js} +2 -2
- package/dist/sdk/{p-9e71a36c.entry.js → p-5cc20a8b.entry.js} +2 -2
- package/dist/sdk/p-628ccd68.entry.js +2 -0
- package/dist/sdk/{p-66587fdd.entry.js → p-675eb13d.entry.js} +2 -2
- package/dist/sdk/{p-312b919e.entry.js → p-6a642433.entry.js} +2 -2
- package/dist/sdk/p-7a0cefff.entry.js +2 -0
- package/dist/sdk/{p-e81bbd62.entry.js.map → p-7a0cefff.entry.js.map} +1 -1
- package/dist/sdk/{p-e2e7061b.entry.js → p-91bb8b59.entry.js} +2 -2
- package/dist/sdk/{p-90e2253e.entry.js → p-9f59909b.entry.js} +2 -2
- package/dist/sdk/p-BlAULXyw.js +2 -0
- package/dist/sdk/p-BlAULXyw.js.map +1 -0
- package/dist/sdk/p-C3fhudPT.js +2 -0
- package/dist/sdk/p-C3fhudPT.js.map +1 -0
- package/dist/sdk/{p-BiILQPdb.js → p-S3-2d2Qd.js} +2 -2
- package/dist/sdk/{p-BiILQPdb.js.map → p-S3-2d2Qd.js.map} +1 -1
- package/dist/sdk/{p-568eabbc.entry.js → p-a4b7ffd8.entry.js} +2 -2
- package/dist/sdk/{p-0fb37ee9.entry.js → p-a5db968f.entry.js} +2 -2
- package/dist/sdk/{p-0ab98e7a.entry.js → p-a6393d19.entry.js} +2 -2
- package/dist/sdk/{p-2cb6a2d0.entry.js → p-c31dbbb4.entry.js} +2 -2
- package/dist/sdk/{p-f232929b.entry.js → p-c5bffd90.entry.js} +2 -2
- package/dist/sdk/{p-f961fbea.entry.js → p-e3611b71.entry.js} +2 -2
- package/dist/sdk/{p-f961fbea.entry.js.map → p-e3611b71.entry.js.map} +1 -1
- package/dist/sdk/p-f0598e42.entry.js +2 -0
- package/dist/sdk/{p-34b98f55.entry.js.map → p-f0598e42.entry.js.map} +1 -1
- package/dist/sdk/{p-a69b83ec.entry.js → p-f369a996.entry.js} +2 -2
- package/dist/sdk/{p-3049e73f.entry.js → p-ffac964c.entry.js} +2 -2
- package/dist/sdk/profile-helpers-BDjk573F.js.map +1 -0
- package/dist/sdk/profile-helpers-b8Koj20a.js.map +1 -0
- package/dist/sdk/profile-store-BZKApsQm.js.map +1 -0
- package/dist/sdk/profile-store-DD6sq42i.js.map +1 -0
- package/dist/sdk/sdk.esm.js +1 -1
- package/dist/sdk/u-config.entry.esm.js.map +1 -1
- package/dist/sdk/u-password-field.entry.esm.js.map +1 -1
- package/dist/sdk/u-password-field.entry.js +104 -0
- package/dist/sdk/u-profile.u-submit-button.entry.esm.js.map +1 -1
- package/dist/sdk/u-reset-password-button.entry.esm.js.map +1 -1
- package/dist/sdk/u-reset-password-button.entry.js +54 -0
- package/dist/sdk/u-spinner.entry.esm.js.map +1 -1
- package/dist/sdk/unidy-store-BwZym11Y.js.map +1 -0
- package/dist/sdk/unidy-store-CtifvCkV.js.map +1 -0
- package/dist/types/auth/auth-helpers.d.ts +5 -7
- package/dist/types/auth/auth.d.ts +1 -1
- package/dist/types/auth/components/reset-pass-button/reset-pass-button.d.ts +1 -0
- package/dist/types/auth/store/auth-store.d.ts +3 -3
- package/dist/types/shared/components/config/config.d.ts +1 -1
- package/package.json +1 -1
- package/dist/cjs/auth-NU3DBc-6.js.map +0 -1
- package/dist/cjs/auth-store-BaxuIp4z.js.map +0 -1
- package/dist/esm/auth-nsjRdpvS.js.map +0 -1
- package/dist/esm/auth-store-CVvBlKGv.js.map +0 -1
- package/dist/sdk/p-34b98f55.entry.js +0 -2
- package/dist/sdk/p-5b40a68b.entry.js +0 -2
- package/dist/sdk/p-88d93d64.entry.js +0 -2
- package/dist/sdk/p-PKvQIsOt.js +0 -2
- package/dist/sdk/p-PKvQIsOt.js.map +0 -1
- package/dist/sdk/p-aMrLKr2m.js +0 -2
- package/dist/sdk/p-aMrLKr2m.js.map +0 -1
- package/dist/sdk/p-e81bbd62.entry.js +0 -2
- /package/dist/sdk/{p-c6816542.entry.js.map → p-08ff2de2.entry.js.map} +0 -0
- /package/dist/sdk/{p-39b61f33.entry.js.map → p-1ea49938.entry.js.map} +0 -0
- /package/dist/sdk/{p-bfb04b17.entry.js.map → p-2a65bcbb.entry.js.map} +0 -0
- /package/dist/sdk/{p-80034205.entry.js.map → p-2af8b45f.entry.js.map} +0 -0
- /package/dist/sdk/{p-0d324822.entry.js.map → p-3411c743.entry.js.map} +0 -0
- /package/dist/sdk/{p-4ec3302d.entry.js.map → p-467c7304.entry.js.map} +0 -0
- /package/dist/sdk/{p-e54d5d38.entry.js.map → p-56abb377.entry.js.map} +0 -0
- /package/dist/sdk/{p-5b40a68b.entry.js.map → p-5703102b.entry.js.map} +0 -0
- /package/dist/sdk/{p-319c5d3b.entry.js.map → p-593c6dde.entry.js.map} +0 -0
- /package/dist/sdk/{p-a4f5940f.entry.js.map → p-5b627aea.entry.js.map} +0 -0
- /package/dist/sdk/{p-9e71a36c.entry.js.map → p-5cc20a8b.entry.js.map} +0 -0
- /package/dist/sdk/{p-88d93d64.entry.js.map → p-628ccd68.entry.js.map} +0 -0
- /package/dist/sdk/{p-66587fdd.entry.js.map → p-675eb13d.entry.js.map} +0 -0
- /package/dist/sdk/{p-312b919e.entry.js.map → p-6a642433.entry.js.map} +0 -0
- /package/dist/sdk/{p-e2e7061b.entry.js.map → p-91bb8b59.entry.js.map} +0 -0
- /package/dist/sdk/{p-90e2253e.entry.js.map → p-9f59909b.entry.js.map} +0 -0
- /package/dist/sdk/{p-568eabbc.entry.js.map → p-a4b7ffd8.entry.js.map} +0 -0
- /package/dist/sdk/{p-0fb37ee9.entry.js.map → p-a5db968f.entry.js.map} +0 -0
- /package/dist/sdk/{p-0ab98e7a.entry.js.map → p-a6393d19.entry.js.map} +0 -0
- /package/dist/sdk/{p-2cb6a2d0.entry.js.map → p-c31dbbb4.entry.js.map} +0 -0
- /package/dist/sdk/{p-f232929b.entry.js.map → p-c5bffd90.entry.js.map} +0 -0
- /package/dist/sdk/{p-a69b83ec.entry.js.map → p-f369a996.entry.js.map} +0 -0
- /package/dist/sdk/{p-3049e73f.entry.js.map → p-ffac964c.entry.js.map} +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var index$1 = require('./index-R2MKLaem.js');
|
|
4
4
|
var i18n = require('./i18n-BoDZ8kd2.js');
|
|
5
|
+
var unidyStore = require('./unidy-store-7AbWnZ6g.js');
|
|
6
|
+
var authStore = require('./auth-store-DPHWWmXf.js');
|
|
5
7
|
var index = require('./index-B_N5xKgH.js');
|
|
6
8
|
var profileStore = require('./profile-store-P_BcYkef.js');
|
|
7
9
|
var componentUtils = require('./component-utils-BpMyeVQo.js');
|
|
8
10
|
var flashStore = require('./flash-store-BuIBuQDx.js');
|
|
9
|
-
var unidyStore = require('./unidy-store-7AbWnZ6g.js');
|
|
10
|
-
var index$1 = require('./index-R2MKLaem.js');
|
|
11
11
|
|
|
12
12
|
class InvalidTokenError extends Error {
|
|
13
13
|
}
|
|
@@ -173,12 +173,6 @@ async function authenticateWithPasskey(client, onSuccess) {
|
|
|
173
173
|
class AuthHelpers {
|
|
174
174
|
client;
|
|
175
175
|
logger = index.createLogger("AuthHelpers");
|
|
176
|
-
static PASSWORD_ERROR_IDENTIFIERS = [
|
|
177
|
-
"invalid_password",
|
|
178
|
-
"password_required",
|
|
179
|
-
"password_not_set",
|
|
180
|
-
"passwords_do_not_match",
|
|
181
|
-
];
|
|
182
176
|
constructor(client) {
|
|
183
177
|
this.client = client;
|
|
184
178
|
}
|
|
@@ -190,7 +184,7 @@ class AuthHelpers {
|
|
|
190
184
|
authStore.authStore.clearErrors();
|
|
191
185
|
const [error, response] = await this.client.auth.createSignIn(email, password, sendMagicCode);
|
|
192
186
|
if (error) {
|
|
193
|
-
this.handleAuthError(error, response);
|
|
187
|
+
this.handleAuthError(error, response, password ? "password" : "email");
|
|
194
188
|
return;
|
|
195
189
|
}
|
|
196
190
|
if (password) {
|
|
@@ -226,7 +220,7 @@ class AuthHelpers {
|
|
|
226
220
|
authStore.authStore.clearErrors();
|
|
227
221
|
const [error, response] = await this.client.auth.authenticateWithPassword(authStore.state.sid, password);
|
|
228
222
|
if (error) {
|
|
229
|
-
this.handleAuthError(error, response);
|
|
223
|
+
this.handleAuthError(error, response, "password");
|
|
230
224
|
}
|
|
231
225
|
else {
|
|
232
226
|
authStore.authStore.setLoading(false);
|
|
@@ -234,31 +228,24 @@ class AuthHelpers {
|
|
|
234
228
|
return;
|
|
235
229
|
}
|
|
236
230
|
}
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
authStore.authStore.setFieldError("email", error);
|
|
241
|
-
break;
|
|
242
|
-
case "missing_required_fields": {
|
|
243
|
-
authStore.authStore.setMissingFields(response.fields);
|
|
244
|
-
profileStore.state.data = response.fields;
|
|
245
|
-
if (response.sid) {
|
|
246
|
-
authStore.authStore.setSignInId(response.sid);
|
|
247
|
-
}
|
|
248
|
-
authStore.authStore.setStep("missing-fields");
|
|
249
|
-
break;
|
|
250
|
-
}
|
|
251
|
-
default:
|
|
252
|
-
if (AuthHelpers.PASSWORD_ERROR_IDENTIFIERS.includes(error)) {
|
|
253
|
-
authStore.authStore.setFieldError("password", error);
|
|
254
|
-
}
|
|
255
|
-
else {
|
|
256
|
-
// e.g. "account_locked", "internal_server_error"
|
|
257
|
-
authStore.authStore.setGlobalError("auth", error);
|
|
258
|
-
}
|
|
259
|
-
break;
|
|
231
|
+
async authenticateWithMagicCode(code) {
|
|
232
|
+
if (!authStore.state.sid) {
|
|
233
|
+
throw new Error(i18n.t("errors.no_sign_in_id"));
|
|
260
234
|
}
|
|
261
|
-
|
|
235
|
+
if (!code) {
|
|
236
|
+
throw new Error(i18n.t("errors.magic_code_is_missing"));
|
|
237
|
+
}
|
|
238
|
+
authStore.authStore.setLoading(true);
|
|
239
|
+
authStore.authStore.clearErrors();
|
|
240
|
+
const [error, response] = await this.client.auth.authenticateWithMagicCode(authStore.state.sid, code);
|
|
241
|
+
if (error) {
|
|
242
|
+
this.handleAuthError(error, response, "magicCode");
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
this.handleAuthSuccess(response);
|
|
246
|
+
}
|
|
247
|
+
authenticateWithPasskey() {
|
|
248
|
+
return authenticateWithPasskey(this.client, (response) => this.handleAuthSuccess(response));
|
|
262
249
|
}
|
|
263
250
|
async logout() {
|
|
264
251
|
const [error, _] = await this.client.auth.signOut(authStore.state.sid);
|
|
@@ -271,7 +258,10 @@ class AuthHelpers {
|
|
|
271
258
|
if (authStore.state.step === "missing-fields") {
|
|
272
259
|
return;
|
|
273
260
|
}
|
|
274
|
-
|
|
261
|
+
const sid = componentUtils.clearUrlParam("sid");
|
|
262
|
+
if (sid) {
|
|
263
|
+
authStore.authStore.setSignInId(sid);
|
|
264
|
+
}
|
|
275
265
|
if (!authStore.state.sid) {
|
|
276
266
|
this.logger.warn("No sign-in ID in the session");
|
|
277
267
|
return;
|
|
@@ -285,40 +275,6 @@ class AuthHelpers {
|
|
|
285
275
|
authStore.authStore.setToken(response.jwt);
|
|
286
276
|
}
|
|
287
277
|
}
|
|
288
|
-
handleSocialAuthRedirect() {
|
|
289
|
-
// missing required fields flow
|
|
290
|
-
const url = new URL(window.location.href);
|
|
291
|
-
const params = url.searchParams;
|
|
292
|
-
const error = params.get("error");
|
|
293
|
-
if (error !== "missing_required_fields") {
|
|
294
|
-
return;
|
|
295
|
-
}
|
|
296
|
-
const fieldsFromUrl = params.get("fields");
|
|
297
|
-
if (!fieldsFromUrl) {
|
|
298
|
-
return;
|
|
299
|
-
}
|
|
300
|
-
const signInId = params.get("sid");
|
|
301
|
-
if (signInId) {
|
|
302
|
-
authStore.authStore.setSignInId(signInId);
|
|
303
|
-
}
|
|
304
|
-
else {
|
|
305
|
-
return;
|
|
306
|
-
}
|
|
307
|
-
try {
|
|
308
|
-
const fields = JSON.parse(fieldsFromUrl);
|
|
309
|
-
authStore.authStore.setMissingFields(fields);
|
|
310
|
-
profileStore.state.data = fields;
|
|
311
|
-
authStore.authStore.setStep("missing-fields");
|
|
312
|
-
params.delete("error");
|
|
313
|
-
params.delete("fields");
|
|
314
|
-
const cleanUrl = `${url.origin}${url.pathname}${url.hash}`;
|
|
315
|
-
window.history.replaceState(null, "", cleanUrl);
|
|
316
|
-
}
|
|
317
|
-
catch (e) {
|
|
318
|
-
this.logger.error("Failed to parse missing fields payload:", e);
|
|
319
|
-
authStore.authStore.setGlobalError("auth", "invalid_required_fields_payload");
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
278
|
async sendMagicCode() {
|
|
323
279
|
if (!authStore.state.sid && authStore.state.step !== "single-login") {
|
|
324
280
|
throw new Error(i18n.t("errors.no_sign_in_id"));
|
|
@@ -344,27 +300,6 @@ class AuthHelpers {
|
|
|
344
300
|
}
|
|
345
301
|
return [error, response];
|
|
346
302
|
}
|
|
347
|
-
async authenticateWithMagicCode(code) {
|
|
348
|
-
if (!authStore.state.sid) {
|
|
349
|
-
throw new Error(i18n.t("errors.no_sign_in_id"));
|
|
350
|
-
}
|
|
351
|
-
if (!code) {
|
|
352
|
-
throw new Error(i18n.t("errors.magic_code_is_missing"));
|
|
353
|
-
}
|
|
354
|
-
authStore.authStore.setLoading(true);
|
|
355
|
-
authStore.authStore.clearErrors();
|
|
356
|
-
const [error, response] = await this.client.auth.authenticateWithMagicCode(authStore.state.sid, code);
|
|
357
|
-
if (!error) {
|
|
358
|
-
this.handleAuthSuccess(response);
|
|
359
|
-
return;
|
|
360
|
-
}
|
|
361
|
-
if (error === "missing_required_fields") {
|
|
362
|
-
this.handleMissingFields(response);
|
|
363
|
-
return;
|
|
364
|
-
}
|
|
365
|
-
authStore.authStore.setLoading(false);
|
|
366
|
-
authStore.authStore.setFieldError("magicCode", error);
|
|
367
|
-
}
|
|
368
303
|
async sendResetPasswordEmail() {
|
|
369
304
|
if (!authStore.state.sid) {
|
|
370
305
|
throw new Error(i18n.t("errors.no_sign_in_id"));
|
|
@@ -381,28 +316,6 @@ class AuthHelpers {
|
|
|
381
316
|
}
|
|
382
317
|
authStore.authStore.setLoading(false);
|
|
383
318
|
}
|
|
384
|
-
async handleResetPasswordRedirect() {
|
|
385
|
-
const url = new URL(window.location.href);
|
|
386
|
-
const params = url.searchParams;
|
|
387
|
-
const resetToken = params.get("reset_password_token");
|
|
388
|
-
if (!resetToken) {
|
|
389
|
-
return false;
|
|
390
|
-
}
|
|
391
|
-
if (authStore.state.sid) {
|
|
392
|
-
authStore.authStore.setLoading(true);
|
|
393
|
-
const [error] = await this.client.auth.validateResetPasswordToken(authStore.state.sid, resetToken);
|
|
394
|
-
if (error) {
|
|
395
|
-
authStore.authStore.setFieldError("resetPassword", error);
|
|
396
|
-
authStore.authStore.setStep("reset-password");
|
|
397
|
-
authStore.authStore.setLoading(false);
|
|
398
|
-
return false;
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
authStore.authStore.setResetToken(resetToken);
|
|
402
|
-
authStore.authStore.setStep("reset-password");
|
|
403
|
-
authStore.authStore.setLoading(false);
|
|
404
|
-
return true;
|
|
405
|
-
}
|
|
406
319
|
async resetPassword() {
|
|
407
320
|
if (!authStore.state.resetPassword.token) {
|
|
408
321
|
throw new Error("No reset token available");
|
|
@@ -439,18 +352,103 @@ class AuthHelpers {
|
|
|
439
352
|
}
|
|
440
353
|
authStore.authStore.setLoading(false);
|
|
441
354
|
}
|
|
442
|
-
|
|
443
|
-
|
|
355
|
+
async handleResetPasswordRedirect() {
|
|
356
|
+
const url = new URL(window.location.href);
|
|
357
|
+
const params = url.searchParams;
|
|
358
|
+
const resetToken = params.get("reset_password_token");
|
|
359
|
+
if (!resetToken) {
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
if (authStore.state.sid) {
|
|
363
|
+
authStore.authStore.setLoading(true);
|
|
364
|
+
const [error] = await this.client.auth.validateResetPasswordToken(authStore.state.sid, resetToken);
|
|
365
|
+
if (error) {
|
|
366
|
+
authStore.authStore.setFieldError("resetPassword", error);
|
|
367
|
+
authStore.authStore.setStep("reset-password");
|
|
368
|
+
authStore.authStore.setLoading(false);
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
authStore.authStore.setResetToken(resetToken);
|
|
373
|
+
authStore.authStore.setStep("reset-password");
|
|
374
|
+
authStore.authStore.setLoading(false);
|
|
444
375
|
}
|
|
445
|
-
|
|
376
|
+
handleSocialAuthRedirect() {
|
|
377
|
+
const url = new URL(window.location.href);
|
|
378
|
+
const params = url.searchParams;
|
|
379
|
+
const error = params.get("error");
|
|
380
|
+
// Not a social auth redirect (normal page load)
|
|
381
|
+
if (!error && !params.has("sid")) {
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
// Handle successful social auth redirect
|
|
385
|
+
if (!error && params.has("sid") && params.has("id_token")) {
|
|
386
|
+
authStore.authStore.setSignInId(componentUtils.clearUrlParam("sid"));
|
|
387
|
+
const idToken = componentUtils.clearUrlParam("id_token");
|
|
388
|
+
if (idToken) {
|
|
389
|
+
authStore.authStore.setToken(idToken);
|
|
390
|
+
this.handleAuthSuccess({ jwt: idToken });
|
|
391
|
+
}
|
|
392
|
+
else {
|
|
393
|
+
this.logger.error("No ID token found in the URL on social auth redirect");
|
|
394
|
+
}
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
// Handle missing required fields
|
|
398
|
+
if (error !== "missing_required_fields") {
|
|
399
|
+
this.logger.error("Social auth redirect error:", error);
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
const fieldsFromUrl = componentUtils.clearUrlParam("fields");
|
|
446
403
|
const sid = componentUtils.clearUrlParam("sid");
|
|
447
|
-
|
|
404
|
+
componentUtils.clearUrlParam("error");
|
|
405
|
+
if (!fieldsFromUrl || !sid) {
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
try {
|
|
409
|
+
const fields = JSON.parse(fieldsFromUrl);
|
|
448
410
|
authStore.authStore.setSignInId(sid);
|
|
411
|
+
this.handleMissingFields(fields);
|
|
412
|
+
}
|
|
413
|
+
catch (e) {
|
|
414
|
+
this.logger.error("Failed to parse missing fields payload:", e);
|
|
415
|
+
authStore.authStore.setGlobalError("auth", "invalid_required_fields_payload");
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
handleAuthError(error, response, fallbackField) {
|
|
419
|
+
switch (error) {
|
|
420
|
+
case "account_not_found":
|
|
421
|
+
authStore.authStore.setFieldError("email", error);
|
|
422
|
+
break;
|
|
423
|
+
case "missing_required_fields": {
|
|
424
|
+
const { fields, sid } = response;
|
|
425
|
+
this.handleMissingFields(fields);
|
|
426
|
+
if (sid) {
|
|
427
|
+
authStore.authStore.setSignInId(sid);
|
|
428
|
+
}
|
|
429
|
+
break;
|
|
430
|
+
}
|
|
431
|
+
default:
|
|
432
|
+
if (fallbackField === "password") {
|
|
433
|
+
authStore.authStore.setFieldError("password", error);
|
|
434
|
+
}
|
|
435
|
+
else if (fallbackField === "magicCode") {
|
|
436
|
+
authStore.authStore.setFieldError("magicCode", error);
|
|
437
|
+
}
|
|
438
|
+
else if (fallbackField === "email") {
|
|
439
|
+
authStore.authStore.setFieldError("email", error);
|
|
440
|
+
}
|
|
441
|
+
else {
|
|
442
|
+
// e.g. "account_locked", "internal_server_error"
|
|
443
|
+
authStore.authStore.setGlobalError("auth", error);
|
|
444
|
+
}
|
|
445
|
+
break;
|
|
449
446
|
}
|
|
447
|
+
authStore.authStore.setLoading(false);
|
|
450
448
|
}
|
|
451
|
-
handleMissingFields(
|
|
452
|
-
authStore.authStore.setMissingFields(
|
|
453
|
-
profileStore.state.data =
|
|
449
|
+
handleMissingFields(fields) {
|
|
450
|
+
authStore.authStore.setMissingFields(fields);
|
|
451
|
+
profileStore.state.data = fields;
|
|
454
452
|
authStore.authStore.setStep("missing-fields");
|
|
455
453
|
authStore.authStore.setLoading(false);
|
|
456
454
|
}
|
|
@@ -466,8 +464,6 @@ class Auth {
|
|
|
466
464
|
helpers;
|
|
467
465
|
constructor(client) {
|
|
468
466
|
this.helpers = new AuthHelpers(client);
|
|
469
|
-
this.helpers.handleSocialAuthRedirect();
|
|
470
|
-
this.helpers.handleResetPasswordRedirect();
|
|
471
467
|
}
|
|
472
468
|
static Errors = {
|
|
473
469
|
email: {
|
|
@@ -496,8 +492,13 @@ class Auth {
|
|
|
496
492
|
}
|
|
497
493
|
return Auth.instance;
|
|
498
494
|
}
|
|
499
|
-
static initialize(client) {
|
|
495
|
+
static async initialize(client) {
|
|
496
|
+
if (Auth.instance) {
|
|
497
|
+
return Auth.instance;
|
|
498
|
+
}
|
|
500
499
|
Auth.instance = new Auth(client);
|
|
500
|
+
Auth.instance.helpers.handleSocialAuthRedirect();
|
|
501
|
+
await Auth.instance.helpers.handleResetPasswordRedirect();
|
|
501
502
|
if (Auth.instance.isTokenValid(authStore.state.token)) {
|
|
502
503
|
authStore.authStore.setAuthenticated(true);
|
|
503
504
|
}
|
|
@@ -576,6 +577,6 @@ class Auth {
|
|
|
576
577
|
}
|
|
577
578
|
|
|
578
579
|
exports.Auth = Auth;
|
|
579
|
-
//# sourceMappingURL=auth-
|
|
580
|
+
//# sourceMappingURL=auth-B83pzi0f.js.map
|
|
580
581
|
|
|
581
|
-
//# sourceMappingURL=auth-
|
|
582
|
+
//# sourceMappingURL=auth-B83pzi0f.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-B83pzi0f.js","sources":["../../node_modules/jwt-decode/build/esm/index.js","src/auth/passkey-auth.ts","src/auth/auth-helpers.ts","src/auth/auth.ts"],"sourcesContent":["export class InvalidTokenError extends Error {\n}\nInvalidTokenError.prototype.name = \"InvalidTokenError\";\nfunction b64DecodeUnicode(str) {\n return decodeURIComponent(atob(str).replace(/(.)/g, (m, p) => {\n let code = p.charCodeAt(0).toString(16).toUpperCase();\n if (code.length < 2) {\n code = \"0\" + code;\n }\n return \"%\" + code;\n }));\n}\nfunction base64UrlDecode(str) {\n let output = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n switch (output.length % 4) {\n case 0:\n break;\n case 2:\n output += \"==\";\n break;\n case 3:\n output += \"=\";\n break;\n default:\n throw new Error(\"base64 string is not of the correct length\");\n }\n try {\n return b64DecodeUnicode(output);\n }\n catch (err) {\n return atob(output);\n }\n}\nexport function jwtDecode(token, options) {\n if (typeof token !== \"string\") {\n throw new InvalidTokenError(\"Invalid token specified: must be a string\");\n }\n options || (options = {});\n const pos = options.header === true ? 0 : 1;\n const part = token.split(\".\")[pos];\n if (typeof part !== \"string\") {\n throw new InvalidTokenError(`Invalid token specified: missing part #${pos + 1}`);\n }\n let decoded;\n try {\n decoded = base64UrlDecode(part);\n }\n catch (e) {\n throw new InvalidTokenError(`Invalid token specified: invalid base64 for part #${pos + 1} (${e.message})`);\n }\n try {\n return JSON.parse(decoded);\n }\n catch (e) {\n throw new InvalidTokenError(`Invalid token specified: invalid json for part #${pos + 1} (${e.message})`);\n }\n}\n","import { jwtDecode } from \"jwt-decode\";\nimport type { PasskeyOptionsResponse, TokenResponse, UnidyClient } from \"../api\";\nimport { createLogger } from \"../logger\";\nimport type { TokenPayload } from \"./auth\";\nimport { authState, authStore } from \"./store/auth-store\";\n\nconst logger = createLogger(\"PasskeyAuth\");\n\nconst PASSKEY_ERRORS: Record<string, string> = {\n NotSupportedError: \"passkey_not_supported\",\n NotAllowedError: \"passkey_cancelled\",\n SecurityError: \"passkey_security_error\",\n InvalidStateError: \"passkey_invalid_state\",\n};\n\nfunction decodeBase64Url(base64url: string): Uint8Array {\n const base64 = base64url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded = base64 + \"=\".repeat((4 - (base64.length % 4)) % 4);\n return Uint8Array.from(atob(padded), (c) => c.charCodeAt(0));\n}\n\nfunction buildPublicKeyOptions(options: PasskeyOptionsResponse): PublicKeyCredentialRequestOptions {\n return {\n challenge: Uint8Array.from(atob(options.challenge), (c) => c.charCodeAt(0)),\n timeout: options.timeout || 60000,\n rpId: options.rpId,\n userVerification: (options.userVerification as UserVerificationRequirement) || \"required\",\n allowCredentials: options.allowCredentials?.map((cred) => ({\n ...cred,\n id: decodeBase64Url(cred.id),\n })),\n };\n}\n\nfunction formatCredentialForServer(credential: PublicKeyCredential) {\n const response = credential.response as AuthenticatorAssertionResponse;\n return {\n id: credential.id,\n rawId: btoa(String.fromCharCode(...new Uint8Array(credential.rawId))),\n response: {\n authenticatorData: btoa(String.fromCharCode(...new Uint8Array(response.authenticatorData))),\n clientDataJSON: btoa(String.fromCharCode(...new Uint8Array(response.clientDataJSON))),\n signature: btoa(String.fromCharCode(...new Uint8Array(response.signature))),\n },\n type: credential.type,\n };\n}\n\nfunction extractAndSetSignInId(tokenResponse: TokenResponse) {\n if (tokenResponse.sid) {\n authStore.setSignInId(tokenResponse.sid);\n return;\n }\n\n // Fallback: extract sid from JWT token payload\n try {\n const decoded = jwtDecode<TokenPayload>(tokenResponse.jwt);\n if (decoded.sid) {\n authStore.setSignInId(decoded.sid);\n }\n } catch {\n // Failed to decode JWT token to extract sid, continue without it\n }\n}\n\nfunction handlePasskeyError(error: unknown) {\n logger.error(\"Passkey error:\", error);\n\n let errorMessage = \"passkey_error\";\n if (error instanceof DOMException) {\n errorMessage = PASSKEY_ERRORS[error.name] || \"passkey_error\";\n }\n\n authStore.setFieldError(\"passkey\", errorMessage);\n authStore.setLoading(false);\n}\n\nexport async function authenticateWithPasskey(client: UnidyClient, onSuccess: (response: TokenResponse) => void) {\n authStore.setLoading(true);\n authStore.clearErrors();\n\n if (!window.PublicKeyCredential) {\n authStore.setFieldError(\"passkey\", \"passkey_not_supported\");\n authStore.setLoading(false);\n return;\n }\n\n try {\n const [optionsError, options] = await client.auth.getPasskeyOptions(authState.sid || undefined);\n\n if (optionsError || !options) {\n authStore.setFieldError(\"passkey\", optionsError || \"bad_request\");\n authStore.setLoading(false);\n return;\n }\n\n const publicKeyOptions = buildPublicKeyOptions(options as PasskeyOptionsResponse);\n\n const credential = (await navigator.credentials.get({\n publicKey: publicKeyOptions,\n })) as PublicKeyCredential | null;\n\n if (!credential) {\n authStore.setFieldError(\"passkey\", \"passkey_cancelled\");\n authStore.setLoading(false);\n return;\n }\n\n const formattedCredential = formatCredentialForServer(credential);\n\n const [verifyError, tkResponse] = await client.auth.authenticateWithPasskey(formattedCredential);\n\n const tokenResponse = tkResponse as TokenResponse;\n if (verifyError || !tokenResponse) {\n authStore.setGlobalError(\"auth\", verifyError || \"authentication_failed\");\n authStore.setLoading(false);\n return;\n }\n\n authStore.setToken(tokenResponse.jwt);\n extractAndSetSignInId(tokenResponse);\n onSuccess(tokenResponse);\n } catch (error) {\n handlePasskeyError(error);\n }\n}\n","import { jwtDecode } from \"jwt-decode\";\nimport type { CreateSignInResponse, RequiredFieldsResponse, TokenResponse, UnidyClient } from \"../api\";\nimport { authState, authStore } from \"../auth/store/auth-store\";\nimport { t } from \"../i18n\";\nimport { createLogger } from \"../logger\";\nimport type { ProfileRaw } from \"../profile\";\nimport { state as profileState } from \"../profile/store/profile-store\";\nimport { clearUrlParam } from \"../shared/component-utils\";\nimport { Flash } from \"../shared/store/flash-store\";\nimport type { TokenPayload } from \"./auth\";\nimport { authenticateWithPasskey } from \"./passkey-auth\";\n\nexport class AuthHelpers {\n private client: UnidyClient;\n private logger = createLogger(\"AuthHelpers\");\n\n constructor(client: UnidyClient) {\n this.client = client;\n }\n\n async createSignIn(email: string, password?: string, sendMagicCode?: boolean) {\n if (!email) {\n throw new Error(t(\"errors.required_field\", { field: \"Email\" }));\n }\n\n authStore.setLoading(true);\n authStore.clearErrors();\n\n const [error, response] = await this.client.auth.createSignIn(email, password, sendMagicCode);\n\n if (error) {\n this.handleAuthError(error, response, password ? \"password\" : \"email\");\n return;\n }\n\n if (password) {\n const token = jwtDecode<TokenPayload>((response as TokenResponse).jwt);\n authStore.setSignInId(token.sid);\n authStore.setToken((response as TokenResponse).jwt);\n authStore.setLoading(false);\n authStore.getRootComponentRef()?.onAuth(response as TokenResponse);\n return;\n }\n\n if (sendMagicCode) {\n authStore.setSignInId((response as CreateSignInResponse).sid);\n authStore.setMagicCodeStep(\"sent\");\n authStore.setStep(\"magic-code\");\n authStore.setLoading(false);\n return [error, response] as const;\n }\n const signInResponse = response as CreateSignInResponse;\n authStore.setStep(\"verification\");\n authStore.setEmail(email);\n authStore.setSignInId(signInResponse.sid);\n authStore.setLoginOptions(signInResponse.login_options);\n authStore.setLoading(false);\n }\n\n async authenticateWithPassword(password: string) {\n if (!authState.sid) {\n throw new Error(t(\"errors.no_sign_in_id\"));\n }\n\n if (!password) {\n throw new Error(t(\"errors.required_field\", { field: \"Password\" }));\n }\n\n authStore.setLoading(true);\n authStore.clearErrors();\n\n const [error, response] = await this.client.auth.authenticateWithPassword(authState.sid, password);\n\n if (error) {\n this.handleAuthError(error, response, \"password\");\n } else {\n authStore.setLoading(false);\n this.handleAuthSuccess(response as TokenResponse);\n return;\n }\n }\n\n async authenticateWithMagicCode(code: string) {\n if (!authState.sid) {\n throw new Error(t(\"errors.no_sign_in_id\"));\n }\n\n if (!code) {\n throw new Error(t(\"errors.magic_code_is_missing\"));\n }\n\n authStore.setLoading(true);\n authStore.clearErrors();\n\n const [error, response] = await this.client.auth.authenticateWithMagicCode(authState.sid, code);\n\n if (error) {\n this.handleAuthError(error, response, \"magicCode\");\n return;\n }\n\n this.handleAuthSuccess(response as TokenResponse);\n }\n\n authenticateWithPasskey() {\n return authenticateWithPasskey(this.client, (response) => this.handleAuthSuccess(response));\n }\n\n async logout() {\n const [error, _] = await this.client.auth.signOut(authState.sid as string);\n\n if (error) {\n authStore.setGlobalError(\"auth\", error);\n }\n\n return [error, _] as const;\n }\n\n async refreshToken() {\n if (authState.step === \"missing-fields\") {\n return;\n }\n\n const sid = clearUrlParam(\"sid\");\n if (sid) {\n authStore.setSignInId(sid);\n }\n\n if (!authState.sid) {\n this.logger.warn(\"No sign-in ID in the session\");\n return;\n }\n\n const [error, response] = await this.client.auth.refreshToken(authState.sid);\n\n if (error) {\n authStore.reset();\n authStore.setGlobalError(\"auth\", error);\n } else {\n authStore.setToken((response as TokenResponse).jwt);\n }\n }\n\n async sendMagicCode() {\n if (!authState.sid && authState.step !== \"single-login\") {\n throw new Error(t(\"errors.no_sign_in_id\"));\n }\n\n authStore.setMagicCodeStep(\"requested\");\n authStore.setLoading(true);\n authStore.clearErrors();\n\n if (authState.step === \"single-login\") {\n const [error, response] = await this.createSignIn(authState.email, undefined, true);\n authStore.setLoading(false);\n return [error, response] as const;\n }\n\n const [error, response] = await this.client.auth.sendMagicCode(authState.sid);\n\n authStore.setLoading(false);\n\n authStore.setStep(\"magic-code\");\n\n if (!error) {\n authStore.setMagicCodeStep(\"sent\");\n\n return [null, response] as const;\n }\n\n authStore.setFieldError(\"magicCode\", error);\n\n if (error === \"magic_code_recently_created\") {\n authStore.setMagicCodeStep(\"sent\");\n }\n\n return [error, response] as const;\n }\n\n async sendResetPasswordEmail() {\n if (!authState.sid) {\n throw new Error(t(\"errors.no_sign_in_id\"));\n }\n\n authStore.setLoading(true);\n authStore.setResetPasswordStep(\"requested\");\n\n const [error, _] = await this.client.auth.sendResetPasswordEmail(authState.sid, window.location.href);\n\n if (error) {\n authStore.setFieldError(\"resetPassword\", error);\n } else {\n authStore.setResetPasswordStep(\"sent\");\n authStore.clearErrors();\n }\n\n authStore.setLoading(false);\n }\n\n async resetPassword() {\n if (!authState.resetPassword.token) {\n throw new Error(\"No reset token available\");\n }\n\n if (!authState.resetPassword.newPassword) {\n authStore.setFieldError(\"resetPassword\", \"password_required\");\n return;\n }\n\n if (\n authState.resetPassword.passwordConfirmation &&\n authState.resetPassword.newPassword !== authState.resetPassword.passwordConfirmation\n ) {\n authStore.setFieldError(\"resetPassword\", \"passwords_do_not_match\");\n return;\n }\n\n authStore.setLoading(true);\n authStore.clearErrors();\n\n const [error, response] = await this.client.auth.resetPassword(\n authState.sid as string,\n authState.resetPassword.token,\n authState.resetPassword.newPassword,\n authState.resetPassword.passwordConfirmation,\n );\n\n if (error) {\n authStore.setFieldError(\"resetPassword\", error);\n\n // TODO: add proper password requirements handling --> for now this is fine\n if (error === \"invalid_password\") {\n authStore.setFieldError(\"password\", response.error_details?.password.map((p) => t(`errors.password_requirements.${p}`)).join(\"\\n\"));\n }\n } else {\n authStore.setStep(\"email\");\n authStore.updateResetPassword({\n step: \"completed\",\n token: null,\n newPassword: \"\",\n passwordConfirmation: \"\",\n });\n\n clearUrlParam(\"reset_password_token\");\n Flash.success.addMessage(\"Password reset successfully\");\n }\n\n authStore.setLoading(false);\n }\n\n async handleResetPasswordRedirect() {\n const url = new URL(window.location.href);\n const params = url.searchParams;\n const resetToken = params.get(\"reset_password_token\");\n\n if (!resetToken) {\n return;\n }\n\n if (authState.sid) {\n authStore.setLoading(true);\n\n const [error] = await this.client.auth.validateResetPasswordToken(authState.sid, resetToken);\n\n if (error) {\n authStore.setFieldError(\"resetPassword\", error);\n authStore.setStep(\"reset-password\");\n authStore.setLoading(false);\n return;\n }\n }\n\n authStore.setResetToken(resetToken);\n authStore.setStep(\"reset-password\");\n authStore.setLoading(false);\n }\n\n handleSocialAuthRedirect(): void {\n const url = new URL(window.location.href);\n const params = url.searchParams;\n const error = params.get(\"error\");\n\n // Not a social auth redirect (normal page load)\n if (!error && !params.has(\"sid\")) {\n return;\n }\n\n // Handle successful social auth redirect\n if (!error && params.has(\"sid\") && params.has(\"id_token\")) {\n authStore.setSignInId(clearUrlParam(\"sid\"));\n\n const idToken = clearUrlParam(\"id_token\");\n\n if (idToken) {\n authStore.setToken(idToken);\n this.handleAuthSuccess({ jwt: idToken } as TokenResponse);\n } else {\n this.logger.error(\"No ID token found in the URL on social auth redirect\");\n }\n\n return;\n }\n\n // Handle missing required fields\n if (error !== \"missing_required_fields\") {\n this.logger.error(\"Social auth redirect error:\", error);\n return;\n }\n\n const fieldsFromUrl = clearUrlParam(\"fields\");\n const sid = clearUrlParam(\"sid\");\n clearUrlParam(\"error\");\n\n if (!fieldsFromUrl || !sid) {\n return;\n }\n\n try {\n const fields = JSON.parse(fieldsFromUrl);\n authStore.setSignInId(sid);\n\n this.handleMissingFields(fields);\n } catch (e) {\n this.logger.error(\"Failed to parse missing fields payload:\", e);\n authStore.setGlobalError(\"auth\", \"invalid_required_fields_payload\");\n }\n }\n\n private handleAuthError(error: string, response: unknown, fallbackField?: \"email\" | \"password\" | \"magicCode\") {\n switch (error) {\n case \"account_not_found\":\n authStore.setFieldError(\"email\", error);\n break;\n\n case \"missing_required_fields\": {\n const { fields, sid } = response as RequiredFieldsResponse;\n this.handleMissingFields(fields);\n if (sid) {\n authStore.setSignInId(sid);\n }\n break;\n }\n\n default:\n if (fallbackField === \"password\") {\n authStore.setFieldError(\"password\", error);\n } else if (fallbackField === \"magicCode\") {\n authStore.setFieldError(\"magicCode\", error);\n } else if (fallbackField === \"email\") {\n authStore.setFieldError(\"email\", error);\n } else {\n // e.g. \"account_locked\", \"internal_server_error\"\n authStore.setGlobalError(\"auth\", error);\n }\n break;\n }\n\n authStore.setLoading(false);\n }\n\n private handleMissingFields(fields: RequiredFieldsResponse[\"fields\"]) {\n authStore.setMissingFields(fields);\n profileState.data = fields as ProfileRaw;\n authStore.setStep(\"missing-fields\");\n authStore.setLoading(false);\n }\n\n private handleAuthSuccess(response: TokenResponse) {\n authStore.setToken(response.jwt);\n authStore.setLoading(false);\n authStore.getRootComponentRef()?.onAuth(response);\n }\n}\n","import * as Sentry from \"@sentry/browser\";\nimport { jwtDecode } from \"jwt-decode\";\nimport type { UnidyClient } from \"../api\";\nimport { getUnidyClient } from \"../api\";\nimport { t } from \"../i18n\";\nimport { waitForConfig } from \"../shared/store/unidy-store\";\nimport { AuthHelpers } from \"./auth-helpers\";\nimport { authState, authStore } from \"./store/auth-store\";\n\nexport interface TokenPayload {\n sub: string; // unidy id\n sid: string; // sign-in id\n exp: number;\n iat: number;\n iss: string;\n aud: string;\n nonce: string;\n auth_time: number;\n email: string;\n email_verified: boolean;\n [key: string]: unknown;\n}\n\nexport type AuthError = Error & {\n code: \"TOKEN_EXPIRED\" | \"REFRESH_FAILED\" | \"NO_TOKEN\" | \"INVALID_TOKEN\" | \"SIGN_IN_NOT_FOUND\" | \"SIGN_OUT_FAILED\";\n requiresReauth: boolean;\n};\n\nexport class Auth {\n private static instance: Auth;\n\n readonly helpers: AuthHelpers;\n\n private constructor(client: UnidyClient) {\n this.helpers = new AuthHelpers(client);\n }\n\n static Errors = {\n email: {\n NOT_FOUND: \"account_not_found\",\n },\n magicCode: {\n RECENTLY_CREATED: \"magic_code_recently_created\",\n NOT_VALID: \"magic_code_not_valid\",\n EXPIRED: \"magic_code_expired\",\n USED: \"magic_code_used\",\n },\n password: {\n INVALID: \"invalid_password\",\n NOT_SET: \"password_not_set\",\n RESET_PASSWORD_ALREADY_SENT: \"reset_password_already_sent\",\n },\n general: {\n ACCOUNT_LOCKED: \"account_locked\",\n SIGN_IN_EXPIRED: \"sign_in_expired\",\n },\n } as const;\n\n static async getInstance(): Promise<Auth> {\n if (!Auth.isInitialized()) {\n await waitForConfig();\n\n return Auth.initialize(getUnidyClient());\n }\n\n return Auth.instance;\n }\n\n static async initialize(client: UnidyClient): Promise<Auth> {\n if (Auth.instance) {\n return Auth.instance;\n }\n\n Auth.instance = new Auth(client);\n\n Auth.instance.helpers.handleSocialAuthRedirect();\n await Auth.instance.helpers.handleResetPasswordRedirect();\n\n if (Auth.instance.isTokenValid(authState.token)) {\n authStore.setAuthenticated(true);\n }\n\n return Auth.instance;\n }\n\n static isInitialized(): boolean {\n return !!Auth.instance;\n }\n\n isTokenValid(token: string | TokenPayload | null): boolean {\n try {\n let decoded: TokenPayload | null;\n\n if (typeof token === \"string\") {\n decoded = jwtDecode<TokenPayload>(token);\n } else {\n decoded = token;\n }\n\n if (!decoded) return false;\n\n const currentTime = Date.now() / 1000;\n return decoded.exp > currentTime;\n } catch (error) {\n Sentry.captureException(error);\n return false;\n }\n }\n\n async isAuthenticated(): Promise<boolean> {\n const token = await this.getToken();\n return typeof token === \"string\";\n }\n\n async getToken(): Promise<string | AuthError> {\n const currentToken = authState.token;\n\n if (currentToken && this.isTokenValid(currentToken)) {\n return currentToken;\n }\n\n await this.helpers.refreshToken();\n\n if (authState.globalErrors.auth || !authState.token) {\n return this.createAuthError(t(\"errors.refresh_failed\"), \"REFRESH_FAILED\", true);\n }\n\n return authState.token as string;\n }\n\n async userData(): Promise<TokenPayload | null> {\n const token = await this.getToken();\n\n if (typeof token !== \"string\") {\n return null;\n }\n\n if (!token) {\n return null;\n }\n\n try {\n return jwtDecode<TokenPayload>(token);\n } catch (error) {\n Sentry.captureException(error);\n return null;\n }\n }\n\n async logout(): Promise<boolean | AuthError> {\n const [error, _] = await this.helpers.logout();\n\n if (error) {\n return this.createAuthError(t(\"errors.sign_out_failed\", { reason: error }), \"SIGN_OUT_FAILED\", false);\n }\n\n authStore.reset();\n\n return true;\n }\n\n getEmail(): string | null {\n return authState.email;\n }\n\n private createAuthError(message: string, code: AuthError[\"code\"], requiresReauth = false): AuthError {\n const error = new Error(message) as AuthError;\n error.code = code;\n error.requiresReauth = requiresReauth;\n\n return error;\n }\n}\n"],"names":["createLogger","authStore","authState","t","clearUrlParam","Flash","profileState","waitForConfig","getUnidyClient","Sentry.captureException"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -48,8 +48,6 @@ const initialState = {
|
|
|
48
48
|
password: null,
|
|
49
49
|
magicCode: null,
|
|
50
50
|
resetPassword: null,
|
|
51
|
-
general: null,
|
|
52
|
-
connection: null,
|
|
53
51
|
passkey: null,
|
|
54
52
|
},
|
|
55
53
|
globalErrors: {},
|
|
@@ -180,6 +178,6 @@ exports.authStore = authStore;
|
|
|
180
178
|
exports.authStoreOnChange = authStoreOnChange;
|
|
181
179
|
exports.missingFieldNames = missingFieldNames;
|
|
182
180
|
exports.state = state;
|
|
183
|
-
//# sourceMappingURL=auth-store-
|
|
181
|
+
//# sourceMappingURL=auth-store-DPHWWmXf.js.map
|
|
184
182
|
|
|
185
|
-
//# sourceMappingURL=auth-store-
|
|
183
|
+
//# sourceMappingURL=auth-store-DPHWWmXf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-store-DPHWWmXf.js","sources":["src/auth/store/auth-store.ts"],"sourcesContent":["import { createStore } from \"@stencil/store\";\nimport type { ProfileNode } from \"../../profile\";\nimport { unidyState } from \"../../shared/store/unidy-store\";\nimport type { LoginOptions, RequiredFieldsResponse } from \"../api/auth\";\nimport type { SigninRoot } from \"../components/signin-root/signin-root\";\n\nexport type AuthStep = \"email\" | \"verification\" | \"magic-code\" | \"missing-fields\" | \"reset-password\" | \"registration\" | \"single-login\";\n\nexport interface AuthState {\n step: AuthStep;\n sid: string | null;\n email: string;\n password: string;\n\n magicCodeStep: null | \"requested\" | \"sent\";\n resetPassword: {\n step: null | \"requested\" | \"sent\" | \"completed\";\n token: string | null;\n newPassword: string;\n passwordConfirmation: string;\n };\n missingRequiredFields?: RequiredFieldsResponse[\"fields\"];\n availableLoginOptions: LoginOptions | null;\n\n loading: boolean;\n errors: Record<\"email\" | \"password\" | \"magicCode\" | \"resetPassword\" | \"passkey\", string | null>;\n globalErrors: Record<string, string | null>;\n\n authenticated: boolean;\n token: string | null;\n}\n\nconst missingRequiredUserDefaultFields = () => {\n const fields = store.state.missingRequiredFields ?? ({} as RequiredFieldsResponse[\"fields\"]);\n const { custom_attributes, ...missingRequiredUserDefaultFields } = fields;\n return missingRequiredUserDefaultFields as Record<string, ProfileNode>;\n};\n\nconst missingRequiredCustomAttributeFields = () => {\n const fields = store.state.missingRequiredFields ?? ({} as RequiredFieldsResponse[\"fields\"]);\n return (fields?.custom_attributes ?? {}) as Record<string, ProfileNode>;\n};\n\nexport const missingFieldNames = () => {\n const userDefaultFields = Object.keys(missingRequiredUserDefaultFields());\n const ca = Object.keys(missingRequiredCustomAttributeFields()).map((k) => `custom_attributes.${k}`);\n return [...userDefaultFields, ...ca];\n};\n\nconst SESSION_KEYS = {\n SID: \"unidy_signin_id\",\n TOKEN: \"unidy_token\",\n EMAIL: \"unidy_email\",\n} as const;\n\nconst saveToStorage = (storage: Storage, key: string, value: string | null) => {\n if (value) {\n storage.setItem(key, value);\n } else {\n storage.removeItem(key);\n }\n};\n\nconst initialState: AuthState = {\n step: undefined,\n email: localStorage.getItem(SESSION_KEYS.EMAIL) ?? \"\",\n password: \"\",\n magicCodeStep: null,\n resetPassword: {\n step: null,\n token: null,\n newPassword: \"\",\n passwordConfirmation: \"\",\n },\n sid: localStorage.getItem(SESSION_KEYS.SID),\n loading: false,\n errors: {\n email: null,\n password: null,\n magicCode: null,\n resetPassword: null,\n passkey: null,\n },\n globalErrors: {},\n authenticated: false,\n missingRequiredFields: undefined,\n availableLoginOptions: {\n magic_link: false,\n password: false,\n social_logins: [],\n passkey: true,\n },\n token: sessionStorage.getItem(SESSION_KEYS.TOKEN),\n};\n\nconst store = createStore<AuthState>(initialState);\nconst { state, reset } = store;\n\nconst authStoreOnChange: <K extends keyof AuthState>(prop: K, cb: (value: AuthState[K]) => void) => () => void = store.onChange;\n\nclass AuthStore {\n private rootComponentRef: SigninRoot | null = null;\n\n setRootComponentRef(ref: SigninRoot) {\n this.rootComponentRef = ref;\n }\n\n getRootComponentRef() {\n return this.rootComponentRef;\n }\n\n get state() {\n return state;\n }\n\n setInitialStep(step: AuthStep) {\n if (state.step === undefined) state.step = step;\n }\n\n setEmail(email: string) {\n state.email = email;\n state.errors.email = null;\n saveToStorage(localStorage, SESSION_KEYS.EMAIL, email);\n }\n\n setPassword(password: string) {\n state.password = password;\n state.errors.password = null;\n }\n\n setMissingFields(fields: RequiredFieldsResponse[\"fields\"]) {\n state.missingRequiredFields = fields;\n }\n\n setLoginOptions(availableLoginOptions: LoginOptions) {\n state.availableLoginOptions = availableLoginOptions;\n }\n\n setLoading(loading: boolean) {\n state.loading = loading;\n }\n\n setFieldError(field: \"email\" | \"password\" | \"magicCode\" | \"resetPassword\" | \"passkey\", error: string | null) {\n if (!this.handleError(error)) return;\n\n state.errors = { ...state.errors, [field]: error };\n }\n\n setGlobalError(key: string, error: string | null) {\n if (!this.handleError(error)) return;\n state.globalErrors = { ...state.globalErrors, [key]: error };\n }\n\n private handleError(error: string | null): boolean {\n if (!error) return true;\n\n if (error === \"connection_failed\") {\n unidyState.backendConnected = false;\n return false;\n }\n\n if (error === \"sign_in_not_found\") {\n this.reset();\n return false;\n }\n\n this.rootComponentRef?.onError(error);\n return true;\n }\n\n clearFieldError(field: \"email\" | \"password\" | \"magicCode\" | \"resetPassword\" | \"passkey\") {\n state.errors = { ...state.errors, [field]: null } as Record<\n \"email\" | \"password\" | \"magicCode\" | \"resetPassword\" | \"passkey\",\n string | null\n >;\n }\n\n clearErrors() {\n state.errors = initialState.errors;\n state.globalErrors = {};\n }\n\n setStep(step: AuthStep) {\n state.step = step;\n }\n\n setSignInId(signInId: string) {\n state.sid = signInId;\n saveToStorage(localStorage, SESSION_KEYS.SID, signInId);\n }\n\n setToken(token: string) {\n state.token = token;\n saveToStorage(sessionStorage, SESSION_KEYS.TOKEN, token);\n this.setAuthenticated(!!token);\n }\n\n setMagicCodeStep(step: null | \"requested\" | \"sent\") {\n state.magicCodeStep = step;\n }\n\n setResetPasswordStep(step: null | \"requested\" | \"sent\" | \"completed\") {\n state.resetPassword = { ...state.resetPassword, step };\n }\n\n setResetToken(token: string | null) {\n state.resetPassword = { ...state.resetPassword, token };\n }\n\n setNewPassword(password: string) {\n state.resetPassword = { ...state.resetPassword, newPassword: password };\n }\n\n setConfirmPassword(password: string) {\n state.resetPassword = { ...state.resetPassword, passwordConfirmation: password };\n }\n\n updateResetPassword(updates: Partial<AuthState[\"resetPassword\"]>) {\n state.resetPassword = { ...state.resetPassword, ...updates };\n }\n\n setAuthenticated(authenticated: boolean) {\n state.authenticated = authenticated;\n\n if (!authenticated) {\n state.token = null;\n state.sid = null;\n }\n }\n\n reset() {\n reset();\n saveToStorage(localStorage, SESSION_KEYS.SID, null);\n saveToStorage(localStorage, SESSION_KEYS.EMAIL, null);\n saveToStorage(sessionStorage, SESSION_KEYS.TOKEN, null);\n }\n}\n\nexport const authStore = new AuthStore();\nexport { state as authState, authStoreOnChange as onChange };\n"],"names":["createStore","unidyState"],"mappings":"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"}
|
package/dist/cjs/index.cjs.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var index = require('./index-R2MKLaem.js');
|
|
4
|
-
var authStore = require('./auth-store-
|
|
5
|
-
var auth = require('./auth-
|
|
4
|
+
var authStore = require('./auth-store-DPHWWmXf.js');
|
|
5
|
+
var auth = require('./auth-B83pzi0f.js');
|
|
6
6
|
var profileStore = require('./profile-store-P_BcYkef.js');
|
|
7
7
|
var paginationStore = require('./pagination-store-BEiW3MQd.js');
|
|
8
8
|
var flashStore = require('./flash-store-BuIBuQDx.js');
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var index$1 = require('./index-R2MKLaem.js');
|
|
4
|
-
var auth = require('./auth-
|
|
4
|
+
var auth = require('./auth-B83pzi0f.js');
|
|
5
5
|
var i18n = require('./i18n-BoDZ8kd2.js');
|
|
6
6
|
var index = require('./index-B_N5xKgH.js');
|
|
7
7
|
var flashStore = require('./flash-store-BuIBuQDx.js');
|
|
@@ -284,6 +284,6 @@ exports.resendDoi = resendDoi;
|
|
|
284
284
|
exports.sendLoginEmail = sendLoginEmail;
|
|
285
285
|
exports.subscribeToNewsletter = subscribeToNewsletter;
|
|
286
286
|
exports.updateSubscriptionPreferences = updateSubscriptionPreferences;
|
|
287
|
-
//# sourceMappingURL=newsletter-helpers-
|
|
287
|
+
//# sourceMappingURL=newsletter-helpers-D-V_8kiN.js.map
|
|
288
288
|
|
|
289
|
-
//# sourceMappingURL=newsletter-helpers-
|
|
289
|
+
//# sourceMappingURL=newsletter-helpers-D-V_8kiN.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"newsletter-helpers-DR0vsegt.js","sources":["src/newsletter/newsletter-helpers.ts"],"sourcesContent":["import { getUnidyClient } from \"../api\";\nimport { Auth } from \"../auth/auth\";\nimport { t } from \"../i18n\";\nimport { createLogger } from \"../logger\";\nimport { Flash } from \"../shared/store/flash-store\";\nimport {\n type CheckedNewsletters,\n type ExistingSubscription,\n type NewsletterErrorIdentifier,\n newsletterStore,\n persist,\n} from \"./store/newsletter-store\";\n\nconst logger = createLogger(\"NewsletterHelpers\");\n\nconst PERSIST_KEY_PREFIX = \"unidy_newsletter_\";\n\nexport function newsletterLogout(): void {\n newsletterStore.state.preferenceToken = \"\";\n newsletterStore.state.existingSubscriptions = [];\n sessionStorage.removeItem(`${PERSIST_KEY_PREFIX}preferenceToken`);\n sessionStorage.removeItem(`${PERSIST_KEY_PREFIX}email`);\n}\n\nexport async function resendDoi(internalName: string): Promise<boolean> {\n const { preferenceToken } = newsletterStore.state;\n\n const authInstance = await Auth.getInstance();\n const idToken = await authInstance.getToken();\n\n const response = await getUnidyClient().newsletters.resendDoi(\n internalName,\n { redirect_to_after_confirmation: redirectToAfterConfirmationUrl() },\n {\n preferenceToken: typeof preferenceToken === \"string\" ? preferenceToken : \"\",\n idToken: typeof idToken === \"string\" ? idToken : \"\",\n },\n );\n\n if (response.status === 204) {\n return true;\n }\n\n if (response.status === 401) {\n Flash.error.addMessage(t(\"newsletter.errors.unauthorized\"));\n newsletterLogout();\n return false;\n }\n\n return false;\n}\n\nexport async function sendLoginEmail(email: string): Promise<void> {\n const response = await getUnidyClient().newsletters.sendLoginEmail({\n email,\n redirect_uri: redirectToAfterConfirmationUrl(),\n });\n\n if (response.status === 204) {\n Flash.info.addMessage(t(\"newsletter.success.login_email_sent\"));\n } else if (response.status === 404) {\n Flash.error.addMessage(t(\"newsletter.errors.login_email_not_found\"));\n } else {\n Flash.error.addMessage(t(\"errors.unknown\", { defaultValue: \"An unknown error occurred\" }));\n }\n}\n\nexport async function fetchSubscriptions(): Promise<void> {\n const { preferenceToken } = newsletterStore.state;\n\n // either preference token is needed or the user must be authenticated\n if (!preferenceToken && !newsletterStore.state.isAuthenticated) {\n logger.error(\"Preference token or authentication is required to fetch subscriptions\");\n return;\n }\n\n const authInstance = await Auth.getInstance();\n const idToken = await authInstance.getToken();\n\n newsletterStore.state.fetchingSubscriptions = true;\n\n const response = await getUnidyClient().newsletters.listSubscriptions({\n preferenceToken,\n idToken: typeof idToken === \"string\" ? idToken : \"\",\n });\n\n newsletterStore.state.fetchingSubscriptions = false;\n\n if (response.status === 401) {\n newsletterLogout();\n Flash.error.addMessage(t(\"newsletter.errors.unauthorized\"));\n return;\n }\n\n if (response.success && response.data) {\n newsletterStore.state.existingSubscriptions = response.data.map(\n (sub): ExistingSubscription => ({\n newsletter_internal_name: sub.newsletter_internal_name,\n confirmed: sub.confirmed_at !== null,\n preference_identifiers: sub.preference_identifiers || [],\n }),\n );\n\n // init checked newsletters and preferences\n const checkedNewsletters: CheckedNewsletters = { ...newsletterStore.state.checkedNewsletters };\n for (const sub of response.data) {\n checkedNewsletters[sub.newsletter_internal_name] = [...(sub.preference_identifiers || [])];\n }\n newsletterStore.state.checkedNewsletters = checkedNewsletters;\n }\n}\n\nasync function handleAlreadySubscribedError(\n email: string,\n errors: Array<{ error_identifier: string; meta: { newsletter_internal_name: string } }>,\n): Promise<void> {\n if (newsletterStore.state.isAuthenticated || newsletterStore.state.preferenceToken) {\n const existingNames = new Set(newsletterStore.state.existingSubscriptions.map((s) => s.newsletter_internal_name));\n\n const newSubscriptions: ExistingSubscription[] = errors\n .filter((err) => err.error_identifier === \"already_subscribed\" && !existingNames.has(err.meta.newsletter_internal_name))\n .map((err) => ({\n newsletter_internal_name: err.meta.newsletter_internal_name,\n confirmed: null,\n preference_identifiers: [],\n }));\n\n if (newSubscriptions.length > 0) {\n newsletterStore.state.existingSubscriptions = [...newsletterStore.state.existingSubscriptions, ...newSubscriptions];\n }\n } else {\n await sendLoginEmail(email);\n }\n}\n\nasync function handleCreateSubscriptionRequest(email: string, internalNames: string[], showSuccessMessage = true): Promise<boolean> {\n const authInstance = await Auth.getInstance();\n const idToken = await authInstance.getToken();\n const { checkedNewsletters } = newsletterStore.state;\n\n const [error, response] = await getUnidyClient().newsletters.createSubscriptions(\n {\n email,\n newsletter_subscriptions: internalNames.map((newsletter) => ({\n newsletter_internal_name: newsletter,\n preference_identifiers: checkedNewsletters[newsletter] || [],\n })),\n redirect_to_after_confirmation: redirectToAfterConfirmationUrl(),\n },\n {\n idToken: typeof idToken === \"string\" ? idToken : \"\",\n },\n );\n\n if (error === null) {\n if (response.data?.results && response.data.results.length > 0) {\n const newSubscriptions: ExistingSubscription[] = response.data.results.map((result) => ({\n newsletter_internal_name: result.newsletter_internal_name,\n confirmed: result.confirmed_at !== null,\n preference_identifiers: result.preference_identifiers || [],\n }));\n\n newsletterStore.state.existingSubscriptions = [...newsletterStore.state.existingSubscriptions, ...newSubscriptions];\n }\n\n if (showSuccessMessage) {\n Flash.success.addMessage(t(\"newsletter.success.subscribe\"));\n }\n\n return true;\n }\n\n if (error === \"unauthorized\") {\n Flash.error.addMessage(t(\"newsletter.errors.unauthorized\"));\n newsletterLogout();\n return false;\n }\n\n if (error === \"newsletter_error\") {\n const errors = response.data?.errors || [];\n const errorMap: Record<string, NewsletterErrorIdentifier> = {};\n\n // special error case which is handled differently: if user is not authenticated, we send a login email, otherwise we add the\n // already_subscribed subscriptions to the existing subscriptions\n const hasAlreadySubscribedError = errors.some((err) => err.error_identifier === \"already_subscribed\");\n if (hasAlreadySubscribedError) {\n await handleAlreadySubscribedError(email, errors);\n }\n\n const newsletterNotFoundError = errors.some((err) => err.error_identifier === \"newsletter_not_found\");\n if (newsletterNotFoundError) {\n errorMap.general = \"newsletter_not_found\";\n }\n\n const hasInvalidEmailError = errors.some(\n (err) => err.error_identifier === \"validation_error\" && err.error_details && \"email\" in err.error_details,\n );\n\n if (hasInvalidEmailError) {\n errorMap.email = \"invalid_email\";\n } else {\n for (const err of errors) {\n errorMap[err.meta.newsletter_internal_name] = err.error_identifier as NewsletterErrorIdentifier;\n }\n }\n\n newsletterStore.state.errors = errorMap;\n } else {\n Flash.error.addMessage(t(\"errors.unknown\", { defaultValue: \"An unknown error occurred\" }));\n }\n\n return false;\n}\n\nexport async function subscribeToNewsletter(internalName: string, email: string): Promise<boolean> {\n return handleCreateSubscriptionRequest(email, [internalName], false);\n}\n\nexport async function createSubscriptions({ email }: { email: string }): Promise<void> {\n const internalNames = Object.keys(newsletterStore.state.checkedNewsletters);\n await handleCreateSubscriptionRequest(email, internalNames, true);\n}\n\nexport async function deleteSubscription(internalName: string): Promise<boolean> {\n const { preferenceToken } = newsletterStore.state;\n\n // either preference token is needed or the user must be authenticated to delete a subscription\n if (!preferenceToken && !newsletterStore.state.isAuthenticated) {\n logger.error(\"Preference token or authentication is required to delete a subscription\");\n return false;\n }\n\n const authInstance = await Auth.getInstance();\n const idToken = await authInstance.getToken();\n\n const response = await getUnidyClient().newsletters.deleteSubscription(internalName, {\n preferenceToken,\n idToken: typeof idToken === \"string\" ? idToken : \"\",\n });\n\n if (response.status === 200 && response.data?.new_preference_token) {\n // if user is not authenticated, we need to store the new preference token which is used for the next request\n if (!newsletterStore.state.isAuthenticated) {\n newsletterStore.state.preferenceToken = response.data.new_preference_token;\n persist(\"preferenceToken\");\n }\n\n newsletterStore.state.existingSubscriptions = newsletterStore.state.existingSubscriptions.filter(\n (sub) => sub.newsletter_internal_name !== internalName,\n );\n\n // Reset checked preferences to defaults (preferences marked with checked='true')\n const defaultPrefs = newsletterStore.state.defaultPreferences[internalName];\n newsletterStore.state.checkedNewsletters = {\n ...newsletterStore.state.checkedNewsletters,\n [internalName]: defaultPrefs ? [...defaultPrefs] : [],\n };\n\n return true;\n }\n\n if (response.status === 204) {\n newsletterLogout();\n\n newsletterStore.state.checkedNewsletters = {};\n return true;\n }\n\n if (response.status === 401) {\n Flash.error.addMessage(t(\"newsletter.errors.unauthorized\"));\n newsletterLogout();\n return false;\n }\n\n if (response.status === 422) {\n return false;\n }\n\n Flash.error.addMessage(t(\"errors.unknown\", { defaultValue: \"An unknown error occurred\" }));\n return false;\n}\n\nexport function getSubscription(internalName: string): ExistingSubscription | undefined {\n return newsletterStore.state.existingSubscriptions.find((sub) => sub.newsletter_internal_name === internalName);\n}\n\nexport function isSubscribed(internalName: string): boolean {\n return newsletterStore.state.existingSubscriptions.some((sub) => sub.newsletter_internal_name === internalName);\n}\n\nexport function isConfirmed(internalName: string): boolean {\n const sub = getSubscription(internalName);\n return sub?.confirmed ?? false;\n}\n\nfunction redirectToAfterConfirmationUrl(): string {\n const baseUrl = `${location.origin}${location.pathname}`;\n const params = new URLSearchParams(location.search);\n for (const key of [\"email\", \"newsletter_error\"]) {\n params.delete(key);\n }\n const queryString = params.toString();\n return queryString ? `${baseUrl}?${queryString}` : baseUrl;\n}\n\nexport function getSubscriptionPreferences(internalName: string): string[] {\n const subscription = getSubscription(internalName);\n return subscription?.preference_identifiers || [];\n}\n\nexport async function updateSubscriptionPreferences(internalName: string): Promise<boolean> {\n const { preferenceToken } = newsletterStore.state;\n\n // Either preference token is needed or the user must be authenticated\n if (!preferenceToken && !newsletterStore.state.isAuthenticated) {\n logger.error(\"Preference token or authentication is required to update subscription preferences\");\n return false;\n }\n\n // Check if the subscription exists\n if (!isSubscribed(internalName)) {\n logger.error(`Cannot update preferences: not subscribed to newsletter '${internalName}'`);\n return false;\n }\n\n const authInstance = await Auth.getInstance();\n const idToken = await authInstance.getToken();\n\n const preferenceIdentifiers = newsletterStore.state.checkedNewsletters[internalName] || [];\n\n const response = await getUnidyClient().newsletters.updateSubscription(\n internalName,\n { preference_identifiers: preferenceIdentifiers },\n {\n preferenceToken,\n idToken: typeof idToken === \"string\" ? idToken : \"\",\n },\n );\n\n if (response.status === 401) {\n Flash.error.addMessage(t(\"newsletter.errors.unauthorized\"));\n newsletterLogout();\n return false;\n }\n\n if (response.success && response.data) {\n // Update the local subscription with the new preferences\n const subscriptionIndex = newsletterStore.state.existingSubscriptions.findIndex((sub) => sub.newsletter_internal_name === internalName);\n\n if (subscriptionIndex !== -1) {\n const updatedSubscriptions = [...newsletterStore.state.existingSubscriptions];\n updatedSubscriptions[subscriptionIndex] = {\n ...updatedSubscriptions[subscriptionIndex],\n preference_identifiers: response.data.preference_identifiers || [],\n };\n newsletterStore.state.existingSubscriptions = updatedSubscriptions;\n }\n\n Flash.success.addMessage(t(\"newsletter.success.preferences_updated\"));\n return true;\n }\n\n Flash.error.addMessage(t(\"errors.unknown\", { defaultValue: \"An unknown error occurred\" }));\n return false;\n}\n"],"names":["createLogger","newsletterStore","Auth","getUnidyClient","Flash","t","persist"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"newsletter-helpers-D-V_8kiN.js","sources":["src/newsletter/newsletter-helpers.ts"],"sourcesContent":["import { getUnidyClient } from \"../api\";\nimport { Auth } from \"../auth/auth\";\nimport { t } from \"../i18n\";\nimport { createLogger } from \"../logger\";\nimport { Flash } from \"../shared/store/flash-store\";\nimport {\n type CheckedNewsletters,\n type ExistingSubscription,\n type NewsletterErrorIdentifier,\n newsletterStore,\n persist,\n} from \"./store/newsletter-store\";\n\nconst logger = createLogger(\"NewsletterHelpers\");\n\nconst PERSIST_KEY_PREFIX = \"unidy_newsletter_\";\n\nexport function newsletterLogout(): void {\n newsletterStore.state.preferenceToken = \"\";\n newsletterStore.state.existingSubscriptions = [];\n sessionStorage.removeItem(`${PERSIST_KEY_PREFIX}preferenceToken`);\n sessionStorage.removeItem(`${PERSIST_KEY_PREFIX}email`);\n}\n\nexport async function resendDoi(internalName: string): Promise<boolean> {\n const { preferenceToken } = newsletterStore.state;\n\n const authInstance = await Auth.getInstance();\n const idToken = await authInstance.getToken();\n\n const response = await getUnidyClient().newsletters.resendDoi(\n internalName,\n { redirect_to_after_confirmation: redirectToAfterConfirmationUrl() },\n {\n preferenceToken: typeof preferenceToken === \"string\" ? preferenceToken : \"\",\n idToken: typeof idToken === \"string\" ? idToken : \"\",\n },\n );\n\n if (response.status === 204) {\n return true;\n }\n\n if (response.status === 401) {\n Flash.error.addMessage(t(\"newsletter.errors.unauthorized\"));\n newsletterLogout();\n return false;\n }\n\n return false;\n}\n\nexport async function sendLoginEmail(email: string): Promise<void> {\n const response = await getUnidyClient().newsletters.sendLoginEmail({\n email,\n redirect_uri: redirectToAfterConfirmationUrl(),\n });\n\n if (response.status === 204) {\n Flash.info.addMessage(t(\"newsletter.success.login_email_sent\"));\n } else if (response.status === 404) {\n Flash.error.addMessage(t(\"newsletter.errors.login_email_not_found\"));\n } else {\n Flash.error.addMessage(t(\"errors.unknown\", { defaultValue: \"An unknown error occurred\" }));\n }\n}\n\nexport async function fetchSubscriptions(): Promise<void> {\n const { preferenceToken } = newsletterStore.state;\n\n // either preference token is needed or the user must be authenticated\n if (!preferenceToken && !newsletterStore.state.isAuthenticated) {\n logger.error(\"Preference token or authentication is required to fetch subscriptions\");\n return;\n }\n\n const authInstance = await Auth.getInstance();\n const idToken = await authInstance.getToken();\n\n newsletterStore.state.fetchingSubscriptions = true;\n\n const response = await getUnidyClient().newsletters.listSubscriptions({\n preferenceToken,\n idToken: typeof idToken === \"string\" ? idToken : \"\",\n });\n\n newsletterStore.state.fetchingSubscriptions = false;\n\n if (response.status === 401) {\n newsletterLogout();\n Flash.error.addMessage(t(\"newsletter.errors.unauthorized\"));\n return;\n }\n\n if (response.success && response.data) {\n newsletterStore.state.existingSubscriptions = response.data.map(\n (sub): ExistingSubscription => ({\n newsletter_internal_name: sub.newsletter_internal_name,\n confirmed: sub.confirmed_at !== null,\n preference_identifiers: sub.preference_identifiers || [],\n }),\n );\n\n // init checked newsletters and preferences\n const checkedNewsletters: CheckedNewsletters = { ...newsletterStore.state.checkedNewsletters };\n for (const sub of response.data) {\n checkedNewsletters[sub.newsletter_internal_name] = [...(sub.preference_identifiers || [])];\n }\n newsletterStore.state.checkedNewsletters = checkedNewsletters;\n }\n}\n\nasync function handleAlreadySubscribedError(\n email: string,\n errors: Array<{ error_identifier: string; meta: { newsletter_internal_name: string } }>,\n): Promise<void> {\n if (newsletterStore.state.isAuthenticated || newsletterStore.state.preferenceToken) {\n const existingNames = new Set(newsletterStore.state.existingSubscriptions.map((s) => s.newsletter_internal_name));\n\n const newSubscriptions: ExistingSubscription[] = errors\n .filter((err) => err.error_identifier === \"already_subscribed\" && !existingNames.has(err.meta.newsletter_internal_name))\n .map((err) => ({\n newsletter_internal_name: err.meta.newsletter_internal_name,\n confirmed: null,\n preference_identifiers: [],\n }));\n\n if (newSubscriptions.length > 0) {\n newsletterStore.state.existingSubscriptions = [...newsletterStore.state.existingSubscriptions, ...newSubscriptions];\n }\n } else {\n await sendLoginEmail(email);\n }\n}\n\nasync function handleCreateSubscriptionRequest(email: string, internalNames: string[], showSuccessMessage = true): Promise<boolean> {\n const authInstance = await Auth.getInstance();\n const idToken = await authInstance.getToken();\n const { checkedNewsletters } = newsletterStore.state;\n\n const [error, response] = await getUnidyClient().newsletters.createSubscriptions(\n {\n email,\n newsletter_subscriptions: internalNames.map((newsletter) => ({\n newsletter_internal_name: newsletter,\n preference_identifiers: checkedNewsletters[newsletter] || [],\n })),\n redirect_to_after_confirmation: redirectToAfterConfirmationUrl(),\n },\n {\n idToken: typeof idToken === \"string\" ? idToken : \"\",\n },\n );\n\n if (error === null) {\n if (response.data?.results && response.data.results.length > 0) {\n const newSubscriptions: ExistingSubscription[] = response.data.results.map((result) => ({\n newsletter_internal_name: result.newsletter_internal_name,\n confirmed: result.confirmed_at !== null,\n preference_identifiers: result.preference_identifiers || [],\n }));\n\n newsletterStore.state.existingSubscriptions = [...newsletterStore.state.existingSubscriptions, ...newSubscriptions];\n }\n\n if (showSuccessMessage) {\n Flash.success.addMessage(t(\"newsletter.success.subscribe\"));\n }\n\n return true;\n }\n\n if (error === \"unauthorized\") {\n Flash.error.addMessage(t(\"newsletter.errors.unauthorized\"));\n newsletterLogout();\n return false;\n }\n\n if (error === \"newsletter_error\") {\n const errors = response.data?.errors || [];\n const errorMap: Record<string, NewsletterErrorIdentifier> = {};\n\n // special error case which is handled differently: if user is not authenticated, we send a login email, otherwise we add the\n // already_subscribed subscriptions to the existing subscriptions\n const hasAlreadySubscribedError = errors.some((err) => err.error_identifier === \"already_subscribed\");\n if (hasAlreadySubscribedError) {\n await handleAlreadySubscribedError(email, errors);\n }\n\n const newsletterNotFoundError = errors.some((err) => err.error_identifier === \"newsletter_not_found\");\n if (newsletterNotFoundError) {\n errorMap.general = \"newsletter_not_found\";\n }\n\n const hasInvalidEmailError = errors.some(\n (err) => err.error_identifier === \"validation_error\" && err.error_details && \"email\" in err.error_details,\n );\n\n if (hasInvalidEmailError) {\n errorMap.email = \"invalid_email\";\n } else {\n for (const err of errors) {\n errorMap[err.meta.newsletter_internal_name] = err.error_identifier as NewsletterErrorIdentifier;\n }\n }\n\n newsletterStore.state.errors = errorMap;\n } else {\n Flash.error.addMessage(t(\"errors.unknown\", { defaultValue: \"An unknown error occurred\" }));\n }\n\n return false;\n}\n\nexport async function subscribeToNewsletter(internalName: string, email: string): Promise<boolean> {\n return handleCreateSubscriptionRequest(email, [internalName], false);\n}\n\nexport async function createSubscriptions({ email }: { email: string }): Promise<void> {\n const internalNames = Object.keys(newsletterStore.state.checkedNewsletters);\n await handleCreateSubscriptionRequest(email, internalNames, true);\n}\n\nexport async function deleteSubscription(internalName: string): Promise<boolean> {\n const { preferenceToken } = newsletterStore.state;\n\n // either preference token is needed or the user must be authenticated to delete a subscription\n if (!preferenceToken && !newsletterStore.state.isAuthenticated) {\n logger.error(\"Preference token or authentication is required to delete a subscription\");\n return false;\n }\n\n const authInstance = await Auth.getInstance();\n const idToken = await authInstance.getToken();\n\n const response = await getUnidyClient().newsletters.deleteSubscription(internalName, {\n preferenceToken,\n idToken: typeof idToken === \"string\" ? idToken : \"\",\n });\n\n if (response.status === 200 && response.data?.new_preference_token) {\n // if user is not authenticated, we need to store the new preference token which is used for the next request\n if (!newsletterStore.state.isAuthenticated) {\n newsletterStore.state.preferenceToken = response.data.new_preference_token;\n persist(\"preferenceToken\");\n }\n\n newsletterStore.state.existingSubscriptions = newsletterStore.state.existingSubscriptions.filter(\n (sub) => sub.newsletter_internal_name !== internalName,\n );\n\n // Reset checked preferences to defaults (preferences marked with checked='true')\n const defaultPrefs = newsletterStore.state.defaultPreferences[internalName];\n newsletterStore.state.checkedNewsletters = {\n ...newsletterStore.state.checkedNewsletters,\n [internalName]: defaultPrefs ? [...defaultPrefs] : [],\n };\n\n return true;\n }\n\n if (response.status === 204) {\n newsletterLogout();\n\n newsletterStore.state.checkedNewsletters = {};\n return true;\n }\n\n if (response.status === 401) {\n Flash.error.addMessage(t(\"newsletter.errors.unauthorized\"));\n newsletterLogout();\n return false;\n }\n\n if (response.status === 422) {\n return false;\n }\n\n Flash.error.addMessage(t(\"errors.unknown\", { defaultValue: \"An unknown error occurred\" }));\n return false;\n}\n\nexport function getSubscription(internalName: string): ExistingSubscription | undefined {\n return newsletterStore.state.existingSubscriptions.find((sub) => sub.newsletter_internal_name === internalName);\n}\n\nexport function isSubscribed(internalName: string): boolean {\n return newsletterStore.state.existingSubscriptions.some((sub) => sub.newsletter_internal_name === internalName);\n}\n\nexport function isConfirmed(internalName: string): boolean {\n const sub = getSubscription(internalName);\n return sub?.confirmed ?? false;\n}\n\nfunction redirectToAfterConfirmationUrl(): string {\n const baseUrl = `${location.origin}${location.pathname}`;\n const params = new URLSearchParams(location.search);\n for (const key of [\"email\", \"newsletter_error\"]) {\n params.delete(key);\n }\n const queryString = params.toString();\n return queryString ? `${baseUrl}?${queryString}` : baseUrl;\n}\n\nexport function getSubscriptionPreferences(internalName: string): string[] {\n const subscription = getSubscription(internalName);\n return subscription?.preference_identifiers || [];\n}\n\nexport async function updateSubscriptionPreferences(internalName: string): Promise<boolean> {\n const { preferenceToken } = newsletterStore.state;\n\n // Either preference token is needed or the user must be authenticated\n if (!preferenceToken && !newsletterStore.state.isAuthenticated) {\n logger.error(\"Preference token or authentication is required to update subscription preferences\");\n return false;\n }\n\n // Check if the subscription exists\n if (!isSubscribed(internalName)) {\n logger.error(`Cannot update preferences: not subscribed to newsletter '${internalName}'`);\n return false;\n }\n\n const authInstance = await Auth.getInstance();\n const idToken = await authInstance.getToken();\n\n const preferenceIdentifiers = newsletterStore.state.checkedNewsletters[internalName] || [];\n\n const response = await getUnidyClient().newsletters.updateSubscription(\n internalName,\n { preference_identifiers: preferenceIdentifiers },\n {\n preferenceToken,\n idToken: typeof idToken === \"string\" ? idToken : \"\",\n },\n );\n\n if (response.status === 401) {\n Flash.error.addMessage(t(\"newsletter.errors.unauthorized\"));\n newsletterLogout();\n return false;\n }\n\n if (response.success && response.data) {\n // Update the local subscription with the new preferences\n const subscriptionIndex = newsletterStore.state.existingSubscriptions.findIndex((sub) => sub.newsletter_internal_name === internalName);\n\n if (subscriptionIndex !== -1) {\n const updatedSubscriptions = [...newsletterStore.state.existingSubscriptions];\n updatedSubscriptions[subscriptionIndex] = {\n ...updatedSubscriptions[subscriptionIndex],\n preference_identifiers: response.data.preference_identifiers || [],\n };\n newsletterStore.state.existingSubscriptions = updatedSubscriptions;\n }\n\n Flash.success.addMessage(t(\"newsletter.success.preferences_updated\"));\n return true;\n }\n\n Flash.error.addMessage(t(\"errors.unknown\", { defaultValue: \"An unknown error occurred\" }));\n return false;\n}\n"],"names":["createLogger","newsletterStore","Auth","getUnidyClient","Flash","t","persist"],"mappings":"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"}
|