@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.
- package/README.md +28 -0
- package/package.json +42 -0
- package/src/index.js +35 -0
- package/src/index.js.map +1 -0
- package/src/lib/BrightPassRoutes.js +33 -0
- package/src/lib/BrightPassRoutes.js.map +1 -0
- package/src/lib/components/BreadcrumbNav.js +70 -0
- package/src/lib/components/BreadcrumbNav.js.map +1 -0
- package/src/lib/components/CreateVaultDialog.js +57 -0
- package/src/lib/components/CreateVaultDialog.js.map +1 -0
- package/src/lib/components/EntryDetailView.js +167 -0
- package/src/lib/components/EntryDetailView.js.map +1 -0
- package/src/lib/components/EntryForm.js +196 -0
- package/src/lib/components/EntryForm.js.map +1 -0
- package/src/lib/components/MasterPasswordPrompt.js +56 -0
- package/src/lib/components/MasterPasswordPrompt.js.map +1 -0
- package/src/lib/components/SearchBar.js +137 -0
- package/src/lib/components/SearchBar.js.map +1 -0
- package/src/lib/context/BrightPassProvider.js +158 -0
- package/src/lib/context/BrightPassProvider.js.map +1 -0
- package/src/lib/dialogs/EmergencyAccessDialog.js +139 -0
- package/src/lib/dialogs/EmergencyAccessDialog.js.map +1 -0
- package/src/lib/dialogs/ImportDialog.js +146 -0
- package/src/lib/dialogs/ImportDialog.js.map +1 -0
- package/src/lib/dialogs/ShareDialog.js +82 -0
- package/src/lib/dialogs/ShareDialog.js.map +1 -0
- package/src/lib/hooks/useBrightPassApi.js +13 -0
- package/src/lib/hooks/useBrightPassApi.js.map +1 -0
- package/src/lib/hooks/useBrightPassAutofill.js +80 -0
- package/src/lib/hooks/useBrightPassAutofill.js.map +1 -0
- package/src/lib/hooks/useBrightPassExtensionBridge.js +108 -0
- package/src/lib/hooks/useBrightPassExtensionBridge.js.map +1 -0
- package/src/lib/hooks/useBrightPassTranslation.js +12 -0
- package/src/lib/hooks/useBrightPassTranslation.js.map +1 -0
- package/src/lib/services/BrightPassApiService.js +219 -0
- package/src/lib/services/BrightPassApiService.js.map +1 -0
- package/src/lib/views/AuditLogView.js +120 -0
- package/src/lib/views/AuditLogView.js.map +1 -0
- package/src/lib/views/PasswordGeneratorPage.js +20 -0
- package/src/lib/views/PasswordGeneratorPage.js.map +1 -0
- package/src/lib/views/VaultDetailView.js +93 -0
- package/src/lib/views/VaultDetailView.js.map +1 -0
- package/src/lib/views/VaultListView.js +99 -0
- package/src/lib/views/VaultListView.js.map +1 -0
- package/src/lib/widgets/BreachCheckWidget.js +57 -0
- package/src/lib/widgets/BreachCheckWidget.js.map +1 -0
- package/src/lib/widgets/PasswordGeneratorWidget.js +137 -0
- package/src/lib/widgets/PasswordGeneratorWidget.js.map +1 -0
- package/src/lib/widgets/TOTPWidget.js +165 -0
- package/src/lib/widgets/TOTPWidget.js.map +1 -0
- package/src/test-setup.js +13 -0
- 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
|
package/src/index.js.map
ADDED
|
@@ -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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"}
|