@strands.gg/accui 1.4.0 → 1.4.1
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/accui.css +544 -14
- package/dist/nuxt/runtime/composables/useStrandsAuth.cjs.js +1 -1
- package/dist/nuxt/runtime/composables/useStrandsAuth.d.ts +21 -1
- package/dist/nuxt/runtime/composables/useStrandsAuth.d.ts.map +1 -1
- package/dist/nuxt/runtime/composables/useStrandsAuth.es.js +1 -1
- package/dist/nuxt/runtime/plugin.client.cjs.js +1 -1
- package/dist/nuxt/runtime/plugin.client.es.js +1 -1
- package/dist/nuxt/runtime/plugin.server.cjs.js +1 -1
- package/dist/nuxt/runtime/plugin.server.es.js +1 -1
- package/dist/nuxt-v4/runtime/composables/useStrandsAuth.cjs.js +1 -1
- package/dist/nuxt-v4/runtime/composables/useStrandsAuth.es.js +1 -1
- package/dist/nuxt-v4/runtime/plugin.client.cjs.js +1 -1
- package/dist/nuxt-v4/runtime/plugin.client.es.js +1 -1
- package/dist/nuxt-v4/runtime/plugin.server.cjs.js +1 -1
- package/dist/nuxt-v4/runtime/plugin.server.es.js +1 -1
- package/dist/strands-auth-ui.cjs.js +3788 -660
- package/dist/strands-auth-ui.cjs.js.map +1 -1
- package/dist/strands-auth-ui.es.js +3798 -670
- package/dist/strands-auth-ui.es.js.map +1 -1
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/{useStrandsAuth-DQbwHB-6.js → useStrandsAuth-SdmBCyFS.js} +67 -7
- package/dist/useStrandsAuth-SdmBCyFS.js.map +1 -0
- package/dist/{useStrandsAuth-Bw5wrBA2.cjs → useStrandsAuth-zR8fRWme.cjs} +67 -7
- package/dist/useStrandsAuth-zR8fRWme.cjs.map +1 -0
- package/dist/{useStrandsConfig-V7XSMyQ5.js → useStrandsConfig-COEj6nFc.js} +3 -1
- package/dist/useStrandsConfig-COEj6nFc.js.map +1 -0
- package/dist/{useStrandsConfig-B9UkrP-c.cjs → useStrandsConfig-DW4ez8t4.cjs} +3 -1
- package/dist/useStrandsConfig-DW4ez8t4.cjs.map +1 -0
- package/dist/vue/components/SignedIn.vue.d.ts +2 -0
- package/dist/vue/components/SignedIn.vue.d.ts.map +1 -1
- package/dist/vue/components/SignedOut.vue.d.ts +2 -0
- package/dist/vue/components/SignedOut.vue.d.ts.map +1 -1
- package/dist/vue/components/StrandsCompleteSignUp.vue.d.ts.map +1 -1
- package/dist/vue/components/StrandsConfirmModal.vue.d.ts +2 -2
- package/dist/vue/components/StrandsHardwareKeySetupModal.vue.d.ts +4 -1
- package/dist/vue/components/StrandsHardwareKeySetupModal.vue.d.ts.map +1 -1
- package/dist/vue/components/StrandsMfaVerification.vue.d.ts.map +1 -1
- package/dist/vue/components/StrandsSettingsModal.vue.d.ts +18 -0
- package/dist/vue/components/StrandsSettingsModal.vue.d.ts.map +1 -0
- package/dist/vue/components/StrandsUserProfile.vue.d.ts +1 -1
- package/dist/vue/components/StrandsUserProfile.vue.d.ts.map +1 -1
- package/dist/vue/components/index.d.ts +1 -0
- package/dist/vue/components/index.d.ts.map +1 -1
- package/dist/vue/composables/useStrandsAuth.d.ts +21 -1
- package/dist/vue/composables/useStrandsAuth.d.ts.map +1 -1
- package/dist/vue/composables/useStrandsConfig.d.ts.map +1 -1
- package/dist/vue/ui/UiAvatarEditor.vue.d.ts +24 -0
- package/dist/vue/ui/UiAvatarEditor.vue.d.ts.map +1 -0
- package/dist/vue/ui/UiAvatarEditorSimple.vue.d.ts +25 -0
- package/dist/vue/ui/UiAvatarEditorSimple.vue.d.ts.map +1 -0
- package/dist/vue/ui/UiButton.vue.d.ts +1 -0
- package/dist/vue/ui/UiButton.vue.d.ts.map +1 -1
- package/dist/vue/ui/UiInput.vue.d.ts +6 -1
- package/dist/vue/ui/UiInput.vue.d.ts.map +1 -1
- package/dist/vue/ui/UiLevelProgress.vue.d.ts +19 -0
- package/dist/vue/ui/UiLevelProgress.vue.d.ts.map +1 -0
- package/dist/vue/ui/UiToggle.vue.d.ts +15 -0
- package/dist/vue/ui/UiToggle.vue.d.ts.map +1 -0
- package/dist/vue/ui/index.d.ts +4 -0
- package/dist/vue/ui/index.d.ts.map +1 -1
- package/dist/vue/utils/sounds.d.ts +57 -0
- package/dist/vue/utils/sounds.d.ts.map +1 -0
- package/package.json +3 -1
- package/dist/useStrandsAuth-Bw5wrBA2.cjs.map +0 -1
- package/dist/useStrandsAuth-DQbwHB-6.js.map +0 -1
- package/dist/useStrandsConfig-B9UkrP-c.cjs.map +0 -1
- package/dist/useStrandsConfig-V7XSMyQ5.js.map +0 -1
package/dist/types/index.d.ts
CHANGED
|
@@ -7,6 +7,8 @@ export interface User {
|
|
|
7
7
|
mfaEnabled: boolean;
|
|
8
8
|
emailVerified: boolean;
|
|
9
9
|
passwordUpdatedAt?: string | Date;
|
|
10
|
+
settings?: any;
|
|
11
|
+
xp: number;
|
|
10
12
|
createdAt: string | Date;
|
|
11
13
|
updatedAt: string | Date;
|
|
12
14
|
}
|
|
@@ -133,6 +135,7 @@ export interface StrandsAuthEndpoints {
|
|
|
133
135
|
oauthProvider: string;
|
|
134
136
|
changeEmail: string;
|
|
135
137
|
avatar: string;
|
|
138
|
+
settings: string;
|
|
136
139
|
mfaDevices: string;
|
|
137
140
|
mfaTotpSetup: string;
|
|
138
141
|
mfaTotpVerify: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../apps/accounts-ui/src/types/index.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,OAAO,CAAA;IACnB,aAAa,EAAE,OAAO,CAAA;IACtB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,CAAC,EAAE,IAAI,CAAA;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAGD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAGD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAClB;AAGD,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IAErB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IAExB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAE1B;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAE1B;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAE1B;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAEhB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAA;CAC1C;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,CAAA;IACrB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,oBAAoB,EAAE,MAAM,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../apps/accounts-ui/src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ref, computed } from "vue";
|
|
2
|
-
import { u as useStrandsConfig } from "./useStrandsConfig-
|
|
2
|
+
import { u as useStrandsConfig } from "./useStrandsConfig-COEj6nFc.js";
|
|
3
3
|
const { getUrl } = useStrandsConfig();
|
|
4
4
|
const currentUser = ref(null);
|
|
5
5
|
const currentSession = ref(null);
|
|
@@ -193,7 +193,7 @@ function useStrandsAuth() {
|
|
|
193
193
|
throw new Error(`Token refresh failed: ${response.status} ${response.statusText}`);
|
|
194
194
|
}
|
|
195
195
|
const authData = await response.json();
|
|
196
|
-
setAuthData(authData);
|
|
196
|
+
setAuthData(authData, true);
|
|
197
197
|
return true;
|
|
198
198
|
} catch (error) {
|
|
199
199
|
await signOut();
|
|
@@ -230,6 +230,8 @@ function useStrandsAuth() {
|
|
|
230
230
|
mfaEnabled: userData.mfaEnabled || false,
|
|
231
231
|
emailVerified: userData.email_verified,
|
|
232
232
|
passwordUpdatedAt: userData.password_updated_at,
|
|
233
|
+
settings: userData.settings || {},
|
|
234
|
+
xp: userData.xp || 0,
|
|
233
235
|
createdAt: userData.created_at,
|
|
234
236
|
updatedAt: userData.updated_at || (/* @__PURE__ */ new Date()).toISOString()
|
|
235
237
|
};
|
|
@@ -290,6 +292,45 @@ function useStrandsAuth() {
|
|
|
290
292
|
isLoadingProfile.value = false;
|
|
291
293
|
}
|
|
292
294
|
};
|
|
295
|
+
const updateUserSettings = async (settings) => {
|
|
296
|
+
if (!currentSession.value?.accessToken) {
|
|
297
|
+
throw new Error("No access token available");
|
|
298
|
+
}
|
|
299
|
+
isLoadingProfile.value = true;
|
|
300
|
+
try {
|
|
301
|
+
const response = await fetch(getUrl("settings"), {
|
|
302
|
+
method: "POST",
|
|
303
|
+
headers: {
|
|
304
|
+
"Content-Type": "application/json",
|
|
305
|
+
"Authorization": `Bearer ${currentSession.value.accessToken}`
|
|
306
|
+
},
|
|
307
|
+
body: JSON.stringify({
|
|
308
|
+
settings
|
|
309
|
+
})
|
|
310
|
+
});
|
|
311
|
+
if (!response.ok) {
|
|
312
|
+
if (response.status === 401) {
|
|
313
|
+
throw new Error("Authentication expired. Please sign in again.");
|
|
314
|
+
} else {
|
|
315
|
+
throw new Error(`Settings update failed: ${response.status} ${response.statusText}`);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
const updatedUserData = await response.json();
|
|
319
|
+
if (currentUser.value) {
|
|
320
|
+
currentUser.value = {
|
|
321
|
+
...currentUser.value,
|
|
322
|
+
settings: updatedUserData.settings,
|
|
323
|
+
updatedAt: updatedUserData.updated_at || (/* @__PURE__ */ new Date()).toISOString()
|
|
324
|
+
};
|
|
325
|
+
if (typeof window !== "undefined") {
|
|
326
|
+
localStorage.setItem("strands_auth_user", JSON.stringify(currentUser.value));
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
return currentUser.value;
|
|
330
|
+
} finally {
|
|
331
|
+
isLoadingProfile.value = false;
|
|
332
|
+
}
|
|
333
|
+
};
|
|
293
334
|
const changeEmail = async (newEmail, password) => {
|
|
294
335
|
if (!currentSession.value?.accessToken) {
|
|
295
336
|
throw new Error("No access token available");
|
|
@@ -423,23 +464,41 @@ function useStrandsAuth() {
|
|
|
423
464
|
}
|
|
424
465
|
return response.json();
|
|
425
466
|
};
|
|
426
|
-
const setAuthData = (authResponse) => {
|
|
467
|
+
const setAuthData = (authResponse, isTokenRefresh = false) => {
|
|
427
468
|
try {
|
|
428
|
-
|
|
469
|
+
if (authResponse.user) {
|
|
470
|
+
if (isTokenRefresh && currentUser.value) {
|
|
471
|
+
currentUser.value = {
|
|
472
|
+
...currentUser.value,
|
|
473
|
+
...authResponse.user,
|
|
474
|
+
// Preserve certain fields that might be missing in refresh response
|
|
475
|
+
avatar: authResponse.user.avatar || currentUser.value.avatar,
|
|
476
|
+
firstName: authResponse.user.firstName || currentUser.value.firstName,
|
|
477
|
+
lastName: authResponse.user.lastName || currentUser.value.lastName
|
|
478
|
+
};
|
|
479
|
+
} else {
|
|
480
|
+
currentUser.value = authResponse.user;
|
|
481
|
+
}
|
|
482
|
+
} else if (!isTokenRefresh) {
|
|
483
|
+
currentUser.value = null;
|
|
484
|
+
}
|
|
429
485
|
const session = {
|
|
430
486
|
accessToken: authResponse.access_token,
|
|
431
487
|
refreshToken: authResponse.refresh_token,
|
|
432
488
|
expiresAt: new Date(Date.now() + 5 * 60 * 1e3),
|
|
433
489
|
// 5 minutes from now (matching API token expiry)
|
|
434
|
-
userId: authResponse.user
|
|
490
|
+
userId: currentUser.value?.id || authResponse.user?.id
|
|
435
491
|
};
|
|
436
492
|
currentSession.value = session;
|
|
437
493
|
if (typeof window !== "undefined") {
|
|
438
494
|
localStorage.setItem("strands_auth_session", JSON.stringify(session));
|
|
439
|
-
|
|
495
|
+
if (currentUser.value) {
|
|
496
|
+
localStorage.setItem("strands_auth_user", JSON.stringify(currentUser.value));
|
|
497
|
+
}
|
|
440
498
|
}
|
|
441
499
|
startTokenRefreshTimer();
|
|
442
500
|
} catch (error) {
|
|
501
|
+
console.error("Error setting auth data:", error);
|
|
443
502
|
}
|
|
444
503
|
};
|
|
445
504
|
const startTokenRefreshTimer = () => {
|
|
@@ -531,6 +590,7 @@ function useStrandsAuth() {
|
|
|
531
590
|
refreshToken,
|
|
532
591
|
fetchProfile,
|
|
533
592
|
updateProfile,
|
|
593
|
+
updateUserSettings,
|
|
534
594
|
changeEmail,
|
|
535
595
|
initialize,
|
|
536
596
|
setAuthData,
|
|
@@ -553,4 +613,4 @@ function useStrandsAuth() {
|
|
|
553
613
|
export {
|
|
554
614
|
useStrandsAuth as u
|
|
555
615
|
};
|
|
556
|
-
//# sourceMappingURL=useStrandsAuth-
|
|
616
|
+
//# sourceMappingURL=useStrandsAuth-SdmBCyFS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStrandsAuth-SdmBCyFS.js","sources":["../../../apps/accounts-ui/src/vue/composables/useStrandsAuth.ts"],"sourcesContent":["import { ref, computed } from 'vue'\nimport type { User, Session, SignInCredentials, SignUpData, AuthResponse, MfaDevice, MfaErrorResponse } from '../../types'\nimport { useStrandsConfig } from './useStrandsConfig'\n\nconst { getUrl } = useStrandsConfig()\n\nconst currentUser = ref<User | null>(null)\nconst currentSession = ref<Session | null>(null)\n\n// Specific loading states\nconst isInitializing = ref(true)\nconst isSigningIn = ref(false)\nconst isSigningUp = ref(false)\nconst isSigningOut = ref(false)\nconst isRefreshingToken = ref(false)\nconst isSendingMfaEmail = ref(false)\nconst isVerifyingMfa = ref(false)\nconst isLoadingProfile = ref(false)\n\n// Legacy loading states for backward compatibility\nconst loading = computed(() => isSigningIn.value || isSigningUp.value || isSigningOut.value || isRefreshingToken.value || isSendingMfaEmail.value || isVerifyingMfa.value || isLoadingProfile.value)\nconst isLoading = computed(() => isInitializing.value || loading.value)\n\n// Loading messages for better UX\nconst loadingMessage = computed(() => {\n if (isInitializing.value) return 'Checking authentication...'\n if (isSigningIn.value) return 'Signing you in...'\n if (isSigningUp.value) return 'Creating your account...'\n if (isSigningOut.value) return 'Signing you out...'\n if (isRefreshingToken.value) return 'Refreshing session...'\n if (isSendingMfaEmail.value) return 'Sending verification code...'\n if (isVerifyingMfa.value) return 'Verifying code...'\n return 'Loading...' // Fallback\n})\n\nconst isInitialized = ref(false)\n\n// MFA state\nconst mfaRequired = ref(false)\nconst mfaSessionId = ref<string | null>(null)\nconst availableMfaMethods = ref<MfaDevice[]>([])\n\n// Token refresh timer\nlet refreshTimer: NodeJS.Timeout | null = null\n\nexport function useStrandsAuth() {\n /**\n * Complete hardware key (WebAuthn) registration for MFA\n * Returns result with backup codes on success\n */\n const completeHardwareKeyRegistration = async (deviceId: string, credential: any, accessToken: string) => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n\n const response = await fetch(getUrl('mfaHardwareCompleteRegistration'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`\n },\n body: JSON.stringify({\n device_id: deviceId,\n credential: credential\n })\n })\n if (!response.ok) {\n const errorText = await response.text()\n let errorMessage = 'Failed to complete hardware key registration'\n \n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.message || errorData.error || errorText\n } catch {\n errorMessage = errorText || 'Failed to complete hardware key registration'\n }\n \n throw new Error(errorMessage)\n }\n return response.json()\n }\n /**\n * Register a hardware key (WebAuthn) for MFA\n * Returns { device_id, challenge } on success\n */\n const registerHardwareKey = async (deviceName: string, accessToken: string, deviceType: 'hardware' | 'passkey' = 'hardware') => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n const response = await fetch(getUrl('mfaHardwareStartRegistration'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n },\n body: JSON.stringify({ \n device_name: deviceName,\n device_type: deviceType \n })\n })\n if (!response.ok) {\n const errorText = await response.text()\n let errorMessage = 'Failed to start hardware key registration'\n \n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.message || errorData.error || errorText\n } catch {\n errorMessage = errorText || 'Failed to start hardware key registration'\n }\n \n throw new Error(errorMessage)\n }\n return response.json()\n }\n\n const isAuthenticated = computed(() => currentUser.value !== null)\n\n const signIn = async (credentials: SignInCredentials) => {\n isSigningIn.value = true\n try {\n // Reset MFA state at start of new sign-in attempt\n mfaRequired.value = false\n mfaSessionId.value = null\n availableMfaMethods.value = []\n \n // Make API call to sign-in endpoint\n const response = await fetch(getUrl('signIn'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(credentials),\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Invalid email or password')\n } else if (response.status === 403) {\n throw new Error('Please verify your email address before signing in')\n } else {\n throw new Error(`Sign in failed: ${response.status} ${response.statusText}`)\n }\n }\n\n const authData: AuthResponse = await response.json()\n \n // Check if MFA is required\n if (authData.mfa_required) {\n mfaRequired.value = true\n mfaSessionId.value = authData.mfa_session_id || null\n \n // Convert API MFA methods to the expected format\n const methods = (authData.available_mfa_methods || []).map((method: any) => {\n // Create better fallback names for different device types\n let fallbackName = `${method.device_type.charAt(0).toUpperCase() + method.device_type.slice(1)} Authentication`\n \n if (method.device_type === 'hardware') {\n // Better names for hardware keys\n fallbackName = method.device_name || 'Security Key' // Could be YubiKey, FIDO2 Key, etc.\n } else if (method.device_type === 'totp') {\n fallbackName = method.device_name || 'Authenticator App'\n } else if (method.device_type === 'email') {\n fallbackName = method.device_name || 'Email Verification'\n }\n \n return {\n id: method.device_id,\n device_type: method.device_type,\n device_name: method.device_name || fallbackName,\n is_active: true,\n created_at: new Date().toISOString(),\n last_used_at: method.last_used_at,\n // Pass through additional metadata if available\n credential_id: method.credential_id,\n device_info: method.device_info\n }\n })\n availableMfaMethods.value = methods\n \n // Set signIn loading to false immediately so MFA modal can show\n isSigningIn.value = false\n \n return authData // Return without storing full auth data\n }\n \n // Store the authentication data if MFA not required\n setAuthData(authData)\n \n return authData\n } catch (error) {\n throw error\n } finally {\n isSigningIn.value = false\n }\n }\n\n const signUp = async (userData: SignUpData) => {\n isSigningUp.value = true\n try {\n // Integration point: Replace with actual auth SDK call\n // Example: const result = await authSDK.signUp(userData)\n \n throw new Error('Sign up not implemented - please integrate with auth SDK')\n } finally {\n isSigningUp.value = false\n }\n }\n\n const signOut = async () => {\n isSigningOut.value = true\n try {\n // Stop token refresh timer\n stopTokenRefreshTimer()\n \n // Clear user and session state\n currentUser.value = null\n currentSession.value = null\n \n // Clear MFA state\n mfaRequired.value = false\n mfaSessionId.value = null\n availableMfaMethods.value = []\n \n // Clear stored tokens\n if (typeof window !== 'undefined') {\n localStorage.removeItem('strands_auth_session')\n localStorage.removeItem('strands_auth_user')\n }\n } finally {\n isSigningOut.value = false\n }\n }\n\n const refreshToken = async () => {\n if (!currentSession.value?.refreshToken) {\n return false\n }\n \n \n isRefreshingToken.value = true\n try {\n const response = await fetch(getUrl('refresh'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n refresh_token: currentSession.value.refreshToken,\n }),\n })\n\n if (!response.ok) { \n if (response.status === 401) {\n // Refresh token is invalid/expired, sign out user\n await signOut()\n return false\n }\n throw new Error(`Token refresh failed: ${response.status} ${response.statusText}`)\n }\n\n const authData: AuthResponse = await response.json()\n \n // Update auth data with new tokens, preserving existing user data if needed\n setAuthData(authData, true)\n \n return true\n } catch (error) {\n // On refresh failure, sign out the user\n await signOut()\n return false\n }\n }\n\n const fetchProfile = async (): Promise<User | null> => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n isLoadingProfile.value = true\n try {\n const response = await fetch(getUrl('profile'), {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n },\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Authentication expired. Please sign in again.')\n } else {\n throw new Error(`Failed to fetch profile: ${response.status} ${response.statusText}`)\n }\n }\n\n const userData = await response.json()\n \n // Update the current user state\n currentUser.value = {\n id: userData.id,\n email: userData.email,\n firstName: userData.first_name,\n lastName: userData.last_name,\n avatar: userData.avatar_url,\n mfaEnabled: userData.mfaEnabled || false,\n emailVerified: userData.email_verified,\n passwordUpdatedAt: userData.password_updated_at,\n settings: userData.settings || {},\n xp: userData.xp || 0,\n createdAt: userData.created_at,\n updatedAt: userData.updated_at || new Date().toISOString(),\n }\n \n // Update localStorage\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_user', JSON.stringify(currentUser.value))\n }\n \n return currentUser.value\n } finally {\n isLoadingProfile.value = false\n }\n }\n\n const updateProfile = async (profileData: Partial<User>) => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n isLoadingProfile.value = true\n try {\n const response = await fetch(getUrl('profile'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n },\n body: JSON.stringify({\n first_name: profileData.firstName,\n last_name: profileData.lastName,\n }),\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Authentication expired. Please sign in again.')\n } else {\n throw new Error(`Profile update failed: ${response.status} ${response.statusText}`)\n }\n }\n\n const updatedUserData = await response.json()\n \n // Update the current user state\n if (currentUser.value) {\n currentUser.value = {\n ...currentUser.value,\n id: updatedUserData.id,\n firstName: updatedUserData.first_name,\n lastName: updatedUserData.last_name,\n // Keep existing properties not returned by API\n avatar: updatedUserData.avatar_url || currentUser.value.avatar,\n mfaEnabled: currentUser.value.mfaEnabled,\n email: currentUser.value.email, // Keep existing email since we don't update it here\n emailVerified: currentUser.value.emailVerified,\n createdAt: updatedUserData.created_at || currentUser.value.createdAt,\n updatedAt: updatedUserData.updated_at || new Date().toISOString(),\n }\n \n // Update localStorage\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_user', JSON.stringify(currentUser.value))\n }\n }\n \n return currentUser.value\n } finally {\n isLoadingProfile.value = false\n }\n }\n\n const updateUserSettings = async (settings: any) => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n isLoadingProfile.value = true\n try {\n const response = await fetch(getUrl('settings'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n },\n body: JSON.stringify({\n settings: settings,\n }),\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Authentication expired. Please sign in again.')\n } else {\n throw new Error(`Settings update failed: ${response.status} ${response.statusText}`)\n }\n }\n\n const updatedUserData = await response.json()\n \n // Update the current user state\n if (currentUser.value) {\n currentUser.value = {\n ...currentUser.value,\n settings: updatedUserData.settings,\n updatedAt: updatedUserData.updated_at || new Date().toISOString(),\n }\n \n // Update localStorage\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_user', JSON.stringify(currentUser.value))\n }\n }\n \n return currentUser.value\n } finally {\n isLoadingProfile.value = false\n }\n }\n\n const changeEmail = async (newEmail: string, password: string) => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n isLoadingProfile.value = true\n try {\n const response = await fetch(getUrl('changeEmail'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n },\n body: JSON.stringify({\n new_email: newEmail,\n password: password,\n }),\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Authentication expired. Please sign in again.')\n } else {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.message || `Email change failed: ${response.status} ${response.statusText}`)\n }\n }\n\n const result = await response.json()\n \n // Update the current user state with new email\n if (currentUser.value) {\n currentUser.value = {\n ...currentUser.value,\n email: newEmail,\n emailVerified: false, // Email needs to be verified again\n updatedAt: new Date().toISOString(),\n }\n \n // Update localStorage\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_user', JSON.stringify(currentUser.value))\n }\n }\n \n return result\n } finally {\n isLoadingProfile.value = false\n }\n }\n\n const verifyMfa = async (deviceId: string, code: string, isBackupCode = false) => {\n if (!mfaSessionId.value) {\n throw new Error('No MFA session available')\n }\n\n isVerifyingMfa.value = true\n try {\n const endpoint = isBackupCode ? getUrl('mfaBackupCodeVerify') : getUrl('mfaSigninVerify')\n const body = isBackupCode \n ? { mfa_session_id: mfaSessionId.value, backup_code: code }\n : { mfa_session_id: mfaSessionId.value, device_id: deviceId, code }\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n let errorMessage = 'MFA verification failed'\n \n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.message || errorData.error || errorText\n } catch {\n // If parsing fails, use the raw text but clean it up\n errorMessage = errorText || 'MFA verification failed'\n }\n \n throw new Error(errorMessage)\n }\n\n const authData: AuthResponse = await response.json()\n \n // Clear MFA state\n mfaRequired.value = false\n mfaSessionId.value = null\n availableMfaMethods.value = []\n \n // Store the authentication data\n setAuthData(authData)\n \n return authData\n } finally {\n isVerifyingMfa.value = false\n }\n }\n\n const sendMfaEmailCode = async (deviceId: string) => {\n if (!mfaSessionId.value) {\n throw new Error('No MFA session available')\n }\n\n isSendingMfaEmail.value = true\n try {\n const response = await fetch(getUrl('mfaSigninSendEmail'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n mfa_session_id: mfaSessionId.value,\n device_id: deviceId,\n }),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n let errorMessage = 'Failed to send MFA email code'\n \n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.message || errorData.error || errorText\n } catch {\n // If parsing fails, use the raw text but clean it up\n errorMessage = errorText || 'Failed to send MFA email code'\n }\n \n throw new Error(errorMessage)\n }\n\n const result = await response.json()\n return result\n } finally {\n isSendingMfaEmail.value = false\n }\n }\n\n const getMfaWebAuthnChallenge = async (deviceId: string) => {\n if (!mfaSessionId.value) {\n throw new Error('No MFA session available')\n }\n \n const response = await fetch(getUrl('mfaWebAuthnChallenge'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n mfa_session_id: mfaSessionId.value,\n device_id: deviceId\n }),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n let errorMessage = 'Failed to get WebAuthn challenge'\n \n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.message || errorData.error || errorText\n } catch {\n errorMessage = errorText || errorMessage\n }\n \n throw new Error(errorMessage)\n }\n\n return response.json()\n }\n\n const setAuthData = (authResponse: AuthResponse, isTokenRefresh = false) => {\n try {\n // Handle user data\n if (authResponse.user) {\n // During token refresh, merge with existing user data to preserve fields that might not be returned\n if (isTokenRefresh && currentUser.value) {\n currentUser.value = {\n ...currentUser.value,\n ...authResponse.user,\n // Preserve certain fields that might be missing in refresh response\n avatar: authResponse.user.avatar || currentUser.value.avatar,\n firstName: authResponse.user.firstName || currentUser.value.firstName,\n lastName: authResponse.user.lastName || currentUser.value.lastName,\n }\n } else {\n currentUser.value = authResponse.user\n }\n } else if (!isTokenRefresh) {\n // Only clear user if it's not a token refresh and no user data provided\n currentUser.value = null\n }\n // If it's a token refresh and no user data, keep existing user data\n \n // Create session object\n const session: Session = {\n accessToken: authResponse.access_token,\n refreshToken: authResponse.refresh_token,\n expiresAt: new Date(Date.now() + 5 * 60 * 1000), // 5 minutes from now (matching API token expiry)\n userId: currentUser.value?.id || authResponse.user?.id,\n }\n \n currentSession.value = session\n \n // Store in localStorage for persistence\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_session', JSON.stringify(session))\n if (currentUser.value) {\n localStorage.setItem('strands_auth_user', JSON.stringify(currentUser.value))\n }\n }\n \n // Start automatic token refresh\n startTokenRefreshTimer()\n } catch (error) {\n console.error('Error setting auth data:', error)\n // Silently handle auth data storage errors\n }\n }\n\n // Token refresh timer management\n const startTokenRefreshTimer = () => {\n // Clear existing timer\n if (refreshTimer) {\n clearTimeout(refreshTimer)\n }\n \n if (!currentSession.value) return\n \n // Calculate time until token expires (refresh 1 minute before expiry)\n const now = new Date()\n const expiresAt = currentSession.value.expiresAt\n const timeUntilRefresh = expiresAt.getTime() - now.getTime() - (1 * 60 * 1000) // 1 minute before expiry\n \n // If token is already expired or expires very soon, refresh immediately\n if (timeUntilRefresh <= 0) {\n refreshToken()\n return\n }\n \n // Set timer to refresh token\n refreshTimer = setTimeout(async () => {\n const success = await refreshToken()\n \n if (success) {\n // Schedule next refresh\n startTokenRefreshTimer()\n }\n }, timeUntilRefresh)\n }\n\n const stopTokenRefreshTimer = () => {\n if (refreshTimer) {\n clearTimeout(refreshTimer)\n refreshTimer = null\n }\n }\n\n const initialize = async () => {\n if (isInitialized.value) return\n \n isInitializing.value = true\n try {\n // Check for existing session/token in localStorage\n if (typeof window !== 'undefined') {\n const storedSession = localStorage.getItem('strands_auth_session')\n const storedUser = localStorage.getItem('strands_auth_user')\n \n if (storedSession && storedUser) {\n try {\n const session = JSON.parse(storedSession) as Session\n const user = JSON.parse(storedUser) as User\n \n // Convert expiresAt back to Date object\n session.expiresAt = new Date(session.expiresAt)\n \n // Check if session is still valid\n if (session.expiresAt > new Date()) {\n currentSession.value = session\n currentUser.value = user\n \n // Start token refresh timer for restored session\n startTokenRefreshTimer()\n } else {\n // Session expired, clear storage\n localStorage.removeItem('strands_auth_session')\n localStorage.removeItem('strands_auth_user')\n }\n } catch (error) {\n // Clear corrupted data\n localStorage.removeItem('strands_auth_session')\n localStorage.removeItem('strands_auth_user')\n }\n }\n }\n \n isInitialized.value = true\n \n // Add a small delay to ensure state is fully settled before hiding loading\n await new Promise(resolve => setTimeout(resolve, 50))\n } catch (error) {\n // Silently handle initialization errors\n } finally {\n isInitializing.value = false\n }\n }\n\n // Auto-initialize on first use\n if (!isInitialized.value) {\n initialize()\n }\n\n return {\n // State\n user: computed(() => currentUser.value),\n currentUser: computed(() => currentUser.value),\n currentSession: computed(() => currentSession.value),\n isAuthenticated,\n isLoading: computed(() => isLoading.value || !isInitialized.value),\n loading: computed(() => loading.value),\n loadingMessage,\n \n // Specific loading states\n isInitializing,\n isSigningIn,\n isSigningUp,\n isSigningOut,\n isRefreshingToken,\n isSendingMfaEmail,\n isVerifyingMfa,\n \n // MFA State\n mfaRequired: computed(() => mfaRequired.value),\n mfaSessionId: computed(() => mfaSessionId.value),\n availableMfaMethods: computed(() => availableMfaMethods.value),\n\n // Methods\n signIn,\n signUp,\n signOut,\n refreshToken,\n fetchProfile,\n updateProfile,\n updateUserSettings,\n changeEmail,\n initialize,\n setAuthData,\n verifyMfa,\n sendMfaEmailCode,\n getMfaWebAuthnChallenge,\n registerHardwareKey,\n completeHardwareKeyRegistration,\n \n // Token management\n startTokenRefreshTimer,\n stopTokenRefreshTimer,\n \n // Force re-initialization (useful for testing or navigation)\n forceReInit: () => {\n isInitialized.value = false\n isInitializing.value = true\n initialize()\n },\n }\n}"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
const vue = require("vue");
|
|
3
|
-
const useStrandsConfig = require("./useStrandsConfig-
|
|
3
|
+
const useStrandsConfig = require("./useStrandsConfig-DW4ez8t4.cjs");
|
|
4
4
|
const { getUrl } = useStrandsConfig.useStrandsConfig();
|
|
5
5
|
const currentUser = vue.ref(null);
|
|
6
6
|
const currentSession = vue.ref(null);
|
|
@@ -194,7 +194,7 @@ function useStrandsAuth() {
|
|
|
194
194
|
throw new Error(`Token refresh failed: ${response.status} ${response.statusText}`);
|
|
195
195
|
}
|
|
196
196
|
const authData = await response.json();
|
|
197
|
-
setAuthData(authData);
|
|
197
|
+
setAuthData(authData, true);
|
|
198
198
|
return true;
|
|
199
199
|
} catch (error) {
|
|
200
200
|
await signOut();
|
|
@@ -231,6 +231,8 @@ function useStrandsAuth() {
|
|
|
231
231
|
mfaEnabled: userData.mfaEnabled || false,
|
|
232
232
|
emailVerified: userData.email_verified,
|
|
233
233
|
passwordUpdatedAt: userData.password_updated_at,
|
|
234
|
+
settings: userData.settings || {},
|
|
235
|
+
xp: userData.xp || 0,
|
|
234
236
|
createdAt: userData.created_at,
|
|
235
237
|
updatedAt: userData.updated_at || (/* @__PURE__ */ new Date()).toISOString()
|
|
236
238
|
};
|
|
@@ -291,6 +293,45 @@ function useStrandsAuth() {
|
|
|
291
293
|
isLoadingProfile.value = false;
|
|
292
294
|
}
|
|
293
295
|
};
|
|
296
|
+
const updateUserSettings = async (settings) => {
|
|
297
|
+
if (!currentSession.value?.accessToken) {
|
|
298
|
+
throw new Error("No access token available");
|
|
299
|
+
}
|
|
300
|
+
isLoadingProfile.value = true;
|
|
301
|
+
try {
|
|
302
|
+
const response = await fetch(getUrl("settings"), {
|
|
303
|
+
method: "POST",
|
|
304
|
+
headers: {
|
|
305
|
+
"Content-Type": "application/json",
|
|
306
|
+
"Authorization": `Bearer ${currentSession.value.accessToken}`
|
|
307
|
+
},
|
|
308
|
+
body: JSON.stringify({
|
|
309
|
+
settings
|
|
310
|
+
})
|
|
311
|
+
});
|
|
312
|
+
if (!response.ok) {
|
|
313
|
+
if (response.status === 401) {
|
|
314
|
+
throw new Error("Authentication expired. Please sign in again.");
|
|
315
|
+
} else {
|
|
316
|
+
throw new Error(`Settings update failed: ${response.status} ${response.statusText}`);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
const updatedUserData = await response.json();
|
|
320
|
+
if (currentUser.value) {
|
|
321
|
+
currentUser.value = {
|
|
322
|
+
...currentUser.value,
|
|
323
|
+
settings: updatedUserData.settings,
|
|
324
|
+
updatedAt: updatedUserData.updated_at || (/* @__PURE__ */ new Date()).toISOString()
|
|
325
|
+
};
|
|
326
|
+
if (typeof window !== "undefined") {
|
|
327
|
+
localStorage.setItem("strands_auth_user", JSON.stringify(currentUser.value));
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
return currentUser.value;
|
|
331
|
+
} finally {
|
|
332
|
+
isLoadingProfile.value = false;
|
|
333
|
+
}
|
|
334
|
+
};
|
|
294
335
|
const changeEmail = async (newEmail, password) => {
|
|
295
336
|
if (!currentSession.value?.accessToken) {
|
|
296
337
|
throw new Error("No access token available");
|
|
@@ -424,23 +465,41 @@ function useStrandsAuth() {
|
|
|
424
465
|
}
|
|
425
466
|
return response.json();
|
|
426
467
|
};
|
|
427
|
-
const setAuthData = (authResponse) => {
|
|
468
|
+
const setAuthData = (authResponse, isTokenRefresh = false) => {
|
|
428
469
|
try {
|
|
429
|
-
|
|
470
|
+
if (authResponse.user) {
|
|
471
|
+
if (isTokenRefresh && currentUser.value) {
|
|
472
|
+
currentUser.value = {
|
|
473
|
+
...currentUser.value,
|
|
474
|
+
...authResponse.user,
|
|
475
|
+
// Preserve certain fields that might be missing in refresh response
|
|
476
|
+
avatar: authResponse.user.avatar || currentUser.value.avatar,
|
|
477
|
+
firstName: authResponse.user.firstName || currentUser.value.firstName,
|
|
478
|
+
lastName: authResponse.user.lastName || currentUser.value.lastName
|
|
479
|
+
};
|
|
480
|
+
} else {
|
|
481
|
+
currentUser.value = authResponse.user;
|
|
482
|
+
}
|
|
483
|
+
} else if (!isTokenRefresh) {
|
|
484
|
+
currentUser.value = null;
|
|
485
|
+
}
|
|
430
486
|
const session = {
|
|
431
487
|
accessToken: authResponse.access_token,
|
|
432
488
|
refreshToken: authResponse.refresh_token,
|
|
433
489
|
expiresAt: new Date(Date.now() + 5 * 60 * 1e3),
|
|
434
490
|
// 5 minutes from now (matching API token expiry)
|
|
435
|
-
userId: authResponse.user
|
|
491
|
+
userId: currentUser.value?.id || authResponse.user?.id
|
|
436
492
|
};
|
|
437
493
|
currentSession.value = session;
|
|
438
494
|
if (typeof window !== "undefined") {
|
|
439
495
|
localStorage.setItem("strands_auth_session", JSON.stringify(session));
|
|
440
|
-
|
|
496
|
+
if (currentUser.value) {
|
|
497
|
+
localStorage.setItem("strands_auth_user", JSON.stringify(currentUser.value));
|
|
498
|
+
}
|
|
441
499
|
}
|
|
442
500
|
startTokenRefreshTimer();
|
|
443
501
|
} catch (error) {
|
|
502
|
+
console.error("Error setting auth data:", error);
|
|
444
503
|
}
|
|
445
504
|
};
|
|
446
505
|
const startTokenRefreshTimer = () => {
|
|
@@ -532,6 +591,7 @@ function useStrandsAuth() {
|
|
|
532
591
|
refreshToken,
|
|
533
592
|
fetchProfile,
|
|
534
593
|
updateProfile,
|
|
594
|
+
updateUserSettings,
|
|
535
595
|
changeEmail,
|
|
536
596
|
initialize,
|
|
537
597
|
setAuthData,
|
|
@@ -552,4 +612,4 @@ function useStrandsAuth() {
|
|
|
552
612
|
};
|
|
553
613
|
}
|
|
554
614
|
exports.useStrandsAuth = useStrandsAuth;
|
|
555
|
-
//# sourceMappingURL=useStrandsAuth-
|
|
615
|
+
//# sourceMappingURL=useStrandsAuth-zR8fRWme.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStrandsAuth-zR8fRWme.cjs","sources":["../../../apps/accounts-ui/src/vue/composables/useStrandsAuth.ts"],"sourcesContent":["import { ref, computed } from 'vue'\nimport type { User, Session, SignInCredentials, SignUpData, AuthResponse, MfaDevice, MfaErrorResponse } from '../../types'\nimport { useStrandsConfig } from './useStrandsConfig'\n\nconst { getUrl } = useStrandsConfig()\n\nconst currentUser = ref<User | null>(null)\nconst currentSession = ref<Session | null>(null)\n\n// Specific loading states\nconst isInitializing = ref(true)\nconst isSigningIn = ref(false)\nconst isSigningUp = ref(false)\nconst isSigningOut = ref(false)\nconst isRefreshingToken = ref(false)\nconst isSendingMfaEmail = ref(false)\nconst isVerifyingMfa = ref(false)\nconst isLoadingProfile = ref(false)\n\n// Legacy loading states for backward compatibility\nconst loading = computed(() => isSigningIn.value || isSigningUp.value || isSigningOut.value || isRefreshingToken.value || isSendingMfaEmail.value || isVerifyingMfa.value || isLoadingProfile.value)\nconst isLoading = computed(() => isInitializing.value || loading.value)\n\n// Loading messages for better UX\nconst loadingMessage = computed(() => {\n if (isInitializing.value) return 'Checking authentication...'\n if (isSigningIn.value) return 'Signing you in...'\n if (isSigningUp.value) return 'Creating your account...'\n if (isSigningOut.value) return 'Signing you out...'\n if (isRefreshingToken.value) return 'Refreshing session...'\n if (isSendingMfaEmail.value) return 'Sending verification code...'\n if (isVerifyingMfa.value) return 'Verifying code...'\n return 'Loading...' // Fallback\n})\n\nconst isInitialized = ref(false)\n\n// MFA state\nconst mfaRequired = ref(false)\nconst mfaSessionId = ref<string | null>(null)\nconst availableMfaMethods = ref<MfaDevice[]>([])\n\n// Token refresh timer\nlet refreshTimer: NodeJS.Timeout | null = null\n\nexport function useStrandsAuth() {\n /**\n * Complete hardware key (WebAuthn) registration for MFA\n * Returns result with backup codes on success\n */\n const completeHardwareKeyRegistration = async (deviceId: string, credential: any, accessToken: string) => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n\n const response = await fetch(getUrl('mfaHardwareCompleteRegistration'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`\n },\n body: JSON.stringify({\n device_id: deviceId,\n credential: credential\n })\n })\n if (!response.ok) {\n const errorText = await response.text()\n let errorMessage = 'Failed to complete hardware key registration'\n \n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.message || errorData.error || errorText\n } catch {\n errorMessage = errorText || 'Failed to complete hardware key registration'\n }\n \n throw new Error(errorMessage)\n }\n return response.json()\n }\n /**\n * Register a hardware key (WebAuthn) for MFA\n * Returns { device_id, challenge } on success\n */\n const registerHardwareKey = async (deviceName: string, accessToken: string, deviceType: 'hardware' | 'passkey' = 'hardware') => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n const response = await fetch(getUrl('mfaHardwareStartRegistration'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n },\n body: JSON.stringify({ \n device_name: deviceName,\n device_type: deviceType \n })\n })\n if (!response.ok) {\n const errorText = await response.text()\n let errorMessage = 'Failed to start hardware key registration'\n \n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.message || errorData.error || errorText\n } catch {\n errorMessage = errorText || 'Failed to start hardware key registration'\n }\n \n throw new Error(errorMessage)\n }\n return response.json()\n }\n\n const isAuthenticated = computed(() => currentUser.value !== null)\n\n const signIn = async (credentials: SignInCredentials) => {\n isSigningIn.value = true\n try {\n // Reset MFA state at start of new sign-in attempt\n mfaRequired.value = false\n mfaSessionId.value = null\n availableMfaMethods.value = []\n \n // Make API call to sign-in endpoint\n const response = await fetch(getUrl('signIn'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(credentials),\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Invalid email or password')\n } else if (response.status === 403) {\n throw new Error('Please verify your email address before signing in')\n } else {\n throw new Error(`Sign in failed: ${response.status} ${response.statusText}`)\n }\n }\n\n const authData: AuthResponse = await response.json()\n \n // Check if MFA is required\n if (authData.mfa_required) {\n mfaRequired.value = true\n mfaSessionId.value = authData.mfa_session_id || null\n \n // Convert API MFA methods to the expected format\n const methods = (authData.available_mfa_methods || []).map((method: any) => {\n // Create better fallback names for different device types\n let fallbackName = `${method.device_type.charAt(0).toUpperCase() + method.device_type.slice(1)} Authentication`\n \n if (method.device_type === 'hardware') {\n // Better names for hardware keys\n fallbackName = method.device_name || 'Security Key' // Could be YubiKey, FIDO2 Key, etc.\n } else if (method.device_type === 'totp') {\n fallbackName = method.device_name || 'Authenticator App'\n } else if (method.device_type === 'email') {\n fallbackName = method.device_name || 'Email Verification'\n }\n \n return {\n id: method.device_id,\n device_type: method.device_type,\n device_name: method.device_name || fallbackName,\n is_active: true,\n created_at: new Date().toISOString(),\n last_used_at: method.last_used_at,\n // Pass through additional metadata if available\n credential_id: method.credential_id,\n device_info: method.device_info\n }\n })\n availableMfaMethods.value = methods\n \n // Set signIn loading to false immediately so MFA modal can show\n isSigningIn.value = false\n \n return authData // Return without storing full auth data\n }\n \n // Store the authentication data if MFA not required\n setAuthData(authData)\n \n return authData\n } catch (error) {\n throw error\n } finally {\n isSigningIn.value = false\n }\n }\n\n const signUp = async (userData: SignUpData) => {\n isSigningUp.value = true\n try {\n // Integration point: Replace with actual auth SDK call\n // Example: const result = await authSDK.signUp(userData)\n \n throw new Error('Sign up not implemented - please integrate with auth SDK')\n } finally {\n isSigningUp.value = false\n }\n }\n\n const signOut = async () => {\n isSigningOut.value = true\n try {\n // Stop token refresh timer\n stopTokenRefreshTimer()\n \n // Clear user and session state\n currentUser.value = null\n currentSession.value = null\n \n // Clear MFA state\n mfaRequired.value = false\n mfaSessionId.value = null\n availableMfaMethods.value = []\n \n // Clear stored tokens\n if (typeof window !== 'undefined') {\n localStorage.removeItem('strands_auth_session')\n localStorage.removeItem('strands_auth_user')\n }\n } finally {\n isSigningOut.value = false\n }\n }\n\n const refreshToken = async () => {\n if (!currentSession.value?.refreshToken) {\n return false\n }\n \n \n isRefreshingToken.value = true\n try {\n const response = await fetch(getUrl('refresh'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n refresh_token: currentSession.value.refreshToken,\n }),\n })\n\n if (!response.ok) { \n if (response.status === 401) {\n // Refresh token is invalid/expired, sign out user\n await signOut()\n return false\n }\n throw new Error(`Token refresh failed: ${response.status} ${response.statusText}`)\n }\n\n const authData: AuthResponse = await response.json()\n \n // Update auth data with new tokens, preserving existing user data if needed\n setAuthData(authData, true)\n \n return true\n } catch (error) {\n // On refresh failure, sign out the user\n await signOut()\n return false\n }\n }\n\n const fetchProfile = async (): Promise<User | null> => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n isLoadingProfile.value = true\n try {\n const response = await fetch(getUrl('profile'), {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n },\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Authentication expired. Please sign in again.')\n } else {\n throw new Error(`Failed to fetch profile: ${response.status} ${response.statusText}`)\n }\n }\n\n const userData = await response.json()\n \n // Update the current user state\n currentUser.value = {\n id: userData.id,\n email: userData.email,\n firstName: userData.first_name,\n lastName: userData.last_name,\n avatar: userData.avatar_url,\n mfaEnabled: userData.mfaEnabled || false,\n emailVerified: userData.email_verified,\n passwordUpdatedAt: userData.password_updated_at,\n settings: userData.settings || {},\n xp: userData.xp || 0,\n createdAt: userData.created_at,\n updatedAt: userData.updated_at || new Date().toISOString(),\n }\n \n // Update localStorage\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_user', JSON.stringify(currentUser.value))\n }\n \n return currentUser.value\n } finally {\n isLoadingProfile.value = false\n }\n }\n\n const updateProfile = async (profileData: Partial<User>) => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n isLoadingProfile.value = true\n try {\n const response = await fetch(getUrl('profile'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n },\n body: JSON.stringify({\n first_name: profileData.firstName,\n last_name: profileData.lastName,\n }),\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Authentication expired. Please sign in again.')\n } else {\n throw new Error(`Profile update failed: ${response.status} ${response.statusText}`)\n }\n }\n\n const updatedUserData = await response.json()\n \n // Update the current user state\n if (currentUser.value) {\n currentUser.value = {\n ...currentUser.value,\n id: updatedUserData.id,\n firstName: updatedUserData.first_name,\n lastName: updatedUserData.last_name,\n // Keep existing properties not returned by API\n avatar: updatedUserData.avatar_url || currentUser.value.avatar,\n mfaEnabled: currentUser.value.mfaEnabled,\n email: currentUser.value.email, // Keep existing email since we don't update it here\n emailVerified: currentUser.value.emailVerified,\n createdAt: updatedUserData.created_at || currentUser.value.createdAt,\n updatedAt: updatedUserData.updated_at || new Date().toISOString(),\n }\n \n // Update localStorage\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_user', JSON.stringify(currentUser.value))\n }\n }\n \n return currentUser.value\n } finally {\n isLoadingProfile.value = false\n }\n }\n\n const updateUserSettings = async (settings: any) => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n isLoadingProfile.value = true\n try {\n const response = await fetch(getUrl('settings'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n },\n body: JSON.stringify({\n settings: settings,\n }),\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Authentication expired. Please sign in again.')\n } else {\n throw new Error(`Settings update failed: ${response.status} ${response.statusText}`)\n }\n }\n\n const updatedUserData = await response.json()\n \n // Update the current user state\n if (currentUser.value) {\n currentUser.value = {\n ...currentUser.value,\n settings: updatedUserData.settings,\n updatedAt: updatedUserData.updated_at || new Date().toISOString(),\n }\n \n // Update localStorage\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_user', JSON.stringify(currentUser.value))\n }\n }\n \n return currentUser.value\n } finally {\n isLoadingProfile.value = false\n }\n }\n\n const changeEmail = async (newEmail: string, password: string) => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n isLoadingProfile.value = true\n try {\n const response = await fetch(getUrl('changeEmail'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n },\n body: JSON.stringify({\n new_email: newEmail,\n password: password,\n }),\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Authentication expired. Please sign in again.')\n } else {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.message || `Email change failed: ${response.status} ${response.statusText}`)\n }\n }\n\n const result = await response.json()\n \n // Update the current user state with new email\n if (currentUser.value) {\n currentUser.value = {\n ...currentUser.value,\n email: newEmail,\n emailVerified: false, // Email needs to be verified again\n updatedAt: new Date().toISOString(),\n }\n \n // Update localStorage\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_user', JSON.stringify(currentUser.value))\n }\n }\n \n return result\n } finally {\n isLoadingProfile.value = false\n }\n }\n\n const verifyMfa = async (deviceId: string, code: string, isBackupCode = false) => {\n if (!mfaSessionId.value) {\n throw new Error('No MFA session available')\n }\n\n isVerifyingMfa.value = true\n try {\n const endpoint = isBackupCode ? getUrl('mfaBackupCodeVerify') : getUrl('mfaSigninVerify')\n const body = isBackupCode \n ? { mfa_session_id: mfaSessionId.value, backup_code: code }\n : { mfa_session_id: mfaSessionId.value, device_id: deviceId, code }\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n let errorMessage = 'MFA verification failed'\n \n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.message || errorData.error || errorText\n } catch {\n // If parsing fails, use the raw text but clean it up\n errorMessage = errorText || 'MFA verification failed'\n }\n \n throw new Error(errorMessage)\n }\n\n const authData: AuthResponse = await response.json()\n \n // Clear MFA state\n mfaRequired.value = false\n mfaSessionId.value = null\n availableMfaMethods.value = []\n \n // Store the authentication data\n setAuthData(authData)\n \n return authData\n } finally {\n isVerifyingMfa.value = false\n }\n }\n\n const sendMfaEmailCode = async (deviceId: string) => {\n if (!mfaSessionId.value) {\n throw new Error('No MFA session available')\n }\n\n isSendingMfaEmail.value = true\n try {\n const response = await fetch(getUrl('mfaSigninSendEmail'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n mfa_session_id: mfaSessionId.value,\n device_id: deviceId,\n }),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n let errorMessage = 'Failed to send MFA email code'\n \n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.message || errorData.error || errorText\n } catch {\n // If parsing fails, use the raw text but clean it up\n errorMessage = errorText || 'Failed to send MFA email code'\n }\n \n throw new Error(errorMessage)\n }\n\n const result = await response.json()\n return result\n } finally {\n isSendingMfaEmail.value = false\n }\n }\n\n const getMfaWebAuthnChallenge = async (deviceId: string) => {\n if (!mfaSessionId.value) {\n throw new Error('No MFA session available')\n }\n \n const response = await fetch(getUrl('mfaWebAuthnChallenge'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n mfa_session_id: mfaSessionId.value,\n device_id: deviceId\n }),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n let errorMessage = 'Failed to get WebAuthn challenge'\n \n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.message || errorData.error || errorText\n } catch {\n errorMessage = errorText || errorMessage\n }\n \n throw new Error(errorMessage)\n }\n\n return response.json()\n }\n\n const setAuthData = (authResponse: AuthResponse, isTokenRefresh = false) => {\n try {\n // Handle user data\n if (authResponse.user) {\n // During token refresh, merge with existing user data to preserve fields that might not be returned\n if (isTokenRefresh && currentUser.value) {\n currentUser.value = {\n ...currentUser.value,\n ...authResponse.user,\n // Preserve certain fields that might be missing in refresh response\n avatar: authResponse.user.avatar || currentUser.value.avatar,\n firstName: authResponse.user.firstName || currentUser.value.firstName,\n lastName: authResponse.user.lastName || currentUser.value.lastName,\n }\n } else {\n currentUser.value = authResponse.user\n }\n } else if (!isTokenRefresh) {\n // Only clear user if it's not a token refresh and no user data provided\n currentUser.value = null\n }\n // If it's a token refresh and no user data, keep existing user data\n \n // Create session object\n const session: Session = {\n accessToken: authResponse.access_token,\n refreshToken: authResponse.refresh_token,\n expiresAt: new Date(Date.now() + 5 * 60 * 1000), // 5 minutes from now (matching API token expiry)\n userId: currentUser.value?.id || authResponse.user?.id,\n }\n \n currentSession.value = session\n \n // Store in localStorage for persistence\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_session', JSON.stringify(session))\n if (currentUser.value) {\n localStorage.setItem('strands_auth_user', JSON.stringify(currentUser.value))\n }\n }\n \n // Start automatic token refresh\n startTokenRefreshTimer()\n } catch (error) {\n console.error('Error setting auth data:', error)\n // Silently handle auth data storage errors\n }\n }\n\n // Token refresh timer management\n const startTokenRefreshTimer = () => {\n // Clear existing timer\n if (refreshTimer) {\n clearTimeout(refreshTimer)\n }\n \n if (!currentSession.value) return\n \n // Calculate time until token expires (refresh 1 minute before expiry)\n const now = new Date()\n const expiresAt = currentSession.value.expiresAt\n const timeUntilRefresh = expiresAt.getTime() - now.getTime() - (1 * 60 * 1000) // 1 minute before expiry\n \n // If token is already expired or expires very soon, refresh immediately\n if (timeUntilRefresh <= 0) {\n refreshToken()\n return\n }\n \n // Set timer to refresh token\n refreshTimer = setTimeout(async () => {\n const success = await refreshToken()\n \n if (success) {\n // Schedule next refresh\n startTokenRefreshTimer()\n }\n }, timeUntilRefresh)\n }\n\n const stopTokenRefreshTimer = () => {\n if (refreshTimer) {\n clearTimeout(refreshTimer)\n refreshTimer = null\n }\n }\n\n const initialize = async () => {\n if (isInitialized.value) return\n \n isInitializing.value = true\n try {\n // Check for existing session/token in localStorage\n if (typeof window !== 'undefined') {\n const storedSession = localStorage.getItem('strands_auth_session')\n const storedUser = localStorage.getItem('strands_auth_user')\n \n if (storedSession && storedUser) {\n try {\n const session = JSON.parse(storedSession) as Session\n const user = JSON.parse(storedUser) as User\n \n // Convert expiresAt back to Date object\n session.expiresAt = new Date(session.expiresAt)\n \n // Check if session is still valid\n if (session.expiresAt > new Date()) {\n currentSession.value = session\n currentUser.value = user\n \n // Start token refresh timer for restored session\n startTokenRefreshTimer()\n } else {\n // Session expired, clear storage\n localStorage.removeItem('strands_auth_session')\n localStorage.removeItem('strands_auth_user')\n }\n } catch (error) {\n // Clear corrupted data\n localStorage.removeItem('strands_auth_session')\n localStorage.removeItem('strands_auth_user')\n }\n }\n }\n \n isInitialized.value = true\n \n // Add a small delay to ensure state is fully settled before hiding loading\n await new Promise(resolve => setTimeout(resolve, 50))\n } catch (error) {\n // Silently handle initialization errors\n } finally {\n isInitializing.value = false\n }\n }\n\n // Auto-initialize on first use\n if (!isInitialized.value) {\n initialize()\n }\n\n return {\n // State\n user: computed(() => currentUser.value),\n currentUser: computed(() => currentUser.value),\n currentSession: computed(() => currentSession.value),\n isAuthenticated,\n isLoading: computed(() => isLoading.value || !isInitialized.value),\n loading: computed(() => loading.value),\n loadingMessage,\n \n // Specific loading states\n isInitializing,\n isSigningIn,\n isSigningUp,\n isSigningOut,\n isRefreshingToken,\n isSendingMfaEmail,\n isVerifyingMfa,\n \n // MFA State\n mfaRequired: computed(() => mfaRequired.value),\n mfaSessionId: computed(() => mfaSessionId.value),\n availableMfaMethods: computed(() => availableMfaMethods.value),\n\n // Methods\n signIn,\n signUp,\n signOut,\n refreshToken,\n fetchProfile,\n updateProfile,\n updateUserSettings,\n changeEmail,\n initialize,\n setAuthData,\n verifyMfa,\n sendMfaEmailCode,\n getMfaWebAuthnChallenge,\n registerHardwareKey,\n completeHardwareKeyRegistration,\n \n // Token management\n startTokenRefreshTimer,\n stopTokenRefreshTimer,\n \n // Force re-initialization (useful for testing or navigation)\n forceReInit: () => {\n isInitialized.value = false\n isInitializing.value = true\n initialize()\n },\n }\n}"],"names":["useStrandsConfig","ref","computed"],"mappings":"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"}
|
|
@@ -27,6 +27,7 @@ const DEFAULT_ENDPOINTS = {
|
|
|
27
27
|
oauthProvider: "/api/v1/oauth/providers/{provider_id}",
|
|
28
28
|
changeEmail: "/api/v1/user/change-email",
|
|
29
29
|
avatar: "/api/v1/user/avatar",
|
|
30
|
+
settings: "/api/v1/user/settings",
|
|
30
31
|
// MFA endpoints
|
|
31
32
|
mfaDevices: "/api/v1/mfa/devices",
|
|
32
33
|
mfaTotpSetup: "/api/v1/mfa/totp/setup",
|
|
@@ -100,6 +101,7 @@ function useStrandsConfig(fallbackConfig) {
|
|
|
100
101
|
oauthProvider: customEndpoints.oauthProvider || DEFAULT_ENDPOINTS.oauthProvider,
|
|
101
102
|
changeEmail: customEndpoints.changeEmail || DEFAULT_ENDPOINTS.changeEmail,
|
|
102
103
|
avatar: customEndpoints.avatar || DEFAULT_ENDPOINTS.avatar,
|
|
104
|
+
settings: customEndpoints.settings || DEFAULT_ENDPOINTS.settings,
|
|
103
105
|
// MFA endpoints
|
|
104
106
|
mfaDevices: customEndpoints.mfaDevices || DEFAULT_ENDPOINTS.mfaDevices,
|
|
105
107
|
mfaTotpSetup: customEndpoints.mfaTotpSetup || DEFAULT_ENDPOINTS.mfaTotpSetup,
|
|
@@ -157,4 +159,4 @@ export {
|
|
|
157
159
|
setStrandsConfig as s,
|
|
158
160
|
useStrandsConfig as u
|
|
159
161
|
};
|
|
160
|
-
//# sourceMappingURL=useStrandsConfig-
|
|
162
|
+
//# sourceMappingURL=useStrandsConfig-COEj6nFc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStrandsConfig-COEj6nFc.js","sources":["../../../apps/accounts-ui/src/shared/defaults.ts","../../../apps/accounts-ui/src/vue/composables/useStrandsConfig.ts"],"sourcesContent":["import type { StrandsAuthConfig } from '../types'\n\nexport const STRANDS_AUTH_DEFAULTS: Required<Omit<StrandsAuthConfig, 'clientId' | 'supportEmail' | 'oauth2RedirectUrl'>> = {\n baseUrl: 'https://your-api.example.com',\n accentColor: '#EA00A8',\n redirectUrl: '/',\n onSignInUrl: '/dashboard',\n onSignOutUrl: '/',\n autoRefresh: true,\n refreshInterval: 4,\n protectedRoutes: [],\n guestOnlyRoutes: ['/auth', '/login', '/register'],\n devMode: false,\n styles: true,\n endpoints: {}\n}","import { ref, computed, inject, provide } from 'vue'\nimport { STRANDS_AUTH_DEFAULTS } from '../../shared/defaults'\n\n// Re-export types for components\nexport type { StrandsAuthConfig, StrandsAuthEndpoints } from '../../types'\nimport type { StrandsAuthConfig, StrandsAuthEndpoints } from '../../types'\n\nconst DEFAULT_ENDPOINTS: StrandsAuthEndpoints = {\n signIn: '/api/v1/auth/sign-in',\n signUp: '/api/v1/auth/sign-up',\n signOut: '/api/v1/auth/sign-out',\n refresh: '/api/v1/auth/refresh',\n passwordReset: '/api/v1/auth/password-reset',\n passwordResetConfirm: '/api/v1/auth/password-reset/confirm',\n completeRegistration: '/api/v1/auth/complete-registration',\n profile: '/api/v1/user/profile',\n verifyEmail: '/api/v1/auth/verify-email',\n oauthProviders: '/api/v1/oauth/providers',\n oauthProvider: '/api/v1/oauth/providers/{provider_id}',\n changeEmail: '/api/v1/user/change-email',\n avatar: '/api/v1/user/avatar',\n settings: '/api/v1/user/settings',\n // MFA endpoints\n mfaDevices: '/api/v1/mfa/devices',\n mfaTotpSetup: '/api/v1/mfa/totp/setup',\n mfaTotpVerify: '/api/v1/mfa/totp/verify',\n mfaEmailSetup: '/api/v1/mfa/email/setup',\n mfaEmailSend: '/api/v1/mfa/email/send',\n mfaEmailVerify: '/api/v1/mfa/email/verify',\n mfaDeviceDisable: '/api/v1/mfa/device/disable',\n mfaBackupCodes: '/api/v1/mfa/backup-codes/regenerate',\n // Hardware key endpoints\n mfaHardwareStartRegistration: '/api/v1/mfa/hardware/start-registration',\n mfaHardwareCompleteRegistration: '/api/v1/mfa/hardware/complete-registration',\n // MFA sign-in specific endpoints\n mfaSigninSendEmail: '/api/v1/auth/mfa/email/send',\n mfaSigninVerify: '/api/v1/auth/mfa/verify',\n mfaBackupCodeVerify: '/api/v1/auth/mfa/backup-code/verify',\n mfaWebAuthnChallenge: '/api/v1/auth/mfa/webauthn/challenge'\n}\n\nconst STRANDS_CONFIG_KEY = Symbol('strands-config')\n\n// Global configuration state\nconst globalConfig = ref<StrandsAuthConfig | null>(null)\n\nexport function provideStrandsConfig(config: StrandsAuthConfig) {\n globalConfig.value = config\n \n try {\n provide(STRANDS_CONFIG_KEY, config)\n } catch (error) {\n console.warn('[Strands Auth] Could not provide config via Vue provide/inject. Config available via global state only.', error)\n }\n}\n\nexport function useStrandsConfig(fallbackConfig?: Partial<StrandsAuthConfig>) {\n // Try to get config from provide/inject first\n const injectedConfig = inject<StrandsAuthConfig | null>(STRANDS_CONFIG_KEY, null)\n \n // Try to get Nuxt runtime config as additional fallback\n let nuxtConfig = null\n try {\n if (typeof window !== 'undefined') {\n // Check window global set by plugin\n if ((window as any).__STRANDS_CONFIG__) {\n nuxtConfig = (window as any).__STRANDS_CONFIG__\n }\n // Fallback to __NUXT__ hydration data\n else if ((window as any).__NUXT__) {\n const nuxtData = (window as any).__NUXT__\n nuxtConfig = nuxtData?.config?.public?.strandsAuth ||\n nuxtData?.public?.strandsAuth ||\n nuxtData?.strandsAuth\n }\n }\n } catch (error) {\n console.error('[Strands Auth] Error accessing runtime configuration:', error)\n }\n \n // Merge configuration sources in priority order\n const activeConfig = computed(() => {\n // Start with defaults, then layer on user configurations\n const config = {\n ...STRANDS_AUTH_DEFAULTS,\n ...(fallbackConfig || {}),\n ...(injectedConfig || {}),\n ...(globalConfig.value || {}),\n ...(nuxtConfig || {})\n }\n \n // Only warn if we're using the exact default URL (indicating no config was provided)\n if (config.baseUrl === STRANDS_AUTH_DEFAULTS.baseUrl && typeof window === 'undefined') {\n console.warn('[Strands Auth] No baseUrl configured for SSR. Please provide a baseUrl in your strandsAuth configuration.')\n }\n \n return config\n })\n\n const endpoints = computed<StrandsAuthEndpoints>(() => {\n const config = activeConfig.value\n const customEndpoints = config.endpoints || {}\n \n return {\n signIn: customEndpoints.signIn || DEFAULT_ENDPOINTS.signIn,\n signUp: customEndpoints.signUp || DEFAULT_ENDPOINTS.signUp,\n signOut: customEndpoints.signOut || DEFAULT_ENDPOINTS.signOut,\n refresh: customEndpoints.refresh || DEFAULT_ENDPOINTS.refresh,\n passwordReset: customEndpoints.passwordReset || DEFAULT_ENDPOINTS.passwordReset,\n passwordResetConfirm: customEndpoints.passwordResetConfirm || DEFAULT_ENDPOINTS.passwordResetConfirm,\n completeRegistration: customEndpoints.completeRegistration || DEFAULT_ENDPOINTS.completeRegistration,\n profile: customEndpoints.profile || DEFAULT_ENDPOINTS.profile,\n verifyEmail: customEndpoints.verifyEmail || DEFAULT_ENDPOINTS.verifyEmail,\n oauthProviders: customEndpoints.oauthProviders || DEFAULT_ENDPOINTS.oauthProviders,\n oauthProvider: customEndpoints.oauthProvider || DEFAULT_ENDPOINTS.oauthProvider,\n changeEmail: customEndpoints.changeEmail || DEFAULT_ENDPOINTS.changeEmail,\n avatar: customEndpoints.avatar || DEFAULT_ENDPOINTS.avatar,\n settings: customEndpoints.settings || DEFAULT_ENDPOINTS.settings,\n // MFA endpoints\n mfaDevices: customEndpoints.mfaDevices || DEFAULT_ENDPOINTS.mfaDevices,\n mfaTotpSetup: customEndpoints.mfaTotpSetup || DEFAULT_ENDPOINTS.mfaTotpSetup,\n mfaTotpVerify: customEndpoints.mfaTotpVerify || DEFAULT_ENDPOINTS.mfaTotpVerify,\n mfaEmailSetup: customEndpoints.mfaEmailSetup || DEFAULT_ENDPOINTS.mfaEmailSetup,\n mfaEmailSend: customEndpoints.mfaEmailSend || DEFAULT_ENDPOINTS.mfaEmailSend,\n mfaEmailVerify: customEndpoints.mfaEmailVerify || DEFAULT_ENDPOINTS.mfaEmailVerify,\n mfaDeviceDisable: customEndpoints.mfaDeviceDisable || DEFAULT_ENDPOINTS.mfaDeviceDisable,\n mfaBackupCodes: customEndpoints.mfaBackupCodes || DEFAULT_ENDPOINTS.mfaBackupCodes,\n // Hardware key endpoints\n mfaHardwareStartRegistration: customEndpoints.mfaHardwareStartRegistration || DEFAULT_ENDPOINTS.mfaHardwareStartRegistration,\n mfaHardwareCompleteRegistration: customEndpoints.mfaHardwareCompleteRegistration || DEFAULT_ENDPOINTS.mfaHardwareCompleteRegistration,\n // MFA sign-in specific endpoints\n mfaSigninSendEmail: customEndpoints.mfaSigninSendEmail || DEFAULT_ENDPOINTS.mfaSigninSendEmail,\n mfaSigninVerify: customEndpoints.mfaSigninVerify || DEFAULT_ENDPOINTS.mfaSigninVerify,\n mfaBackupCodeVerify: customEndpoints.mfaBackupCodeVerify || DEFAULT_ENDPOINTS.mfaBackupCodeVerify,\n mfaWebAuthnChallenge: customEndpoints.mfaWebAuthnChallenge || DEFAULT_ENDPOINTS.mfaWebAuthnChallenge\n }\n })\n\n const getUrl = (endpoint: keyof StrandsAuthEndpoints | string) => {\n const config = activeConfig.value\n if (!config.baseUrl) {\n throw new Error('Base URL is required in configuration')\n }\n \n // If endpoint is a string key, try to find it in endpoints first\n let endpointPath: string\n if (typeof endpoint === 'string' && endpoint in endpoints.value) {\n endpointPath = endpoints.value[endpoint as keyof StrandsAuthEndpoints]\n } else if (typeof endpoint === 'string') {\n // If it's a string but not a key, treat it as a literal path\n endpointPath = endpoint\n } else {\n // It's a keyof StrandsAuthEndpoints\n endpointPath = endpoints.value[endpoint]\n }\n \n // Ensure proper URL construction with slash separation\n const baseUrl = config.baseUrl.replace(/\\/$/, '')\n const path = endpointPath.startsWith('/') ? endpointPath : `/${endpointPath}`\n console.debug(`[Strands Auth] Constructing URL for endpoint \"${endpoint}\": ${baseUrl}${path}`)\n return `${baseUrl}${path}`\n }\n\n const getSupportEmail = () => {\n const config = activeConfig.value\n return config.supportEmail || null\n }\n\n return {\n config: activeConfig,\n endpoints,\n getUrl,\n getSupportEmail\n }\n}\n\n// Convenience function to set global config\nexport function setStrandsConfig(config: StrandsAuthConfig) {\n globalConfig.value = config\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -28,6 +28,7 @@ const DEFAULT_ENDPOINTS = {
|
|
|
28
28
|
oauthProvider: "/api/v1/oauth/providers/{provider_id}",
|
|
29
29
|
changeEmail: "/api/v1/user/change-email",
|
|
30
30
|
avatar: "/api/v1/user/avatar",
|
|
31
|
+
settings: "/api/v1/user/settings",
|
|
31
32
|
// MFA endpoints
|
|
32
33
|
mfaDevices: "/api/v1/mfa/devices",
|
|
33
34
|
mfaTotpSetup: "/api/v1/mfa/totp/setup",
|
|
@@ -101,6 +102,7 @@ function useStrandsConfig(fallbackConfig) {
|
|
|
101
102
|
oauthProvider: customEndpoints.oauthProvider || DEFAULT_ENDPOINTS.oauthProvider,
|
|
102
103
|
changeEmail: customEndpoints.changeEmail || DEFAULT_ENDPOINTS.changeEmail,
|
|
103
104
|
avatar: customEndpoints.avatar || DEFAULT_ENDPOINTS.avatar,
|
|
105
|
+
settings: customEndpoints.settings || DEFAULT_ENDPOINTS.settings,
|
|
104
106
|
// MFA endpoints
|
|
105
107
|
mfaDevices: customEndpoints.mfaDevices || DEFAULT_ENDPOINTS.mfaDevices,
|
|
106
108
|
mfaTotpSetup: customEndpoints.mfaTotpSetup || DEFAULT_ENDPOINTS.mfaTotpSetup,
|
|
@@ -156,4 +158,4 @@ exports.STRANDS_AUTH_DEFAULTS = STRANDS_AUTH_DEFAULTS;
|
|
|
156
158
|
exports.provideStrandsConfig = provideStrandsConfig;
|
|
157
159
|
exports.setStrandsConfig = setStrandsConfig;
|
|
158
160
|
exports.useStrandsConfig = useStrandsConfig;
|
|
159
|
-
//# sourceMappingURL=useStrandsConfig-
|
|
161
|
+
//# sourceMappingURL=useStrandsConfig-DW4ez8t4.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStrandsConfig-DW4ez8t4.cjs","sources":["../../../apps/accounts-ui/src/shared/defaults.ts","../../../apps/accounts-ui/src/vue/composables/useStrandsConfig.ts"],"sourcesContent":["import type { StrandsAuthConfig } from '../types'\n\nexport const STRANDS_AUTH_DEFAULTS: Required<Omit<StrandsAuthConfig, 'clientId' | 'supportEmail' | 'oauth2RedirectUrl'>> = {\n baseUrl: 'https://your-api.example.com',\n accentColor: '#EA00A8',\n redirectUrl: '/',\n onSignInUrl: '/dashboard',\n onSignOutUrl: '/',\n autoRefresh: true,\n refreshInterval: 4,\n protectedRoutes: [],\n guestOnlyRoutes: ['/auth', '/login', '/register'],\n devMode: false,\n styles: true,\n endpoints: {}\n}","import { ref, computed, inject, provide } from 'vue'\nimport { STRANDS_AUTH_DEFAULTS } from '../../shared/defaults'\n\n// Re-export types for components\nexport type { StrandsAuthConfig, StrandsAuthEndpoints } from '../../types'\nimport type { StrandsAuthConfig, StrandsAuthEndpoints } from '../../types'\n\nconst DEFAULT_ENDPOINTS: StrandsAuthEndpoints = {\n signIn: '/api/v1/auth/sign-in',\n signUp: '/api/v1/auth/sign-up',\n signOut: '/api/v1/auth/sign-out',\n refresh: '/api/v1/auth/refresh',\n passwordReset: '/api/v1/auth/password-reset',\n passwordResetConfirm: '/api/v1/auth/password-reset/confirm',\n completeRegistration: '/api/v1/auth/complete-registration',\n profile: '/api/v1/user/profile',\n verifyEmail: '/api/v1/auth/verify-email',\n oauthProviders: '/api/v1/oauth/providers',\n oauthProvider: '/api/v1/oauth/providers/{provider_id}',\n changeEmail: '/api/v1/user/change-email',\n avatar: '/api/v1/user/avatar',\n settings: '/api/v1/user/settings',\n // MFA endpoints\n mfaDevices: '/api/v1/mfa/devices',\n mfaTotpSetup: '/api/v1/mfa/totp/setup',\n mfaTotpVerify: '/api/v1/mfa/totp/verify',\n mfaEmailSetup: '/api/v1/mfa/email/setup',\n mfaEmailSend: '/api/v1/mfa/email/send',\n mfaEmailVerify: '/api/v1/mfa/email/verify',\n mfaDeviceDisable: '/api/v1/mfa/device/disable',\n mfaBackupCodes: '/api/v1/mfa/backup-codes/regenerate',\n // Hardware key endpoints\n mfaHardwareStartRegistration: '/api/v1/mfa/hardware/start-registration',\n mfaHardwareCompleteRegistration: '/api/v1/mfa/hardware/complete-registration',\n // MFA sign-in specific endpoints\n mfaSigninSendEmail: '/api/v1/auth/mfa/email/send',\n mfaSigninVerify: '/api/v1/auth/mfa/verify',\n mfaBackupCodeVerify: '/api/v1/auth/mfa/backup-code/verify',\n mfaWebAuthnChallenge: '/api/v1/auth/mfa/webauthn/challenge'\n}\n\nconst STRANDS_CONFIG_KEY = Symbol('strands-config')\n\n// Global configuration state\nconst globalConfig = ref<StrandsAuthConfig | null>(null)\n\nexport function provideStrandsConfig(config: StrandsAuthConfig) {\n globalConfig.value = config\n \n try {\n provide(STRANDS_CONFIG_KEY, config)\n } catch (error) {\n console.warn('[Strands Auth] Could not provide config via Vue provide/inject. Config available via global state only.', error)\n }\n}\n\nexport function useStrandsConfig(fallbackConfig?: Partial<StrandsAuthConfig>) {\n // Try to get config from provide/inject first\n const injectedConfig = inject<StrandsAuthConfig | null>(STRANDS_CONFIG_KEY, null)\n \n // Try to get Nuxt runtime config as additional fallback\n let nuxtConfig = null\n try {\n if (typeof window !== 'undefined') {\n // Check window global set by plugin\n if ((window as any).__STRANDS_CONFIG__) {\n nuxtConfig = (window as any).__STRANDS_CONFIG__\n }\n // Fallback to __NUXT__ hydration data\n else if ((window as any).__NUXT__) {\n const nuxtData = (window as any).__NUXT__\n nuxtConfig = nuxtData?.config?.public?.strandsAuth ||\n nuxtData?.public?.strandsAuth ||\n nuxtData?.strandsAuth\n }\n }\n } catch (error) {\n console.error('[Strands Auth] Error accessing runtime configuration:', error)\n }\n \n // Merge configuration sources in priority order\n const activeConfig = computed(() => {\n // Start with defaults, then layer on user configurations\n const config = {\n ...STRANDS_AUTH_DEFAULTS,\n ...(fallbackConfig || {}),\n ...(injectedConfig || {}),\n ...(globalConfig.value || {}),\n ...(nuxtConfig || {})\n }\n \n // Only warn if we're using the exact default URL (indicating no config was provided)\n if (config.baseUrl === STRANDS_AUTH_DEFAULTS.baseUrl && typeof window === 'undefined') {\n console.warn('[Strands Auth] No baseUrl configured for SSR. Please provide a baseUrl in your strandsAuth configuration.')\n }\n \n return config\n })\n\n const endpoints = computed<StrandsAuthEndpoints>(() => {\n const config = activeConfig.value\n const customEndpoints = config.endpoints || {}\n \n return {\n signIn: customEndpoints.signIn || DEFAULT_ENDPOINTS.signIn,\n signUp: customEndpoints.signUp || DEFAULT_ENDPOINTS.signUp,\n signOut: customEndpoints.signOut || DEFAULT_ENDPOINTS.signOut,\n refresh: customEndpoints.refresh || DEFAULT_ENDPOINTS.refresh,\n passwordReset: customEndpoints.passwordReset || DEFAULT_ENDPOINTS.passwordReset,\n passwordResetConfirm: customEndpoints.passwordResetConfirm || DEFAULT_ENDPOINTS.passwordResetConfirm,\n completeRegistration: customEndpoints.completeRegistration || DEFAULT_ENDPOINTS.completeRegistration,\n profile: customEndpoints.profile || DEFAULT_ENDPOINTS.profile,\n verifyEmail: customEndpoints.verifyEmail || DEFAULT_ENDPOINTS.verifyEmail,\n oauthProviders: customEndpoints.oauthProviders || DEFAULT_ENDPOINTS.oauthProviders,\n oauthProvider: customEndpoints.oauthProvider || DEFAULT_ENDPOINTS.oauthProvider,\n changeEmail: customEndpoints.changeEmail || DEFAULT_ENDPOINTS.changeEmail,\n avatar: customEndpoints.avatar || DEFAULT_ENDPOINTS.avatar,\n settings: customEndpoints.settings || DEFAULT_ENDPOINTS.settings,\n // MFA endpoints\n mfaDevices: customEndpoints.mfaDevices || DEFAULT_ENDPOINTS.mfaDevices,\n mfaTotpSetup: customEndpoints.mfaTotpSetup || DEFAULT_ENDPOINTS.mfaTotpSetup,\n mfaTotpVerify: customEndpoints.mfaTotpVerify || DEFAULT_ENDPOINTS.mfaTotpVerify,\n mfaEmailSetup: customEndpoints.mfaEmailSetup || DEFAULT_ENDPOINTS.mfaEmailSetup,\n mfaEmailSend: customEndpoints.mfaEmailSend || DEFAULT_ENDPOINTS.mfaEmailSend,\n mfaEmailVerify: customEndpoints.mfaEmailVerify || DEFAULT_ENDPOINTS.mfaEmailVerify,\n mfaDeviceDisable: customEndpoints.mfaDeviceDisable || DEFAULT_ENDPOINTS.mfaDeviceDisable,\n mfaBackupCodes: customEndpoints.mfaBackupCodes || DEFAULT_ENDPOINTS.mfaBackupCodes,\n // Hardware key endpoints\n mfaHardwareStartRegistration: customEndpoints.mfaHardwareStartRegistration || DEFAULT_ENDPOINTS.mfaHardwareStartRegistration,\n mfaHardwareCompleteRegistration: customEndpoints.mfaHardwareCompleteRegistration || DEFAULT_ENDPOINTS.mfaHardwareCompleteRegistration,\n // MFA sign-in specific endpoints\n mfaSigninSendEmail: customEndpoints.mfaSigninSendEmail || DEFAULT_ENDPOINTS.mfaSigninSendEmail,\n mfaSigninVerify: customEndpoints.mfaSigninVerify || DEFAULT_ENDPOINTS.mfaSigninVerify,\n mfaBackupCodeVerify: customEndpoints.mfaBackupCodeVerify || DEFAULT_ENDPOINTS.mfaBackupCodeVerify,\n mfaWebAuthnChallenge: customEndpoints.mfaWebAuthnChallenge || DEFAULT_ENDPOINTS.mfaWebAuthnChallenge\n }\n })\n\n const getUrl = (endpoint: keyof StrandsAuthEndpoints | string) => {\n const config = activeConfig.value\n if (!config.baseUrl) {\n throw new Error('Base URL is required in configuration')\n }\n \n // If endpoint is a string key, try to find it in endpoints first\n let endpointPath: string\n if (typeof endpoint === 'string' && endpoint in endpoints.value) {\n endpointPath = endpoints.value[endpoint as keyof StrandsAuthEndpoints]\n } else if (typeof endpoint === 'string') {\n // If it's a string but not a key, treat it as a literal path\n endpointPath = endpoint\n } else {\n // It's a keyof StrandsAuthEndpoints\n endpointPath = endpoints.value[endpoint]\n }\n \n // Ensure proper URL construction with slash separation\n const baseUrl = config.baseUrl.replace(/\\/$/, '')\n const path = endpointPath.startsWith('/') ? endpointPath : `/${endpointPath}`\n console.debug(`[Strands Auth] Constructing URL for endpoint \"${endpoint}\": ${baseUrl}${path}`)\n return `${baseUrl}${path}`\n }\n\n const getSupportEmail = () => {\n const config = activeConfig.value\n return config.supportEmail || null\n }\n\n return {\n config: activeConfig,\n endpoints,\n getUrl,\n getSupportEmail\n }\n}\n\n// Convenience function to set global config\nexport function setStrandsConfig(config: StrandsAuthConfig) {\n globalConfig.value = config\n}\n"],"names":["ref","provide","inject","computed"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignedIn.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/SignedIn.vue"],"names":[],"mappings":"AAmCA;AAgFA,UAAU,KAAK;IACb,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAuCD,iBAAS,cAAc;WAwFT,OAAO,IAA6B
|
|
1
|
+
{"version":3,"file":"SignedIn.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/SignedIn.vue"],"names":[],"mappings":"AAmCA;AAgFA,UAAU,KAAK;IACb,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAuCD,iBAAS,cAAc;WAwFT,OAAO,IAA6B;;;;;;;;;;;;;;;;;;YAZrB,GAAG;;;YACF,GAAG;yBACJ,GAAG;;;;EAe/B;AAgBD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;;;;;kBAtJJ,OAAO;6EA8JtB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAapG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
|