@brightchain/brightpass-react-components 0.1.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.
Files changed (52) hide show
  1. package/README.md +28 -0
  2. package/package.json +42 -0
  3. package/src/index.js +35 -0
  4. package/src/index.js.map +1 -0
  5. package/src/lib/BrightPassRoutes.js +33 -0
  6. package/src/lib/BrightPassRoutes.js.map +1 -0
  7. package/src/lib/components/BreadcrumbNav.js +70 -0
  8. package/src/lib/components/BreadcrumbNav.js.map +1 -0
  9. package/src/lib/components/CreateVaultDialog.js +57 -0
  10. package/src/lib/components/CreateVaultDialog.js.map +1 -0
  11. package/src/lib/components/EntryDetailView.js +167 -0
  12. package/src/lib/components/EntryDetailView.js.map +1 -0
  13. package/src/lib/components/EntryForm.js +196 -0
  14. package/src/lib/components/EntryForm.js.map +1 -0
  15. package/src/lib/components/MasterPasswordPrompt.js +56 -0
  16. package/src/lib/components/MasterPasswordPrompt.js.map +1 -0
  17. package/src/lib/components/SearchBar.js +137 -0
  18. package/src/lib/components/SearchBar.js.map +1 -0
  19. package/src/lib/context/BrightPassProvider.js +158 -0
  20. package/src/lib/context/BrightPassProvider.js.map +1 -0
  21. package/src/lib/dialogs/EmergencyAccessDialog.js +139 -0
  22. package/src/lib/dialogs/EmergencyAccessDialog.js.map +1 -0
  23. package/src/lib/dialogs/ImportDialog.js +146 -0
  24. package/src/lib/dialogs/ImportDialog.js.map +1 -0
  25. package/src/lib/dialogs/ShareDialog.js +82 -0
  26. package/src/lib/dialogs/ShareDialog.js.map +1 -0
  27. package/src/lib/hooks/useBrightPassApi.js +13 -0
  28. package/src/lib/hooks/useBrightPassApi.js.map +1 -0
  29. package/src/lib/hooks/useBrightPassAutofill.js +80 -0
  30. package/src/lib/hooks/useBrightPassAutofill.js.map +1 -0
  31. package/src/lib/hooks/useBrightPassExtensionBridge.js +108 -0
  32. package/src/lib/hooks/useBrightPassExtensionBridge.js.map +1 -0
  33. package/src/lib/hooks/useBrightPassTranslation.js +12 -0
  34. package/src/lib/hooks/useBrightPassTranslation.js.map +1 -0
  35. package/src/lib/services/BrightPassApiService.js +219 -0
  36. package/src/lib/services/BrightPassApiService.js.map +1 -0
  37. package/src/lib/views/AuditLogView.js +120 -0
  38. package/src/lib/views/AuditLogView.js.map +1 -0
  39. package/src/lib/views/PasswordGeneratorPage.js +20 -0
  40. package/src/lib/views/PasswordGeneratorPage.js.map +1 -0
  41. package/src/lib/views/VaultDetailView.js +93 -0
  42. package/src/lib/views/VaultDetailView.js.map +1 -0
  43. package/src/lib/views/VaultListView.js +99 -0
  44. package/src/lib/views/VaultListView.js.map +1 -0
  45. package/src/lib/widgets/BreachCheckWidget.js +57 -0
  46. package/src/lib/widgets/BreachCheckWidget.js.map +1 -0
  47. package/src/lib/widgets/PasswordGeneratorWidget.js +137 -0
  48. package/src/lib/widgets/PasswordGeneratorWidget.js.map +1 -0
  49. package/src/lib/widgets/TOTPWidget.js +165 -0
  50. package/src/lib/widgets/TOTPWidget.js.map +1 -0
  51. package/src/test-setup.js +13 -0
  52. package/src/test-setup.js.map +1 -0
package/README.md ADDED
@@ -0,0 +1,28 @@
1
+ # @brightchain/brightpass-react-components
2
+
3
+ BrightPass React UI components for the BrightChain password manager.
4
+
5
+ This library contains all BrightPass frontend components including views, widgets, dialogs, hooks, services, and context providers.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ yarn add @brightchain/brightpass-react-components
11
+ ```
12
+
13
+ ## Peer Dependencies
14
+
15
+ - `@brightchain/brightchain-lib`
16
+ - `@digitaldefiance/express-suite-react-components`
17
+ - `@mui/material` / `@mui/icons-material`
18
+ - `react` / `react-dom`
19
+ - `react-router-dom`
20
+
21
+ ## Usage
22
+
23
+ ```tsx
24
+ import { BrightPassRoutes } from '@brightchain/brightpass-react-components';
25
+
26
+ // In your router:
27
+ <Route path="/brightpass/*" element={<BrightPassRoutes />} />
28
+ ```
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@brightchain/brightpass-react-components",
3
+ "version": "0.1.0",
4
+ "description": "BrightPass React UI components for BrightChain password manager",
5
+ "main": "src/index.ts",
6
+ "types": "src/index.ts",
7
+ "files": [
8
+ "src",
9
+ "README.md"
10
+ ],
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/Digital-Defiance/BrightChain.git",
14
+ "directory": "brightpass-react-components"
15
+ },
16
+ "homepage": "https://github.com/Digital-Defiance/BrightChain#readme",
17
+ "bugs": {
18
+ "url": "https://github.com/Digital-Defiance/BrightChain/issues"
19
+ },
20
+ "keywords": [
21
+ "brightchain",
22
+ "brightpass",
23
+ "password-manager",
24
+ "react",
25
+ "components"
26
+ ],
27
+ "author": "Digital Defiance",
28
+ "license": "MIT",
29
+ "peerDependencies": {
30
+ "@brightchain/brightchain-lib": "*",
31
+ "@digitaldefiance/express-suite-react-components": "*",
32
+ "@digitaldefiance/i18n-lib": "*",
33
+ "@mui/icons-material": "*",
34
+ "@mui/material": "*",
35
+ "axios": "*",
36
+ "react": "^18.0.0",
37
+ "react-dom": "^18.0.0",
38
+ "react-router-dom": "^6.0.0"
39
+ },
40
+ "module": "./src/index.js",
41
+ "type": "module"
42
+ }
package/src/index.js ADDED
@@ -0,0 +1,35 @@
1
+ // ── Main entry (BrightPassRoutes) ─────────────────────────────────────
2
+ export { default as BrightPassRoutes } from './lib/BrightPassRoutes';
3
+ // ── Context ──────────────────────────────────────────────────────────
4
+ export { BrightPassProvider, useBrightPass, BrightPassContext, DEFAULT_AUTO_LOCK_MS, HIDDEN_TAB_LOCK_MS, } from './lib/context/BrightPassProvider';
5
+ // ── Services ─────────────────────────────────────────────────────────
6
+ export { default as BrightPassApiService } from './lib/services/BrightPassApiService';
7
+ // ── Hooks ────────────────────────────────────────────────────────────
8
+ export { useBrightPassApi } from './lib/hooks/useBrightPassApi';
9
+ export { useBrightPassTranslation } from './lib/hooks/useBrightPassTranslation';
10
+ export { useBrightPassAutofill, matchSiteUrl, } from './lib/hooks/useBrightPassAutofill';
11
+ export { useBrightPassExtensionBridge, isAllowedOrigin, } from './lib/hooks/useBrightPassExtensionBridge';
12
+ // ── Views ────────────────────────────────────────────────────────────
13
+ export { default as VaultListView } from './lib/views/VaultListView';
14
+ export { default as VaultDetailView } from './lib/views/VaultDetailView';
15
+ export { default as AuditLogView } from './lib/views/AuditLogView';
16
+ export { sortAuditEntries, filterAuditEntries, formatAuditEntry, } from './lib/views/AuditLogView';
17
+ export { default as PasswordGeneratorPage } from './lib/views/PasswordGeneratorPage';
18
+ // ── Components ───────────────────────────────────────────────────────
19
+ export { default as BreadcrumbNav } from './lib/components/BreadcrumbNav';
20
+ export { buildBreadcrumbs } from './lib/components/BreadcrumbNav';
21
+ export { default as CreateVaultDialog } from './lib/components/CreateVaultDialog';
22
+ export { default as MasterPasswordPrompt } from './lib/components/MasterPasswordPrompt';
23
+ export { default as EntryDetailView } from './lib/components/EntryDetailView';
24
+ export { default as EntryForm } from './lib/components/EntryForm';
25
+ export { default as SearchBar } from './lib/components/SearchBar';
26
+ export { filterEntries } from './lib/components/SearchBar';
27
+ // ── Widgets ──────────────────────────────────────────────────────────
28
+ export { default as PasswordGeneratorWidget, classifyStrength, } from './lib/widgets/PasswordGeneratorWidget';
29
+ export { default as TOTPWidget, formatTotpCode, calculateRemainingSeconds, isValidBase32, isValidOtpauthUri, isValidTotpSecret, } from './lib/widgets/TOTPWidget';
30
+ export { default as BreachCheckWidget, formatBreachMessage, } from './lib/widgets/BreachCheckWidget';
31
+ // ── Dialogs ──────────────────────────────────────────────────────────
32
+ export { default as ShareDialog } from './lib/dialogs/ShareDialog';
33
+ export { default as EmergencyAccessDialog, validateThreshold, } from './lib/dialogs/EmergencyAccessDialog';
34
+ export { default as ImportDialog, getAcceptedFileTypes, formatImportSummary, } from './lib/dialogs/ImportDialog';
35
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../brightpass-react-components/src/index.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAErE,wEAAwE;AACxE,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,kCAAkC,CAAC;AAO1C,wEAAwE;AACxE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAEtF,wEAAwE;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EACL,qBAAqB,EACrB,YAAY,GACb,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EACL,4BAA4B,EAC5B,eAAe,GAChB,MAAM,0CAA0C,CAAC;AAMlD,wEAAwE;AACxE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAErF,wEAAwE;AACxE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAElF,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAExF,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAE9E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAElE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAG3D,wEAAwE;AACxE,OAAO,EACL,OAAO,IAAI,uBAAuB,EAClC,gBAAgB,GACjB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,OAAO,IAAI,UAAU,EACrB,cAAc,EACd,yBAAyB,EACzB,aAAa,EACb,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,OAAO,IAAI,iBAAiB,EAC5B,mBAAmB,GACpB,MAAM,iCAAiC,CAAC;AAEzC,wEAAwE;AACxE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EACL,OAAO,IAAI,qBAAqB,EAChC,iBAAiB,GAClB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,OAAO,IAAI,YAAY,EACvB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * BrightPassRoutes — Route definitions for the BrightPass password manager.
4
+ *
5
+ * All routes are relative (rendered inside a parent `<Route path="/brightpass/*">`).
6
+ * Wrapped in BrightPassProvider for vault state and PrivateRoute for auth enforcement.
7
+ *
8
+ * Routes:
9
+ * /brightpass → VaultListView
10
+ * /brightpass/vault/:vaultId → VaultDetailView
11
+ * /brightpass/vault/:vaultId/audit → AuditLogView
12
+ * /brightpass/tools/generator → PasswordGeneratorPage
13
+ *
14
+ * Requirements: 14.1, 14.2
15
+ */
16
+ import { lazy, Suspense } from 'react';
17
+ import { Route, Routes } from 'react-router-dom';
18
+ import { PrivateRoute } from '@digitaldefiance/express-suite-react-components';
19
+ import { Box, CircularProgress } from '@mui/material';
20
+ import { BrightPassProvider } from './context/BrightPassProvider';
21
+ // Lazy-loaded view components for code splitting.
22
+ // These will be implemented in later tasks; the lazy() calls will resolve
23
+ // once the corresponding files are created.
24
+ const VaultListView = lazy(() => import('./views/VaultListView'));
25
+ const VaultDetailView = lazy(() => import('./views/VaultDetailView'));
26
+ const AuditLogView = lazy(() => import('./views/AuditLogView'));
27
+ const PasswordGeneratorPage = lazy(() => import('./views/PasswordGeneratorPage'));
28
+ const LoadingFallback = () => (_jsx(Box, { display: "flex", justifyContent: "center", alignItems: "center", mt: 4, children: _jsx(CircularProgress, {}) }));
29
+ const BrightPassRoutes = () => {
30
+ return (_jsx(BrightPassProvider, { children: _jsx(PrivateRoute, { children: _jsx(Suspense, { fallback: _jsx(LoadingFallback, {}), children: _jsxs(Routes, { children: [_jsx(Route, { index: true, element: _jsx(VaultListView, {}) }), _jsx(Route, { path: "vault/:vaultId", element: _jsx(VaultDetailView, {}) }), _jsx(Route, { path: "vault/:vaultId/audit", element: _jsx(AuditLogView, {}) }), _jsx(Route, { path: "tools/generator", element: _jsx(PasswordGeneratorPage, {}) })] }) }) }) }));
31
+ };
32
+ export default BrightPassRoutes;
33
+ //# sourceMappingURL=BrightPassRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrightPassRoutes.js","sourceRoot":"","sources":["../../../../brightpass-react-components/src/lib/BrightPassRoutes.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,iDAAiD,CAAC;AAC/E,OAAO,EAAE,GAAG,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE,kDAAkD;AAClD,0EAA0E;AAC1E,4CAA4C;AAC5C,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC;AAClE,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC,CAAC;AACtE,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC;AAChE,MAAM,qBAAqB,GAAG,IAAI,CAChC,GAAG,EAAE,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAC9C,CAAC;AAEF,MAAM,eAAe,GAAa,GAAG,EAAE,CAAC,CACtC,KAAC,GAAG,IAAC,OAAO,EAAC,MAAM,EAAC,cAAc,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,EAAE,EAAE,CAAC,YACnE,KAAC,gBAAgB,KAAG,GAChB,CACP,CAAC;AAEF,MAAM,gBAAgB,GAAa,GAAG,EAAE;IACtC,OAAO,CACL,KAAC,kBAAkB,cACjB,KAAC,YAAY,cACX,KAAC,QAAQ,IAAC,QAAQ,EAAE,KAAC,eAAe,KAAG,YACrC,MAAC,MAAM,eACL,KAAC,KAAK,IAAC,KAAK,QAAC,OAAO,EAAE,KAAC,aAAa,KAAG,GAAI,EAC3C,KAAC,KAAK,IAAC,IAAI,EAAC,gBAAgB,EAAC,OAAO,EAAE,KAAC,eAAe,KAAG,GAAI,EAC7D,KAAC,KAAK,IAAC,IAAI,EAAC,sBAAsB,EAAC,OAAO,EAAE,KAAC,YAAY,KAAG,GAAI,EAChE,KAAC,KAAK,IAAC,IAAI,EAAC,iBAAiB,EAAC,OAAO,EAAE,KAAC,qBAAqB,KAAG,GAAI,IAC7D,GACA,GACE,GACI,CACtB,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,70 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Link as RouterLink, useLocation } from 'react-router-dom';
3
+ import { Breadcrumbs, Link, Typography } from '@mui/material';
4
+ import NavigateNextIcon from '@mui/icons-material/NavigateNext';
5
+ import { BrightPassStrings } from '@brightchain/brightchain-lib';
6
+ import { useBrightPassTranslation } from '../hooks/useBrightPassTranslation';
7
+ import { useBrightPass } from '../context/BrightPassProvider';
8
+ /**
9
+ * Build the breadcrumb items array from the current pathname.
10
+ * Exported for testability.
11
+ */
12
+ export function buildBreadcrumbs(pathname, t, vaultName) {
13
+ const items = [];
14
+ // Normalize: strip trailing slash, ensure starts with /brightpass
15
+ const normalized = pathname.replace(/\/+$/, '');
16
+ if (!normalized.startsWith('/brightpass')) {
17
+ return items;
18
+ }
19
+ // Segments after /brightpass
20
+ const rest = normalized.slice('/brightpass'.length);
21
+ const segments = rest.split('/').filter(Boolean);
22
+ // Root: "BrightPass" is always the first crumb
23
+ items.push({
24
+ label: t(BrightPassStrings.Breadcrumb_BrightPass),
25
+ to: '/brightpass',
26
+ });
27
+ if (segments.length === 0) {
28
+ // At /brightpass — root is the current page (non-clickable)
29
+ delete items[items.length - 1].to;
30
+ return items;
31
+ }
32
+ if (segments[0] === 'vault' && segments.length >= 2) {
33
+ const vaultId = segments[1];
34
+ items.push({
35
+ label: t(BrightPassStrings.Breadcrumb_Vault, {
36
+ NAME: vaultName || vaultId,
37
+ }),
38
+ to: `/brightpass/vault/${vaultId}`,
39
+ });
40
+ if (segments[2] === 'audit') {
41
+ items.push({
42
+ label: t(BrightPassStrings.Breadcrumb_AuditLog),
43
+ });
44
+ }
45
+ }
46
+ else if (segments[0] === 'tools' && segments[1] === 'generator') {
47
+ items.push({
48
+ label: t(BrightPassStrings.Breadcrumb_PasswordGenerator),
49
+ });
50
+ }
51
+ // The last item should have no `to` (non-clickable)
52
+ if (items.length > 0) {
53
+ delete items[items.length - 1].to;
54
+ }
55
+ return items;
56
+ }
57
+ const BreadcrumbNav = () => {
58
+ const { pathname } = useLocation();
59
+ const { t } = useBrightPassTranslation();
60
+ const { vault } = useBrightPass();
61
+ const vaultName = vault?.metadata?.name;
62
+ const items = buildBreadcrumbs(pathname, t, vaultName);
63
+ if (items.length <= 1) {
64
+ // Don't render breadcrumbs when there's only the root item
65
+ return null;
66
+ }
67
+ return (_jsx(Breadcrumbs, { separator: _jsx(NavigateNextIcon, { fontSize: "small" }), "aria-label": "breadcrumb", sx: { mb: 2 }, children: items.map((item, index) => item.to ? (_jsx(Link, { component: RouterLink, to: item.to, underline: "hover", color: "inherit", children: item.label }, item.to)) : (_jsx(Typography, { color: "text.primary", children: item.label }, `crumb-${index}`))) }));
68
+ };
69
+ export default BreadcrumbNav;
70
+ //# sourceMappingURL=BreadcrumbNav.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BreadcrumbNav.js","sourceRoot":"","sources":["../../../../../brightpass-react-components/src/lib/components/BreadcrumbNav.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * CreateVaultDialog — Form dialog for creating a new vault.
4
+ *
5
+ * Requires vault name and master password. On submit, calls
6
+ * `brightPassApiService.createVault()` and refreshes the vault list.
7
+ * On error, displays an i18n error message and keeps the dialog open.
8
+ *
9
+ * Requirements: 3.6, 3.7
10
+ */
11
+ import { useState } from 'react';
12
+ import { Alert, Button, Dialog, DialogActions, DialogContent, DialogTitle, TextField, } from '@mui/material';
13
+ import { BrightPassStrings } from '@brightchain/brightchain-lib';
14
+ import { useBrightPassTranslation } from '../hooks/useBrightPassTranslation';
15
+ import { useBrightPassApi } from '../hooks/useBrightPassApi';
16
+ const CreateVaultDialog = ({ open, onClose, onVaultCreated, }) => {
17
+ const { t } = useBrightPassTranslation();
18
+ const brightPassApi = useBrightPassApi();
19
+ const [name, setName] = useState('');
20
+ const [masterPassword, setMasterPassword] = useState('');
21
+ const [error, setError] = useState(null);
22
+ const [loading, setLoading] = useState(false);
23
+ const resetState = () => {
24
+ setName('');
25
+ setMasterPassword('');
26
+ setError(null);
27
+ setLoading(false);
28
+ };
29
+ const handleClose = () => {
30
+ resetState();
31
+ onClose();
32
+ };
33
+ const handleSubmit = async () => {
34
+ setLoading(true);
35
+ setError(null);
36
+ try {
37
+ await brightPassApi.createVault(name, masterPassword);
38
+ resetState();
39
+ onVaultCreated();
40
+ onClose();
41
+ }
42
+ catch {
43
+ setError(t(BrightPassStrings.Error_Generic));
44
+ }
45
+ finally {
46
+ setLoading(false);
47
+ }
48
+ };
49
+ const handleKeyDown = (e) => {
50
+ if (e.key === 'Enter' && name && masterPassword && !loading) {
51
+ handleSubmit();
52
+ }
53
+ };
54
+ return (_jsxs(Dialog, { open: open, onClose: handleClose, maxWidth: "xs", fullWidth: true, children: [_jsx(DialogTitle, { children: t(BrightPassStrings.VaultList_CreateVault) }), _jsxs(DialogContent, { children: [error && (_jsx(Alert, { severity: "error", sx: { mb: 2 }, children: error })), _jsx(TextField, { autoFocus: true, margin: "dense", label: t(BrightPassStrings.VaultList_Title), fullWidth: true, variant: "outlined", value: name, onChange: (e) => setName(e.target.value) }), _jsx(TextField, { margin: "dense", label: t(BrightPassStrings.VaultList_EnterMasterPassword), type: "password", fullWidth: true, variant: "outlined", value: masterPassword, onChange: (e) => setMasterPassword(e.target.value), onKeyDown: handleKeyDown })] }), _jsxs(DialogActions, { children: [_jsx(Button, { onClick: handleClose, children: t(BrightPassStrings.VaultList_Cancel) }), _jsx(Button, { onClick: handleSubmit, variant: "contained", disabled: loading || !name || !masterPassword, children: t(BrightPassStrings.VaultList_CreateVault) })] })] }));
55
+ };
56
+ export default CreateVaultDialog;
57
+ //# sourceMappingURL=CreateVaultDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateVaultDialog.js","sourceRoot":"","sources":["../../../../../brightpass-react-components/src/lib/components/CreateVaultDialog.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,167 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { BrightPassStrings } from '@brightchain/brightchain-lib';
3
+ import DeleteIcon from '@mui/icons-material/Delete';
4
+ import EditIcon from '@mui/icons-material/Edit';
5
+ import Visibility from '@mui/icons-material/Visibility';
6
+ import VisibilityOff from '@mui/icons-material/VisibilityOff';
7
+ import { Alert, Box, Button, Chip, CircularProgress, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, IconButton, InputAdornment, TextField, Typography, } from '@mui/material';
8
+ import { useCallback, useEffect, useState } from 'react';
9
+ import { useBrightPassTranslation } from '../hooks/useBrightPassTranslation';
10
+ import { useBrightPassApi } from '../hooks/useBrightPassApi';
11
+ const MASK = '••••••••';
12
+ const EntryDetailView = ({ vaultId, entryId, onEdit, onDelete, }) => {
13
+ const { t } = useBrightPassTranslation();
14
+ const brightPassApi = useBrightPassApi();
15
+ const [entry, setEntry] = useState(null);
16
+ const [loading, setLoading] = useState(true);
17
+ const [error, setError] = useState(null);
18
+ // Track which sensitive fields are revealed
19
+ const [revealedFields, setRevealedFields] = useState(new Set());
20
+ // Breach check state (login entries only)
21
+ const [breachResult, setBreachResult] = useState(null);
22
+ const [breachLoading, setBreachLoading] = useState(false);
23
+ // Delete confirmation dialog
24
+ const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);
25
+ const [deleting, setDeleting] = useState(false);
26
+ // Fetch entry on mount
27
+ useEffect(() => {
28
+ let cancelled = false;
29
+ setLoading(true);
30
+ setError(null);
31
+ brightPassApi
32
+ .getEntry(vaultId, entryId)
33
+ .then((data) => {
34
+ if (!cancelled) {
35
+ setEntry(data);
36
+ }
37
+ })
38
+ .catch((err) => {
39
+ if (!cancelled) {
40
+ setError(err?.message ?? t(BrightPassStrings.Error_Generic));
41
+ }
42
+ })
43
+ .finally(() => {
44
+ if (!cancelled) {
45
+ setLoading(false);
46
+ }
47
+ });
48
+ return () => {
49
+ cancelled = true;
50
+ };
51
+ }, [vaultId, entryId, t]);
52
+ // Auto-check breach status for login entries
53
+ useEffect(() => {
54
+ if (!entry || entry.type !== 'login')
55
+ return;
56
+ let cancelled = false;
57
+ setBreachLoading(true);
58
+ brightPassApi
59
+ .checkBreach(entry.password)
60
+ .then((result) => {
61
+ if (!cancelled) {
62
+ setBreachResult(result);
63
+ }
64
+ })
65
+ .catch(() => {
66
+ // Silently ignore breach check failures
67
+ })
68
+ .finally(() => {
69
+ if (!cancelled) {
70
+ setBreachLoading(false);
71
+ }
72
+ });
73
+ return () => {
74
+ cancelled = true;
75
+ };
76
+ }, [entry]);
77
+ const toggleField = useCallback((fieldName) => {
78
+ setRevealedFields((prev) => {
79
+ const next = new Set(prev);
80
+ if (next.has(fieldName)) {
81
+ next.delete(fieldName);
82
+ }
83
+ else {
84
+ next.add(fieldName);
85
+ }
86
+ return next;
87
+ });
88
+ }, []);
89
+ const handleDelete = useCallback(async () => {
90
+ setDeleting(true);
91
+ try {
92
+ await brightPassApi.deleteEntry(vaultId, entryId);
93
+ setShowDeleteConfirm(false);
94
+ onDelete?.();
95
+ }
96
+ catch (err) {
97
+ const message = err?.message ??
98
+ t(BrightPassStrings.Error_Generic);
99
+ setError(message);
100
+ setShowDeleteConfirm(false);
101
+ }
102
+ finally {
103
+ setDeleting(false);
104
+ }
105
+ }, [vaultId, entryId, onDelete, t]);
106
+ /** Renders a read-only text field. */
107
+ const renderField = (label, value) => {
108
+ if (value === undefined || value === '')
109
+ return null;
110
+ return (_jsx(TextField, { label: label, value: value, fullWidth: true, margin: "dense", slotProps: { input: { readOnly: true } } }));
111
+ };
112
+ /** Renders a sensitive field with mask/reveal toggle. */
113
+ const renderSensitiveField = (label, value, fieldName) => {
114
+ const isRevealed = revealedFields.has(fieldName);
115
+ return (_jsx(TextField, { label: label, value: isRevealed ? value : MASK, fullWidth: true, margin: "dense", slotProps: {
116
+ input: {
117
+ readOnly: true,
118
+ endAdornment: (_jsx(InputAdornment, { position: "end", children: _jsx(IconButton, { "aria-label": isRevealed
119
+ ? t(BrightPassStrings.EntryDetail_HidePassword)
120
+ : t(BrightPassStrings.EntryDetail_ShowPassword), onClick: () => toggleField(fieldName), edge: "end", children: isRevealed ? _jsx(VisibilityOff, {}) : _jsx(Visibility, {}) }) })),
121
+ },
122
+ } }));
123
+ };
124
+ /** Renders type-specific fields for a login entry. */
125
+ const renderLoginFields = (e) => (_jsxs(_Fragment, { children: [renderField(t(BrightPassStrings.EntryDetail_SiteUrl), e.siteUrl), renderField(t(BrightPassStrings.EntryDetail_Username), e.username), renderSensitiveField(t(BrightPassStrings.EntryDetail_Password), e.password, 'password'), e.totpSecret &&
126
+ renderField(t(BrightPassStrings.EntryDetail_TotpSecret), e.totpSecret)] }));
127
+ /** Renders type-specific fields for a secure note entry. */
128
+ const renderSecureNoteFields = (e) => (_jsx(_Fragment, { children: renderField(t(BrightPassStrings.EntryDetail_Content), e.content) }));
129
+ /** Renders type-specific fields for a credit card entry. */
130
+ const renderCreditCardFields = (e) => (_jsxs(_Fragment, { children: [renderField(t(BrightPassStrings.EntryDetail_CardholderName), e.cardholderName), renderSensitiveField(t(BrightPassStrings.EntryDetail_CardNumber), e.cardNumber, 'cardNumber'), renderField(t(BrightPassStrings.EntryDetail_ExpirationDate), e.expirationDate), renderSensitiveField(t(BrightPassStrings.EntryDetail_CVV), e.cvv, 'cvv')] }));
131
+ /** Renders type-specific fields for an identity entry. */
132
+ const renderIdentityFields = (e) => (_jsxs(_Fragment, { children: [renderField(t(BrightPassStrings.EntryDetail_FirstName), e.firstName), renderField(t(BrightPassStrings.EntryDetail_LastName), e.lastName), renderField(t(BrightPassStrings.EntryDetail_Email), e.email), renderField(t(BrightPassStrings.EntryDetail_Phone), e.phone), renderField(t(BrightPassStrings.EntryDetail_Address), e.address)] }));
133
+ /** Renders the type-specific fields based on entry type. */
134
+ const renderEntryFields = (e) => {
135
+ switch (e.type) {
136
+ case 'login':
137
+ return renderLoginFields(e);
138
+ case 'secure_note':
139
+ return renderSecureNoteFields(e);
140
+ case 'credit_card':
141
+ return renderCreditCardFields(e);
142
+ case 'identity':
143
+ return renderIdentityFields(e);
144
+ default:
145
+ return null;
146
+ }
147
+ };
148
+ // --- Loading state ---
149
+ if (loading) {
150
+ return (_jsx(Box, { display: "flex", justifyContent: "center", py: 4, children: _jsx(CircularProgress, {}) }));
151
+ }
152
+ // --- Error state ---
153
+ if (error) {
154
+ return (_jsx(Alert, { severity: "error", sx: { my: 2 }, children: error }));
155
+ }
156
+ // --- No entry ---
157
+ if (!entry) {
158
+ return null;
159
+ }
160
+ return (_jsxs(Box, { children: [_jsxs(Box, { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 2, children: [_jsx(Typography, { variant: "h5", component: "h2", children: entry.title }), _jsxs(Box, { display: "flex", gap: 1, children: [_jsx(Button, { variant: "outlined", startIcon: _jsx(EditIcon, {}), onClick: () => onEdit?.(entry), children: t(BrightPassStrings.EntryDetail_Edit) }), _jsx(Button, { variant: "outlined", color: "error", startIcon: _jsx(DeleteIcon, {}), onClick: () => setShowDeleteConfirm(true), children: t(BrightPassStrings.EntryDetail_Delete) })] })] }), entry.type === 'login' && !breachLoading && breachResult && (_jsx(Alert, { severity: breachResult.breached ? 'warning' : 'success', sx: { mb: 2 }, children: breachResult.breached
161
+ ? t(BrightPassStrings.EntryDetail_BreachWarning, {
162
+ COUNT: String(breachResult.count),
163
+ })
164
+ : t(BrightPassStrings.EntryDetail_BreachSafe) })), entry.type === 'login' && breachLoading && (_jsxs(Box, { display: "flex", alignItems: "center", gap: 1, mb: 2, children: [_jsx(CircularProgress, { size: 16 }), _jsx(Typography, { variant: "body2", color: "text.secondary", children: t(BrightPassStrings.Breach_Check) })] })), renderEntryFields(entry), renderField(t(BrightPassStrings.EntryDetail_Notes), entry.notes), entry.tags && entry.tags.length > 0 && (_jsxs(Box, { mt: 1, mb: 1, children: [_jsx(Typography, { variant: "caption", color: "text.secondary", children: t(BrightPassStrings.EntryDetail_Tags) }), _jsx(Box, { display: "flex", gap: 0.5, flexWrap: "wrap", mt: 0.5, children: entry.tags.map((tag) => (_jsx(Chip, { label: tag, size: "small", variant: "outlined" }, tag))) })] })), _jsxs(Box, { display: "flex", gap: 2, mt: 2, children: [_jsxs(Typography, { variant: "caption", color: "text.secondary", children: [t(BrightPassStrings.EntryDetail_CreatedAt), ":", ' ', new Date(entry.createdAt).toLocaleString()] }), _jsxs(Typography, { variant: "caption", color: "text.secondary", children: [t(BrightPassStrings.EntryDetail_UpdatedAt), ":", ' ', new Date(entry.updatedAt).toLocaleString()] })] }), _jsxs(Dialog, { open: showDeleteConfirm, onClose: () => setShowDeleteConfirm(false), maxWidth: "xs", fullWidth: true, children: [_jsx(DialogTitle, { children: t(BrightPassStrings.EntryDetail_ConfirmDelete) }), _jsx(DialogContent, { children: _jsx(DialogContentText, { children: t(BrightPassStrings.EntryDetail_ConfirmDeleteMessage) }) }), _jsxs(DialogActions, { children: [_jsx(Button, { onClick: () => setShowDeleteConfirm(false), disabled: deleting, children: t(BrightPassStrings.EntryDetail_Cancel) }), _jsx(Button, { onClick: handleDelete, color: "error", variant: "contained", disabled: deleting, children: deleting ? (_jsx(CircularProgress, { size: 20 })) : (t(BrightPassStrings.EntryDetail_Delete)) })] })] })] }));
165
+ };
166
+ export default EntryDetailView;
167
+ //# sourceMappingURL=EntryDetailView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntryDetailView.js","sourceRoot":"","sources":["../../../../../brightpass-react-components/src/lib/components/EntryDetailView.tsx"],"names":[],"mappings":"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"}