@burdenoff/microfe-auth 2026.510.127
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/README.md +12 -0
- package/dist/_virtual/_rolldown/runtime.js +13 -0
- package/dist/auth/AuthRoot.d.ts +30 -0
- package/dist/auth/AuthRoot.d.ts.map +1 -0
- package/dist/auth/AuthRoot.js +82 -0
- package/dist/auth/AuthRoot.js.map +1 -0
- package/dist/auth/AuthRoutes.d.ts +29 -0
- package/dist/auth/AuthRoutes.d.ts.map +1 -0
- package/dist/auth/AuthRoutes.js +271 -0
- package/dist/auth/AuthRoutes.js.map +1 -0
- package/dist/auth/components/AuthIcons.d.ts +17 -0
- package/dist/auth/components/AuthIcons.d.ts.map +1 -0
- package/dist/auth/components/AuthIcons.js +197 -0
- package/dist/auth/components/AuthIcons.js.map +1 -0
- package/dist/auth/components/AuthLayout.d.ts +17 -0
- package/dist/auth/components/AuthLayout.d.ts.map +1 -0
- package/dist/auth/components/AuthLayout.js +237 -0
- package/dist/auth/components/AuthLayout.js.map +1 -0
- package/dist/auth/components/CaptchaV2.d.ts +16 -0
- package/dist/auth/components/CaptchaV2.d.ts.map +1 -0
- package/dist/auth/components/CaptchaV2.js +47 -0
- package/dist/auth/components/CaptchaV2.js.map +1 -0
- package/dist/auth/components/ConfirmActionDialog.d.ts +16 -0
- package/dist/auth/components/ConfirmActionDialog.d.ts.map +1 -0
- package/dist/auth/components/ConfirmActionDialog.js +68 -0
- package/dist/auth/components/ConfirmActionDialog.js.map +1 -0
- package/dist/auth/components/index.d.ts +4 -0
- package/dist/auth/components/index.d.ts.map +1 -0
- package/dist/auth/components/profile/UserProfileMenu.d.ts +42 -0
- package/dist/auth/components/profile/UserProfileMenu.d.ts.map +1 -0
- package/dist/auth/components/profile/UserProfileMenu.js +91 -0
- package/dist/auth/components/profile/UserProfileMenu.js.map +1 -0
- package/dist/auth/components/workspace/WorkspaceSelector.d.ts +76 -0
- package/dist/auth/components/workspace/WorkspaceSelector.d.ts.map +1 -0
- package/dist/auth/components/workspace/WorkspaceSelector.js +240 -0
- package/dist/auth/components/workspace/WorkspaceSelector.js.map +1 -0
- package/dist/auth/constants/permissions.d.ts +30 -0
- package/dist/auth/constants/permissions.d.ts.map +1 -0
- package/dist/auth/constants/permissions.js +18 -0
- package/dist/auth/constants/permissions.js.map +1 -0
- package/dist/auth/constants/sessionKeys.d.ts +18 -0
- package/dist/auth/constants/sessionKeys.d.ts.map +1 -0
- package/dist/auth/constants/sessionKeys.js +6 -0
- package/dist/auth/constants/sessionKeys.js.map +1 -0
- package/dist/auth/hooks/index.d.ts +18 -0
- package/dist/auth/hooks/index.d.ts.map +1 -0
- package/dist/auth/hooks/index.js +16 -0
- package/dist/auth/hooks/useAccountOperations.d.ts +19 -0
- package/dist/auth/hooks/useAccountOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useAccountOperations.js +52 -0
- package/dist/auth/hooks/useAccountOperations.js.map +1 -0
- package/dist/auth/hooks/useApiKeyOperations.d.ts +22 -0
- package/dist/auth/hooks/useApiKeyOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useApiKeyOperations.js +4 -0
- package/dist/auth/hooks/useAppOperations.d.ts +26 -0
- package/dist/auth/hooks/useAppOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useAppOperations.js +4 -0
- package/dist/auth/hooks/useAuthOperations.d.ts +57 -0
- package/dist/auth/hooks/useAuthOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useAuthOperations.js +236 -0
- package/dist/auth/hooks/useAuthOperations.js.map +1 -0
- package/dist/auth/hooks/useAuthPermissions.d.ts +20 -0
- package/dist/auth/hooks/useAuthPermissions.d.ts.map +1 -0
- package/dist/auth/hooks/useAuthPermissions.js +22 -0
- package/dist/auth/hooks/useAuthPermissions.js.map +1 -0
- package/dist/auth/hooks/useCaptchaV3.d.ts +13 -0
- package/dist/auth/hooks/useCaptchaV3.d.ts.map +1 -0
- package/dist/auth/hooks/useCaptchaV3.js +19 -0
- package/dist/auth/hooks/useCaptchaV3.js.map +1 -0
- package/dist/auth/hooks/useContextSwitcherData.d.ts +106 -0
- package/dist/auth/hooks/useContextSwitcherData.d.ts.map +1 -0
- package/dist/auth/hooks/useContextSwitcherData.js +466 -0
- package/dist/auth/hooks/useContextSwitcherData.js.map +1 -0
- package/dist/auth/hooks/useDelegationOperations.d.ts +25 -0
- package/dist/auth/hooks/useDelegationOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useDelegationOperations.js +4 -0
- package/dist/auth/hooks/useMfaOperations.d.ts +18 -0
- package/dist/auth/hooks/useMfaOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useMfaOperations.js +103 -0
- package/dist/auth/hooks/useMfaOperations.js.map +1 -0
- package/dist/auth/hooks/useMyWorkspaces.d.ts +45 -0
- package/dist/auth/hooks/useMyWorkspaces.d.ts.map +1 -0
- package/dist/auth/hooks/useMyWorkspaces.js +140 -0
- package/dist/auth/hooks/useMyWorkspaces.js.map +1 -0
- package/dist/auth/hooks/useOAuthOperations.d.ts +19 -0
- package/dist/auth/hooks/useOAuthOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useOAuthOperations.js +103 -0
- package/dist/auth/hooks/useOAuthOperations.js.map +1 -0
- package/dist/auth/hooks/usePasswordOperations.d.ts +13 -0
- package/dist/auth/hooks/usePasswordOperations.d.ts.map +1 -0
- package/dist/auth/hooks/usePasswordOperations.js +56 -0
- package/dist/auth/hooks/usePasswordOperations.js.map +1 -0
- package/dist/auth/hooks/useSessionOperations.d.ts +41 -0
- package/dist/auth/hooks/useSessionOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useSessionOperations.js +59 -0
- package/dist/auth/hooks/useSessionOperations.js.map +1 -0
- package/dist/auth/hooks/useSsoOperations.d.ts +65 -0
- package/dist/auth/hooks/useSsoOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useSsoOperations.js +236 -0
- package/dist/auth/hooks/useSsoOperations.js.map +1 -0
- package/dist/auth/hooks/useTokenRefresh.d.ts +56 -0
- package/dist/auth/hooks/useTokenRefresh.d.ts.map +1 -0
- package/dist/auth/hooks/useTokenRefresh.js +53 -0
- package/dist/auth/hooks/useTokenRefresh.js.map +1 -0
- package/dist/auth/hooks/useUserOperations.d.ts +32 -0
- package/dist/auth/hooks/useUserOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useUserOperations.js +100 -0
- package/dist/auth/hooks/useUserOperations.js.map +1 -0
- package/dist/auth/hooks/useWorkspaceOperations.d.ts +35 -0
- package/dist/auth/hooks/useWorkspaceOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useWorkspaceOperations.js +35 -0
- package/dist/auth/hooks/useWorkspaceOperations.js.map +1 -0
- package/dist/auth/hooks/useWorkspaceToken.d.ts +56 -0
- package/dist/auth/hooks/useWorkspaceToken.d.ts.map +1 -0
- package/dist/auth/hooks/useWorkspaceToken.js +94 -0
- package/dist/auth/hooks/useWorkspaceToken.js.map +1 -0
- package/dist/auth/index.d.ts +63 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +18 -0
- package/dist/auth/pages/ApiKeysPage.d.ts +5 -0
- package/dist/auth/pages/ApiKeysPage.d.ts.map +1 -0
- package/dist/auth/pages/AppsPage.d.ts +5 -0
- package/dist/auth/pages/AppsPage.d.ts.map +1 -0
- package/dist/auth/pages/AuditLogPage.d.ts +5 -0
- package/dist/auth/pages/AuditLogPage.d.ts.map +1 -0
- package/dist/auth/pages/AuditLogPage.js +129 -0
- package/dist/auth/pages/AuditLogPage.js.map +1 -0
- package/dist/auth/pages/DelegationsPage.d.ts +5 -0
- package/dist/auth/pages/DelegationsPage.d.ts.map +1 -0
- package/dist/auth/pages/EmailVerifyPage.d.ts +5 -0
- package/dist/auth/pages/EmailVerifyPage.d.ts.map +1 -0
- package/dist/auth/pages/EmailVerifyPage.js +166 -0
- package/dist/auth/pages/EmailVerifyPage.js.map +1 -0
- package/dist/auth/pages/LoginPage.d.ts +6 -0
- package/dist/auth/pages/LoginPage.d.ts.map +1 -0
- package/dist/auth/pages/LoginPage.js +575 -0
- package/dist/auth/pages/LoginPage.js.map +1 -0
- package/dist/auth/pages/MagicLinkPage.d.ts +6 -0
- package/dist/auth/pages/MagicLinkPage.d.ts.map +1 -0
- package/dist/auth/pages/MagicLinkPage.js +219 -0
- package/dist/auth/pages/MagicLinkPage.js.map +1 -0
- package/dist/auth/pages/MfaSetupPage.d.ts +5 -0
- package/dist/auth/pages/MfaSetupPage.d.ts.map +1 -0
- package/dist/auth/pages/MfaSetupPage.js +341 -0
- package/dist/auth/pages/MfaSetupPage.js.map +1 -0
- package/dist/auth/pages/MfaVerifyPage.d.ts +7 -0
- package/dist/auth/pages/MfaVerifyPage.d.ts.map +1 -0
- package/dist/auth/pages/MfaVerifyPage.js +189 -0
- package/dist/auth/pages/MfaVerifyPage.js.map +1 -0
- package/dist/auth/pages/OAuthCallbackPage.d.ts +7 -0
- package/dist/auth/pages/OAuthCallbackPage.d.ts.map +1 -0
- package/dist/auth/pages/OAuthCallbackPage.js +100 -0
- package/dist/auth/pages/OAuthCallbackPage.js.map +1 -0
- package/dist/auth/pages/PasswordResetPage.d.ts +6 -0
- package/dist/auth/pages/PasswordResetPage.d.ts.map +1 -0
- package/dist/auth/pages/PasswordResetPage.js +352 -0
- package/dist/auth/pages/PasswordResetPage.js.map +1 -0
- package/dist/auth/pages/ReactivatePage.d.ts +6 -0
- package/dist/auth/pages/ReactivatePage.d.ts.map +1 -0
- package/dist/auth/pages/ReactivatePage.js +217 -0
- package/dist/auth/pages/ReactivatePage.js.map +1 -0
- package/dist/auth/pages/RegisterPage.d.ts +5 -0
- package/dist/auth/pages/RegisterPage.d.ts.map +1 -0
- package/dist/auth/pages/RegisterPage.js +439 -0
- package/dist/auth/pages/RegisterPage.js.map +1 -0
- package/dist/auth/pages/SSORelayCallbackPage.d.ts +8 -0
- package/dist/auth/pages/SSORelayCallbackPage.d.ts.map +1 -0
- package/dist/auth/pages/SSORelayCallbackPage.js +48 -0
- package/dist/auth/pages/SSORelayCallbackPage.js.map +1 -0
- package/dist/auth/pages/SSORelayPage.d.ts +18 -0
- package/dist/auth/pages/SSORelayPage.d.ts.map +1 -0
- package/dist/auth/pages/SSORelayPage.js +134 -0
- package/dist/auth/pages/SSORelayPage.js.map +1 -0
- package/dist/auth/pages/SecurityPage.d.ts +5 -0
- package/dist/auth/pages/SecurityPage.d.ts.map +1 -0
- package/dist/auth/pages/SecurityPage.js +587 -0
- package/dist/auth/pages/SecurityPage.js.map +1 -0
- package/dist/auth/pages/SessionBridgePage.d.ts +14 -0
- package/dist/auth/pages/SessionBridgePage.d.ts.map +1 -0
- package/dist/auth/pages/SessionBridgePage.js +231 -0
- package/dist/auth/pages/SessionBridgePage.js.map +1 -0
- package/dist/auth/pages/SessionsPage.d.ts +5 -0
- package/dist/auth/pages/SessionsPage.d.ts.map +1 -0
- package/dist/auth/pages/SessionsPage.js +258 -0
- package/dist/auth/pages/SessionsPage.js.map +1 -0
- package/dist/auth/pages/SsoCallbackPage.d.ts +8 -0
- package/dist/auth/pages/SsoCallbackPage.d.ts.map +1 -0
- package/dist/auth/pages/SsoCallbackPage.js +188 -0
- package/dist/auth/pages/SsoCallbackPage.js.map +1 -0
- package/dist/auth/pages/SsoConfigPage.d.ts +6 -0
- package/dist/auth/pages/SsoConfigPage.d.ts.map +1 -0
- package/dist/auth/pages/SsoConfigPage.js +1144 -0
- package/dist/auth/pages/SsoConfigPage.js.map +1 -0
- package/dist/auth/pages/SsoLoginPage.d.ts +7 -0
- package/dist/auth/pages/SsoLoginPage.d.ts.map +1 -0
- package/dist/auth/pages/SsoLoginPage.js +236 -0
- package/dist/auth/pages/SsoLoginPage.js.map +1 -0
- package/dist/auth/pages/UserDetailsPage.d.ts +11 -0
- package/dist/auth/pages/UserDetailsPage.d.ts.map +1 -0
- package/dist/auth/pages/UserDetailsPage.js +338 -0
- package/dist/auth/pages/UserDetailsPage.js.map +1 -0
- package/dist/auth/pages/UserProfilePage.d.ts +5 -0
- package/dist/auth/pages/UserProfilePage.d.ts.map +1 -0
- package/dist/auth/pages/UserProfilePage.js +445 -0
- package/dist/auth/pages/UserProfilePage.js.map +1 -0
- package/dist/auth/pages/UsersPage.d.ts +5 -0
- package/dist/auth/pages/UsersPage.d.ts.map +1 -0
- package/dist/auth/pages/UsersPage.js +899 -0
- package/dist/auth/pages/UsersPage.js.map +1 -0
- package/dist/auth/providers/AuthProvider.d.ts +18 -0
- package/dist/auth/providers/AuthProvider.d.ts.map +1 -0
- package/dist/auth/providers/AuthProvider.js +36 -0
- package/dist/auth/providers/AuthProvider.js.map +1 -0
- package/dist/auth/providers/CaptchaProvider.d.ts +13 -0
- package/dist/auth/providers/CaptchaProvider.d.ts.map +1 -0
- package/dist/auth/providers/CaptchaProvider.js +21 -0
- package/dist/auth/providers/CaptchaProvider.js.map +1 -0
- package/dist/auth/store/authStore.d.ts +91 -0
- package/dist/auth/store/authStore.d.ts.map +1 -0
- package/dist/auth/store/authStore.js +314 -0
- package/dist/auth/store/authStore.js.map +1 -0
- package/dist/auth/types/index.d.ts +636 -0
- package/dist/auth/types/index.d.ts.map +1 -0
- package/dist/auth/utils/captchaConfig.d.ts +4 -0
- package/dist/auth/utils/captchaConfig.d.ts.map +1 -0
- package/dist/auth/utils/captchaConfig.js +13 -0
- package/dist/auth/utils/captchaConfig.js.map +1 -0
- package/dist/auth/utils/formatters.d.ts +37 -0
- package/dist/auth/utils/formatters.d.ts.map +1 -0
- package/dist/auth/utils/formatters.js +48 -0
- package/dist/auth/utils/formatters.js.map +1 -0
- package/dist/auth/utils/gatewayBaseUrls.d.ts +6 -0
- package/dist/auth/utils/gatewayBaseUrls.d.ts.map +1 -0
- package/dist/auth/utils/gatewayBaseUrls.js +18 -0
- package/dist/auth/utils/gatewayBaseUrls.js.map +1 -0
- package/dist/auth/utils/index.d.ts +3 -0
- package/dist/auth/utils/index.d.ts.map +1 -0
- package/dist/auth/utils/validation.d.ts +30 -0
- package/dist/auth/utils/validation.d.ts.map +1 -0
- package/dist/auth/utils/validation.js +15 -0
- package/dist/auth/utils/validation.js.map +1 -0
- package/dist/dev/main.d.ts +2 -0
- package/dist/dev/main.d.ts.map +1 -0
- package/dist/generated/global-operations.d.ts +2978 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-operations.js +944 -0
- package/dist/generated/global-operations.js.map +1 -0
- package/dist/generated/global-types.d.ts +21253 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/wspace-operations.d.ts +2 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-types.d.ts +55214 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/microfe-auth.css +3 -0
- package/dist/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js +70 -0
- package/dist/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js.map +1 -0
- package/dist/node_modules/object-assign/index.js +41 -0
- package/dist/node_modules/object-assign/index.js.map +1 -0
- package/dist/node_modules/prop-types/checkPropTypes.js +46 -0
- package/dist/node_modules/prop-types/checkPropTypes.js.map +1 -0
- package/dist/node_modules/prop-types/factoryWithThrowingShims.js +49 -0
- package/dist/node_modules/prop-types/factoryWithThrowingShims.js.map +1 -0
- package/dist/node_modules/prop-types/factoryWithTypeCheckers.js +272 -0
- package/dist/node_modules/prop-types/factoryWithTypeCheckers.js.map +1 -0
- package/dist/node_modules/prop-types/index.js +16 -0
- package/dist/node_modules/prop-types/index.js.map +1 -0
- package/dist/node_modules/prop-types/lib/ReactPropTypesSecret.js +10 -0
- package/dist/node_modules/prop-types/lib/ReactPropTypesSecret.js.map +1 -0
- package/dist/node_modules/prop-types/lib/has.js +10 -0
- package/dist/node_modules/prop-types/lib/has.js.map +1 -0
- package/dist/node_modules/qrcode.react/lib/esm/index.js +959 -0
- package/dist/node_modules/qrcode.react/lib/esm/index.js.map +1 -0
- package/dist/node_modules/react-async-script/lib/esm/async-script-loader.js +114 -0
- package/dist/node_modules/react-async-script/lib/esm/async-script-loader.js.map +1 -0
- package/dist/node_modules/react-google-recaptcha/lib/esm/index.js +8 -0
- package/dist/node_modules/react-google-recaptcha/lib/esm/index.js.map +1 -0
- package/dist/node_modules/react-google-recaptcha/lib/esm/recaptcha-wrapper.js +20 -0
- package/dist/node_modules/react-google-recaptcha/lib/esm/recaptcha-wrapper.js.map +1 -0
- package/dist/node_modules/react-google-recaptcha/lib/esm/recaptcha.js +148 -0
- package/dist/node_modules/react-google-recaptcha/lib/esm/recaptcha.js.map +1 -0
- package/dist/node_modules/react-google-recaptcha-v3/dist/react-google-recaptcha-v3.esm.js +445 -0
- package/dist/node_modules/react-google-recaptcha-v3/dist/react-google-recaptcha-v3.esm.js.map +1 -0
- package/dist/node_modules/react-is/cjs/react-is.development.js +84 -0
- package/dist/node_modules/react-is/cjs/react-is.development.js.map +1 -0
- package/dist/node_modules/react-is/cjs/react-is.production.min.js +64 -0
- package/dist/node_modules/react-is/cjs/react-is.production.min.js.map +1 -0
- package/dist/node_modules/react-is/index.js +12 -0
- package/dist/node_modules/react-is/index.js.map +1 -0
- package/dist/shared/hooks/index.d.ts +7 -0
- package/dist/shared/hooks/index.d.ts.map +1 -0
- package/dist/shared/index.d.ts +6 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/types/index.d.ts +109 -0
- package/dist/shared/types/index.d.ts.map +1 -0
- package/dist/utils/nativeBridge.d.ts +3 -0
- package/dist/utils/nativeBridge.d.ts.map +1 -0
- package/dist/utils/nativeBridge.js +2 -0
- package/package.json +114 -0
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
import { create as e } from "zustand";
|
|
2
|
+
import { persist as t } from "zustand/middleware";
|
|
3
|
+
import { createProfileScopedStorage as n } from "@burdenoff/fe-libs/shared/utils";
|
|
4
|
+
//#region src/auth/store/authStore.ts
|
|
5
|
+
var r = "bf-p", i = "bf-profiles", a = "bf-active-profile", o = "auth-storage", s = "bf-auth-state-cleared";
|
|
6
|
+
function c() {
|
|
7
|
+
return sessionStorage.getItem(a);
|
|
8
|
+
}
|
|
9
|
+
function l(e, t) {
|
|
10
|
+
return `${r}-${e}-${t}`;
|
|
11
|
+
}
|
|
12
|
+
function u(e) {
|
|
13
|
+
localStorage.removeItem(o), e && localStorage.removeItem(l(e, o));
|
|
14
|
+
for (let e of Object.keys(localStorage)) e.startsWith(`${r}-`) && e.endsWith(`-${o}`) && localStorage.removeItem(e);
|
|
15
|
+
}
|
|
16
|
+
function d() {
|
|
17
|
+
typeof window < "u" && window.dispatchEvent(new Event("bf-profile-storage-change"));
|
|
18
|
+
}
|
|
19
|
+
function f(e) {
|
|
20
|
+
if (typeof window > "u") return;
|
|
21
|
+
let t = c();
|
|
22
|
+
if (!t && !e.user && !e.clear) return;
|
|
23
|
+
let n = e.user?.id ?? t;
|
|
24
|
+
if (!(!n && !e.clear)) {
|
|
25
|
+
if (e.clear) {
|
|
26
|
+
if (u(n), !n) {
|
|
27
|
+
localStorage.removeItem(i), sessionStorage.removeItem(a);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
localStorage.removeItem(l(n, "user")), localStorage.removeItem(l(n, "tokens")), localStorage.removeItem(l(n, "workspace-token"));
|
|
31
|
+
try {
|
|
32
|
+
let e = localStorage.getItem(i), t = (e ? JSON.parse(e) : []).filter((e) => e.id !== n);
|
|
33
|
+
localStorage.setItem(i, JSON.stringify(t));
|
|
34
|
+
} catch {}
|
|
35
|
+
sessionStorage.removeItem(a);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (n) {
|
|
39
|
+
if (e.user) {
|
|
40
|
+
localStorage.setItem(l(n, "user"), JSON.stringify(e.user));
|
|
41
|
+
try {
|
|
42
|
+
let t = localStorage.getItem(i), r = (t ? JSON.parse(t) : []).filter((e) => e.id !== n);
|
|
43
|
+
r.push({
|
|
44
|
+
id: n,
|
|
45
|
+
email: e.user.email ?? "",
|
|
46
|
+
name: e.user.name ?? `${e.user.firstName ?? ""} ${e.user.lastName ?? ""}`.trim(),
|
|
47
|
+
avatar: e.user.avatar,
|
|
48
|
+
lastLogin: (/* @__PURE__ */ new Date()).toISOString()
|
|
49
|
+
}), localStorage.setItem(i, JSON.stringify(r));
|
|
50
|
+
} catch {}
|
|
51
|
+
sessionStorage.setItem(a, n);
|
|
52
|
+
}
|
|
53
|
+
if (e.accessToken !== void 0 || e.refreshToken !== void 0) {
|
|
54
|
+
let t = localStorage.getItem(l(n, "tokens")), r = t ? JSON.parse(t) : {}, i = r.expiresAt ?? Date.now() + 3600 * 1e3, a = e.accessToken ?? r.accessToken;
|
|
55
|
+
if (a) try {
|
|
56
|
+
let e = a.split(".")[1].replace(/-/g, "+").replace(/_/g, "/"), t = e.padEnd(Math.ceil(e.length / 4) * 4, "="), n = JSON.parse(atob(t));
|
|
57
|
+
typeof n.exp == "number" && (i = n.exp * 1e3);
|
|
58
|
+
} catch {}
|
|
59
|
+
let o = {
|
|
60
|
+
...r,
|
|
61
|
+
...e.accessToken === void 0 ? {} : { accessToken: e.accessToken },
|
|
62
|
+
...e.refreshToken === void 0 ? {} : { refreshToken: e.refreshToken },
|
|
63
|
+
expiresAt: i
|
|
64
|
+
};
|
|
65
|
+
o.accessToken ? localStorage.setItem(l(n, "tokens"), JSON.stringify(o)) : localStorage.removeItem(l(n, "tokens"));
|
|
66
|
+
}
|
|
67
|
+
e.workspaceToken !== void 0 && (e.workspaceToken ? localStorage.setItem(l(n, "workspace-token"), e.workspaceToken) : localStorage.removeItem(l(n, "workspace-token"))), d();
|
|
68
|
+
try {
|
|
69
|
+
let t = window.location.hostname, r = t.endsWith(".local.burdenoff.com") ? ".local.burdenoff.com" : void 0, i = `${r ? `; domain=${r}` : ""}; path=/; samesite=lax${window.location.protocol === "https:" ? "; secure" : ""}`;
|
|
70
|
+
if (e.accessToken && n) {
|
|
71
|
+
let e = JSON.stringify({
|
|
72
|
+
id: n,
|
|
73
|
+
origin: window.location.origin
|
|
74
|
+
});
|
|
75
|
+
document.cookie = `bf-sso=${encodeURIComponent(e)}${i}; max-age=86400`, document.cookie = `bf-sso-profile=${encodeURIComponent(e)}${i}; max-age=86400`;
|
|
76
|
+
}
|
|
77
|
+
e.clear && (document.cookie = "bf-sso=; path=/; max-age=0", document.cookie = "bf-sso-profile=; path=/; max-age=0", r && (document.cookie = `bf-sso=; path=/; domain=${r}; max-age=0`, document.cookie = `bf-sso-profile=; path=/; domain=${r}; max-age=0`), t && !["localhost", "127.0.0.1"].includes(t) && (document.cookie = `bf-sso=; path=/; domain=${t}; max-age=0`, document.cookie = `bf-sso-profile=; path=/; domain=${t}; max-age=0`));
|
|
78
|
+
} catch {}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
var p = e()(t((e) => ({
|
|
83
|
+
user: null,
|
|
84
|
+
accessToken: null,
|
|
85
|
+
refreshToken: null,
|
|
86
|
+
isAuthenticated: !1,
|
|
87
|
+
organizations: [],
|
|
88
|
+
currentOrganizationId: null,
|
|
89
|
+
isLoadingOrganizations: !1,
|
|
90
|
+
workspaces: [],
|
|
91
|
+
currentWorkspaceId: null,
|
|
92
|
+
workspaceToken: null,
|
|
93
|
+
isLoadingWorkspaces: !1,
|
|
94
|
+
projects: [],
|
|
95
|
+
currentProjectId: null,
|
|
96
|
+
isLoadingProjects: !1,
|
|
97
|
+
mfaRequired: !1,
|
|
98
|
+
mfaChallengeId: null,
|
|
99
|
+
mfaDevices: [],
|
|
100
|
+
activeSessions: [],
|
|
101
|
+
currentSessionId: null,
|
|
102
|
+
linkedAccounts: [],
|
|
103
|
+
trustedDevices: [],
|
|
104
|
+
securityEvents: [],
|
|
105
|
+
apiKeys: [],
|
|
106
|
+
apps: [],
|
|
107
|
+
currentApp: null,
|
|
108
|
+
delegations: [],
|
|
109
|
+
grantedDelegations: [],
|
|
110
|
+
isLoading: !1,
|
|
111
|
+
error: null,
|
|
112
|
+
errorCode: null,
|
|
113
|
+
setUser: (t) => {
|
|
114
|
+
e({ user: t }), f({ user: t });
|
|
115
|
+
},
|
|
116
|
+
setAccessToken: (t) => {
|
|
117
|
+
e({ accessToken: t }), f({ accessToken: t });
|
|
118
|
+
},
|
|
119
|
+
setAuthTokens: (t, n) => {
|
|
120
|
+
if (p.getState().user) e({
|
|
121
|
+
accessToken: t,
|
|
122
|
+
refreshToken: n
|
|
123
|
+
}), f({
|
|
124
|
+
accessToken: t,
|
|
125
|
+
refreshToken: n
|
|
126
|
+
});
|
|
127
|
+
else try {
|
|
128
|
+
let r = t.split(".")[1].replace(/-/g, "+").replace(/_/g, "/"), i = r.padEnd(Math.ceil(r.length / 4) * 4, "="), a = JSON.parse(atob(i)), o = {
|
|
129
|
+
id: a.sub,
|
|
130
|
+
email: a.email,
|
|
131
|
+
username: a.username,
|
|
132
|
+
role: a.role,
|
|
133
|
+
status: "ACTIVE",
|
|
134
|
+
emailVerified: !0,
|
|
135
|
+
mfaEnabled: !1,
|
|
136
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
137
|
+
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
138
|
+
};
|
|
139
|
+
e({
|
|
140
|
+
accessToken: t,
|
|
141
|
+
refreshToken: n,
|
|
142
|
+
user: o
|
|
143
|
+
}), f({
|
|
144
|
+
accessToken: t,
|
|
145
|
+
refreshToken: n,
|
|
146
|
+
user: o
|
|
147
|
+
});
|
|
148
|
+
} catch (r) {
|
|
149
|
+
console.error("[AuthStore] Failed to decode JWT:", r), e({
|
|
150
|
+
accessToken: t,
|
|
151
|
+
refreshToken: n
|
|
152
|
+
}), f({
|
|
153
|
+
accessToken: t,
|
|
154
|
+
refreshToken: n
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
setAuthenticated: (t) => e({ isAuthenticated: t }),
|
|
159
|
+
clearAuth: () => {
|
|
160
|
+
e({
|
|
161
|
+
user: null,
|
|
162
|
+
accessToken: null,
|
|
163
|
+
refreshToken: null,
|
|
164
|
+
isAuthenticated: !1,
|
|
165
|
+
mfaRequired: !1,
|
|
166
|
+
mfaChallengeId: null,
|
|
167
|
+
activeSessions: [],
|
|
168
|
+
currentSessionId: null,
|
|
169
|
+
organizations: [],
|
|
170
|
+
currentOrganizationId: null,
|
|
171
|
+
isLoadingOrganizations: !1,
|
|
172
|
+
workspaces: [],
|
|
173
|
+
workspaceToken: null,
|
|
174
|
+
currentWorkspaceId: null,
|
|
175
|
+
isLoadingWorkspaces: !1,
|
|
176
|
+
projects: [],
|
|
177
|
+
currentProjectId: null,
|
|
178
|
+
isLoadingProjects: !1
|
|
179
|
+
}), f({ clear: !0 });
|
|
180
|
+
},
|
|
181
|
+
setOrganizations: (t) => e({ organizations: t }),
|
|
182
|
+
setCurrentOrganizationId: (t) => e((e) => e.currentOrganizationId === t ? e : { currentOrganizationId: t }),
|
|
183
|
+
setLoadingOrganizations: (t) => e({ isLoadingOrganizations: t }),
|
|
184
|
+
setWorkspaces: (t) => e({ workspaces: t }),
|
|
185
|
+
setCurrentWorkspaceId: (t) => e((e) => e.currentWorkspaceId === t ? e : { currentWorkspaceId: t }),
|
|
186
|
+
setWorkspaceToken: (t) => {
|
|
187
|
+
e({ workspaceToken: t }), f({ workspaceToken: t });
|
|
188
|
+
},
|
|
189
|
+
setLoadingWorkspaces: (t) => e({ isLoadingWorkspaces: t }),
|
|
190
|
+
clearWorkspace: () => e({
|
|
191
|
+
currentWorkspaceId: null,
|
|
192
|
+
workspaceToken: null,
|
|
193
|
+
workspaces: []
|
|
194
|
+
}),
|
|
195
|
+
setProjects: (t) => e({ projects: t }),
|
|
196
|
+
setCurrentProjectId: (t) => e((e) => e.currentProjectId === t ? e : { currentProjectId: t }),
|
|
197
|
+
setLoadingProjects: (t) => e({ isLoadingProjects: t }),
|
|
198
|
+
clearProject: () => e({
|
|
199
|
+
currentProjectId: null,
|
|
200
|
+
projects: []
|
|
201
|
+
}),
|
|
202
|
+
clearContext: () => e({
|
|
203
|
+
organizations: [],
|
|
204
|
+
currentOrganizationId: null,
|
|
205
|
+
isLoadingOrganizations: !1,
|
|
206
|
+
workspaces: [],
|
|
207
|
+
currentWorkspaceId: null,
|
|
208
|
+
workspaceToken: null,
|
|
209
|
+
isLoadingWorkspaces: !1,
|
|
210
|
+
projects: [],
|
|
211
|
+
currentProjectId: null,
|
|
212
|
+
isLoadingProjects: !1
|
|
213
|
+
}),
|
|
214
|
+
loadFromProfile: (t) => {
|
|
215
|
+
let n = null, r = null, i = null, a = null;
|
|
216
|
+
try {
|
|
217
|
+
let e = localStorage.getItem(l(t, "user"));
|
|
218
|
+
e && (n = JSON.parse(e));
|
|
219
|
+
} catch {}
|
|
220
|
+
try {
|
|
221
|
+
let e = localStorage.getItem(l(t, "tokens"));
|
|
222
|
+
if (e) {
|
|
223
|
+
let t = JSON.parse(e);
|
|
224
|
+
r = t.accessToken ?? null, i = t.refreshToken ?? null;
|
|
225
|
+
}
|
|
226
|
+
} catch {}
|
|
227
|
+
a = localStorage.getItem(l(t, "workspace-token")), e({
|
|
228
|
+
user: n,
|
|
229
|
+
accessToken: r,
|
|
230
|
+
refreshToken: i,
|
|
231
|
+
isAuthenticated: !!r && !!n,
|
|
232
|
+
workspaceToken: a,
|
|
233
|
+
organizations: [],
|
|
234
|
+
currentOrganizationId: null,
|
|
235
|
+
isLoadingOrganizations: !1,
|
|
236
|
+
workspaces: [],
|
|
237
|
+
currentWorkspaceId: null,
|
|
238
|
+
isLoadingWorkspaces: !1,
|
|
239
|
+
projects: [],
|
|
240
|
+
currentProjectId: null,
|
|
241
|
+
isLoadingProjects: !1,
|
|
242
|
+
mfaRequired: !1,
|
|
243
|
+
mfaChallengeId: null
|
|
244
|
+
}), d();
|
|
245
|
+
},
|
|
246
|
+
setMfaRequired: (t, n) => e({
|
|
247
|
+
mfaRequired: t,
|
|
248
|
+
mfaChallengeId: n || null
|
|
249
|
+
}),
|
|
250
|
+
setMfaDevices: (t) => e({ mfaDevices: t }),
|
|
251
|
+
removeMfaDevice: (t) => e((e) => ({ mfaDevices: e.mfaDevices.filter((e) => e.id !== t) })),
|
|
252
|
+
setActiveSessions: (t) => e({ activeSessions: t }),
|
|
253
|
+
removeSession: (t) => e((e) => ({ activeSessions: e.activeSessions.filter((e) => e.id !== t) })),
|
|
254
|
+
setLinkedAccounts: (t) => e({ linkedAccounts: t }),
|
|
255
|
+
removeLinkedAccount: (t) => e((e) => ({ linkedAccounts: e.linkedAccounts.filter((e) => e.id !== t) })),
|
|
256
|
+
setTrustedDevices: (t) => e({ trustedDevices: t }),
|
|
257
|
+
removeTrustedDevice: (t) => e((e) => ({ trustedDevices: e.trustedDevices.filter((e) => e.id !== t) })),
|
|
258
|
+
setSecurityEvents: (t) => e({ securityEvents: t }),
|
|
259
|
+
setApiKeys: (t) => e({ apiKeys: t }),
|
|
260
|
+
removeApiKey: (t) => e((e) => ({ apiKeys: e.apiKeys.filter((e) => e.id !== t) })),
|
|
261
|
+
setApps: (t) => e({ apps: t }),
|
|
262
|
+
setCurrentApp: (t) => e({ currentApp: t }),
|
|
263
|
+
addApp: (t) => e((e) => ({ apps: [...e.apps, t] })),
|
|
264
|
+
updateApp: (t) => e((e) => ({
|
|
265
|
+
apps: e.apps.map((e) => e.id === t.id ? t : e),
|
|
266
|
+
currentApp: e.currentApp?.id === t.id ? t : e.currentApp
|
|
267
|
+
})),
|
|
268
|
+
removeApp: (t) => e((e) => ({
|
|
269
|
+
apps: e.apps.filter((e) => e.id !== t),
|
|
270
|
+
currentApp: e.currentApp?.id === t ? null : e.currentApp
|
|
271
|
+
})),
|
|
272
|
+
setDelegations: (t) => e({ delegations: t }),
|
|
273
|
+
setGrantedDelegations: (t) => e({ grantedDelegations: t }),
|
|
274
|
+
addDelegation: (t) => e((e) => ({ delegations: [...e.delegations, t] })),
|
|
275
|
+
removeDelegation: (t) => e((e) => ({
|
|
276
|
+
delegations: e.delegations.filter((e) => e.id !== t),
|
|
277
|
+
grantedDelegations: e.grantedDelegations.filter((e) => e.id !== t)
|
|
278
|
+
})),
|
|
279
|
+
setLoading: (t) => e({ isLoading: t }),
|
|
280
|
+
setError: (t, n) => e({
|
|
281
|
+
error: t,
|
|
282
|
+
errorCode: n ?? null
|
|
283
|
+
})
|
|
284
|
+
}), {
|
|
285
|
+
name: "auth-storage",
|
|
286
|
+
storage: n(),
|
|
287
|
+
partialize: (e) => ({
|
|
288
|
+
accessToken: e.accessToken,
|
|
289
|
+
refreshToken: e.refreshToken,
|
|
290
|
+
user: e.user,
|
|
291
|
+
isAuthenticated: e.isAuthenticated,
|
|
292
|
+
currentOrganizationId: e.currentOrganizationId,
|
|
293
|
+
currentWorkspaceId: e.currentWorkspaceId,
|
|
294
|
+
currentProjectId: e.currentProjectId,
|
|
295
|
+
workspaceToken: e.workspaceToken,
|
|
296
|
+
mfaRequired: e.mfaRequired,
|
|
297
|
+
mfaChallengeId: e.mfaChallengeId
|
|
298
|
+
})
|
|
299
|
+
}));
|
|
300
|
+
if (typeof window < "u") {
|
|
301
|
+
let e = window;
|
|
302
|
+
e.__bfAuthClearListenerInstalled || (e.__bfAuthClearListenerInstalled = !0, window.addEventListener(s, () => {
|
|
303
|
+
let e = p.getState();
|
|
304
|
+
if (e.isAuthenticated || e.accessToken || e.refreshToken || e.user) {
|
|
305
|
+
e.clearAuth();
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
u(sessionStorage.getItem(a));
|
|
309
|
+
}));
|
|
310
|
+
}
|
|
311
|
+
//#endregion
|
|
312
|
+
export { p as useAuthStore };
|
|
313
|
+
|
|
314
|
+
//# sourceMappingURL=authStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authStore.js","names":[],"sources":["../../../src/auth/store/authStore.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { persist } from \"zustand/middleware\";\nimport { createProfileScopedStorage } from \"@burdenoff/fe-libs/shared/utils\";\nimport type {\n User,\n Session,\n MfaDevice,\n OAuthAccount,\n TrustedDevice,\n SecurityAudit,\n ApiKey,\n App,\n AppUserDelegation,\n Workspace,\n Organization,\n Project,\n} from \"../types\";\n\n/**\n * Sync auth state to profile-scoped storage (ProfileStorageManager keys).\n * The active profile ID comes from sessionStorage (\"bf-active-profile\").\n * Data is stored under localStorage keys: bf-p-{profileId}-user, bf-p-{profileId}-tokens, etc.\n */\nconst BF_PREFIX = \"bf-p\";\nconst BF_PROFILES = \"bf-profiles\";\nconst BF_ACTIVE = \"bf-active-profile\";\nconst AUTH_STORAGE_KEY = \"auth-storage\";\nconst AUTH_STATE_CLEARED_EVENT = \"bf-auth-state-cleared\";\n\nfunction getActiveProfileForSync(): string | null {\n return sessionStorage.getItem(BF_ACTIVE);\n}\n\nfunction pfKey(profileId: string, suffix: string): string {\n return `${BF_PREFIX}-${profileId}-${suffix}`;\n}\n\nfunction clearPersistedAuthStorage(profileId?: string | null): void {\n localStorage.removeItem(AUTH_STORAGE_KEY);\n if (profileId) {\n localStorage.removeItem(pfKey(profileId, AUTH_STORAGE_KEY));\n }\n for (const key of Object.keys(localStorage)) {\n if (\n key.startsWith(`${BF_PREFIX}-`) &&\n key.endsWith(`-${AUTH_STORAGE_KEY}`)\n ) {\n localStorage.removeItem(key);\n }\n }\n}\n\ninterface ProfileMeta {\n id: string;\n email: string;\n name: string;\n avatar?: string;\n lastLogin: string;\n}\n\n/** Dispatch custom event to notify fe-libs AuthProvider of storage changes (same-tab). */\nfunction notifyProfileStorageChange(): void {\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(new Event(\"bf-profile-storage-change\"));\n }\n}\n\nfunction syncToProfileStorage(data: {\n user?: User | null;\n accessToken?: string | null;\n refreshToken?: string | null;\n workspaceToken?: string | null;\n clear?: boolean;\n}) {\n if (typeof window === \"undefined\") return;\n\n const profileId = getActiveProfileForSync();\n if (!profileId && !data.user && !data.clear) return;\n\n // For login/signup: prefer the user's own ID as the target profile.\n // This prevents overwriting an existing active profile when a NEW user\n // signs up or logs in (multi-account scenario).\n const targetId = data.user?.id ?? profileId;\n if (!targetId && !data.clear) return;\n\n if (data.clear) {\n clearPersistedAuthStorage(targetId);\n if (!targetId) {\n localStorage.removeItem(BF_PROFILES);\n sessionStorage.removeItem(BF_ACTIVE);\n return;\n }\n // Remove profile data keys\n localStorage.removeItem(pfKey(targetId, \"user\"));\n localStorage.removeItem(pfKey(targetId, \"tokens\"));\n localStorage.removeItem(pfKey(targetId, \"workspace-token\"));\n // Remove from profiles list\n try {\n const profilesRaw = localStorage.getItem(BF_PROFILES);\n const profiles: ProfileMeta[] = profilesRaw\n ? JSON.parse(profilesRaw)\n : [];\n const filtered = profiles.filter((p) => p.id !== targetId);\n localStorage.setItem(BF_PROFILES, JSON.stringify(filtered));\n } catch {\n /* ignore */\n }\n sessionStorage.removeItem(BF_ACTIVE);\n return;\n }\n\n if (!targetId) return;\n\n if (data.user) {\n localStorage.setItem(pfKey(targetId, \"user\"), JSON.stringify(data.user));\n // Update profiles list\n try {\n const profilesRaw = localStorage.getItem(BF_PROFILES);\n const profiles: ProfileMeta[] = profilesRaw\n ? JSON.parse(profilesRaw)\n : [];\n const existing = profiles.filter((p) => p.id !== targetId);\n existing.push({\n id: targetId,\n email: data.user.email ?? \"\",\n name:\n data.user.name ??\n `${data.user.firstName ?? \"\"} ${data.user.lastName ?? \"\"}`.trim(),\n avatar: data.user.avatar,\n lastLogin: new Date().toISOString(),\n });\n localStorage.setItem(BF_PROFILES, JSON.stringify(existing));\n } catch {\n /* ignore */\n }\n // Set as active profile in this tab\n sessionStorage.setItem(BF_ACTIVE, targetId);\n }\n\n if (data.accessToken !== undefined || data.refreshToken !== undefined) {\n const existingRaw = localStorage.getItem(pfKey(targetId, \"tokens\"));\n const existing = existingRaw ? JSON.parse(existingRaw) : {};\n // Compute expiresAt from the actual JWT exp claim if a new access token is provided\n let expiresAt = existing.expiresAt ?? Date.now() + 60 * 60 * 1000;\n const tokenToCheck = data.accessToken ?? existing.accessToken;\n if (tokenToCheck) {\n try {\n const raw = tokenToCheck\n .split(\".\")[1]\n .replace(/-/g, \"+\")\n .replace(/_/g, \"/\");\n const padded = raw.padEnd(Math.ceil(raw.length / 4) * 4, \"=\");\n const payload = JSON.parse(atob(padded));\n if (typeof payload.exp === \"number\") {\n expiresAt = payload.exp * 1000; // JWT exp is in seconds → ms\n }\n } catch {\n // Fallback: keep existing or default 1h\n }\n }\n const merged = {\n ...existing,\n ...(data.accessToken !== undefined\n ? { accessToken: data.accessToken }\n : {}),\n ...(data.refreshToken !== undefined\n ? { refreshToken: data.refreshToken }\n : {}),\n expiresAt,\n };\n if (merged.accessToken) {\n localStorage.setItem(pfKey(targetId, \"tokens\"), JSON.stringify(merged));\n } else {\n localStorage.removeItem(pfKey(targetId, \"tokens\"));\n }\n }\n\n if (data.workspaceToken !== undefined) {\n if (data.workspaceToken) {\n localStorage.setItem(\n pfKey(targetId, \"workspace-token\"),\n data.workspaceToken,\n );\n } else {\n localStorage.removeItem(pfKey(targetId, \"workspace-token\"));\n }\n }\n\n // Notify fe-libs AuthProvider of the change (same-tab custom event)\n notifyProfileStorageChange();\n\n // Set SSO cookie for cross-domain session sharing (works in all envs)\n // Stores profile ID + the origin where the user logged in.\n // Other shells use the origin to redirect to /auth/sso-relay for token relay.\n try {\n const hostname = window.location.hostname;\n // For local dev, set cookie on shared .local.burdenoff.com domain\n // For production, set cookie on current domain only (relay handles cross-domain)\n const isSharedDomain = hostname.endsWith(\".local.burdenoff.com\");\n const domain = isSharedDomain ? \".local.burdenoff.com\" : undefined;\n const domainPart = domain ? `; domain=${domain}` : \"\";\n const securePart = window.location.protocol === \"https:\" ? \"; secure\" : \"\";\n const cookieOpts = `${domainPart}; path=/; samesite=lax${securePart}`;\n\n if (data.accessToken && targetId) {\n // Store profile ID + login origin for SSO relay\n const ssoValue = JSON.stringify({\n id: targetId,\n origin: window.location.origin,\n });\n document.cookie = `bf-sso=${encodeURIComponent(ssoValue)}${cookieOpts}; max-age=86400`;\n document.cookie = `bf-sso-profile=${encodeURIComponent(ssoValue)}${cookieOpts}; max-age=86400`;\n }\n\n if (data.clear) {\n document.cookie = \"bf-sso=; path=/; max-age=0\";\n document.cookie = \"bf-sso-profile=; path=/; max-age=0\";\n if (domain) {\n document.cookie = `bf-sso=; path=/; domain=${domain}; max-age=0`;\n document.cookie = `bf-sso-profile=; path=/; domain=${domain}; max-age=0`;\n }\n if (hostname && ![\"localhost\", \"127.0.0.1\"].includes(hostname)) {\n document.cookie = `bf-sso=; path=/; domain=${hostname}; max-age=0`;\n document.cookie = `bf-sso-profile=; path=/; domain=${hostname}; max-age=0`;\n }\n }\n } catch {\n /* ignore */\n }\n}\n\ninterface AuthState {\n // Auth state\n user: User | null;\n accessToken: string | null;\n refreshToken: string | null;\n isAuthenticated: boolean;\n\n // Organization state\n organizations: Organization[];\n currentOrganizationId: string | null;\n isLoadingOrganizations: boolean;\n\n // Workspace state\n workspaces: Workspace[];\n currentWorkspaceId: string | null;\n workspaceToken: string | null;\n isLoadingWorkspaces: boolean;\n\n // Project state\n projects: Project[];\n currentProjectId: string | null;\n isLoadingProjects: boolean;\n\n // MFA state\n mfaRequired: boolean;\n mfaChallengeId: string | null;\n mfaDevices: MfaDevice[];\n\n // Session state\n activeSessions: Session[];\n currentSessionId: string | null;\n\n // OAuth state\n linkedAccounts: OAuthAccount[];\n\n // Security state\n trustedDevices: TrustedDevice[];\n securityEvents: SecurityAudit[];\n\n // API Keys state\n apiKeys: ApiKey[];\n\n // Apps state\n apps: App[];\n currentApp: App | null;\n\n // Delegations state\n delegations: AppUserDelegation[];\n grantedDelegations: AppUserDelegation[];\n\n // UI state\n isLoading: boolean;\n error: string | null;\n errorCode: string | null;\n\n // Actions - Auth\n setUser: (user: User | null) => void;\n setAccessToken: (token: string | null) => void;\n setAuthTokens: (accessToken: string, refreshToken: string) => void;\n setAuthenticated: (isAuthenticated: boolean) => void;\n clearAuth: () => void;\n\n // Actions - Organization\n setOrganizations: (organizations: Organization[]) => void;\n setCurrentOrganizationId: (orgId: string | null) => void;\n setLoadingOrganizations: (loading: boolean) => void;\n\n // Actions - Workspace\n setWorkspaces: (workspaces: Workspace[]) => void;\n setCurrentWorkspaceId: (workspaceId: string | null) => void;\n setWorkspaceToken: (token: string | null) => void;\n setLoadingWorkspaces: (loading: boolean) => void;\n clearWorkspace: () => void;\n\n // Actions - Project\n setProjects: (projects: Project[]) => void;\n setCurrentProjectId: (projectId: string | null) => void;\n setLoadingProjects: (loading: boolean) => void;\n clearProject: () => void;\n\n // Actions - Context (clears org, workspace, project)\n clearContext: () => void;\n\n // Actions - Profile Switch (load from profile storage without syncing back)\n loadFromProfile: (profileId: string) => void;\n\n // Actions - MFA\n setMfaRequired: (required: boolean, challengeId?: string) => void;\n setMfaDevices: (devices: MfaDevice[]) => void;\n removeMfaDevice: (deviceId: string) => void;\n\n // Actions - Sessions\n setActiveSessions: (sessions: Session[]) => void;\n removeSession: (sessionId: string) => void;\n\n // Actions - OAuth\n setLinkedAccounts: (accounts: OAuthAccount[]) => void;\n removeLinkedAccount: (accountId: string) => void;\n\n // Actions - Security\n setTrustedDevices: (devices: TrustedDevice[]) => void;\n removeTrustedDevice: (deviceId: string) => void;\n setSecurityEvents: (events: SecurityAudit[]) => void;\n\n // Actions - API Keys\n setApiKeys: (keys: ApiKey[]) => void;\n removeApiKey: (keyId: string) => void;\n\n // Actions - Apps\n setApps: (apps: App[]) => void;\n setCurrentApp: (app: App | null) => void;\n addApp: (app: App) => void;\n updateApp: (app: App) => void;\n removeApp: (appId: string) => void;\n\n // Actions - Delegations\n setDelegations: (delegations: AppUserDelegation[]) => void;\n setGrantedDelegations: (delegations: AppUserDelegation[]) => void;\n addDelegation: (delegation: AppUserDelegation) => void;\n removeDelegation: (delegationId: string) => void;\n\n // Actions - UI\n setLoading: (loading: boolean) => void;\n setError: (error: string | null, errorCode?: string | null) => void;\n}\n\nexport const useAuthStore = create<AuthState>()(\n persist(\n (set) => ({\n // Initial state\n user: null,\n accessToken: null,\n refreshToken: null,\n isAuthenticated: false,\n organizations: [],\n currentOrganizationId: null,\n isLoadingOrganizations: false,\n workspaces: [],\n currentWorkspaceId: null,\n workspaceToken: null,\n isLoadingWorkspaces: false,\n projects: [],\n currentProjectId: null,\n isLoadingProjects: false,\n mfaRequired: false,\n mfaChallengeId: null,\n mfaDevices: [],\n activeSessions: [],\n currentSessionId: null,\n linkedAccounts: [],\n trustedDevices: [],\n securityEvents: [],\n apiKeys: [],\n apps: [],\n currentApp: null,\n delegations: [],\n grantedDelegations: [],\n isLoading: false,\n error: null,\n errorCode: null,\n\n // Actions - Auth (with profile storage sync)\n setUser: (user) => {\n set({ user });\n syncToProfileStorage({ user });\n },\n\n setAccessToken: (token) => {\n set({ accessToken: token });\n syncToProfileStorage({ accessToken: token });\n },\n\n setAuthTokens: (accessToken, refreshToken) => {\n // Only set tokens here. Do NOT overwrite user — setUser() handles that\n // with the full user object from the GraphQL response (firstName, lastName, etc.).\n // Fall back to JWT-decoded user ONLY if no user is currently in the store.\n const currentState = useAuthStore.getState();\n if (currentState.user) {\n // User already set (from setUser call) — just update tokens\n set({ accessToken, refreshToken });\n syncToProfileStorage({ accessToken, refreshToken });\n } else {\n // No user yet — decode JWT as fallback\n try {\n const b64 = accessToken\n .split(\".\")[1]\n .replace(/-/g, \"+\")\n .replace(/_/g, \"/\");\n const padded = b64.padEnd(Math.ceil(b64.length / 4) * 4, \"=\");\n const payload = JSON.parse(atob(padded));\n const user: User = {\n id: payload.sub,\n email: payload.email,\n username: payload.username,\n role: payload.role,\n status: \"ACTIVE\",\n emailVerified: true,\n mfaEnabled: false,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n set({ accessToken, refreshToken, user });\n syncToProfileStorage({ accessToken, refreshToken, user });\n } catch (error) {\n console.error(\"[AuthStore] Failed to decode JWT:\", error);\n set({ accessToken, refreshToken });\n syncToProfileStorage({ accessToken, refreshToken });\n }\n }\n },\n\n setAuthenticated: (isAuthenticated) => set({ isAuthenticated }),\n\n clearAuth: () => {\n set({\n user: null,\n accessToken: null,\n refreshToken: null,\n isAuthenticated: false,\n mfaRequired: false,\n mfaChallengeId: null,\n activeSessions: [],\n currentSessionId: null,\n organizations: [],\n currentOrganizationId: null,\n isLoadingOrganizations: false,\n workspaces: [],\n workspaceToken: null,\n currentWorkspaceId: null,\n isLoadingWorkspaces: false,\n projects: [],\n currentProjectId: null,\n isLoadingProjects: false,\n });\n syncToProfileStorage({ clear: true });\n },\n\n // Actions - Organization\n setOrganizations: (organizations) => set({ organizations }),\n\n setCurrentOrganizationId: (orgId) =>\n set((state) =>\n state.currentOrganizationId === orgId\n ? state\n : { currentOrganizationId: orgId },\n ),\n\n setLoadingOrganizations: (loading) =>\n set({ isLoadingOrganizations: loading }),\n\n // Actions - Workspace\n setWorkspaces: (workspaces) => set({ workspaces }),\n\n setCurrentWorkspaceId: (workspaceId) =>\n set((state) =>\n state.currentWorkspaceId === workspaceId\n ? state\n : { currentWorkspaceId: workspaceId },\n ),\n\n setWorkspaceToken: (token) => {\n set({ workspaceToken: token });\n syncToProfileStorage({ workspaceToken: token });\n },\n\n setLoadingWorkspaces: (loading) => set({ isLoadingWorkspaces: loading }),\n\n clearWorkspace: () =>\n set({ currentWorkspaceId: null, workspaceToken: null, workspaces: [] }),\n\n // Actions - Project\n setProjects: (projects) => set({ projects }),\n\n setCurrentProjectId: (projectId) =>\n set((state) =>\n state.currentProjectId === projectId\n ? state\n : { currentProjectId: projectId },\n ),\n\n setLoadingProjects: (loading) => set({ isLoadingProjects: loading }),\n\n clearProject: () => set({ currentProjectId: null, projects: [] }),\n\n // Actions - Context (clears org, workspace, project)\n clearContext: () =>\n set({\n organizations: [],\n currentOrganizationId: null,\n isLoadingOrganizations: false,\n workspaces: [],\n currentWorkspaceId: null,\n workspaceToken: null,\n isLoadingWorkspaces: false,\n projects: [],\n currentProjectId: null,\n isLoadingProjects: false,\n }),\n\n // Actions - Profile Switch\n // Loads user/tokens from profile-scoped localStorage WITHOUT syncing back.\n // Used during account switching to align zustand with the new active profile.\n loadFromProfile: (profileId: string) => {\n let user: User | null = null;\n let accessToken: string | null = null;\n let refreshToken: string | null = null;\n let workspaceToken: string | null = null;\n\n try {\n const userRaw = localStorage.getItem(pfKey(profileId, \"user\"));\n if (userRaw) user = JSON.parse(userRaw);\n } catch {\n /* ignore */\n }\n\n try {\n const tokensRaw = localStorage.getItem(pfKey(profileId, \"tokens\"));\n if (tokensRaw) {\n const tokens = JSON.parse(tokensRaw);\n accessToken = tokens.accessToken ?? null;\n refreshToken = tokens.refreshToken ?? null;\n }\n } catch {\n /* ignore */\n }\n\n workspaceToken = localStorage.getItem(\n pfKey(profileId, \"workspace-token\"),\n );\n\n // Set everything in one batch — clears context data so it will be re-fetched\n set({\n user,\n accessToken,\n refreshToken,\n isAuthenticated: !!accessToken && !!user,\n workspaceToken,\n // Clear all context — will be re-fetched for the new user\n organizations: [],\n currentOrganizationId: null,\n isLoadingOrganizations: false,\n workspaces: [],\n currentWorkspaceId: null,\n isLoadingWorkspaces: false,\n projects: [],\n currentProjectId: null,\n isLoadingProjects: false,\n // Clear MFA state\n mfaRequired: false,\n mfaChallengeId: null,\n });\n\n // Notify listeners (e.g., AuthTokenProvider) without writing back to storage\n notifyProfileStorageChange();\n },\n\n // Actions - MFA\n setMfaRequired: (required, challengeId) =>\n set({ mfaRequired: required, mfaChallengeId: challengeId || null }),\n\n setMfaDevices: (devices) => set({ mfaDevices: devices }),\n\n removeMfaDevice: (deviceId) =>\n set((state) => ({\n mfaDevices: state.mfaDevices.filter((d) => d.id !== deviceId),\n })),\n\n // Actions - Sessions\n setActiveSessions: (sessions) => set({ activeSessions: sessions }),\n\n removeSession: (sessionId) =>\n set((state) => ({\n activeSessions: state.activeSessions.filter(\n (s) => s.id !== sessionId,\n ),\n })),\n\n // Actions - OAuth\n setLinkedAccounts: (accounts) => set({ linkedAccounts: accounts }),\n\n removeLinkedAccount: (accountId) =>\n set((state) => ({\n linkedAccounts: state.linkedAccounts.filter(\n (a) => a.id !== accountId,\n ),\n })),\n\n // Actions - Security\n setTrustedDevices: (devices) => set({ trustedDevices: devices }),\n\n removeTrustedDevice: (deviceId) =>\n set((state) => ({\n trustedDevices: state.trustedDevices.filter((d) => d.id !== deviceId),\n })),\n\n setSecurityEvents: (events) => set({ securityEvents: events }),\n\n // Actions - API Keys\n setApiKeys: (keys) => set({ apiKeys: keys }),\n\n removeApiKey: (keyId) =>\n set((state) => ({\n apiKeys: state.apiKeys.filter((k) => k.id !== keyId),\n })),\n\n // Actions - Apps\n setApps: (apps) => set({ apps }),\n\n setCurrentApp: (app) => set({ currentApp: app }),\n\n addApp: (app) =>\n set((state) => ({\n apps: [...state.apps, app],\n })),\n\n updateApp: (app) =>\n set((state) => ({\n apps: state.apps.map((a) => (a.id === app.id ? app : a)),\n currentApp: state.currentApp?.id === app.id ? app : state.currentApp,\n })),\n\n removeApp: (appId) =>\n set((state) => ({\n apps: state.apps.filter((a) => a.id !== appId),\n currentApp: state.currentApp?.id === appId ? null : state.currentApp,\n })),\n\n // Actions - Delegations\n setDelegations: (delegations) => set({ delegations }),\n\n setGrantedDelegations: (delegations) =>\n set({ grantedDelegations: delegations }),\n\n addDelegation: (delegation) =>\n set((state) => ({\n delegations: [...state.delegations, delegation],\n })),\n\n removeDelegation: (delegationId) =>\n set((state) => ({\n delegations: state.delegations.filter((d) => d.id !== delegationId),\n grantedDelegations: state.grantedDelegations.filter(\n (d) => d.id !== delegationId,\n ),\n })),\n\n // Actions - UI\n setLoading: (loading) => set({ isLoading: loading }),\n\n setError: (error, errorCode) =>\n set({ error, errorCode: errorCode ?? null }),\n }),\n {\n name: \"auth-storage\",\n storage: createProfileScopedStorage(),\n partialize: (state) => ({\n accessToken: state.accessToken,\n refreshToken: state.refreshToken,\n user: state.user,\n isAuthenticated: state.isAuthenticated,\n // Context state\n currentOrganizationId: state.currentOrganizationId,\n currentWorkspaceId: state.currentWorkspaceId,\n currentProjectId: state.currentProjectId,\n workspaceToken: state.workspaceToken,\n // MFA state must be persisted for login verification flow\n mfaRequired: state.mfaRequired,\n mfaChallengeId: state.mfaChallengeId,\n }),\n },\n ),\n);\n\ntype AuthClearWindow = Window & { __bfAuthClearListenerInstalled?: boolean };\n\nif (typeof window !== \"undefined\") {\n const authWindow = window as AuthClearWindow;\n if (!authWindow.__bfAuthClearListenerInstalled) {\n authWindow.__bfAuthClearListenerInstalled = true;\n window.addEventListener(AUTH_STATE_CLEARED_EVENT, () => {\n const state = useAuthStore.getState();\n if (\n state.isAuthenticated ||\n state.accessToken ||\n state.refreshToken ||\n state.user\n ) {\n state.clearAuth();\n return;\n }\n clearPersistedAuthStorage(sessionStorage.getItem(BF_ACTIVE));\n });\n }\n}\n"],"mappings":"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"}
|