@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,338 @@
|
|
|
1
|
+
import { useAuthStore as e } from "../store/authStore.js";
|
|
2
|
+
import { useUserOperations as t } from "../hooks/useUserOperations.js";
|
|
3
|
+
import { useAuthPermissions as n } from "../hooks/useAuthPermissions.js";
|
|
4
|
+
import "../hooks/index.js";
|
|
5
|
+
import { AlertIcon as r, SpinnerIcon as i } from "../components/AuthIcons.js";
|
|
6
|
+
import { ConfirmActionDialog as a } from "../components/ConfirmActionDialog.js";
|
|
7
|
+
import { useEffect as o, useState as s } from "react";
|
|
8
|
+
import { useNavigate as c, useParams as l } from "react-router-dom";
|
|
9
|
+
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
10
|
+
//#region src/auth/pages/UserDetailsPage.tsx
|
|
11
|
+
var f = [
|
|
12
|
+
"SUPER_ADMIN",
|
|
13
|
+
"TENANT_ADMIN",
|
|
14
|
+
"ORG_ADMIN"
|
|
15
|
+
], p = (e) => {
|
|
16
|
+
switch (e) {
|
|
17
|
+
case "SUPER_ADMIN": return "bg-accent-purple-subtle text-accent-purple";
|
|
18
|
+
case "TENANT_ADMIN": return "bg-status-info-bg-subtle text-status-info-text";
|
|
19
|
+
case "ORG_ADMIN": return "bg-accent-indigo-subtle text-accent-indigo";
|
|
20
|
+
case "WORKSPACE_ADMIN": return "bg-accent-cyan-subtle text-accent-cyan";
|
|
21
|
+
case "MEMBER": return "bg-status-success-bg-subtle text-status-success-text";
|
|
22
|
+
case "GUEST": return "bg-bg-sunken text-text-primary";
|
|
23
|
+
default: return "bg-bg-sunken text-text-primary";
|
|
24
|
+
}
|
|
25
|
+
}, m = (e) => {
|
|
26
|
+
switch (e) {
|
|
27
|
+
case "ACTIVE": return "bg-status-success-bg-subtle text-status-success-text";
|
|
28
|
+
case "INACTIVE": return "bg-status-warning-bg-subtle text-status-warning-text";
|
|
29
|
+
case "SUSPENDED": return "bg-status-warning-bg-subtle text-status-warning-text";
|
|
30
|
+
case "DELETED": return "bg-status-error-bg-subtle text-status-error-text";
|
|
31
|
+
default: return "bg-bg-sunken text-text-primary";
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
function h() {
|
|
35
|
+
let { id: h } = l(), g = c(), _ = e((e) => e.isAuthenticated), v = e((e) => e.user), { canViewUsers: y, canDeleteUsers: b, isLoading: x } = n(), { getUser: S, deleteUser: C, hardDeleteUser: w } = t(), [T, E] = s(null), [D, O] = s(!0), [k, A] = s(null), [j, M] = s(null), [N, P] = s(null);
|
|
36
|
+
o(() => {
|
|
37
|
+
let e = !1;
|
|
38
|
+
if (!h) {
|
|
39
|
+
A("Missing user id"), O(!1);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (!_) {
|
|
43
|
+
O(!1);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
return O(!0), A(null), S(h).then((t) => {
|
|
47
|
+
e || (t ? E(t) : A("User not found"));
|
|
48
|
+
}).catch((t) => {
|
|
49
|
+
e || A(t instanceof Error ? t.message : "Failed to fetch user details");
|
|
50
|
+
}).finally(() => {
|
|
51
|
+
e || O(!1);
|
|
52
|
+
}), () => {
|
|
53
|
+
e = !0;
|
|
54
|
+
};
|
|
55
|
+
}, [
|
|
56
|
+
h,
|
|
57
|
+
S,
|
|
58
|
+
_
|
|
59
|
+
]);
|
|
60
|
+
let F = async () => {
|
|
61
|
+
if (T) try {
|
|
62
|
+
let e = await C(T.id);
|
|
63
|
+
if (e.success) {
|
|
64
|
+
M(`User "${T.email}" has been deactivated.`), P(null);
|
|
65
|
+
let e = await S(T.id);
|
|
66
|
+
e && E(e);
|
|
67
|
+
} else A(e.message);
|
|
68
|
+
} catch (e) {
|
|
69
|
+
A(e instanceof Error ? e.message : "Failed to delete user");
|
|
70
|
+
}
|
|
71
|
+
}, I = async () => {
|
|
72
|
+
if (T) try {
|
|
73
|
+
let e = await w(T.id);
|
|
74
|
+
e.success ? (P(null), g("/auth/users")) : A(e.message);
|
|
75
|
+
} catch (e) {
|
|
76
|
+
A(e instanceof Error ? e.message : "Failed to hard delete user");
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
return _ ? v && !f.includes(v.role) ? /* @__PURE__ */ u("div", {
|
|
80
|
+
className: "max-w-4xl mx-auto p-6",
|
|
81
|
+
children: /* @__PURE__ */ d("div", {
|
|
82
|
+
className: "text-center py-16 border-2 border-dashed border-border-subtle rounded-xl",
|
|
83
|
+
children: [/* @__PURE__ */ u("h2", {
|
|
84
|
+
className: "text-xl font-semibold text-text-primary mb-2",
|
|
85
|
+
children: "You are not allowed to access this page"
|
|
86
|
+
}), /* @__PURE__ */ u("p", {
|
|
87
|
+
className: "text-text-secondary",
|
|
88
|
+
children: "This page is restricted to administrators only."
|
|
89
|
+
})]
|
|
90
|
+
})
|
|
91
|
+
}) : x || D ? /* @__PURE__ */ u("div", {
|
|
92
|
+
className: "max-w-4xl mx-auto p-6",
|
|
93
|
+
children: /* @__PURE__ */ d("div", {
|
|
94
|
+
className: "text-center py-16",
|
|
95
|
+
children: [/* @__PURE__ */ u(i, { className: "w-8 h-8 mx-auto text-text-secondary animate-spin" }), /* @__PURE__ */ u("p", {
|
|
96
|
+
className: "mt-4 text-text-secondary",
|
|
97
|
+
children: "Loading user..."
|
|
98
|
+
})]
|
|
99
|
+
})
|
|
100
|
+
}) : y ? k || !T ? /* @__PURE__ */ d("div", {
|
|
101
|
+
className: "max-w-4xl mx-auto p-6",
|
|
102
|
+
children: [/* @__PURE__ */ d("button", {
|
|
103
|
+
onClick: () => g("/auth/users"),
|
|
104
|
+
className: "mb-6 flex items-center gap-2 text-text-link hover:underline font-medium",
|
|
105
|
+
children: [/* @__PURE__ */ u("svg", {
|
|
106
|
+
className: "w-4 h-4",
|
|
107
|
+
fill: "none",
|
|
108
|
+
viewBox: "0 0 24 24",
|
|
109
|
+
stroke: "currentColor",
|
|
110
|
+
children: /* @__PURE__ */ u("path", {
|
|
111
|
+
strokeLinecap: "round",
|
|
112
|
+
strokeLinejoin: "round",
|
|
113
|
+
strokeWidth: 2,
|
|
114
|
+
d: "M10 19l-7-7m0 0l7-7m-7 7h18"
|
|
115
|
+
})
|
|
116
|
+
}), "Back to Users"]
|
|
117
|
+
}), /* @__PURE__ */ d("div", {
|
|
118
|
+
className: "flex items-start gap-3 p-4 rounded-xl bg-status-error-bg-subtle border border-status-error-border",
|
|
119
|
+
children: [/* @__PURE__ */ u(r, { className: "w-5 h-5 text-status-error-text flex-shrink-0 mt-0.5" }), /* @__PURE__ */ u("p", {
|
|
120
|
+
className: "text-sm text-status-error-text",
|
|
121
|
+
children: k || "User not found"
|
|
122
|
+
})]
|
|
123
|
+
})]
|
|
124
|
+
}) : /* @__PURE__ */ d("div", {
|
|
125
|
+
className: "max-w-4xl mx-auto p-6",
|
|
126
|
+
children: [
|
|
127
|
+
/* @__PURE__ */ u(a, {
|
|
128
|
+
open: N !== null,
|
|
129
|
+
onOpenChange: (e) => {
|
|
130
|
+
e || P(null);
|
|
131
|
+
},
|
|
132
|
+
title: N === "hard-delete" ? "Permanently delete user?" : "Deactivate user?",
|
|
133
|
+
description: N === "hard-delete" ? `This permanently deletes "${T.email}" and cannot be undone.` : `"${T.email}" will be prevented from signing in until reactivated.`,
|
|
134
|
+
confirmText: N === "hard-delete" ? "Delete permanently" : "Deactivate user",
|
|
135
|
+
variant: N === "hard-delete" ? "danger" : "warning",
|
|
136
|
+
onConfirm: async () => {
|
|
137
|
+
N === "hard-delete" ? await I() : N === "deactivate" && await F();
|
|
138
|
+
}
|
|
139
|
+
}),
|
|
140
|
+
/* @__PURE__ */ d("button", {
|
|
141
|
+
onClick: () => g("/auth/users"),
|
|
142
|
+
className: "mb-6 flex items-center gap-2 text-text-link hover:underline font-medium",
|
|
143
|
+
children: [/* @__PURE__ */ u("svg", {
|
|
144
|
+
className: "w-4 h-4",
|
|
145
|
+
fill: "none",
|
|
146
|
+
viewBox: "0 0 24 24",
|
|
147
|
+
stroke: "currentColor",
|
|
148
|
+
children: /* @__PURE__ */ u("path", {
|
|
149
|
+
strokeLinecap: "round",
|
|
150
|
+
strokeLinejoin: "round",
|
|
151
|
+
strokeWidth: 2,
|
|
152
|
+
d: "M10 19l-7-7m0 0l7-7m-7 7h18"
|
|
153
|
+
})
|
|
154
|
+
}), "Back to Users"]
|
|
155
|
+
}),
|
|
156
|
+
j && /* @__PURE__ */ d("div", {
|
|
157
|
+
className: "mb-6 p-4 rounded-xl bg-status-success-bg-subtle border border-status-success-border",
|
|
158
|
+
children: [/* @__PURE__ */ u("p", {
|
|
159
|
+
className: "text-status-success-text",
|
|
160
|
+
children: j
|
|
161
|
+
}), /* @__PURE__ */ u("button", {
|
|
162
|
+
onClick: () => M(null),
|
|
163
|
+
className: "mt-2 text-sm text-status-success-text hover:underline",
|
|
164
|
+
children: "Dismiss"
|
|
165
|
+
})]
|
|
166
|
+
}),
|
|
167
|
+
/* @__PURE__ */ d("div", {
|
|
168
|
+
className: "p-6 rounded-xl border border-border-subtle bg-bg-surface shadow-sm",
|
|
169
|
+
children: [
|
|
170
|
+
/* @__PURE__ */ d("div", {
|
|
171
|
+
className: "flex items-center gap-4 mb-8",
|
|
172
|
+
children: [/* @__PURE__ */ u("div", {
|
|
173
|
+
className: "auth-brand-badge flex h-20 w-20 items-center justify-center rounded-full text-3xl font-semibold",
|
|
174
|
+
children: (T.name || T.username || T.email).charAt(0).toUpperCase()
|
|
175
|
+
}), /* @__PURE__ */ d("div", { children: [
|
|
176
|
+
/* @__PURE__ */ u("h1", {
|
|
177
|
+
className: "text-2xl font-semibold text-text-primary",
|
|
178
|
+
children: T.name || T.username
|
|
179
|
+
}),
|
|
180
|
+
/* @__PURE__ */ u("p", {
|
|
181
|
+
className: "text-text-secondary",
|
|
182
|
+
"data-testid": "user-email",
|
|
183
|
+
children: T.email
|
|
184
|
+
}),
|
|
185
|
+
/* @__PURE__ */ d("div", {
|
|
186
|
+
className: "flex items-center gap-2 mt-2",
|
|
187
|
+
children: [/* @__PURE__ */ u("span", {
|
|
188
|
+
className: `px-2.5 py-1 rounded-full text-xs font-medium ${p(T.role)}`,
|
|
189
|
+
children: T.role.replace("_", " ")
|
|
190
|
+
}), /* @__PURE__ */ u("span", {
|
|
191
|
+
className: `px-2.5 py-1 rounded-full text-xs font-medium ${m(T.status)}`,
|
|
192
|
+
children: T.status
|
|
193
|
+
})]
|
|
194
|
+
})
|
|
195
|
+
] })]
|
|
196
|
+
}),
|
|
197
|
+
/* @__PURE__ */ d("div", {
|
|
198
|
+
className: "grid grid-cols-2 gap-6",
|
|
199
|
+
children: [
|
|
200
|
+
/* @__PURE__ */ d("div", {
|
|
201
|
+
className: "p-4 rounded-lg bg-bg-canvas/50",
|
|
202
|
+
children: [/* @__PURE__ */ u("label", {
|
|
203
|
+
className: "block text-sm font-medium text-text-secondary mb-1",
|
|
204
|
+
children: "Username"
|
|
205
|
+
}), /* @__PURE__ */ u("p", {
|
|
206
|
+
className: "text-text-primary font-medium",
|
|
207
|
+
children: T.username
|
|
208
|
+
})]
|
|
209
|
+
}),
|
|
210
|
+
/* @__PURE__ */ d("div", {
|
|
211
|
+
className: "p-4 rounded-lg bg-bg-canvas/50",
|
|
212
|
+
children: [/* @__PURE__ */ u("label", {
|
|
213
|
+
className: "block text-sm font-medium text-text-secondary mb-1",
|
|
214
|
+
children: "Email"
|
|
215
|
+
}), /* @__PURE__ */ u("p", {
|
|
216
|
+
className: "text-text-primary font-medium",
|
|
217
|
+
children: T.email
|
|
218
|
+
})]
|
|
219
|
+
}),
|
|
220
|
+
/* @__PURE__ */ d("div", {
|
|
221
|
+
className: "p-4 rounded-lg bg-bg-canvas/50",
|
|
222
|
+
children: [/* @__PURE__ */ u("label", {
|
|
223
|
+
className: "block text-sm font-medium text-text-secondary mb-1",
|
|
224
|
+
children: "Email Verified"
|
|
225
|
+
}), /* @__PURE__ */ u("p", {
|
|
226
|
+
className: "text-text-primary font-medium",
|
|
227
|
+
children: T.emailVerified ? /* @__PURE__ */ u("span", {
|
|
228
|
+
className: "text-status-success-text",
|
|
229
|
+
children: "Yes"
|
|
230
|
+
}) : /* @__PURE__ */ u("span", {
|
|
231
|
+
className: "text-status-warning-text",
|
|
232
|
+
children: "No"
|
|
233
|
+
})
|
|
234
|
+
})]
|
|
235
|
+
}),
|
|
236
|
+
/* @__PURE__ */ d("div", {
|
|
237
|
+
className: "p-4 rounded-lg bg-bg-canvas/50",
|
|
238
|
+
children: [/* @__PURE__ */ u("label", {
|
|
239
|
+
className: "block text-sm font-medium text-text-secondary mb-1",
|
|
240
|
+
children: "MFA Enabled"
|
|
241
|
+
}), /* @__PURE__ */ u("p", {
|
|
242
|
+
className: "text-text-primary font-medium",
|
|
243
|
+
children: T.mfaEnabled ? /* @__PURE__ */ u("span", {
|
|
244
|
+
className: "text-status-success-text",
|
|
245
|
+
children: "Yes"
|
|
246
|
+
}) : /* @__PURE__ */ u("span", {
|
|
247
|
+
className: "text-text-secondary",
|
|
248
|
+
children: "No"
|
|
249
|
+
})
|
|
250
|
+
})]
|
|
251
|
+
}),
|
|
252
|
+
T.phoneNumber && /* @__PURE__ */ d("div", {
|
|
253
|
+
className: "p-4 rounded-lg bg-bg-canvas/50",
|
|
254
|
+
children: [/* @__PURE__ */ u("label", {
|
|
255
|
+
className: "block text-sm font-medium text-text-secondary mb-1",
|
|
256
|
+
children: "Phone Number"
|
|
257
|
+
}), /* @__PURE__ */ u("p", {
|
|
258
|
+
className: "text-text-primary font-medium",
|
|
259
|
+
children: T.phoneNumber
|
|
260
|
+
})]
|
|
261
|
+
}),
|
|
262
|
+
/* @__PURE__ */ d("div", {
|
|
263
|
+
className: "p-4 rounded-lg bg-bg-canvas/50",
|
|
264
|
+
children: [/* @__PURE__ */ u("label", {
|
|
265
|
+
className: "block text-sm font-medium text-text-secondary mb-1",
|
|
266
|
+
children: "Last Login"
|
|
267
|
+
}), /* @__PURE__ */ u("p", {
|
|
268
|
+
className: "text-text-primary font-medium",
|
|
269
|
+
children: T.lastLoginAt ? new Date(T.lastLoginAt).toLocaleString() : "Never"
|
|
270
|
+
})]
|
|
271
|
+
}),
|
|
272
|
+
/* @__PURE__ */ d("div", {
|
|
273
|
+
className: "p-4 rounded-lg bg-bg-canvas/50",
|
|
274
|
+
children: [/* @__PURE__ */ u("label", {
|
|
275
|
+
className: "block text-sm font-medium text-text-secondary mb-1",
|
|
276
|
+
children: "Created"
|
|
277
|
+
}), /* @__PURE__ */ u("p", {
|
|
278
|
+
className: "text-text-primary font-medium",
|
|
279
|
+
children: new Date(T.createdAt).toLocaleString()
|
|
280
|
+
})]
|
|
281
|
+
}),
|
|
282
|
+
/* @__PURE__ */ d("div", {
|
|
283
|
+
className: "p-4 rounded-lg bg-bg-canvas/50",
|
|
284
|
+
children: [/* @__PURE__ */ u("label", {
|
|
285
|
+
className: "block text-sm font-medium text-text-secondary mb-1",
|
|
286
|
+
children: "Last Updated"
|
|
287
|
+
}), /* @__PURE__ */ u("p", {
|
|
288
|
+
className: "text-text-primary font-medium",
|
|
289
|
+
children: new Date(T.updatedAt).toLocaleString()
|
|
290
|
+
})]
|
|
291
|
+
})
|
|
292
|
+
]
|
|
293
|
+
}),
|
|
294
|
+
/* @__PURE__ */ d("div", {
|
|
295
|
+
className: "mt-8 pt-6 border-t border-border-subtle flex gap-3",
|
|
296
|
+
children: [T.status !== "DELETED" && b && /* @__PURE__ */ u("button", {
|
|
297
|
+
onClick: () => P("deactivate"),
|
|
298
|
+
className: "px-4 py-2.5 rounded-xl border border-status-error-border text-status-error-text font-medium hover:bg-status-error-bg-subtle transition-colors",
|
|
299
|
+
children: "Deactivate User"
|
|
300
|
+
}), b && T.status === "DELETED" && /* @__PURE__ */ u("button", {
|
|
301
|
+
onClick: () => P("hard-delete"),
|
|
302
|
+
className: "px-4 py-2.5 rounded-xl bg-status-error-bg text-white font-medium hover:bg-status-error-bg-hover transition-colors",
|
|
303
|
+
children: "Permanently Delete"
|
|
304
|
+
})]
|
|
305
|
+
})
|
|
306
|
+
]
|
|
307
|
+
})
|
|
308
|
+
]
|
|
309
|
+
}) : /* @__PURE__ */ u("div", {
|
|
310
|
+
className: "max-w-4xl mx-auto p-6",
|
|
311
|
+
children: /* @__PURE__ */ d("div", {
|
|
312
|
+
className: "text-center py-16 border-2 border-dashed border-border-subtle rounded-xl",
|
|
313
|
+
children: [/* @__PURE__ */ u("h2", {
|
|
314
|
+
className: "text-xl font-semibold text-text-primary mb-2",
|
|
315
|
+
children: "Admin Access Required"
|
|
316
|
+
}), /* @__PURE__ */ u("p", {
|
|
317
|
+
className: "text-text-secondary",
|
|
318
|
+
children: "You need administrator privileges to view user details."
|
|
319
|
+
})]
|
|
320
|
+
})
|
|
321
|
+
}) : /* @__PURE__ */ u("div", {
|
|
322
|
+
className: "max-w-4xl mx-auto p-6",
|
|
323
|
+
children: /* @__PURE__ */ d("div", {
|
|
324
|
+
className: "text-center py-16 border-2 border-dashed border-border-subtle rounded-xl",
|
|
325
|
+
children: [/* @__PURE__ */ u("h2", {
|
|
326
|
+
className: "text-xl font-semibold text-text-primary mb-2",
|
|
327
|
+
children: "Authentication Required"
|
|
328
|
+
}), /* @__PURE__ */ u("p", {
|
|
329
|
+
className: "text-text-secondary",
|
|
330
|
+
children: "Please sign in to view user details"
|
|
331
|
+
})]
|
|
332
|
+
})
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
//#endregion
|
|
336
|
+
export { h as UserDetailsPage };
|
|
337
|
+
|
|
338
|
+
//# sourceMappingURL=UserDetailsPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserDetailsPage.js","names":[],"sources":["../../../src/auth/pages/UserDetailsPage.tsx"],"sourcesContent":["import { useState, useEffect } from \"react\";\nimport { useNavigate, useParams } from \"react-router-dom\";\nimport { useAuthPermissions, useUserOperations } from \"../hooks\";\nimport { useAuthStore } from \"../store/authStore\";\nimport { ConfirmActionDialog } from \"../components/ConfirmActionDialog\";\nimport { SpinnerIcon, AlertIcon } from \"../components/AuthIcons\";\nimport type { User, UserRole, UserStatus } from \"../types\";\n\nconst ALLOWED_ROLES: UserRole[] = [\"SUPER_ADMIN\", \"TENANT_ADMIN\", \"ORG_ADMIN\"];\n\nconst getRoleColor = (role: UserRole) => {\n switch (role) {\n case \"SUPER_ADMIN\":\n return \"bg-accent-purple-subtle text-accent-purple\";\n case \"TENANT_ADMIN\":\n return \"bg-status-info-bg-subtle text-status-info-text\";\n case \"ORG_ADMIN\":\n return \"bg-accent-indigo-subtle text-accent-indigo\";\n case \"WORKSPACE_ADMIN\":\n return \"bg-accent-cyan-subtle text-accent-cyan\";\n case \"MEMBER\":\n return \"bg-status-success-bg-subtle text-status-success-text\";\n case \"GUEST\":\n return \"bg-bg-sunken text-text-primary\";\n default:\n return \"bg-bg-sunken text-text-primary\";\n }\n};\n\nconst getStatusColor = (status: UserStatus) => {\n switch (status) {\n case \"ACTIVE\":\n return \"bg-status-success-bg-subtle text-status-success-text\";\n case \"INACTIVE\":\n return \"bg-status-warning-bg-subtle text-status-warning-text\";\n case \"SUSPENDED\":\n return \"bg-status-warning-bg-subtle text-status-warning-text\";\n case \"DELETED\":\n return \"bg-status-error-bg-subtle text-status-error-text\";\n default:\n return \"bg-bg-sunken text-text-primary\";\n }\n};\n\n/**\n * User details page (admin only).\n *\n * Route: /auth/users/:id\n *\n * Renders the full profile of a single user, with admin actions\n * (edit, deactivate, hard-delete). Reuses the same getUser query\n * that UsersPage relies on.\n */\nexport function UserDetailsPage() {\n const { id } = useParams<{ id: string }>();\n const navigate = useNavigate();\n const isAuthenticated = useAuthStore((state) => state.isAuthenticated);\n const currentUser = useAuthStore((state) => state.user);\n const {\n canViewUsers,\n canDeleteUsers,\n isLoading: permissionsLoading,\n } = useAuthPermissions();\n const { getUser, deleteUser, hardDeleteUser } = useUserOperations();\n\n const [user, setUser] = useState<User | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [successMessage, setSuccessMessage] = useState<string | null>(null);\n const [pendingAction, setPendingAction] = useState<\n \"deactivate\" | \"hard-delete\" | null\n >(null);\n\n useEffect(() => {\n let cancelled = false;\n if (!id) {\n setError(\"Missing user id\");\n setLoading(false);\n return;\n }\n if (!isAuthenticated) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n getUser(id)\n .then((fetched) => {\n if (cancelled) return;\n if (!fetched) {\n setError(\"User not found\");\n } else {\n setUser(fetched);\n }\n })\n .catch((err: unknown) => {\n if (cancelled) return;\n setError(\n err instanceof Error ? err.message : \"Failed to fetch user details\",\n );\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n\n return () => {\n cancelled = true;\n };\n }, [id, getUser, isAuthenticated]);\n\n const handleDeactivate = async () => {\n if (!user) return;\n try {\n const result = await deleteUser(user.id);\n if (result.success) {\n setSuccessMessage(`User \"${user.email}\" has been deactivated.`);\n setPendingAction(null);\n // Refresh\n const fresh = await getUser(user.id);\n if (fresh) setUser(fresh);\n } else {\n setError(result.message);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to delete user\");\n }\n };\n\n const handleHardDelete = async () => {\n if (!user) return;\n try {\n const result = await hardDeleteUser(user.id);\n if (result.success) {\n setPendingAction(null);\n navigate(\"/auth/users\");\n } else {\n setError(result.message);\n }\n } catch (err) {\n setError(\n err instanceof Error ? err.message : \"Failed to hard delete user\",\n );\n }\n };\n\n // Auth + role guards\n if (!isAuthenticated) {\n return (\n <div className=\"max-w-4xl mx-auto p-6\">\n <div className=\"text-center py-16 border-2 border-dashed border-border-subtle rounded-xl\">\n <h2 className=\"text-xl font-semibold text-text-primary mb-2\">\n Authentication Required\n </h2>\n <p className=\"text-text-secondary\">\n Please sign in to view user details\n </p>\n </div>\n </div>\n );\n }\n\n if (currentUser && !ALLOWED_ROLES.includes(currentUser.role)) {\n return (\n <div className=\"max-w-4xl mx-auto p-6\">\n <div className=\"text-center py-16 border-2 border-dashed border-border-subtle rounded-xl\">\n <h2 className=\"text-xl font-semibold text-text-primary mb-2\">\n You are not allowed to access this page\n </h2>\n <p className=\"text-text-secondary\">\n This page is restricted to administrators only.\n </p>\n </div>\n </div>\n );\n }\n\n if (permissionsLoading || loading) {\n return (\n <div className=\"max-w-4xl mx-auto p-6\">\n <div className=\"text-center py-16\">\n <SpinnerIcon className=\"w-8 h-8 mx-auto text-text-secondary animate-spin\" />\n <p className=\"mt-4 text-text-secondary\">Loading user...</p>\n </div>\n </div>\n );\n }\n\n if (!canViewUsers) {\n return (\n <div className=\"max-w-4xl mx-auto p-6\">\n <div className=\"text-center py-16 border-2 border-dashed border-border-subtle rounded-xl\">\n <h2 className=\"text-xl font-semibold text-text-primary mb-2\">\n Admin Access Required\n </h2>\n <p className=\"text-text-secondary\">\n You need administrator privileges to view user details.\n </p>\n </div>\n </div>\n );\n }\n\n if (error || !user) {\n return (\n <div className=\"max-w-4xl mx-auto p-6\">\n <button\n onClick={() => navigate(\"/auth/users\")}\n className=\"mb-6 flex items-center gap-2 text-text-link hover:underline font-medium\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M10 19l-7-7m0 0l7-7m-7 7h18\"\n />\n </svg>\n Back to Users\n </button>\n <div className=\"flex items-start gap-3 p-4 rounded-xl bg-status-error-bg-subtle border border-status-error-border\">\n <AlertIcon className=\"w-5 h-5 text-status-error-text flex-shrink-0 mt-0.5\" />\n <p className=\"text-sm text-status-error-text\">\n {error || \"User not found\"}\n </p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"max-w-4xl mx-auto p-6\">\n <ConfirmActionDialog\n open={pendingAction !== null}\n onOpenChange={(open) => {\n if (!open) setPendingAction(null);\n }}\n title={\n pendingAction === \"hard-delete\"\n ? \"Permanently delete user?\"\n : \"Deactivate user?\"\n }\n description={\n pendingAction === \"hard-delete\"\n ? `This permanently deletes \"${user.email}\" and cannot be undone.`\n : `\"${user.email}\" will be prevented from signing in until reactivated.`\n }\n confirmText={\n pendingAction === \"hard-delete\"\n ? \"Delete permanently\"\n : \"Deactivate user\"\n }\n variant={pendingAction === \"hard-delete\" ? \"danger\" : \"warning\"}\n onConfirm={async () => {\n if (pendingAction === \"hard-delete\") await handleHardDelete();\n else if (pendingAction === \"deactivate\") await handleDeactivate();\n }}\n />\n\n <button\n onClick={() => navigate(\"/auth/users\")}\n className=\"mb-6 flex items-center gap-2 text-text-link hover:underline font-medium\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M10 19l-7-7m0 0l7-7m-7 7h18\"\n />\n </svg>\n Back to Users\n </button>\n\n {successMessage && (\n <div className=\"mb-6 p-4 rounded-xl bg-status-success-bg-subtle border border-status-success-border\">\n <p className=\"text-status-success-text\">{successMessage}</p>\n <button\n onClick={() => setSuccessMessage(null)}\n className=\"mt-2 text-sm text-status-success-text hover:underline\"\n >\n Dismiss\n </button>\n </div>\n )}\n\n <div className=\"p-6 rounded-xl border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"flex items-center gap-4 mb-8\">\n <div className=\"auth-brand-badge flex h-20 w-20 items-center justify-center rounded-full text-3xl font-semibold\">\n {(user.name || user.username || user.email).charAt(0).toUpperCase()}\n </div>\n <div>\n <h1 className=\"text-2xl font-semibold text-text-primary\">\n {user.name || user.username}\n </h1>\n <p className=\"text-text-secondary\" data-testid=\"user-email\">\n {user.email}\n </p>\n <div className=\"flex items-center gap-2 mt-2\">\n <span\n className={`px-2.5 py-1 rounded-full text-xs font-medium ${getRoleColor(user.role)}`}\n >\n {user.role.replace(\"_\", \" \")}\n </span>\n <span\n className={`px-2.5 py-1 rounded-full text-xs font-medium ${getStatusColor(user.status)}`}\n >\n {user.status}\n </span>\n </div>\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-6\">\n <div className=\"p-4 rounded-lg bg-bg-canvas/50\">\n <label className=\"block text-sm font-medium text-text-secondary mb-1\">\n Username\n </label>\n <p className=\"text-text-primary font-medium\">{user.username}</p>\n </div>\n <div className=\"p-4 rounded-lg bg-bg-canvas/50\">\n <label className=\"block text-sm font-medium text-text-secondary mb-1\">\n Email\n </label>\n <p className=\"text-text-primary font-medium\">{user.email}</p>\n </div>\n <div className=\"p-4 rounded-lg bg-bg-canvas/50\">\n <label className=\"block text-sm font-medium text-text-secondary mb-1\">\n Email Verified\n </label>\n <p className=\"text-text-primary font-medium\">\n {user.emailVerified ? (\n <span className=\"text-status-success-text\">Yes</span>\n ) : (\n <span className=\"text-status-warning-text\">No</span>\n )}\n </p>\n </div>\n <div className=\"p-4 rounded-lg bg-bg-canvas/50\">\n <label className=\"block text-sm font-medium text-text-secondary mb-1\">\n MFA Enabled\n </label>\n <p className=\"text-text-primary font-medium\">\n {user.mfaEnabled ? (\n <span className=\"text-status-success-text\">Yes</span>\n ) : (\n <span className=\"text-text-secondary\">No</span>\n )}\n </p>\n </div>\n {user.phoneNumber && (\n <div className=\"p-4 rounded-lg bg-bg-canvas/50\">\n <label className=\"block text-sm font-medium text-text-secondary mb-1\">\n Phone Number\n </label>\n <p className=\"text-text-primary font-medium\">\n {user.phoneNumber}\n </p>\n </div>\n )}\n <div className=\"p-4 rounded-lg bg-bg-canvas/50\">\n <label className=\"block text-sm font-medium text-text-secondary mb-1\">\n Last Login\n </label>\n <p className=\"text-text-primary font-medium\">\n {user.lastLoginAt\n ? new Date(user.lastLoginAt).toLocaleString()\n : \"Never\"}\n </p>\n </div>\n <div className=\"p-4 rounded-lg bg-bg-canvas/50\">\n <label className=\"block text-sm font-medium text-text-secondary mb-1\">\n Created\n </label>\n <p className=\"text-text-primary font-medium\">\n {new Date(user.createdAt).toLocaleString()}\n </p>\n </div>\n <div className=\"p-4 rounded-lg bg-bg-canvas/50\">\n <label className=\"block text-sm font-medium text-text-secondary mb-1\">\n Last Updated\n </label>\n <p className=\"text-text-primary font-medium\">\n {new Date(user.updatedAt).toLocaleString()}\n </p>\n </div>\n </div>\n\n <div className=\"mt-8 pt-6 border-t border-border-subtle flex gap-3\">\n {user.status !== \"DELETED\" && canDeleteUsers && (\n <button\n onClick={() => setPendingAction(\"deactivate\")}\n className=\"px-4 py-2.5 rounded-xl border border-status-error-border text-status-error-text font-medium hover:bg-status-error-bg-subtle transition-colors\"\n >\n Deactivate User\n </button>\n )}\n {canDeleteUsers && user.status === \"DELETED\" && (\n <button\n onClick={() => setPendingAction(\"hard-delete\")}\n className=\"px-4 py-2.5 rounded-xl bg-status-error-bg text-white font-medium hover:bg-status-error-bg-hover transition-colors\"\n >\n Permanently Delete\n </button>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserProfilePage.d.ts","sourceRoot":"","sources":["../../../src/auth/pages/UserProfilePage.tsx"],"names":[],"mappings":"AAsBA;;GAEG;AACH,wBAAgB,eAAe,4CAmgB9B"}
|