@datatechsolutions/ui 3.8.0 → 3.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/astrlabe/index.js +107 -107
- package/dist/astrlabe/index.mjs +3 -3
- package/dist/astrlabe/workflow-canvas.js +3 -3
- package/dist/astrlabe/workflow-canvas.mjs +2 -2
- package/dist/{chunk-KKXI7CPF.mjs → chunk-2E7HYTS7.mjs} +3 -3
- package/dist/{chunk-KKXI7CPF.mjs.map → chunk-2E7HYTS7.mjs.map} +1 -1
- package/dist/{chunk-EWYAM4WJ.mjs → chunk-2ZY3IQ2I.mjs} +3 -3
- package/dist/{chunk-EWYAM4WJ.mjs.map → chunk-2ZY3IQ2I.mjs.map} +1 -1
- package/dist/{chunk-VPFVW7ZF.js → chunk-6E2YH67A.js} +35 -35
- package/dist/{chunk-VPFVW7ZF.js.map → chunk-6E2YH67A.js.map} +1 -1
- package/dist/{chunk-A4A3SQTV.mjs → chunk-6QJI5YOJ.mjs} +3 -3
- package/dist/{chunk-A4A3SQTV.mjs.map → chunk-6QJI5YOJ.mjs.map} +1 -1
- package/dist/{chunk-3X3IYDG6.js → chunk-7AM2SXEF.js} +68 -68
- package/dist/{chunk-3X3IYDG6.js.map → chunk-7AM2SXEF.js.map} +1 -1
- package/dist/{chunk-H37VDL7Y.js → chunk-A2RIX2RK.js} +4 -4
- package/dist/{chunk-H37VDL7Y.js.map → chunk-A2RIX2RK.js.map} +1 -1
- package/dist/{chunk-32DHEVOH.mjs → chunk-ARLYOLSO.mjs} +3 -3
- package/dist/{chunk-32DHEVOH.mjs.map → chunk-ARLYOLSO.mjs.map} +1 -1
- package/dist/{chunk-5YVOLHSW.mjs → chunk-AXBD6OAF.mjs} +4 -4
- package/dist/{chunk-5YVOLHSW.mjs.map → chunk-AXBD6OAF.mjs.map} +1 -1
- package/dist/{chunk-ZP37M2QK.mjs → chunk-BWUFLW5W.mjs} +6 -6
- package/dist/{chunk-ZP37M2QK.mjs.map → chunk-BWUFLW5W.mjs.map} +1 -1
- package/dist/{chunk-HBOORO52.js → chunk-CLTNCBSP.js} +4 -4
- package/dist/{chunk-HBOORO52.js.map → chunk-CLTNCBSP.js.map} +1 -1
- package/dist/{chunk-F35GFICG.js → chunk-CRBGZA6Y.js} +13 -13
- package/dist/{chunk-F35GFICG.js.map → chunk-CRBGZA6Y.js.map} +1 -1
- package/dist/{chunk-7JZFNKJD.js → chunk-DQIEVLA3.js} +35 -35
- package/dist/{chunk-7JZFNKJD.js.map → chunk-DQIEVLA3.js.map} +1 -1
- package/dist/{chunk-57E4TCB2.mjs → chunk-EAIE4QGD.mjs} +3 -3
- package/dist/{chunk-57E4TCB2.mjs.map → chunk-EAIE4QGD.mjs.map} +1 -1
- package/dist/{chunk-5W6LMDXV.mjs → chunk-GQWC4EKE.mjs} +4 -4
- package/dist/{chunk-5W6LMDXV.mjs.map → chunk-GQWC4EKE.mjs.map} +1 -1
- package/dist/{chunk-FKUIVS6I.js → chunk-IVKFXPLO.js} +28 -28
- package/dist/{chunk-FKUIVS6I.js.map → chunk-IVKFXPLO.js.map} +1 -1
- package/dist/{chunk-FNA66TT4.js → chunk-MT66VKLS.js} +163 -219
- package/dist/chunk-MT66VKLS.js.map +1 -0
- package/dist/{chunk-74BU2EBZ.mjs → chunk-OEZ7GAJY.mjs} +6 -6
- package/dist/{chunk-74BU2EBZ.mjs.map → chunk-OEZ7GAJY.mjs.map} +1 -1
- package/dist/{chunk-CZZOCKEA.mjs → chunk-OVQ4MKCV.mjs} +3 -3
- package/dist/{chunk-CZZOCKEA.mjs.map → chunk-OVQ4MKCV.mjs.map} +1 -1
- package/dist/{chunk-WDBVIU7W.mjs → chunk-PD3JLDA5.mjs} +3 -3
- package/dist/{chunk-WDBVIU7W.mjs.map → chunk-PD3JLDA5.mjs.map} +1 -1
- package/dist/{chunk-TJPPZU77.js → chunk-R6GEJBFC.js} +34 -34
- package/dist/{chunk-TJPPZU77.js.map → chunk-R6GEJBFC.js.map} +1 -1
- package/dist/{chunk-Q4QORAMH.js → chunk-RFUSH7WD.js} +10 -10
- package/dist/{chunk-Q4QORAMH.js.map → chunk-RFUSH7WD.js.map} +1 -1
- package/dist/{chunk-VS6PTRQ7.mjs → chunk-SJ6SUS7H.mjs} +3 -3
- package/dist/{chunk-VS6PTRQ7.mjs.map → chunk-SJ6SUS7H.mjs.map} +1 -1
- package/dist/{chunk-E57RZXOR.js → chunk-T4IYOKHR.js} +25 -25
- package/dist/{chunk-E57RZXOR.js.map → chunk-T4IYOKHR.js.map} +1 -1
- package/dist/{chunk-3H5CFLVK.js → chunk-U6VFS3RD.js} +135 -135
- package/dist/{chunk-3H5CFLVK.js.map → chunk-U6VFS3RD.js.map} +1 -1
- package/dist/{chunk-RCHTRG7R.js → chunk-UZIICTIY.js} +55 -55
- package/dist/{chunk-RCHTRG7R.js.map → chunk-UZIICTIY.js.map} +1 -1
- package/dist/{chunk-TCP45Q4B.js → chunk-WJENX6KB.js} +9 -9
- package/dist/{chunk-TCP45Q4B.js.map → chunk-WJENX6KB.js.map} +1 -1
- package/dist/{chunk-PYNXIDG3.mjs → chunk-WS3IJFPW.mjs} +3 -3
- package/dist/{chunk-PYNXIDG3.mjs.map → chunk-WS3IJFPW.mjs.map} +1 -1
- package/dist/{chunk-Q7HRCCFT.js → chunk-ZDXEGSCF.js} +45 -45
- package/dist/{chunk-Q7HRCCFT.js.map → chunk-ZDXEGSCF.js.map} +1 -1
- package/dist/{chunk-PCUINUIC.mjs → chunk-ZQEMKEEH.mjs} +3 -3
- package/dist/{chunk-PCUINUIC.mjs.map → chunk-ZQEMKEEH.mjs.map} +1 -1
- package/dist/{chunk-E6C7MFHJ.mjs → chunk-ZQRUAXGP.mjs} +164 -218
- package/dist/chunk-ZQRUAXGP.mjs.map +1 -0
- package/dist/index.d.mts +43 -42
- package/dist/index.d.ts +43 -42
- package/dist/index.js +662 -670
- package/dist/index.mjs +1 -1
- package/dist/platform/admin/index.js +9 -9
- package/dist/platform/admin/index.mjs +3 -3
- package/dist/platform/agents-workspace.js +6 -6
- package/dist/platform/agents-workspace.mjs +5 -5
- package/dist/platform/app-shell.js +3 -3
- package/dist/platform/app-shell.mjs +2 -2
- package/dist/platform/auth/index.js +21 -21
- package/dist/platform/auth/index.mjs +3 -3
- package/dist/platform/billing/index.js +3 -3
- package/dist/platform/billing/index.mjs +2 -2
- package/dist/platform/impersonation/index.js +3 -3
- package/dist/platform/impersonation/index.mjs +2 -2
- package/dist/platform/index.d.mts +1 -1
- package/dist/platform/index.d.ts +1 -1
- package/dist/platform/index.js +74 -74
- package/dist/platform/index.mjs +17 -17
- package/dist/platform/pages/index.d.mts +93 -4
- package/dist/platform/pages/index.d.ts +93 -4
- package/dist/platform/pages/index.js +1009 -575
- package/dist/platform/pages/index.js.map +1 -1
- package/dist/platform/pages/index.mjs +805 -372
- package/dist/platform/pages/index.mjs.map +1 -1
- package/dist/platform/settings/index.js +6 -6
- package/dist/platform/settings/index.mjs +5 -5
- package/dist/platform/workflow-canvas-shell.js +4 -4
- package/dist/platform/workflow-canvas-shell.mjs +3 -3
- package/package.json +1 -1
- package/dist/chunk-E6C7MFHJ.mjs.map +0 -1
- package/dist/chunk-FNA66TT4.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkMT66VKLS_js = require('./chunk-MT66VKLS.js');
|
|
5
5
|
var chunkYXN2K77G_js = require('./chunk-YXN2K77G.js');
|
|
6
6
|
var chunkS7KHTUHA_js = require('./chunk-S7KHTUHA.js');
|
|
7
7
|
var react = require('react');
|
|
@@ -11,7 +11,7 @@ var jsxRuntime = require('react/jsx-runtime');
|
|
|
11
11
|
|
|
12
12
|
var PlatformStateContext = react.createContext(null);
|
|
13
13
|
function PlatformStateProvider({ children, normalizeRole }) {
|
|
14
|
-
const { user } =
|
|
14
|
+
const { user } = chunkMT66VKLS_js.useAuth();
|
|
15
15
|
const state = react.useMemo(() => {
|
|
16
16
|
const organizationId = user?.organizationId ?? "";
|
|
17
17
|
const actor = user ? {
|
|
@@ -33,7 +33,7 @@ function usePlatformState() {
|
|
|
33
33
|
}
|
|
34
34
|
function resolveFlag(locale) {
|
|
35
35
|
const code = locale === "pt-BR" ? "br" : locale;
|
|
36
|
-
return
|
|
36
|
+
return chunkMT66VKLS_js.LOCALE_FLAGS?.[code];
|
|
37
37
|
}
|
|
38
38
|
function PlatformAppShell({
|
|
39
39
|
appName,
|
|
@@ -50,12 +50,12 @@ function PlatformAppShell({
|
|
|
50
50
|
children
|
|
51
51
|
}) {
|
|
52
52
|
const tCommon = chunkYXN2K77G_js.useTranslations("common");
|
|
53
|
-
const { user, status, logout } =
|
|
53
|
+
const { user, status, logout } = chunkMT66VKLS_js.useAuth();
|
|
54
54
|
usePlatformState();
|
|
55
|
-
const { resolvedTheme, setTheme, dockPosition, dockAutoHide, dockEnabled } =
|
|
55
|
+
const { resolvedTheme, setTheme, dockPosition, dockAutoHide, dockEnabled } = chunkMT66VKLS_js.usePlatformPreferences();
|
|
56
56
|
const pathname = chunkS7KHTUHA_js.usePathname();
|
|
57
57
|
const router = chunkS7KHTUHA_js.useRouter();
|
|
58
|
-
const { history, openHistory } =
|
|
58
|
+
const { history, openHistory } = chunkMT66VKLS_js.useNotifications();
|
|
59
59
|
const currentLocale = chunkYXN2K77G_js.useLocale();
|
|
60
60
|
const localeMeta = i18n.LANGUAGE_META[currentLocale];
|
|
61
61
|
const items = react.useMemo(() => navigationItems.filter((item) => {
|
|
@@ -83,7 +83,7 @@ function PlatformAppShell({
|
|
|
83
83
|
organizationId: user.organizationId ?? null
|
|
84
84
|
} : null;
|
|
85
85
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
86
|
-
|
|
86
|
+
chunkMT66VKLS_js.PlatformShell,
|
|
87
87
|
{
|
|
88
88
|
items,
|
|
89
89
|
launchpadPageOrder: pageOrder,
|
|
@@ -129,5 +129,5 @@ function PlatformAppShell({
|
|
|
129
129
|
exports.PlatformAppShell = PlatformAppShell;
|
|
130
130
|
exports.PlatformStateProvider = PlatformStateProvider;
|
|
131
131
|
exports.usePlatformState = usePlatformState;
|
|
132
|
-
//# sourceMappingURL=chunk-
|
|
133
|
-
//# sourceMappingURL=chunk-
|
|
132
|
+
//# sourceMappingURL=chunk-WJENX6KB.js.map
|
|
133
|
+
//# sourceMappingURL=chunk-WJENX6KB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/platform/platform-state-provider.tsx","../src/platform/app-shell.tsx"],"names":["createContext","useAuth","useMemo","useContext","LOCALE_FLAGS","useTranslations","usePlatformPreferences","usePathname","useRouter","useNotifications","useLocale","LANGUAGE_META","useCallback","jsx","PlatformShell","RectangleStackIcon","HomeIcon"],"mappings":"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","file":"chunk-TCP45Q4B.js","sourcesContent":["import { createContext, useContext, useMemo, type ReactNode } from 'react'\nimport { useAuth, type AuthUser } from '../_auth'\n\ntype PlatformState = {\n currentOrganizationId: string\n actor: AuthUser | null\n}\n\nconst PlatformStateContext = createContext<PlatformState | null>(null)\n\nexport type PlatformStateProviderProps = {\n children: ReactNode\n /**\n * Function that converts a JWT role claim to the app's canonical role\n * union (the same `normalizePlatformRole` produced by\n * `createPlatformRbac()` in this app). Lifted out as a prop because\n * each consuming app uses its own role enum.\n */\n normalizeRole: (input: unknown) => string\n}\n\nexport function PlatformStateProvider({ children, normalizeRole }: PlatformStateProviderProps) {\n const { user } = useAuth()\n\n const state = useMemo<PlatformState>(() => {\n const organizationId = user?.organizationId ?? ''\n\n const actor: AuthUser | null = user\n ? {\n ...user,\n role: normalizeRole(user.role),\n organizationId,\n }\n : null\n\n return {\n currentOrganizationId: organizationId,\n actor,\n }\n }, [user, normalizeRole])\n\n return (\n <PlatformStateContext.Provider value={state}>\n {children}\n </PlatformStateContext.Provider>\n )\n}\n\nexport function usePlatformState() {\n const context = useContext(PlatformStateContext)\n if (!context) throw new Error('usePlatformState must be used inside PlatformStateProvider')\n return context\n}\n","import { useCallback, useMemo, type ComponentType, type ReactNode } from 'react'\nimport { RectangleStackIcon, HomeIcon } from '@heroicons/react/24/outline'\nimport { useAuth, usePlatformPreferences } from '../_auth'\nimport { LANGUAGE_META } from '@datatechsolutions/shared-domain/i18n'\nimport {\n PlatformShell,\n type NavigationItem,\n} from '@ui/index'\nimport { useNotifications } from '@ui/components/notifications'\nimport { useLocale, useTranslations } from '@ui/lib/i18n-context'\nimport { usePathname, useRouter } from '@ui/lib/router-context'\nimport { LOCALE_FLAGS } from '@ui/lib/locale-flags'\nimport { usePlatformState } from './platform-state-provider'\n\nfunction resolveFlag(locale: string): string | undefined {\n const code = locale === 'pt-BR' ? 'br' : locale\n return LOCALE_FLAGS?.[code as keyof typeof LOCALE_FLAGS]\n}\n\nexport type PlatformAppShellProps = {\n /** App display name (e.g. \"Astrlabe\"). */\n appName: string\n /** Tailwind gradient classes for the shell branding (e.g. \"from-sky-500 to-indigo-600\"). */\n appGradient: string\n /** Branded logo node rendered inside the flyout trigger. */\n appLogo: ReactNode\n /**\n * Optional app icon for the branded loader (defaults to the platform's\n * RectangleStackIcon if omitted).\n */\n appIcon?: ReactNode\n /**\n * When the appIcon is a brand SVG that has its own background\n * (gradient, fill, etc), set this to true so the BrandedLoader\n * doesn't wrap it in a second gradient container.\n */\n appIconRaw?: boolean\n /**\n * Optional override for the dock dashboard icon (defaults to HomeIcon).\n */\n dashboardIcon?: ComponentType<{ className?: string }>\n\n /** App-specific navigation items already pre-translated. */\n navigationItems: NavigationItem[]\n /** Custom ordering of launchpad page tiles. */\n pageOrder: string[]\n /**\n * Map of navigation/module ID → required permission name. The shell\n * filters `navigationItems` so that any item whose ID has an entry here\n * is hidden unless `hasPermission` returns true for the listed permission.\n */\n modulePermissions: Record<string, string>\n /**\n * Permission predicate, typically `(p) => can(actor, p)` from each app's\n * `createPlatformRbac()` factory.\n */\n hasPermission: (permission: string) => boolean\n\n /**\n * Optional settings/profile drawer content (e.g. an app-specific\n * `<SettingsModal>`). Receives the open state + close handler the shell\n * manages internally so the drawer renders inside the shell chrome.\n */\n settingsModal?: (props: { open: boolean; onClose: () => void }) => ReactNode\n\n children: ReactNode\n}\n\n/**\n * Cross-app platform shell — wires `<PlatformShell>` from ui to windsock's\n * auth + preferences hooks and to ui's i18n/router contexts. Each app\n * passes its own logo, gradient, navigation, and permission predicate; the\n * rest of the chrome (header, dock, flyout, sign-out confirm modal) is\n * shared.\n */\nexport function PlatformAppShell({\n appName,\n appGradient,\n appLogo,\n appIcon,\n appIconRaw,\n dashboardIcon,\n navigationItems,\n pageOrder,\n modulePermissions,\n hasPermission,\n settingsModal,\n children,\n}: PlatformAppShellProps) {\n const tCommon = useTranslations('common')\n const { user, status, logout } = useAuth()\n // Validate the platform-state provider is mounted above this shell;\n // the actor itself isn't read here, but the same provider feeds children.\n usePlatformState()\n const { resolvedTheme, setTheme, dockPosition, dockAutoHide, dockEnabled } = usePlatformPreferences()\n const pathname = usePathname()\n const router = useRouter()\n const { history, openHistory } = useNotifications()\n const currentLocale = useLocale()\n const localeMeta = LANGUAGE_META[currentLocale as keyof typeof LANGUAGE_META]\n\n const items = useMemo(() => navigationItems.filter((item) => {\n const permission = modulePermissions[item.id]\n if (!permission) return true\n return hasPermission(permission)\n }), [navigationItems, modulePermissions, hasPermission])\n\n const handleSignOut = useCallback(() => { void logout('/login') }, [logout])\n const handleToggleTheme = useCallback(\n () => { setTheme(resolvedTheme === 'dark' ? 'light' : 'dark') },\n [resolvedTheme, setTheme],\n )\n const handleNavigate = useCallback((href: string) => router.push(href), [router])\n const handlePrefetch = useCallback((href: string) => router.prefetch(href), [router])\n\n const shellUser = user\n ? {\n name: user.name ?? null,\n email: user.email ?? null,\n image: user.image ?? null,\n role: user.role ?? null,\n permissions: user.permissions as string[] | undefined,\n organizationId: user.organizationId ?? null,\n }\n : null\n\n return (\n <PlatformShell\n items={items}\n launchpadPageOrder={pageOrder}\n user={shellUser}\n authStatus={status}\n onSignOut={handleSignOut}\n dockPosition={dockPosition}\n dockAutoHide={dockAutoHide}\n dockEnabled={dockEnabled}\n resolvedTheme={resolvedTheme}\n onToggleTheme={handleToggleTheme}\n pathname={pathname}\n onNavigate={handleNavigate}\n onPrefetch={handlePrefetch}\n appName={appName}\n appIcon={appIcon ?? <RectangleStackIcon className=\"h-full w-full\" />}\n appIconRaw={appIconRaw}\n appLogo={appLogo}\n appGradient={appGradient}\n dashboardIcon={dashboardIcon ?? HomeIcon}\n notificationCount={history.length}\n onNotifications={openHistory}\n labels={{\n home: tCommon('home'),\n profile: tCommon('profile'),\n signOut: tCommon('signOut'),\n signOutConfirmTitle: tCommon('signOutConfirmTitle'),\n cancel: tCommon('cancel'),\n notifications: tCommon('notifications'),\n theme: tCommon('theme'),\n currentTheme: resolvedTheme === 'dark' ? tCommon('darkMode') : tCommon('lightMode'),\n language: tCommon('language'),\n currentLocale: localeMeta?.nativeName ?? currentLocale,\n localeFlag: resolveFlag(currentLocale),\n actions: tCommon('actions'),\n }}\n {...(settingsModal ? { profileDrawer: settingsModal } : {})}\n >\n {children}\n </PlatformShell>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/platform/platform-state-provider.tsx","../src/platform/app-shell.tsx"],"names":["createContext","useAuth","useMemo","useContext","LOCALE_FLAGS","useTranslations","usePlatformPreferences","usePathname","useRouter","useNotifications","useLocale","LANGUAGE_META","useCallback","jsx","PlatformShell","RectangleStackIcon","HomeIcon"],"mappings":"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","file":"chunk-WJENX6KB.js","sourcesContent":["import { createContext, useContext, useMemo, type ReactNode } from 'react'\nimport { useAuth, type AuthUser } from '../_auth'\n\ntype PlatformState = {\n currentOrganizationId: string\n actor: AuthUser | null\n}\n\nconst PlatformStateContext = createContext<PlatformState | null>(null)\n\nexport type PlatformStateProviderProps = {\n children: ReactNode\n /**\n * Function that converts a JWT role claim to the app's canonical role\n * union (the same `normalizePlatformRole` produced by\n * `createPlatformRbac()` in this app). Lifted out as a prop because\n * each consuming app uses its own role enum.\n */\n normalizeRole: (input: unknown) => string\n}\n\nexport function PlatformStateProvider({ children, normalizeRole }: PlatformStateProviderProps) {\n const { user } = useAuth()\n\n const state = useMemo<PlatformState>(() => {\n const organizationId = user?.organizationId ?? ''\n\n const actor: AuthUser | null = user\n ? {\n ...user,\n role: normalizeRole(user.role),\n organizationId,\n }\n : null\n\n return {\n currentOrganizationId: organizationId,\n actor,\n }\n }, [user, normalizeRole])\n\n return (\n <PlatformStateContext.Provider value={state}>\n {children}\n </PlatformStateContext.Provider>\n )\n}\n\nexport function usePlatformState() {\n const context = useContext(PlatformStateContext)\n if (!context) throw new Error('usePlatformState must be used inside PlatformStateProvider')\n return context\n}\n","import { useCallback, useMemo, type ComponentType, type ReactNode } from 'react'\nimport { RectangleStackIcon, HomeIcon } from '@heroicons/react/24/outline'\nimport { useAuth, usePlatformPreferences } from '../_auth'\nimport { LANGUAGE_META } from '@datatechsolutions/shared-domain/i18n'\nimport {\n PlatformShell,\n type NavigationItem,\n} from '@ui/index'\nimport { useNotifications } from '@ui/components/notifications'\nimport { useLocale, useTranslations } from '@ui/lib/i18n-context'\nimport { usePathname, useRouter } from '@ui/lib/router-context'\nimport { LOCALE_FLAGS } from '@ui/lib/locale-flags'\nimport { usePlatformState } from './platform-state-provider'\n\nfunction resolveFlag(locale: string): string | undefined {\n const code = locale === 'pt-BR' ? 'br' : locale\n return LOCALE_FLAGS?.[code as keyof typeof LOCALE_FLAGS]\n}\n\nexport type PlatformAppShellProps = {\n /** App display name (e.g. \"Astrlabe\"). */\n appName: string\n /** Tailwind gradient classes for the shell branding (e.g. \"from-sky-500 to-indigo-600\"). */\n appGradient: string\n /** Branded logo node rendered inside the flyout trigger. */\n appLogo: ReactNode\n /**\n * Optional app icon for the branded loader (defaults to the platform's\n * RectangleStackIcon if omitted).\n */\n appIcon?: ReactNode\n /**\n * When the appIcon is a brand SVG that has its own background\n * (gradient, fill, etc), set this to true so the BrandedLoader\n * doesn't wrap it in a second gradient container.\n */\n appIconRaw?: boolean\n /**\n * Optional override for the dock dashboard icon (defaults to HomeIcon).\n */\n dashboardIcon?: ComponentType<{ className?: string }>\n\n /** App-specific navigation items already pre-translated. */\n navigationItems: NavigationItem[]\n /** Custom ordering of launchpad page tiles. */\n pageOrder: string[]\n /**\n * Map of navigation/module ID → required permission name. The shell\n * filters `navigationItems` so that any item whose ID has an entry here\n * is hidden unless `hasPermission` returns true for the listed permission.\n */\n modulePermissions: Record<string, string>\n /**\n * Permission predicate, typically `(p) => can(actor, p)` from each app's\n * `createPlatformRbac()` factory.\n */\n hasPermission: (permission: string) => boolean\n\n /**\n * Optional settings/profile drawer content (e.g. an app-specific\n * `<SettingsModal>`). Receives the open state + close handler the shell\n * manages internally so the drawer renders inside the shell chrome.\n */\n settingsModal?: (props: { open: boolean; onClose: () => void }) => ReactNode\n\n children: ReactNode\n}\n\n/**\n * Cross-app platform shell — wires `<PlatformShell>` from ui to windsock's\n * auth + preferences hooks and to ui's i18n/router contexts. Each app\n * passes its own logo, gradient, navigation, and permission predicate; the\n * rest of the chrome (header, dock, flyout, sign-out confirm modal) is\n * shared.\n */\nexport function PlatformAppShell({\n appName,\n appGradient,\n appLogo,\n appIcon,\n appIconRaw,\n dashboardIcon,\n navigationItems,\n pageOrder,\n modulePermissions,\n hasPermission,\n settingsModal,\n children,\n}: PlatformAppShellProps) {\n const tCommon = useTranslations('common')\n const { user, status, logout } = useAuth()\n // Validate the platform-state provider is mounted above this shell;\n // the actor itself isn't read here, but the same provider feeds children.\n usePlatformState()\n const { resolvedTheme, setTheme, dockPosition, dockAutoHide, dockEnabled } = usePlatformPreferences()\n const pathname = usePathname()\n const router = useRouter()\n const { history, openHistory } = useNotifications()\n const currentLocale = useLocale()\n const localeMeta = LANGUAGE_META[currentLocale as keyof typeof LANGUAGE_META]\n\n const items = useMemo(() => navigationItems.filter((item) => {\n const permission = modulePermissions[item.id]\n if (!permission) return true\n return hasPermission(permission)\n }), [navigationItems, modulePermissions, hasPermission])\n\n const handleSignOut = useCallback(() => { void logout('/login') }, [logout])\n const handleToggleTheme = useCallback(\n () => { setTheme(resolvedTheme === 'dark' ? 'light' : 'dark') },\n [resolvedTheme, setTheme],\n )\n const handleNavigate = useCallback((href: string) => router.push(href), [router])\n const handlePrefetch = useCallback((href: string) => router.prefetch(href), [router])\n\n const shellUser = user\n ? {\n name: user.name ?? null,\n email: user.email ?? null,\n image: user.image ?? null,\n role: user.role ?? null,\n permissions: user.permissions as string[] | undefined,\n organizationId: user.organizationId ?? null,\n }\n : null\n\n return (\n <PlatformShell\n items={items}\n launchpadPageOrder={pageOrder}\n user={shellUser}\n authStatus={status}\n onSignOut={handleSignOut}\n dockPosition={dockPosition}\n dockAutoHide={dockAutoHide}\n dockEnabled={dockEnabled}\n resolvedTheme={resolvedTheme}\n onToggleTheme={handleToggleTheme}\n pathname={pathname}\n onNavigate={handleNavigate}\n onPrefetch={handlePrefetch}\n appName={appName}\n appIcon={appIcon ?? <RectangleStackIcon className=\"h-full w-full\" />}\n appIconRaw={appIconRaw}\n appLogo={appLogo}\n appGradient={appGradient}\n dashboardIcon={dashboardIcon ?? HomeIcon}\n notificationCount={history.length}\n onNotifications={openHistory}\n labels={{\n home: tCommon('home'),\n profile: tCommon('profile'),\n signOut: tCommon('signOut'),\n signOutConfirmTitle: tCommon('signOutConfirmTitle'),\n cancel: tCommon('cancel'),\n notifications: tCommon('notifications'),\n theme: tCommon('theme'),\n currentTheme: resolvedTheme === 'dark' ? tCommon('darkMode') : tCommon('lightMode'),\n language: tCommon('language'),\n currentLocale: localeMeta?.nativeName ?? currentLocale,\n localeFlag: resolveFlag(currentLocale),\n actions: tCommon('actions'),\n }}\n {...(settingsModal ? { profileDrawer: settingsModal } : {})}\n >\n {children}\n </PlatformShell>\n )\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { OtpInput, BackupCodeGrid, PasswordStrengthMeter } from './chunk-3VYD7QL2.mjs';
|
|
3
|
-
import { useAuth, StepFormPage, OptionGrid, Spinner, FormCheckbox, SectionCard, EmptyState, ListCard, ListCardItem, StatusBadge, Sheet, PasswordInput, BaseForm, Avatar, InlineSpinner, Input, SegmentedControl } from './chunk-
|
|
3
|
+
import { useAuth, StepFormPage, OptionGrid, Spinner, FormCheckbox, SectionCard, EmptyState, ListCard, ListCardItem, StatusBadge, Sheet, PasswordInput, BaseForm, Avatar, InlineSpinner, Input, SegmentedControl } from './chunk-ZQRUAXGP.mjs';
|
|
4
4
|
import { useTranslations, useFormatter, useLocale } from './chunk-7VJ7CMMT.mjs';
|
|
5
5
|
import { Button, Badge } from './chunk-WR55H7DH.mjs';
|
|
6
6
|
import { triggerHaptic } from './chunk-D2JF6C3E.mjs';
|
|
@@ -1017,5 +1017,5 @@ function UserProfile({
|
|
|
1017
1017
|
}
|
|
1018
1018
|
|
|
1019
1019
|
export { LinkedAccountsTabContent, MfaManage, MfaSetup, ProfileTabContent, SecurityTabContent, SessionsTabContent, UserProfile };
|
|
1020
|
-
//# sourceMappingURL=chunk-
|
|
1021
|
-
//# sourceMappingURL=chunk-
|
|
1020
|
+
//# sourceMappingURL=chunk-WS3IJFPW.mjs.map
|
|
1021
|
+
//# sourceMappingURL=chunk-WS3IJFPW.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/platform/auth/mfa-setup.tsx","../src/platform/auth/mfa-manage.tsx","../src/platform/auth/user-profile.tsx"],"names":["useState","useCallback","jsxs","Fragment","jsx","ShieldCheckIcon"],"mappings":"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","file":"chunk-PYNXIDG3.mjs","sourcesContent":["import { useState, useCallback } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n StepFormPage,\n OptionGrid,\n FormCheckbox,\n Spinner,\n triggerHaptic,\n type FormStep,\n} from '@ui/index'\nimport { OtpInput, BackupCodeGrid } from './components'\nimport { ShieldCheckIcon } from '@heroicons/react/24/outline'\nimport { useAuth } from '../../_auth'\n\nexport type { MfaSetupProps } from '@datatechsolutions/shared-domain'\nimport type { MfaSetupProps } from '@datatechsolutions/shared-domain'\n\nexport function MfaSetup({\n onSuccess,\n onCancel,\n enforcement = 'optional',\n onGenerateSecret,\n onVerifySetup,\n}: MfaSetupProps) {\n const t = useTranslations('windsock')\n const { client } = useAuth()\n\n const setupSteps: FormStep[] = [\n {\n id: 'method',\n title: t('mfa.setup.stepMethodTitle'),\n description: t('mfa.setup.stepMethodDescription'),\n },\n {\n id: 'scan',\n title: t('mfa.setup.stepScanTitle'),\n description: t('mfa.setup.stepScanDescription'),\n },\n {\n id: 'verify',\n title: t('mfa.setup.stepVerifyTitle'),\n description: t('mfa.setup.stepVerifyDescription'),\n },\n {\n id: 'backup',\n title: t('mfa.setup.stepBackupTitle'),\n description: t('mfa.setup.stepBackupDescription'),\n },\n ]\n\n const [currentStep, setCurrentStep] = useState(0)\n const [selectedMethod, setSelectedMethod] = useState('totp')\n const [qrCodeUri, setQrCodeUri] = useState('')\n const [secret, setSecret] = useState('')\n const [verifyCode, setVerifyCode] = useState('')\n const [verifyError, setVerifyError] = useState<string | null>(null)\n const [backupCodes, setBackupCodes] = useState<string[]>([])\n const [savedBackupCodes, setSavedBackupCodes] = useState(false)\n const [isLoading, setIsLoading] = useState(false)\n\n const handleStepChange = useCallback(\n async (step: number) => {\n // Moving from method -> scan: generate secret\n if (step === 1 && currentStep === 0) {\n setIsLoading(true)\n try {\n if (onGenerateSecret) {\n const result = await onGenerateSecret()\n setSecret(result.secret)\n setQrCodeUri(result.qrCodeUri)\n } else {\n const result = await client.generateMfaSecret()\n setSecret(result.secret)\n setQrCodeUri(result.qrCode)\n setBackupCodes(result.backupCodes)\n }\n } catch {\n // Stay on current step if generation fails\n return\n } finally {\n setIsLoading(false)\n }\n }\n triggerHaptic('light')\n setCurrentStep(step)\n },\n [currentStep, onGenerateSecret, client],\n )\n\n const handleMethodSelect = useCallback((method: string) => {\n triggerHaptic('light')\n setSelectedMethod(method)\n }, [])\n\n const handleVerifyComplete = useCallback(\n async (code: string) => {\n setVerifyError(null)\n setIsLoading(true)\n\n try {\n if (onVerifySetup) {\n const result = await onVerifySetup(code)\n if (result.success) {\n triggerHaptic('success')\n if (result.backupCodes?.length) {\n setBackupCodes(result.backupCodes)\n }\n setCurrentStep(3)\n } else {\n triggerHaptic('error')\n setVerifyError(t('mfa.setup.errorInvalidCode'))\n }\n } else {\n const result = await client.verifyMfaSetup(code)\n if (result.success) {\n triggerHaptic('success')\n setCurrentStep(3)\n } else {\n triggerHaptic('error')\n setVerifyError(t('mfa.setup.errorInvalidCode'))\n }\n }\n } catch {\n triggerHaptic('error')\n setVerifyError(t('mfa.setup.errorVerificationFailed'))\n } finally {\n setIsLoading(false)\n }\n },\n [onVerifySetup, client, t],\n )\n\n const handleSubmit = useCallback(() => {\n triggerHaptic('success')\n onSuccess?.()\n }, [onSuccess])\n\n const handleCancel = useCallback(() => {\n triggerHaptic('light')\n onCancel?.()\n }, [onCancel])\n\n const canAdvance = (() => {\n switch (currentStep) {\n case 0: return !!selectedMethod\n case 1: return !!qrCodeUri\n case 2: return false // Advance via OTP complete callback\n case 3: return savedBackupCodes\n default: return false\n }\n })()\n\n return (\n <StepFormPage\n title={t('mfa.setup.title')}\n subtitle={\n enforcement === 'required'\n ? t('mfa.setup.subtitleRequired')\n : t('mfa.setup.subtitleOptional')\n }\n label={t('mfa.setup.label')}\n icon={<ShieldCheckIcon className=\"h-5 w-5\" />}\n gradient=\"from-emerald-500 via-teal-500 to-cyan-500\"\n steps={setupSteps}\n currentStep={currentStep}\n onStepChange={handleStepChange}\n onSubmit={handleSubmit}\n onCancel={handleCancel}\n isSubmitting={isLoading}\n submitLabel={t('mfa.setup.submitLabel')}\n canAdvance={canAdvance}\n >\n {/* Step 0: Choose method */}\n {currentStep === 0 && (\n <OptionGrid\n icon={<ShieldCheckIcon className=\"h-4 w-4\" />}\n title={t('mfa.setup.methodGridTitle')}\n options={[\n {\n code: 'totp',\n flag: '\\u{1F4F1}',\n label: t('mfa.setup.methodAuthenticatorApp'),\n },\n ]}\n selected={selectedMethod}\n onSelect={handleMethodSelect}\n columns={2}\n />\n )}\n\n {/* Step 1: Scan QR code */}\n {currentStep === 1 && (\n <div className=\"space-y-4\">\n {isLoading ? (\n <div className=\"flex justify-center py-8\">\n <Spinner />\n </div>\n ) : (\n <>\n {qrCodeUri && (\n <div className=\"flex justify-center\">\n <div className=\"rounded-xl bg-white p-4\">\n <img\n src={qrCodeUri}\n alt={t('mfa.setup.qrCodeAlt')}\n className=\"h-48 w-48\"\n />\n </div>\n </div>\n )}\n\n {secret && (\n <div className=\"text-center\">\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mb-1\">\n {t('mfa.setup.manualSecretLabel')}\n </p>\n <code className=\"font-mono text-sm font-medium text-gray-900 dark:text-white tracking-widest\">\n {secret}\n </code>\n </div>\n )}\n </>\n )}\n </div>\n )}\n\n {/* Step 2: Verify code */}\n {currentStep === 2 && (\n <div className=\"space-y-4\">\n <OtpInput\n value={verifyCode}\n onChange={setVerifyCode}\n onComplete={handleVerifyComplete}\n error={verifyError ?? undefined}\n disabled={isLoading}\n autoFocus\n />\n {isLoading && (\n <div className=\"flex justify-center\">\n <Spinner />\n </div>\n )}\n </div>\n )}\n\n {/* Step 3: Save backup codes */}\n {currentStep === 3 && (\n <div className=\"space-y-4\">\n <BackupCodeGrid\n codes={backupCodes}\n revealed\n />\n <FormCheckbox\n label={t('mfa.setup.backupCodesSavedConfirm')}\n checked={savedBackupCodes}\n onChange={setSavedBackupCodes}\n />\n </div>\n )}\n </StepFormPage>\n )\n}\n","import { useState, useCallback } from 'react'\nimport { useTranslations, useFormatter } from '@ui/lib/i18n-context'\nimport { toBusinessDate } from '@datatechsolutions/shared-domain'\nimport {\n SectionCard,\n ListCard,\n ListCardItem,\n StatusBadge,\n EmptyState,\n Button,\n PasswordInput,\n Sheet,\n DynamicIslandConfirm,\n triggerHaptic,\n} from '@ui/index'\nimport { BackupCodeGrid } from './components'\nimport {\n ShieldCheckIcon,\n PlusIcon,\n ArrowPathIcon,\n} from '@heroicons/react/24/outline'\nimport { ShieldExclamationIcon } from '@heroicons/react/20/solid'\nimport { useAuth } from '../../_auth'\n\nexport type { EnrolledMethod, MfaManageProps } from '@datatechsolutions/shared-domain'\nimport type { EnrolledMethod, MfaManageProps } from '@datatechsolutions/shared-domain'\n\nexport function MfaManage({\n mfaEnabled,\n enrolledMethods = [],\n onEnroll,\n onDisable,\n onRegenerateBackupCodes,\n}: MfaManageProps) {\n const t = useTranslations('windsock')\n const format = useFormatter()\n const { client } = useAuth()\n\n const [isBackupSheetOpen, setIsBackupSheetOpen] = useState(false)\n const [newBackupCodes, setNewBackupCodes] = useState<string[]>([])\n const [isRegenerating, setIsRegenerating] = useState(false)\n const [isConfirmDisableOpen, setIsConfirmDisableOpen] = useState(false)\n const [disablePassword, setDisablePassword] = useState('')\n const [disableError, setDisableError] = useState<string | null>(null)\n const [isDisabling, setIsDisabling] = useState(false)\n\n const handleOpenBackupSheet = useCallback(async () => {\n triggerHaptic('medium')\n setIsRegenerating(true)\n try {\n const codes = onRegenerateBackupCodes\n ? await onRegenerateBackupCodes()\n : await client.regenerateBackupCodes()\n setNewBackupCodes(codes)\n setIsBackupSheetOpen(true)\n } catch {\n // Fail silently — caller is responsible for error surfacing\n } finally {\n setIsRegenerating(false)\n }\n }, [onRegenerateBackupCodes, client])\n\n const handleCloseBackupSheet = useCallback(() => {\n triggerHaptic('light')\n setIsBackupSheetOpen(false)\n setNewBackupCodes([])\n }, [])\n\n const handleRequestDisable = useCallback(() => {\n triggerHaptic('warning')\n setDisablePassword('')\n setDisableError(null)\n setIsConfirmDisableOpen(true)\n }, [])\n\n const handleConfirmDisable = useCallback(async () => {\n if (!disablePassword.trim()) {\n setDisableError(t('mfa.manage.disablePasswordRequired'))\n triggerHaptic('error')\n return\n }\n\n setDisableError(null)\n setIsDisabling(true)\n triggerHaptic('medium')\n\n try {\n if (onDisable) {\n onDisable()\n } else {\n const result = await client.disableMfa(disablePassword)\n if (!result.success) {\n setDisableError(result.error ?? t('mfa.manage.disableError'))\n triggerHaptic('error')\n return\n }\n }\n setIsConfirmDisableOpen(false)\n triggerHaptic('success')\n } catch {\n setDisableError(t('mfa.manage.disableError'))\n triggerHaptic('error')\n } finally {\n setIsDisabling(false)\n }\n }, [disablePassword, onDisable, client, t])\n\n const handleCancelDisable = useCallback(() => {\n triggerHaptic('light')\n setIsConfirmDisableOpen(false)\n setDisablePassword('')\n setDisableError(null)\n }, [])\n\n const handleEnroll = useCallback(() => {\n triggerHaptic('light')\n onEnroll?.()\n }, [onEnroll])\n\n return (\n <>\n <SectionCard\n header={{\n icon: <ShieldCheckIcon className=\"h-5 w-5 text-white\" />,\n title: t('mfa.manage.title'),\n subtitle: t('mfa.manage.subtitle'),\n gradient: 'from-emerald-500 via-teal-500 to-cyan-500',\n rightContent: mfaEnabled ? (\n <StatusBadge status=\"active\" label={t('mfa.manage.statusEnabled')} size=\"sm\" />\n ) : (\n <StatusBadge status=\"inactive\" label={t('mfa.manage.statusDisabled')} size=\"sm\" />\n ),\n }}\n padded={false}\n >\n {!mfaEnabled ? (\n /* MFA not enabled — show empty state with enable CTA */\n <div className=\"p-4 sm:p-6\">\n <EmptyState\n message={t('mfa.manage.emptyStateMessage')}\n description={t('mfa.manage.emptyStateDescription')}\n icon={ShieldExclamationIcon}\n action={{\n label: t('mfa.manage.enableButton'),\n onClick: handleEnroll,\n }}\n variant=\"card\"\n />\n </div>\n ) : (\n /* MFA enabled — show enrolled methods list + action buttons */\n <div className=\"space-y-4 p-4 sm:p-6\">\n {enrolledMethods.length > 0 && (\n <ListCard>\n {enrolledMethods.map((method, index) => (\n <ListCardItem\n key={`${method.type}-${index}`}\n leading={\n <div className=\"h-9 w-9 rounded-xl bg-gradient-to-br from-emerald-500 to-teal-600 flex items-center justify-center shadow-sm\">\n <ShieldCheckIcon className=\"h-5 w-5 text-white\" />\n </div>\n }\n trailing={\n <StatusBadge status=\"active\" label={t('mfa.manage.methodStatusActive')} size=\"sm\" />\n }\n >\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {method.label}\n </p>\n {method.createdAt && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mt-0.5\">\n {t('mfa.manage.methodEnrolledAt', {\n date: format.dateTime(new Date(method.createdAt), {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n }),\n })}\n </p>\n )}\n </ListCardItem>\n ))}\n </ListCard>\n )}\n\n {/* Action buttons */}\n <div className=\"flex flex-col gap-2 sm:flex-row sm:gap-3\">\n {onEnroll && (\n <Button\n color=\"ios-glass-blue\"\n onClick={handleEnroll}\n className=\"flex-1\"\n >\n <PlusIcon className=\"h-4 w-4 mr-1.5\" />\n {t('mfa.manage.addMethodButton')}\n </Button>\n )}\n\n <Button\n outline\n onClick={handleOpenBackupSheet}\n loading={isRegenerating}\n disabled={isRegenerating}\n className=\"flex-1\"\n >\n <ArrowPathIcon className=\"h-4 w-4 mr-1.5\" />\n {t('mfa.manage.regenerateBackupCodesButton')}\n </Button>\n\n <Button\n color=\"ios-glass-red\"\n onClick={handleRequestDisable}\n className=\"flex-1\"\n >\n {t('mfa.manage.disableMfaButton')}\n </Button>\n </div>\n </div>\n )}\n </SectionCard>\n\n {/* Backup codes sheet */}\n <Sheet\n open={isBackupSheetOpen}\n onClose={handleCloseBackupSheet}\n title={t('mfa.manage.backupCodesSheetTitle')}\n side=\"bottom\"\n size=\"md\"\n >\n <div className=\"space-y-4 p-4 sm:p-6\">\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {t('mfa.manage.backupCodesSheetDescription')}\n </p>\n <BackupCodeGrid\n codes={newBackupCodes}\n revealed\n />\n <Button\n color=\"ios-glass-blue\"\n fullWidth\n onClick={handleCloseBackupSheet}\n >\n {t('mfa.manage.backupCodesDoneButton')}\n </Button>\n </div>\n </Sheet>\n\n {/* Disable MFA — requires password confirmation */}\n <Sheet\n open={isConfirmDisableOpen}\n onClose={handleCancelDisable}\n title={t('mfa.manage.confirmDisableTitle')}\n side=\"bottom\"\n size=\"md\"\n >\n <div className=\"space-y-4 p-4 sm:p-6\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-xl bg-ios-red shadow-sm\">\n <ShieldExclamationIcon className=\"h-5 w-5 text-white\" />\n </div>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {t('mfa.manage.confirmDisableDescription')}\n </p>\n </div>\n\n <PasswordInput\n label={t('mfa.manage.disablePasswordLabel')}\n value={disablePassword}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setDisablePassword(event.target.value)}\n placeholder={t('mfa.manage.disablePasswordPlaceholder')}\n disabled={isDisabling}\n autoFocus\n autoComplete=\"current-password\"\n />\n\n {disableError && (\n <p className=\"text-sm text-red-600 dark:text-red-400\" role=\"alert\">{disableError}</p>\n )}\n\n <div className=\"flex gap-3\">\n <Button\n outline\n onClick={handleCancelDisable}\n disabled={isDisabling}\n className=\"flex-1\"\n >\n {t('mfa.manage.confirmDisableCancelLabel')}\n </Button>\n <Button\n color=\"ios-glass-red\"\n onClick={handleConfirmDisable}\n loading={isDisabling}\n disabled={isDisabling || !disablePassword.trim()}\n className=\"flex-1\"\n >\n {t('mfa.manage.confirmDisableConfirmLabel')}\n </Button>\n </div>\n </div>\n </Sheet>\n </>\n )\n}\n","import React, { useState, useEffect, useCallback, useRef } from 'react'\nimport { useTranslations, useFormatter, useLocale } from '@ui/lib/i18n-context'\nimport {\n SegmentedControl,\n SectionCard,\n BaseForm,\n Input,\n PasswordInput,\n Button,\n ListCard,\n ListCardItem,\n Avatar,\n Badge,\n InlineSpinner,\n triggerHaptic,\n} from '@ui/index'\nimport { PasswordStrengthMeter } from './components'\nimport {\n UserIcon,\n ComputerDesktopIcon,\n LinkIcon,\n CheckCircleIcon,\n GlobeAltIcon,\n CameraIcon,\n} from '@heroicons/react/24/outline'\nimport { useAuth } from '../../_auth'\nimport { MfaManage } from './mfa-manage'\nimport { MfaSetup } from './mfa-setup'\nimport * as sharedI18n from '@datatechsolutions/shared-domain/i18n'\nimport type { LocaleCode } from '@datatechsolutions/shared-domain/i18n'\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport type { ProfileTab, UserProfileProps } from '@datatechsolutions/shared-domain'\nimport type {\n UserSession,\n LinkedAccount,\n ProfileTab,\n ProfileTabContentProps,\n UserProfileProps,\n} from '@datatechsolutions/shared-domain'\n\nconst ALL_TABS: ProfileTab[] = ['profile', 'security', 'sessions', 'linked-accounts']\n\nexport function ProfileTabContent({ onProfileUpdate }: ProfileTabContentProps) {\n const t = useTranslations('windsock')\n const currentLocale = useLocale() as LocaleCode\n const { user, client } = useAuth()\n\n const [name, setName] = useState(user?.name ?? '')\n const [avatarPreview, setAvatarPreview] = useState<string | null>(user?.image ?? null)\n const [isUploadingAvatar, setIsUploadingAvatar] = useState(false)\n const fileInputRef = useRef<HTMLInputElement>(null)\n const [selectedLocale, setSelectedLocale] = useState<LocaleCode>(currentLocale)\n const [isSaving, setIsSaving] = useState(false)\n const [saveError, setSaveError] = useState<string | null>(null)\n const [saveSuccess, setSaveSuccess] = useState(false)\n\n const handleAvatarChange = useCallback(async (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0]\n if (!file) return\n\n // Validate client-side\n if (!['image/jpeg', 'image/png', 'image/webp'].includes(file.type)) {\n setSaveError(t('userProfile.profile.avatarInvalidType'))\n return\n }\n if (file.size > 5 * 1024 * 1024) {\n setSaveError(t('userProfile.profile.avatarTooLarge'))\n return\n }\n\n // Show preview immediately\n const previewUrl = URL.createObjectURL(file)\n setAvatarPreview(previewUrl)\n setSaveError(null)\n setIsUploadingAvatar(true)\n triggerHaptic('light')\n\n try {\n // Upload to S3 via presigned URL\n const uploadResult = await client.uploadFile(file, 'avatars')\n if (!uploadResult.success || !uploadResult.key) {\n throw new Error(uploadResult.error ?? 'Upload failed')\n }\n\n // Save the S3 key to user profile\n const updateResult = await client.updateProfile({ image: uploadResult.key })\n if (!updateResult.success) {\n throw new Error(updateResult.error ?? 'Profile update failed')\n }\n\n triggerHaptic('success')\n } catch (error) {\n setSaveError(error instanceof Error ? error.message : 'Upload failed')\n setAvatarPreview(user?.image ?? null)\n triggerHaptic('error')\n } finally {\n setIsUploadingAvatar(false)\n // Reset file input so same file can be re-selected\n if (fileInputRef.current) fileInputRef.current.value = ''\n }\n }, [client, user, t])\n\n const handleSave = useCallback(async () => {\n setSaveError(null)\n setSaveSuccess(false)\n setIsSaving(true)\n triggerHaptic('light')\n try {\n if (onProfileUpdate) {\n await onProfileUpdate({ name, email: user?.email ?? '', locale: selectedLocale })\n } else {\n const result = await client.updateProfile({ name, locale: selectedLocale })\n if (!result.success) {\n throw new Error(result.error)\n }\n }\n setSaveSuccess(true)\n triggerHaptic('success')\n // Persist locale to cookie and reload if changed\n if (selectedLocale !== currentLocale) {\n sharedI18n.setLocaleCookie(selectedLocale)\n window.location.reload()\n }\n } catch {\n setSaveError(t('userProfile.profile.saveError'))\n triggerHaptic('error')\n } finally {\n setIsSaving(false)\n }\n }, [name, selectedLocale, currentLocale, user, onProfileUpdate, client, t])\n\n return (\n <div className=\"space-y-6\">\n <SectionCard\n header={{\n icon: <UserIcon className=\"h-5 w-5 text-white\" />,\n title: t('userProfile.profile.title'),\n subtitle: t('userProfile.profile.subtitle'),\n gradient: 'from-blue-500 via-indigo-500 to-violet-500',\n }}\n >\n <BaseForm onSubmit={handleSave} submitLabel={t('userProfile.profile.saveButton')} showFooter={false}>\n {/* Avatar Upload */}\n <div className=\"flex flex-col items-center gap-3 pb-4\">\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n disabled={isUploadingAvatar}\n className=\"group relative\"\n >\n <Avatar\n src={avatarPreview ?? undefined}\n initials={user?.name?.slice(0, 2).toUpperCase() ?? user?.email?.slice(0, 2).toUpperCase()}\n alt={user?.name ?? 'Profile'}\n className=\"h-20 w-20 text-2xl\"\n />\n <div className=\"absolute inset-0 flex items-center justify-center rounded-full bg-black/0 transition group-hover:bg-black/40\">\n {isUploadingAvatar ? (\n <InlineSpinner />\n ) : (\n <CameraIcon className=\"h-6 w-6 text-white opacity-0 transition group-hover:opacity-100\" />\n )}\n </div>\n </button>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/jpeg,image/png,image/webp\"\n onChange={handleAvatarChange}\n className=\"hidden\"\n />\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">\n {t('userProfile.profile.avatarHint')}\n </p>\n </div>\n\n <Input\n label={t('userProfile.profile.nameLabel')}\n value={name}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setName(event.target.value)}\n disabled={isSaving}\n autoComplete=\"name\"\n />\n <Input\n label={t('userProfile.profile.emailLabel')}\n type=\"email\"\n value={user?.email ?? ''}\n readOnly\n disabled\n autoComplete=\"email\"\n />\n\n {saveError && (\n <p className=\"text-sm text-red-600 dark:text-red-400\">{saveError}</p>\n )}\n\n {saveSuccess && (\n <p className=\"text-sm text-green-600 dark:text-green-400\">\n {t('userProfile.profile.saveSuccess')}\n </p>\n )}\n\n <Button\n type=\"submit\"\n color=\"ios-glass-blue\"\n fullWidth\n loading={isSaving}\n disabled={isSaving}\n >\n {t('userProfile.profile.saveButton')}\n </Button>\n </BaseForm>\n </SectionCard>\n\n <SectionCard\n header={{\n icon: <GlobeAltIcon className=\"h-5 w-5 text-white\" />,\n title: t('userProfile.profile.languageTitle'),\n subtitle: t('userProfile.profile.languageSubtitle'),\n gradient: 'from-lime-400 via-emerald-500 to-green-600',\n }}\n >\n <div className=\"grid grid-cols-3 gap-2\">\n {sharedI18n.SUPPORTED_LOCALES.map((code) => {\n const meta = sharedI18n.LANGUAGE_META[code]\n const checked = selectedLocale === code\n return (\n <button\n key={code}\n type=\"button\"\n onClick={() => {\n setSelectedLocale(code)\n triggerHaptic('light')\n }}\n className={`group relative flex flex-col items-center justify-center rounded-xl border px-2 py-2.5 backdrop-blur-xl shadow-[inset_0_1px_0_rgba(255,255,255,0.9),0_10px_22px_-16px_rgba(15,23,42,0.45)] dark:shadow-[inset_0_1px_0_rgba(255,255,255,0.18),0_10px_22px_-16px_rgba(0,0,0,0.75)] transition ${\n checked\n ? 'border-indigo-400/80 bg-gradient-to-br from-indigo-100/85 via-white/80 to-sky-100/75 dark:border-indigo-300/70 dark:bg-[linear-gradient(140deg,rgba(99,102,241,0.32)_0%,rgba(30,41,59,0.72)_100%)]'\n : 'border-white/55 bg-gradient-to-br from-white/82 via-white/66 to-slate-100/62 hover:from-white/92 hover:to-sky-100/72 dark:border-white/15 dark:bg-[linear-gradient(140deg,rgba(30,41,59,0.72)_0%,rgba(15,23,42,0.62)_100%)] dark:hover:bg-[linear-gradient(140deg,rgba(51,65,85,0.76)_0%,rgba(30,41,59,0.68)_100%)]'\n }`}\n >\n <span className=\"text-lg leading-5\">{meta.flag}</span>\n <span className={`mt-1.5 text-xs font-semibold ${\n checked ? 'text-slate-900 dark:text-indigo-100' : 'text-slate-700 dark:text-slate-100'\n }`}>\n {meta.nativeName}\n </span>\n {checked && (\n <CheckCircleIcon className=\"absolute right-1 top-1 h-3.5 w-3.5 text-indigo-600 dark:text-indigo-300\" />\n )}\n </button>\n )\n })}\n </div>\n {selectedLocale !== currentLocale && (\n <div className=\"mt-4\">\n <Button\n type=\"button\"\n color=\"ios-glass-blue\"\n fullWidth\n loading={isSaving}\n disabled={isSaving}\n onClick={handleSave}\n >\n {t('userProfile.profile.saveButton')}\n </Button>\n </div>\n )}\n </SectionCard>\n </div>\n )\n}\n\n// ── Security Tab ─────────────────────────────────────────────────────────────\n\nexport function SecurityTabContent() {\n const t = useTranslations('windsock')\n const { client, user, refresh } = useAuth()\n\n const [showMfaSetup, setShowMfaSetup] = useState(false)\n const [currentPassword, setCurrentPassword] = useState('')\n const [newPassword, setNewPassword] = useState('')\n const [confirmPassword, setConfirmPassword] = useState('')\n const [passwordError, setPasswordError] = useState<string | null>(null)\n const [passwordSuccess, setPasswordSuccess] = useState(false)\n const [isSavingPassword, setIsSavingPassword] = useState(false)\n\n const handleMfaSetupSuccess = useCallback(() => {\n setShowMfaSetup(false)\n // Refresh user state so mfaEnabled reflects the new status\n refresh()\n }, [refresh])\n\n const handleChangePassword = useCallback(async () => {\n setPasswordError(null)\n setPasswordSuccess(false)\n\n if (!currentPassword) {\n setPasswordError(t('userProfile.security.errorCurrentRequired'))\n return\n }\n if (!newPassword) {\n setPasswordError(t('userProfile.security.errorNewRequired'))\n return\n }\n if (newPassword !== confirmPassword) {\n setPasswordError(t('userProfile.security.errorPasswordMismatch'))\n return\n }\n\n setIsSavingPassword(true)\n triggerHaptic('light')\n\n try {\n const result = await client.changePassword(currentPassword, newPassword)\n if (!result.success) {\n setPasswordError(result.error ?? t('userProfile.security.errorSaveFailed'))\n triggerHaptic('error')\n return\n }\n setCurrentPassword('')\n setNewPassword('')\n setConfirmPassword('')\n setPasswordSuccess(true)\n triggerHaptic('success')\n } catch {\n setPasswordError(t('userProfile.security.errorSaveFailed'))\n triggerHaptic('error')\n } finally {\n setIsSavingPassword(false)\n }\n }, [currentPassword, newPassword, confirmPassword, client, t])\n\n return (\n <div className=\"space-y-6\">\n {showMfaSetup ? (\n <MfaSetup\n onSuccess={handleMfaSetupSuccess}\n onCancel={() => setShowMfaSetup(false)}\n />\n ) : (\n <MfaManage\n mfaEnabled={user?.mfaEnabled ?? false}\n enrolledMethods={user?.mfaEnabled ? [{ type: 'totp', label: t('userProfile.security.mfaTotpLabel') }] : []}\n onEnroll={() => setShowMfaSetup(true)}\n />\n )}\n\n <SectionCard\n header={{\n icon: <UserIcon className=\"h-5 w-5 text-white\" />,\n title: t('userProfile.security.changePasswordTitle'),\n subtitle: t('userProfile.security.changePasswordSubtitle'),\n gradient: 'from-blue-500 via-sky-500 to-cyan-500',\n }}\n >\n <BaseForm onSubmit={handleChangePassword} submitLabel={t('userProfile.security.changePasswordButton')} showFooter={false}>\n <PasswordInput\n label={t('userProfile.security.currentPasswordLabel')}\n value={currentPassword}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setCurrentPassword(event.target.value)}\n disabled={isSavingPassword}\n autoComplete=\"current-password\"\n />\n <PasswordInput\n label={t('userProfile.security.newPasswordLabel')}\n value={newPassword}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setNewPassword(event.target.value)}\n disabled={isSavingPassword}\n autoComplete=\"new-password\"\n />\n <PasswordStrengthMeter password={newPassword} />\n <PasswordInput\n label={t('userProfile.security.confirmPasswordLabel')}\n value={confirmPassword}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setConfirmPassword(event.target.value)}\n disabled={isSavingPassword}\n autoComplete=\"new-password\"\n />\n\n {passwordError && (\n <p className=\"text-sm text-red-600 dark:text-red-400\">{passwordError}</p>\n )}\n\n {passwordSuccess && (\n <p className=\"text-sm text-green-600 dark:text-green-400\">\n {t('userProfile.security.changePasswordSuccess')}\n </p>\n )}\n\n <Button\n type=\"submit\"\n color=\"ios-glass-blue\"\n fullWidth\n loading={isSavingPassword}\n disabled={isSavingPassword}\n >\n {t('userProfile.security.changePasswordButton')}\n </Button>\n </BaseForm>\n </SectionCard>\n </div>\n )\n}\n\n// ── Sessions Tab ─────────────────────────────────────────────────────────────\n\nexport function SessionsTabContent() {\n const t = useTranslations('windsock')\n const format = useFormatter()\n const { client } = useAuth()\n\n const [sessions, setSessions] = useState<UserSession[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [revokingId, setRevokingId] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n\n const fetchSessions = async () => {\n setIsLoading(true)\n try {\n const rawSessions = await client.getSessions()\n if (!cancelled) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n setSessions(rawSessions.map((session: any) => ({\n id: session.id,\n device: session.userAgent ?? 'Unknown',\n location: session.ipAddress ?? 'Unknown',\n lastActive: typeof session.createdAt === 'string' ? session.createdAt : (session.createdAt as Date).toISOString(),\n current: false,\n })))\n }\n } catch {\n // Non-critical — render empty list\n } finally {\n if (!cancelled) setIsLoading(false)\n }\n }\n\n fetchSessions()\n return () => { cancelled = true }\n }, [client])\n\n const handleRevoke = useCallback(async (sessionId: string) => {\n setRevokingId(sessionId)\n triggerHaptic('medium')\n try {\n await client.revokeSession(sessionId)\n setSessions((previous) => previous.filter((s) => s.id !== sessionId))\n triggerHaptic('success')\n } catch {\n triggerHaptic('error')\n } finally {\n setRevokingId(null)\n }\n }, [client])\n\n return (\n <SectionCard\n header={{\n icon: <ComputerDesktopIcon className=\"h-5 w-5 text-white\" />,\n title: t('userProfile.sessions.title'),\n subtitle: t('userProfile.sessions.subtitle'),\n gradient: 'from-teal-500 via-cyan-500 to-sky-500',\n }}\n padded={false}\n >\n {isLoading ? (\n <div className=\"flex items-center justify-center gap-2 p-8 text-sm text-slate-500 dark:text-slate-400\">\n <InlineSpinner />\n <span>{t('userProfile.sessions.loading')}</span>\n </div>\n ) : sessions.length === 0 ? (\n <p className=\"p-6 text-center text-sm text-slate-500 dark:text-slate-400\">\n {t('userProfile.sessions.empty')}\n </p>\n ) : (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b liquid-divider\">\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {t('userProfile.sessions.columnDevice')}\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {t('userProfile.sessions.columnLocation')}\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {t('userProfile.sessions.columnLastActive')}\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {t('userProfile.sessions.columnAction')}\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-gray-200/60 dark:divide-white/10\">\n {sessions.map((session) => (\n <tr key={session.id}>\n <td className=\"px-4 py-3 text-slate-900 dark:text-white\">\n <div className=\"flex items-center gap-2\">\n {session.device}\n {session.current && (\n <Badge color=\"green\">{t('userProfile.sessions.currentBadge')}</Badge>\n )}\n </div>\n </td>\n <td className=\"px-4 py-3 text-slate-500 dark:text-slate-400\">\n {session.location}\n </td>\n <td className=\"px-4 py-3 text-slate-500 dark:text-slate-400\">\n {format.relativeTime(new Date(session.lastActive))}\n </td>\n <td className=\"px-4 py-3 text-right\">\n {!session.current && (\n <Button\n size=\"sm\"\n color=\"ios-glass-red\"\n onClick={() => handleRevoke(session.id)}\n loading={revokingId === session.id}\n disabled={revokingId !== null}\n >\n {t('userProfile.sessions.revokeButton')}\n </Button>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </SectionCard>\n )\n}\n\n// ── Linked Accounts Tab ──────────────────────────────────────────────────────\n\nexport function LinkedAccountsTabContent() {\n const t = useTranslations('windsock')\n const { client } = useAuth()\n\n const [accounts, setAccounts] = useState<LinkedAccount[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [actioningProvider, setActioningProvider] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n\n const fetchAccounts = async () => {\n setIsLoading(true)\n try {\n const rawAccounts = await client.getLinkedAccounts()\n if (!cancelled) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n setAccounts(rawAccounts.map((account: any) => ({\n provider: account.provider,\n providerUserId: account.providerAccountId,\n connected: true,\n })))\n }\n } catch {\n // Non-critical — render empty list\n } finally {\n if (!cancelled) setIsLoading(false)\n }\n }\n\n fetchAccounts()\n return () => { cancelled = true }\n }, [client])\n\n const handleDisconnect = useCallback(async (provider: string) => {\n setActioningProvider(provider)\n triggerHaptic('medium')\n try {\n await client.disconnectProvider(provider)\n setAccounts((previous) => previous.filter((a) => a.provider !== provider))\n triggerHaptic('success')\n } catch {\n triggerHaptic('error')\n } finally {\n setActioningProvider(null)\n }\n }, [client])\n\n const providerInitials = (provider: string) =>\n provider.slice(0, 2).toUpperCase()\n\n return (\n <SectionCard\n header={{\n icon: <LinkIcon className=\"h-5 w-5 text-white\" />,\n title: t('userProfile.linkedAccounts.title'),\n subtitle: t('userProfile.linkedAccounts.subtitle'),\n gradient: 'from-violet-500 via-purple-500 to-pink-500',\n }}\n padded={false}\n >\n {isLoading ? (\n <div className=\"flex items-center justify-center gap-2 p-8 text-sm text-slate-500 dark:text-slate-400\">\n <InlineSpinner />\n <span>{t('userProfile.linkedAccounts.loading')}</span>\n </div>\n ) : accounts.length === 0 ? (\n <p className=\"p-6 text-center text-sm text-slate-500 dark:text-slate-400\">\n {t('userProfile.linkedAccounts.empty')}\n </p>\n ) : (\n <ListCard>\n {accounts.map((account) => (\n <ListCardItem\n key={account.provider}\n leading={\n <Avatar\n src={account.logoUrl}\n initials={providerInitials(account.provider)}\n alt={account.provider}\n />\n }\n trailing={\n <Button\n size=\"sm\"\n color=\"ios-glass-red\"\n onClick={() => handleDisconnect(account.provider)}\n loading={actioningProvider === account.provider}\n disabled={actioningProvider !== null}\n >\n {t('userProfile.linkedAccounts.disconnectButton')}\n </Button>\n }\n >\n <div>\n <p className=\"text-sm font-medium capitalize text-slate-900 dark:text-white\">\n {account.provider}\n </p>\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">\n {t('userProfile.linkedAccounts.connectedLabel')}\n </p>\n </div>\n </ListCardItem>\n ))}\n </ListCard>\n )}\n </SectionCard>\n )\n}\n\n// ── UserProfile ──────────────────────────────────────────────────────────────\n\nexport function UserProfile({\n defaultTab = 'profile',\n tabs = ALL_TABS,\n onSignOut: _onSignOut,\n onProfileUpdate,\n}: UserProfileProps) {\n const t = useTranslations('windsock')\n const { status } = useAuth()\n\n const [activeTab, setActiveTab] = useState<ProfileTab>(\n tabs.includes(defaultTab) ? defaultTab : (tabs[0] ?? 'profile'),\n )\n\n if (status === 'loading') {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <InlineSpinner />\n </div>\n )\n }\n\n if (status !== 'authenticated') {\n return null\n }\n\n const segments = tabs.map((tab) => ({\n value: tab,\n label: t(`userProfile.tabs.${tab}`),\n }))\n\n return (\n <div className=\"space-y-6\">\n {tabs.length > 1 && (\n <SegmentedControl\n segments={segments}\n value={activeTab}\n onChange={(value: string) => setActiveTab(value as ProfileTab)}\n fullWidth\n />\n )}\n\n {activeTab === 'profile' && (\n <ProfileTabContent onProfileUpdate={onProfileUpdate} />\n )}\n\n {activeTab === 'security' && (\n <SecurityTabContent />\n )}\n\n {activeTab === 'sessions' && (\n <SessionsTabContent />\n )}\n\n {activeTab === 'linked-accounts' && (\n <LinkedAccountsTabContent />\n )}\n </div>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/platform/auth/mfa-setup.tsx","../src/platform/auth/mfa-manage.tsx","../src/platform/auth/user-profile.tsx"],"names":["useState","useCallback","jsxs","Fragment","jsx","ShieldCheckIcon"],"mappings":"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","file":"chunk-WS3IJFPW.mjs","sourcesContent":["import { useState, useCallback } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n StepFormPage,\n OptionGrid,\n FormCheckbox,\n Spinner,\n triggerHaptic,\n type FormStep,\n} from '@ui/index'\nimport { OtpInput, BackupCodeGrid } from './components'\nimport { ShieldCheckIcon } from '@heroicons/react/24/outline'\nimport { useAuth } from '../../_auth'\n\nexport type { MfaSetupProps } from '@datatechsolutions/shared-domain'\nimport type { MfaSetupProps } from '@datatechsolutions/shared-domain'\n\nexport function MfaSetup({\n onSuccess,\n onCancel,\n enforcement = 'optional',\n onGenerateSecret,\n onVerifySetup,\n}: MfaSetupProps) {\n const t = useTranslations('windsock')\n const { client } = useAuth()\n\n const setupSteps: FormStep[] = [\n {\n id: 'method',\n title: t('mfa.setup.stepMethodTitle'),\n description: t('mfa.setup.stepMethodDescription'),\n },\n {\n id: 'scan',\n title: t('mfa.setup.stepScanTitle'),\n description: t('mfa.setup.stepScanDescription'),\n },\n {\n id: 'verify',\n title: t('mfa.setup.stepVerifyTitle'),\n description: t('mfa.setup.stepVerifyDescription'),\n },\n {\n id: 'backup',\n title: t('mfa.setup.stepBackupTitle'),\n description: t('mfa.setup.stepBackupDescription'),\n },\n ]\n\n const [currentStep, setCurrentStep] = useState(0)\n const [selectedMethod, setSelectedMethod] = useState('totp')\n const [qrCodeUri, setQrCodeUri] = useState('')\n const [secret, setSecret] = useState('')\n const [verifyCode, setVerifyCode] = useState('')\n const [verifyError, setVerifyError] = useState<string | null>(null)\n const [backupCodes, setBackupCodes] = useState<string[]>([])\n const [savedBackupCodes, setSavedBackupCodes] = useState(false)\n const [isLoading, setIsLoading] = useState(false)\n\n const handleStepChange = useCallback(\n async (step: number) => {\n // Moving from method -> scan: generate secret\n if (step === 1 && currentStep === 0) {\n setIsLoading(true)\n try {\n if (onGenerateSecret) {\n const result = await onGenerateSecret()\n setSecret(result.secret)\n setQrCodeUri(result.qrCodeUri)\n } else {\n const result = await client.generateMfaSecret()\n setSecret(result.secret)\n setQrCodeUri(result.qrCode)\n setBackupCodes(result.backupCodes)\n }\n } catch {\n // Stay on current step if generation fails\n return\n } finally {\n setIsLoading(false)\n }\n }\n triggerHaptic('light')\n setCurrentStep(step)\n },\n [currentStep, onGenerateSecret, client],\n )\n\n const handleMethodSelect = useCallback((method: string) => {\n triggerHaptic('light')\n setSelectedMethod(method)\n }, [])\n\n const handleVerifyComplete = useCallback(\n async (code: string) => {\n setVerifyError(null)\n setIsLoading(true)\n\n try {\n if (onVerifySetup) {\n const result = await onVerifySetup(code)\n if (result.success) {\n triggerHaptic('success')\n if (result.backupCodes?.length) {\n setBackupCodes(result.backupCodes)\n }\n setCurrentStep(3)\n } else {\n triggerHaptic('error')\n setVerifyError(t('mfa.setup.errorInvalidCode'))\n }\n } else {\n const result = await client.verifyMfaSetup(code)\n if (result.success) {\n triggerHaptic('success')\n setCurrentStep(3)\n } else {\n triggerHaptic('error')\n setVerifyError(t('mfa.setup.errorInvalidCode'))\n }\n }\n } catch {\n triggerHaptic('error')\n setVerifyError(t('mfa.setup.errorVerificationFailed'))\n } finally {\n setIsLoading(false)\n }\n },\n [onVerifySetup, client, t],\n )\n\n const handleSubmit = useCallback(() => {\n triggerHaptic('success')\n onSuccess?.()\n }, [onSuccess])\n\n const handleCancel = useCallback(() => {\n triggerHaptic('light')\n onCancel?.()\n }, [onCancel])\n\n const canAdvance = (() => {\n switch (currentStep) {\n case 0: return !!selectedMethod\n case 1: return !!qrCodeUri\n case 2: return false // Advance via OTP complete callback\n case 3: return savedBackupCodes\n default: return false\n }\n })()\n\n return (\n <StepFormPage\n title={t('mfa.setup.title')}\n subtitle={\n enforcement === 'required'\n ? t('mfa.setup.subtitleRequired')\n : t('mfa.setup.subtitleOptional')\n }\n label={t('mfa.setup.label')}\n icon={<ShieldCheckIcon className=\"h-5 w-5\" />}\n gradient=\"from-emerald-500 via-teal-500 to-cyan-500\"\n steps={setupSteps}\n currentStep={currentStep}\n onStepChange={handleStepChange}\n onSubmit={handleSubmit}\n onCancel={handleCancel}\n isSubmitting={isLoading}\n submitLabel={t('mfa.setup.submitLabel')}\n canAdvance={canAdvance}\n >\n {/* Step 0: Choose method */}\n {currentStep === 0 && (\n <OptionGrid\n icon={<ShieldCheckIcon className=\"h-4 w-4\" />}\n title={t('mfa.setup.methodGridTitle')}\n options={[\n {\n code: 'totp',\n flag: '\\u{1F4F1}',\n label: t('mfa.setup.methodAuthenticatorApp'),\n },\n ]}\n selected={selectedMethod}\n onSelect={handleMethodSelect}\n columns={2}\n />\n )}\n\n {/* Step 1: Scan QR code */}\n {currentStep === 1 && (\n <div className=\"space-y-4\">\n {isLoading ? (\n <div className=\"flex justify-center py-8\">\n <Spinner />\n </div>\n ) : (\n <>\n {qrCodeUri && (\n <div className=\"flex justify-center\">\n <div className=\"rounded-xl bg-white p-4\">\n <img\n src={qrCodeUri}\n alt={t('mfa.setup.qrCodeAlt')}\n className=\"h-48 w-48\"\n />\n </div>\n </div>\n )}\n\n {secret && (\n <div className=\"text-center\">\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mb-1\">\n {t('mfa.setup.manualSecretLabel')}\n </p>\n <code className=\"font-mono text-sm font-medium text-gray-900 dark:text-white tracking-widest\">\n {secret}\n </code>\n </div>\n )}\n </>\n )}\n </div>\n )}\n\n {/* Step 2: Verify code */}\n {currentStep === 2 && (\n <div className=\"space-y-4\">\n <OtpInput\n value={verifyCode}\n onChange={setVerifyCode}\n onComplete={handleVerifyComplete}\n error={verifyError ?? undefined}\n disabled={isLoading}\n autoFocus\n />\n {isLoading && (\n <div className=\"flex justify-center\">\n <Spinner />\n </div>\n )}\n </div>\n )}\n\n {/* Step 3: Save backup codes */}\n {currentStep === 3 && (\n <div className=\"space-y-4\">\n <BackupCodeGrid\n codes={backupCodes}\n revealed\n />\n <FormCheckbox\n label={t('mfa.setup.backupCodesSavedConfirm')}\n checked={savedBackupCodes}\n onChange={setSavedBackupCodes}\n />\n </div>\n )}\n </StepFormPage>\n )\n}\n","import { useState, useCallback } from 'react'\nimport { useTranslations, useFormatter } from '@ui/lib/i18n-context'\nimport { toBusinessDate } from '@datatechsolutions/shared-domain'\nimport {\n SectionCard,\n ListCard,\n ListCardItem,\n StatusBadge,\n EmptyState,\n Button,\n PasswordInput,\n Sheet,\n DynamicIslandConfirm,\n triggerHaptic,\n} from '@ui/index'\nimport { BackupCodeGrid } from './components'\nimport {\n ShieldCheckIcon,\n PlusIcon,\n ArrowPathIcon,\n} from '@heroicons/react/24/outline'\nimport { ShieldExclamationIcon } from '@heroicons/react/20/solid'\nimport { useAuth } from '../../_auth'\n\nexport type { EnrolledMethod, MfaManageProps } from '@datatechsolutions/shared-domain'\nimport type { EnrolledMethod, MfaManageProps } from '@datatechsolutions/shared-domain'\n\nexport function MfaManage({\n mfaEnabled,\n enrolledMethods = [],\n onEnroll,\n onDisable,\n onRegenerateBackupCodes,\n}: MfaManageProps) {\n const t = useTranslations('windsock')\n const format = useFormatter()\n const { client } = useAuth()\n\n const [isBackupSheetOpen, setIsBackupSheetOpen] = useState(false)\n const [newBackupCodes, setNewBackupCodes] = useState<string[]>([])\n const [isRegenerating, setIsRegenerating] = useState(false)\n const [isConfirmDisableOpen, setIsConfirmDisableOpen] = useState(false)\n const [disablePassword, setDisablePassword] = useState('')\n const [disableError, setDisableError] = useState<string | null>(null)\n const [isDisabling, setIsDisabling] = useState(false)\n\n const handleOpenBackupSheet = useCallback(async () => {\n triggerHaptic('medium')\n setIsRegenerating(true)\n try {\n const codes = onRegenerateBackupCodes\n ? await onRegenerateBackupCodes()\n : await client.regenerateBackupCodes()\n setNewBackupCodes(codes)\n setIsBackupSheetOpen(true)\n } catch {\n // Fail silently — caller is responsible for error surfacing\n } finally {\n setIsRegenerating(false)\n }\n }, [onRegenerateBackupCodes, client])\n\n const handleCloseBackupSheet = useCallback(() => {\n triggerHaptic('light')\n setIsBackupSheetOpen(false)\n setNewBackupCodes([])\n }, [])\n\n const handleRequestDisable = useCallback(() => {\n triggerHaptic('warning')\n setDisablePassword('')\n setDisableError(null)\n setIsConfirmDisableOpen(true)\n }, [])\n\n const handleConfirmDisable = useCallback(async () => {\n if (!disablePassword.trim()) {\n setDisableError(t('mfa.manage.disablePasswordRequired'))\n triggerHaptic('error')\n return\n }\n\n setDisableError(null)\n setIsDisabling(true)\n triggerHaptic('medium')\n\n try {\n if (onDisable) {\n onDisable()\n } else {\n const result = await client.disableMfa(disablePassword)\n if (!result.success) {\n setDisableError(result.error ?? t('mfa.manage.disableError'))\n triggerHaptic('error')\n return\n }\n }\n setIsConfirmDisableOpen(false)\n triggerHaptic('success')\n } catch {\n setDisableError(t('mfa.manage.disableError'))\n triggerHaptic('error')\n } finally {\n setIsDisabling(false)\n }\n }, [disablePassword, onDisable, client, t])\n\n const handleCancelDisable = useCallback(() => {\n triggerHaptic('light')\n setIsConfirmDisableOpen(false)\n setDisablePassword('')\n setDisableError(null)\n }, [])\n\n const handleEnroll = useCallback(() => {\n triggerHaptic('light')\n onEnroll?.()\n }, [onEnroll])\n\n return (\n <>\n <SectionCard\n header={{\n icon: <ShieldCheckIcon className=\"h-5 w-5 text-white\" />,\n title: t('mfa.manage.title'),\n subtitle: t('mfa.manage.subtitle'),\n gradient: 'from-emerald-500 via-teal-500 to-cyan-500',\n rightContent: mfaEnabled ? (\n <StatusBadge status=\"active\" label={t('mfa.manage.statusEnabled')} size=\"sm\" />\n ) : (\n <StatusBadge status=\"inactive\" label={t('mfa.manage.statusDisabled')} size=\"sm\" />\n ),\n }}\n padded={false}\n >\n {!mfaEnabled ? (\n /* MFA not enabled — show empty state with enable CTA */\n <div className=\"p-4 sm:p-6\">\n <EmptyState\n message={t('mfa.manage.emptyStateMessage')}\n description={t('mfa.manage.emptyStateDescription')}\n icon={ShieldExclamationIcon}\n action={{\n label: t('mfa.manage.enableButton'),\n onClick: handleEnroll,\n }}\n variant=\"card\"\n />\n </div>\n ) : (\n /* MFA enabled — show enrolled methods list + action buttons */\n <div className=\"space-y-4 p-4 sm:p-6\">\n {enrolledMethods.length > 0 && (\n <ListCard>\n {enrolledMethods.map((method, index) => (\n <ListCardItem\n key={`${method.type}-${index}`}\n leading={\n <div className=\"h-9 w-9 rounded-xl bg-gradient-to-br from-emerald-500 to-teal-600 flex items-center justify-center shadow-sm\">\n <ShieldCheckIcon className=\"h-5 w-5 text-white\" />\n </div>\n }\n trailing={\n <StatusBadge status=\"active\" label={t('mfa.manage.methodStatusActive')} size=\"sm\" />\n }\n >\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {method.label}\n </p>\n {method.createdAt && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mt-0.5\">\n {t('mfa.manage.methodEnrolledAt', {\n date: format.dateTime(new Date(method.createdAt), {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n }),\n })}\n </p>\n )}\n </ListCardItem>\n ))}\n </ListCard>\n )}\n\n {/* Action buttons */}\n <div className=\"flex flex-col gap-2 sm:flex-row sm:gap-3\">\n {onEnroll && (\n <Button\n color=\"ios-glass-blue\"\n onClick={handleEnroll}\n className=\"flex-1\"\n >\n <PlusIcon className=\"h-4 w-4 mr-1.5\" />\n {t('mfa.manage.addMethodButton')}\n </Button>\n )}\n\n <Button\n outline\n onClick={handleOpenBackupSheet}\n loading={isRegenerating}\n disabled={isRegenerating}\n className=\"flex-1\"\n >\n <ArrowPathIcon className=\"h-4 w-4 mr-1.5\" />\n {t('mfa.manage.regenerateBackupCodesButton')}\n </Button>\n\n <Button\n color=\"ios-glass-red\"\n onClick={handleRequestDisable}\n className=\"flex-1\"\n >\n {t('mfa.manage.disableMfaButton')}\n </Button>\n </div>\n </div>\n )}\n </SectionCard>\n\n {/* Backup codes sheet */}\n <Sheet\n open={isBackupSheetOpen}\n onClose={handleCloseBackupSheet}\n title={t('mfa.manage.backupCodesSheetTitle')}\n side=\"bottom\"\n size=\"md\"\n >\n <div className=\"space-y-4 p-4 sm:p-6\">\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {t('mfa.manage.backupCodesSheetDescription')}\n </p>\n <BackupCodeGrid\n codes={newBackupCodes}\n revealed\n />\n <Button\n color=\"ios-glass-blue\"\n fullWidth\n onClick={handleCloseBackupSheet}\n >\n {t('mfa.manage.backupCodesDoneButton')}\n </Button>\n </div>\n </Sheet>\n\n {/* Disable MFA — requires password confirmation */}\n <Sheet\n open={isConfirmDisableOpen}\n onClose={handleCancelDisable}\n title={t('mfa.manage.confirmDisableTitle')}\n side=\"bottom\"\n size=\"md\"\n >\n <div className=\"space-y-4 p-4 sm:p-6\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-xl bg-ios-red shadow-sm\">\n <ShieldExclamationIcon className=\"h-5 w-5 text-white\" />\n </div>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {t('mfa.manage.confirmDisableDescription')}\n </p>\n </div>\n\n <PasswordInput\n label={t('mfa.manage.disablePasswordLabel')}\n value={disablePassword}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setDisablePassword(event.target.value)}\n placeholder={t('mfa.manage.disablePasswordPlaceholder')}\n disabled={isDisabling}\n autoFocus\n autoComplete=\"current-password\"\n />\n\n {disableError && (\n <p className=\"text-sm text-red-600 dark:text-red-400\" role=\"alert\">{disableError}</p>\n )}\n\n <div className=\"flex gap-3\">\n <Button\n outline\n onClick={handleCancelDisable}\n disabled={isDisabling}\n className=\"flex-1\"\n >\n {t('mfa.manage.confirmDisableCancelLabel')}\n </Button>\n <Button\n color=\"ios-glass-red\"\n onClick={handleConfirmDisable}\n loading={isDisabling}\n disabled={isDisabling || !disablePassword.trim()}\n className=\"flex-1\"\n >\n {t('mfa.manage.confirmDisableConfirmLabel')}\n </Button>\n </div>\n </div>\n </Sheet>\n </>\n )\n}\n","import React, { useState, useEffect, useCallback, useRef } from 'react'\nimport { useTranslations, useFormatter, useLocale } from '@ui/lib/i18n-context'\nimport {\n SegmentedControl,\n SectionCard,\n BaseForm,\n Input,\n PasswordInput,\n Button,\n ListCard,\n ListCardItem,\n Avatar,\n Badge,\n InlineSpinner,\n triggerHaptic,\n} from '@ui/index'\nimport { PasswordStrengthMeter } from './components'\nimport {\n UserIcon,\n ComputerDesktopIcon,\n LinkIcon,\n CheckCircleIcon,\n GlobeAltIcon,\n CameraIcon,\n} from '@heroicons/react/24/outline'\nimport { useAuth } from '../../_auth'\nimport { MfaManage } from './mfa-manage'\nimport { MfaSetup } from './mfa-setup'\nimport * as sharedI18n from '@datatechsolutions/shared-domain/i18n'\nimport type { LocaleCode } from '@datatechsolutions/shared-domain/i18n'\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport type { ProfileTab, UserProfileProps } from '@datatechsolutions/shared-domain'\nimport type {\n UserSession,\n LinkedAccount,\n ProfileTab,\n ProfileTabContentProps,\n UserProfileProps,\n} from '@datatechsolutions/shared-domain'\n\nconst ALL_TABS: ProfileTab[] = ['profile', 'security', 'sessions', 'linked-accounts']\n\nexport function ProfileTabContent({ onProfileUpdate }: ProfileTabContentProps) {\n const t = useTranslations('windsock')\n const currentLocale = useLocale() as LocaleCode\n const { user, client } = useAuth()\n\n const [name, setName] = useState(user?.name ?? '')\n const [avatarPreview, setAvatarPreview] = useState<string | null>(user?.image ?? null)\n const [isUploadingAvatar, setIsUploadingAvatar] = useState(false)\n const fileInputRef = useRef<HTMLInputElement>(null)\n const [selectedLocale, setSelectedLocale] = useState<LocaleCode>(currentLocale)\n const [isSaving, setIsSaving] = useState(false)\n const [saveError, setSaveError] = useState<string | null>(null)\n const [saveSuccess, setSaveSuccess] = useState(false)\n\n const handleAvatarChange = useCallback(async (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0]\n if (!file) return\n\n // Validate client-side\n if (!['image/jpeg', 'image/png', 'image/webp'].includes(file.type)) {\n setSaveError(t('userProfile.profile.avatarInvalidType'))\n return\n }\n if (file.size > 5 * 1024 * 1024) {\n setSaveError(t('userProfile.profile.avatarTooLarge'))\n return\n }\n\n // Show preview immediately\n const previewUrl = URL.createObjectURL(file)\n setAvatarPreview(previewUrl)\n setSaveError(null)\n setIsUploadingAvatar(true)\n triggerHaptic('light')\n\n try {\n // Upload to S3 via presigned URL\n const uploadResult = await client.uploadFile(file, 'avatars')\n if (!uploadResult.success || !uploadResult.key) {\n throw new Error(uploadResult.error ?? 'Upload failed')\n }\n\n // Save the S3 key to user profile\n const updateResult = await client.updateProfile({ image: uploadResult.key })\n if (!updateResult.success) {\n throw new Error(updateResult.error ?? 'Profile update failed')\n }\n\n triggerHaptic('success')\n } catch (error) {\n setSaveError(error instanceof Error ? error.message : 'Upload failed')\n setAvatarPreview(user?.image ?? null)\n triggerHaptic('error')\n } finally {\n setIsUploadingAvatar(false)\n // Reset file input so same file can be re-selected\n if (fileInputRef.current) fileInputRef.current.value = ''\n }\n }, [client, user, t])\n\n const handleSave = useCallback(async () => {\n setSaveError(null)\n setSaveSuccess(false)\n setIsSaving(true)\n triggerHaptic('light')\n try {\n if (onProfileUpdate) {\n await onProfileUpdate({ name, email: user?.email ?? '', locale: selectedLocale })\n } else {\n const result = await client.updateProfile({ name, locale: selectedLocale })\n if (!result.success) {\n throw new Error(result.error)\n }\n }\n setSaveSuccess(true)\n triggerHaptic('success')\n // Persist locale to cookie and reload if changed\n if (selectedLocale !== currentLocale) {\n sharedI18n.setLocaleCookie(selectedLocale)\n window.location.reload()\n }\n } catch {\n setSaveError(t('userProfile.profile.saveError'))\n triggerHaptic('error')\n } finally {\n setIsSaving(false)\n }\n }, [name, selectedLocale, currentLocale, user, onProfileUpdate, client, t])\n\n return (\n <div className=\"space-y-6\">\n <SectionCard\n header={{\n icon: <UserIcon className=\"h-5 w-5 text-white\" />,\n title: t('userProfile.profile.title'),\n subtitle: t('userProfile.profile.subtitle'),\n gradient: 'from-blue-500 via-indigo-500 to-violet-500',\n }}\n >\n <BaseForm onSubmit={handleSave} submitLabel={t('userProfile.profile.saveButton')} showFooter={false}>\n {/* Avatar Upload */}\n <div className=\"flex flex-col items-center gap-3 pb-4\">\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n disabled={isUploadingAvatar}\n className=\"group relative\"\n >\n <Avatar\n src={avatarPreview ?? undefined}\n initials={user?.name?.slice(0, 2).toUpperCase() ?? user?.email?.slice(0, 2).toUpperCase()}\n alt={user?.name ?? 'Profile'}\n className=\"h-20 w-20 text-2xl\"\n />\n <div className=\"absolute inset-0 flex items-center justify-center rounded-full bg-black/0 transition group-hover:bg-black/40\">\n {isUploadingAvatar ? (\n <InlineSpinner />\n ) : (\n <CameraIcon className=\"h-6 w-6 text-white opacity-0 transition group-hover:opacity-100\" />\n )}\n </div>\n </button>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/jpeg,image/png,image/webp\"\n onChange={handleAvatarChange}\n className=\"hidden\"\n />\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">\n {t('userProfile.profile.avatarHint')}\n </p>\n </div>\n\n <Input\n label={t('userProfile.profile.nameLabel')}\n value={name}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setName(event.target.value)}\n disabled={isSaving}\n autoComplete=\"name\"\n />\n <Input\n label={t('userProfile.profile.emailLabel')}\n type=\"email\"\n value={user?.email ?? ''}\n readOnly\n disabled\n autoComplete=\"email\"\n />\n\n {saveError && (\n <p className=\"text-sm text-red-600 dark:text-red-400\">{saveError}</p>\n )}\n\n {saveSuccess && (\n <p className=\"text-sm text-green-600 dark:text-green-400\">\n {t('userProfile.profile.saveSuccess')}\n </p>\n )}\n\n <Button\n type=\"submit\"\n color=\"ios-glass-blue\"\n fullWidth\n loading={isSaving}\n disabled={isSaving}\n >\n {t('userProfile.profile.saveButton')}\n </Button>\n </BaseForm>\n </SectionCard>\n\n <SectionCard\n header={{\n icon: <GlobeAltIcon className=\"h-5 w-5 text-white\" />,\n title: t('userProfile.profile.languageTitle'),\n subtitle: t('userProfile.profile.languageSubtitle'),\n gradient: 'from-lime-400 via-emerald-500 to-green-600',\n }}\n >\n <div className=\"grid grid-cols-3 gap-2\">\n {sharedI18n.SUPPORTED_LOCALES.map((code) => {\n const meta = sharedI18n.LANGUAGE_META[code]\n const checked = selectedLocale === code\n return (\n <button\n key={code}\n type=\"button\"\n onClick={() => {\n setSelectedLocale(code)\n triggerHaptic('light')\n }}\n className={`group relative flex flex-col items-center justify-center rounded-xl border px-2 py-2.5 backdrop-blur-xl shadow-[inset_0_1px_0_rgba(255,255,255,0.9),0_10px_22px_-16px_rgba(15,23,42,0.45)] dark:shadow-[inset_0_1px_0_rgba(255,255,255,0.18),0_10px_22px_-16px_rgba(0,0,0,0.75)] transition ${\n checked\n ? 'border-indigo-400/80 bg-gradient-to-br from-indigo-100/85 via-white/80 to-sky-100/75 dark:border-indigo-300/70 dark:bg-[linear-gradient(140deg,rgba(99,102,241,0.32)_0%,rgba(30,41,59,0.72)_100%)]'\n : 'border-white/55 bg-gradient-to-br from-white/82 via-white/66 to-slate-100/62 hover:from-white/92 hover:to-sky-100/72 dark:border-white/15 dark:bg-[linear-gradient(140deg,rgba(30,41,59,0.72)_0%,rgba(15,23,42,0.62)_100%)] dark:hover:bg-[linear-gradient(140deg,rgba(51,65,85,0.76)_0%,rgba(30,41,59,0.68)_100%)]'\n }`}\n >\n <span className=\"text-lg leading-5\">{meta.flag}</span>\n <span className={`mt-1.5 text-xs font-semibold ${\n checked ? 'text-slate-900 dark:text-indigo-100' : 'text-slate-700 dark:text-slate-100'\n }`}>\n {meta.nativeName}\n </span>\n {checked && (\n <CheckCircleIcon className=\"absolute right-1 top-1 h-3.5 w-3.5 text-indigo-600 dark:text-indigo-300\" />\n )}\n </button>\n )\n })}\n </div>\n {selectedLocale !== currentLocale && (\n <div className=\"mt-4\">\n <Button\n type=\"button\"\n color=\"ios-glass-blue\"\n fullWidth\n loading={isSaving}\n disabled={isSaving}\n onClick={handleSave}\n >\n {t('userProfile.profile.saveButton')}\n </Button>\n </div>\n )}\n </SectionCard>\n </div>\n )\n}\n\n// ── Security Tab ─────────────────────────────────────────────────────────────\n\nexport function SecurityTabContent() {\n const t = useTranslations('windsock')\n const { client, user, refresh } = useAuth()\n\n const [showMfaSetup, setShowMfaSetup] = useState(false)\n const [currentPassword, setCurrentPassword] = useState('')\n const [newPassword, setNewPassword] = useState('')\n const [confirmPassword, setConfirmPassword] = useState('')\n const [passwordError, setPasswordError] = useState<string | null>(null)\n const [passwordSuccess, setPasswordSuccess] = useState(false)\n const [isSavingPassword, setIsSavingPassword] = useState(false)\n\n const handleMfaSetupSuccess = useCallback(() => {\n setShowMfaSetup(false)\n // Refresh user state so mfaEnabled reflects the new status\n refresh()\n }, [refresh])\n\n const handleChangePassword = useCallback(async () => {\n setPasswordError(null)\n setPasswordSuccess(false)\n\n if (!currentPassword) {\n setPasswordError(t('userProfile.security.errorCurrentRequired'))\n return\n }\n if (!newPassword) {\n setPasswordError(t('userProfile.security.errorNewRequired'))\n return\n }\n if (newPassword !== confirmPassword) {\n setPasswordError(t('userProfile.security.errorPasswordMismatch'))\n return\n }\n\n setIsSavingPassword(true)\n triggerHaptic('light')\n\n try {\n const result = await client.changePassword(currentPassword, newPassword)\n if (!result.success) {\n setPasswordError(result.error ?? t('userProfile.security.errorSaveFailed'))\n triggerHaptic('error')\n return\n }\n setCurrentPassword('')\n setNewPassword('')\n setConfirmPassword('')\n setPasswordSuccess(true)\n triggerHaptic('success')\n } catch {\n setPasswordError(t('userProfile.security.errorSaveFailed'))\n triggerHaptic('error')\n } finally {\n setIsSavingPassword(false)\n }\n }, [currentPassword, newPassword, confirmPassword, client, t])\n\n return (\n <div className=\"space-y-6\">\n {showMfaSetup ? (\n <MfaSetup\n onSuccess={handleMfaSetupSuccess}\n onCancel={() => setShowMfaSetup(false)}\n />\n ) : (\n <MfaManage\n mfaEnabled={user?.mfaEnabled ?? false}\n enrolledMethods={user?.mfaEnabled ? [{ type: 'totp', label: t('userProfile.security.mfaTotpLabel') }] : []}\n onEnroll={() => setShowMfaSetup(true)}\n />\n )}\n\n <SectionCard\n header={{\n icon: <UserIcon className=\"h-5 w-5 text-white\" />,\n title: t('userProfile.security.changePasswordTitle'),\n subtitle: t('userProfile.security.changePasswordSubtitle'),\n gradient: 'from-blue-500 via-sky-500 to-cyan-500',\n }}\n >\n <BaseForm onSubmit={handleChangePassword} submitLabel={t('userProfile.security.changePasswordButton')} showFooter={false}>\n <PasswordInput\n label={t('userProfile.security.currentPasswordLabel')}\n value={currentPassword}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setCurrentPassword(event.target.value)}\n disabled={isSavingPassword}\n autoComplete=\"current-password\"\n />\n <PasswordInput\n label={t('userProfile.security.newPasswordLabel')}\n value={newPassword}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setNewPassword(event.target.value)}\n disabled={isSavingPassword}\n autoComplete=\"new-password\"\n />\n <PasswordStrengthMeter password={newPassword} />\n <PasswordInput\n label={t('userProfile.security.confirmPasswordLabel')}\n value={confirmPassword}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setConfirmPassword(event.target.value)}\n disabled={isSavingPassword}\n autoComplete=\"new-password\"\n />\n\n {passwordError && (\n <p className=\"text-sm text-red-600 dark:text-red-400\">{passwordError}</p>\n )}\n\n {passwordSuccess && (\n <p className=\"text-sm text-green-600 dark:text-green-400\">\n {t('userProfile.security.changePasswordSuccess')}\n </p>\n )}\n\n <Button\n type=\"submit\"\n color=\"ios-glass-blue\"\n fullWidth\n loading={isSavingPassword}\n disabled={isSavingPassword}\n >\n {t('userProfile.security.changePasswordButton')}\n </Button>\n </BaseForm>\n </SectionCard>\n </div>\n )\n}\n\n// ── Sessions Tab ─────────────────────────────────────────────────────────────\n\nexport function SessionsTabContent() {\n const t = useTranslations('windsock')\n const format = useFormatter()\n const { client } = useAuth()\n\n const [sessions, setSessions] = useState<UserSession[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [revokingId, setRevokingId] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n\n const fetchSessions = async () => {\n setIsLoading(true)\n try {\n const rawSessions = await client.getSessions()\n if (!cancelled) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n setSessions(rawSessions.map((session: any) => ({\n id: session.id,\n device: session.userAgent ?? 'Unknown',\n location: session.ipAddress ?? 'Unknown',\n lastActive: typeof session.createdAt === 'string' ? session.createdAt : (session.createdAt as Date).toISOString(),\n current: false,\n })))\n }\n } catch {\n // Non-critical — render empty list\n } finally {\n if (!cancelled) setIsLoading(false)\n }\n }\n\n fetchSessions()\n return () => { cancelled = true }\n }, [client])\n\n const handleRevoke = useCallback(async (sessionId: string) => {\n setRevokingId(sessionId)\n triggerHaptic('medium')\n try {\n await client.revokeSession(sessionId)\n setSessions((previous) => previous.filter((s) => s.id !== sessionId))\n triggerHaptic('success')\n } catch {\n triggerHaptic('error')\n } finally {\n setRevokingId(null)\n }\n }, [client])\n\n return (\n <SectionCard\n header={{\n icon: <ComputerDesktopIcon className=\"h-5 w-5 text-white\" />,\n title: t('userProfile.sessions.title'),\n subtitle: t('userProfile.sessions.subtitle'),\n gradient: 'from-teal-500 via-cyan-500 to-sky-500',\n }}\n padded={false}\n >\n {isLoading ? (\n <div className=\"flex items-center justify-center gap-2 p-8 text-sm text-slate-500 dark:text-slate-400\">\n <InlineSpinner />\n <span>{t('userProfile.sessions.loading')}</span>\n </div>\n ) : sessions.length === 0 ? (\n <p className=\"p-6 text-center text-sm text-slate-500 dark:text-slate-400\">\n {t('userProfile.sessions.empty')}\n </p>\n ) : (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b liquid-divider\">\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {t('userProfile.sessions.columnDevice')}\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {t('userProfile.sessions.columnLocation')}\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {t('userProfile.sessions.columnLastActive')}\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {t('userProfile.sessions.columnAction')}\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-gray-200/60 dark:divide-white/10\">\n {sessions.map((session) => (\n <tr key={session.id}>\n <td className=\"px-4 py-3 text-slate-900 dark:text-white\">\n <div className=\"flex items-center gap-2\">\n {session.device}\n {session.current && (\n <Badge color=\"green\">{t('userProfile.sessions.currentBadge')}</Badge>\n )}\n </div>\n </td>\n <td className=\"px-4 py-3 text-slate-500 dark:text-slate-400\">\n {session.location}\n </td>\n <td className=\"px-4 py-3 text-slate-500 dark:text-slate-400\">\n {format.relativeTime(new Date(session.lastActive))}\n </td>\n <td className=\"px-4 py-3 text-right\">\n {!session.current && (\n <Button\n size=\"sm\"\n color=\"ios-glass-red\"\n onClick={() => handleRevoke(session.id)}\n loading={revokingId === session.id}\n disabled={revokingId !== null}\n >\n {t('userProfile.sessions.revokeButton')}\n </Button>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </SectionCard>\n )\n}\n\n// ── Linked Accounts Tab ──────────────────────────────────────────────────────\n\nexport function LinkedAccountsTabContent() {\n const t = useTranslations('windsock')\n const { client } = useAuth()\n\n const [accounts, setAccounts] = useState<LinkedAccount[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [actioningProvider, setActioningProvider] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n\n const fetchAccounts = async () => {\n setIsLoading(true)\n try {\n const rawAccounts = await client.getLinkedAccounts()\n if (!cancelled) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n setAccounts(rawAccounts.map((account: any) => ({\n provider: account.provider,\n providerUserId: account.providerAccountId,\n connected: true,\n })))\n }\n } catch {\n // Non-critical — render empty list\n } finally {\n if (!cancelled) setIsLoading(false)\n }\n }\n\n fetchAccounts()\n return () => { cancelled = true }\n }, [client])\n\n const handleDisconnect = useCallback(async (provider: string) => {\n setActioningProvider(provider)\n triggerHaptic('medium')\n try {\n await client.disconnectProvider(provider)\n setAccounts((previous) => previous.filter((a) => a.provider !== provider))\n triggerHaptic('success')\n } catch {\n triggerHaptic('error')\n } finally {\n setActioningProvider(null)\n }\n }, [client])\n\n const providerInitials = (provider: string) =>\n provider.slice(0, 2).toUpperCase()\n\n return (\n <SectionCard\n header={{\n icon: <LinkIcon className=\"h-5 w-5 text-white\" />,\n title: t('userProfile.linkedAccounts.title'),\n subtitle: t('userProfile.linkedAccounts.subtitle'),\n gradient: 'from-violet-500 via-purple-500 to-pink-500',\n }}\n padded={false}\n >\n {isLoading ? (\n <div className=\"flex items-center justify-center gap-2 p-8 text-sm text-slate-500 dark:text-slate-400\">\n <InlineSpinner />\n <span>{t('userProfile.linkedAccounts.loading')}</span>\n </div>\n ) : accounts.length === 0 ? (\n <p className=\"p-6 text-center text-sm text-slate-500 dark:text-slate-400\">\n {t('userProfile.linkedAccounts.empty')}\n </p>\n ) : (\n <ListCard>\n {accounts.map((account) => (\n <ListCardItem\n key={account.provider}\n leading={\n <Avatar\n src={account.logoUrl}\n initials={providerInitials(account.provider)}\n alt={account.provider}\n />\n }\n trailing={\n <Button\n size=\"sm\"\n color=\"ios-glass-red\"\n onClick={() => handleDisconnect(account.provider)}\n loading={actioningProvider === account.provider}\n disabled={actioningProvider !== null}\n >\n {t('userProfile.linkedAccounts.disconnectButton')}\n </Button>\n }\n >\n <div>\n <p className=\"text-sm font-medium capitalize text-slate-900 dark:text-white\">\n {account.provider}\n </p>\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">\n {t('userProfile.linkedAccounts.connectedLabel')}\n </p>\n </div>\n </ListCardItem>\n ))}\n </ListCard>\n )}\n </SectionCard>\n )\n}\n\n// ── UserProfile ──────────────────────────────────────────────────────────────\n\nexport function UserProfile({\n defaultTab = 'profile',\n tabs = ALL_TABS,\n onSignOut: _onSignOut,\n onProfileUpdate,\n}: UserProfileProps) {\n const t = useTranslations('windsock')\n const { status } = useAuth()\n\n const [activeTab, setActiveTab] = useState<ProfileTab>(\n tabs.includes(defaultTab) ? defaultTab : (tabs[0] ?? 'profile'),\n )\n\n if (status === 'loading') {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <InlineSpinner />\n </div>\n )\n }\n\n if (status !== 'authenticated') {\n return null\n }\n\n const segments = tabs.map((tab) => ({\n value: tab,\n label: t(`userProfile.tabs.${tab}`),\n }))\n\n return (\n <div className=\"space-y-6\">\n {tabs.length > 1 && (\n <SegmentedControl\n segments={segments}\n value={activeTab}\n onChange={(value: string) => setActiveTab(value as ProfileTab)}\n fullWidth\n />\n )}\n\n {activeTab === 'profile' && (\n <ProfileTabContent onProfileUpdate={onProfileUpdate} />\n )}\n\n {activeTab === 'security' && (\n <SecurityTabContent />\n )}\n\n {activeTab === 'sessions' && (\n <SessionsTabContent />\n )}\n\n {activeTab === 'linked-accounts' && (\n <LinkedAccountsTabContent />\n )}\n </div>\n )\n}\n"]}
|