@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
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { BrightPassStrings } from '@brightchain/brightchain-lib';
|
|
3
|
+
import { Alert, Box, Button, Checkbox, CircularProgress, FormControlLabel, Tab, Tabs, TextField, } from '@mui/material';
|
|
4
|
+
import { useCallback, useMemo, useState } from 'react';
|
|
5
|
+
import { useBrightPassTranslation } from '../hooks/useBrightPassTranslation';
|
|
6
|
+
import { useBrightPassApi } from '../hooks/useBrightPassApi';
|
|
7
|
+
const ENTRY_TYPES = [
|
|
8
|
+
'login',
|
|
9
|
+
'secure_note',
|
|
10
|
+
'credit_card',
|
|
11
|
+
'identity',
|
|
12
|
+
];
|
|
13
|
+
const TYPE_TO_STRING_KEY = {
|
|
14
|
+
login: 'EntryType_Login',
|
|
15
|
+
secure_note: 'EntryType_SecureNote',
|
|
16
|
+
credit_card: 'EntryType_CreditCard',
|
|
17
|
+
identity: 'EntryType_Identity',
|
|
18
|
+
};
|
|
19
|
+
function getInitialCommon(entry) {
|
|
20
|
+
return {
|
|
21
|
+
title: entry?.title ?? '',
|
|
22
|
+
notes: entry?.notes ?? '',
|
|
23
|
+
tags: entry?.tags?.join(', ') ?? '',
|
|
24
|
+
favorite: entry?.favorite ?? false,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function getInitialLogin(entry) {
|
|
28
|
+
const e = entry?.type === 'login' ? entry : undefined;
|
|
29
|
+
return {
|
|
30
|
+
siteUrl: e?.siteUrl ?? '',
|
|
31
|
+
username: e?.username ?? '',
|
|
32
|
+
password: e?.password ?? '',
|
|
33
|
+
totpSecret: e?.totpSecret ?? '',
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function getInitialSecureNote(entry) {
|
|
37
|
+
const e = entry?.type === 'secure_note' ? entry : undefined;
|
|
38
|
+
return { content: e?.content ?? '' };
|
|
39
|
+
}
|
|
40
|
+
function getInitialCreditCard(entry) {
|
|
41
|
+
const e = entry?.type === 'credit_card' ? entry : undefined;
|
|
42
|
+
return {
|
|
43
|
+
cardholderName: e?.cardholderName ?? '',
|
|
44
|
+
cardNumber: e?.cardNumber ?? '',
|
|
45
|
+
expirationDate: e?.expirationDate ?? '',
|
|
46
|
+
cvv: e?.cvv ?? '',
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function getInitialIdentity(entry) {
|
|
50
|
+
const e = entry?.type === 'identity' ? entry : undefined;
|
|
51
|
+
return {
|
|
52
|
+
firstName: e?.firstName ?? '',
|
|
53
|
+
lastName: e?.lastName ?? '',
|
|
54
|
+
email: e?.email ?? '',
|
|
55
|
+
phone: e?.phone ?? '',
|
|
56
|
+
address: e?.address ?? '',
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function parseTags(raw) {
|
|
60
|
+
return raw
|
|
61
|
+
.split(',')
|
|
62
|
+
.map((t) => t.trim())
|
|
63
|
+
.filter(Boolean);
|
|
64
|
+
}
|
|
65
|
+
function buildEntry(type, common, login, secureNote, creditCard, identity, existingEntry) {
|
|
66
|
+
const now = new Date();
|
|
67
|
+
const base = {
|
|
68
|
+
id: existingEntry?.id ?? '',
|
|
69
|
+
title: common.title,
|
|
70
|
+
notes: common.notes || undefined,
|
|
71
|
+
tags: parseTags(common.tags),
|
|
72
|
+
favorite: common.favorite,
|
|
73
|
+
createdAt: existingEntry?.createdAt ?? now,
|
|
74
|
+
updatedAt: now,
|
|
75
|
+
attachments: existingEntry?.attachments,
|
|
76
|
+
};
|
|
77
|
+
switch (type) {
|
|
78
|
+
case 'login':
|
|
79
|
+
return {
|
|
80
|
+
...base,
|
|
81
|
+
type: 'login',
|
|
82
|
+
siteUrl: login.siteUrl,
|
|
83
|
+
username: login.username,
|
|
84
|
+
password: login.password,
|
|
85
|
+
totpSecret: login.totpSecret || undefined,
|
|
86
|
+
};
|
|
87
|
+
case 'secure_note':
|
|
88
|
+
return {
|
|
89
|
+
...base,
|
|
90
|
+
type: 'secure_note',
|
|
91
|
+
content: secureNote.content,
|
|
92
|
+
};
|
|
93
|
+
case 'credit_card':
|
|
94
|
+
return {
|
|
95
|
+
...base,
|
|
96
|
+
type: 'credit_card',
|
|
97
|
+
cardholderName: creditCard.cardholderName,
|
|
98
|
+
cardNumber: creditCard.cardNumber,
|
|
99
|
+
expirationDate: creditCard.expirationDate,
|
|
100
|
+
cvv: creditCard.cvv,
|
|
101
|
+
};
|
|
102
|
+
case 'identity':
|
|
103
|
+
return {
|
|
104
|
+
...base,
|
|
105
|
+
type: 'identity',
|
|
106
|
+
firstName: identity.firstName,
|
|
107
|
+
lastName: identity.lastName,
|
|
108
|
+
email: identity.email || undefined,
|
|
109
|
+
phone: identity.phone || undefined,
|
|
110
|
+
address: identity.address || undefined,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const EntryForm = ({ vaultId, entry, onSave, onCancel, }) => {
|
|
115
|
+
const { t } = useBrightPassTranslation();
|
|
116
|
+
const isEditing = Boolean(entry);
|
|
117
|
+
const brightPassApi = useBrightPassApi();
|
|
118
|
+
const [activeType, setActiveType] = useState(entry?.type ?? 'login');
|
|
119
|
+
const [common, setCommon] = useState(() => getInitialCommon(entry));
|
|
120
|
+
const [login, setLogin] = useState(() => getInitialLogin(entry));
|
|
121
|
+
const [secureNote, setSecureNote] = useState(() => getInitialSecureNote(entry));
|
|
122
|
+
const [creditCard, setCreditCard] = useState(() => getInitialCreditCard(entry));
|
|
123
|
+
const [identity, setIdentity] = useState(() => getInitialIdentity(entry));
|
|
124
|
+
const [submitting, setSubmitting] = useState(false);
|
|
125
|
+
const [error, setError] = useState(null);
|
|
126
|
+
const tabIndex = useMemo(() => ENTRY_TYPES.indexOf(activeType), [activeType]);
|
|
127
|
+
const handleTabChange = useCallback((_, newIndex) => {
|
|
128
|
+
if (!isEditing) {
|
|
129
|
+
setActiveType(ENTRY_TYPES[newIndex]);
|
|
130
|
+
}
|
|
131
|
+
}, [isEditing]);
|
|
132
|
+
const updateCommon = useCallback((field, value) => {
|
|
133
|
+
setCommon((prev) => ({ ...prev, [field]: value }));
|
|
134
|
+
}, []);
|
|
135
|
+
const handleSubmit = useCallback(async (e) => {
|
|
136
|
+
e.preventDefault();
|
|
137
|
+
setError(null);
|
|
138
|
+
setSubmitting(true);
|
|
139
|
+
const builtEntry = buildEntry(activeType, common, login, secureNote, creditCard, identity, entry);
|
|
140
|
+
try {
|
|
141
|
+
let saved;
|
|
142
|
+
if (isEditing && entry) {
|
|
143
|
+
saved = await brightPassApi.updateEntry(vaultId, entry.id, builtEntry);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
saved = await brightPassApi.createEntry(vaultId, builtEntry);
|
|
147
|
+
}
|
|
148
|
+
onSave?.(saved);
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
const message = err?.message ??
|
|
152
|
+
t(BrightPassStrings.Error_Generic);
|
|
153
|
+
setError(message);
|
|
154
|
+
}
|
|
155
|
+
finally {
|
|
156
|
+
setSubmitting(false);
|
|
157
|
+
}
|
|
158
|
+
}, [
|
|
159
|
+
activeType,
|
|
160
|
+
common,
|
|
161
|
+
login,
|
|
162
|
+
secureNote,
|
|
163
|
+
creditCard,
|
|
164
|
+
identity,
|
|
165
|
+
entry,
|
|
166
|
+
isEditing,
|
|
167
|
+
vaultId,
|
|
168
|
+
onSave,
|
|
169
|
+
t,
|
|
170
|
+
]);
|
|
171
|
+
const renderLoginFields = () => (_jsxs(_Fragment, { children: [_jsx(TextField, { label: t(BrightPassStrings.EntryDetail_SiteUrl), value: login.siteUrl, onChange: (e) => setLogin((prev) => ({ ...prev, siteUrl: e.target.value })), fullWidth: true, margin: "dense" }), _jsx(TextField, { label: t(BrightPassStrings.EntryDetail_Username), value: login.username, onChange: (e) => setLogin((prev) => ({ ...prev, username: e.target.value })), fullWidth: true, margin: "dense" }), _jsxs(Box, { display: "flex", gap: 1, alignItems: "flex-start", children: [_jsx(TextField, { label: t(BrightPassStrings.EntryDetail_Password), value: login.password, onChange: (e) => setLogin((prev) => ({ ...prev, password: e.target.value })), fullWidth: true, margin: "dense", type: "password" }), _jsx(Button, { variant: "outlined", sx: { mt: 1, whiteSpace: 'nowrap' }, disabled: true, children: t(BrightPassStrings.EntryForm_GeneratePassword) })] }), _jsx(TextField, { label: t(BrightPassStrings.EntryDetail_TotpSecret), value: login.totpSecret, onChange: (e) => setLogin((prev) => ({ ...prev, totpSecret: e.target.value })), fullWidth: true, margin: "dense", helperText: t(BrightPassStrings.EntryForm_TotpSecretHelp) })] }));
|
|
172
|
+
const renderSecureNoteFields = () => (_jsx(TextField, { label: t(BrightPassStrings.EntryDetail_Content), value: secureNote.content, onChange: (e) => setSecureNote((prev) => ({ ...prev, content: e.target.value })), fullWidth: true, margin: "dense", multiline: true, minRows: 4 }));
|
|
173
|
+
const renderCreditCardFields = () => (_jsxs(_Fragment, { children: [_jsx(TextField, { label: t(BrightPassStrings.EntryDetail_CardholderName), value: creditCard.cardholderName, onChange: (e) => setCreditCard((prev) => ({
|
|
174
|
+
...prev,
|
|
175
|
+
cardholderName: e.target.value,
|
|
176
|
+
})), fullWidth: true, margin: "dense" }), _jsx(TextField, { label: t(BrightPassStrings.EntryDetail_CardNumber), value: creditCard.cardNumber, onChange: (e) => setCreditCard((prev) => ({ ...prev, cardNumber: e.target.value })), fullWidth: true, margin: "dense" }), _jsx(TextField, { label: t(BrightPassStrings.EntryDetail_ExpirationDate), value: creditCard.expirationDate, onChange: (e) => setCreditCard((prev) => ({
|
|
177
|
+
...prev,
|
|
178
|
+
expirationDate: e.target.value,
|
|
179
|
+
})), fullWidth: true, margin: "dense" }), _jsx(TextField, { label: t(BrightPassStrings.EntryDetail_CVV), value: creditCard.cvv, onChange: (e) => setCreditCard((prev) => ({ ...prev, cvv: e.target.value })), fullWidth: true, margin: "dense" })] }));
|
|
180
|
+
const renderIdentityFields = () => (_jsxs(_Fragment, { children: [_jsx(TextField, { label: t(BrightPassStrings.EntryDetail_FirstName), value: identity.firstName, onChange: (e) => setIdentity((prev) => ({ ...prev, firstName: e.target.value })), fullWidth: true, margin: "dense" }), _jsx(TextField, { label: t(BrightPassStrings.EntryDetail_LastName), value: identity.lastName, onChange: (e) => setIdentity((prev) => ({ ...prev, lastName: e.target.value })), fullWidth: true, margin: "dense" }), _jsx(TextField, { label: t(BrightPassStrings.EntryDetail_Email), value: identity.email, onChange: (e) => setIdentity((prev) => ({ ...prev, email: e.target.value })), fullWidth: true, margin: "dense" }), _jsx(TextField, { label: t(BrightPassStrings.EntryDetail_Phone), value: identity.phone, onChange: (e) => setIdentity((prev) => ({ ...prev, phone: e.target.value })), fullWidth: true, margin: "dense" }), _jsx(TextField, { label: t(BrightPassStrings.EntryDetail_Address), value: identity.address, onChange: (e) => setIdentity((prev) => ({ ...prev, address: e.target.value })), fullWidth: true, margin: "dense", multiline: true, minRows: 2 })] }));
|
|
181
|
+
const renderTypeFields = () => {
|
|
182
|
+
switch (activeType) {
|
|
183
|
+
case 'login':
|
|
184
|
+
return renderLoginFields();
|
|
185
|
+
case 'secure_note':
|
|
186
|
+
return renderSecureNoteFields();
|
|
187
|
+
case 'credit_card':
|
|
188
|
+
return renderCreditCardFields();
|
|
189
|
+
case 'identity':
|
|
190
|
+
return renderIdentityFields();
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
return (_jsxs(Box, { component: "form", onSubmit: handleSubmit, children: [_jsx(Tabs, { value: tabIndex, onChange: handleTabChange, sx: { mb: 2 }, children: ENTRY_TYPES.map((type) => (_jsx(Tab, { label: t(BrightPassStrings[TYPE_TO_STRING_KEY[type]]), disabled: isEditing && type !== entry?.type }, type))) }), error && (_jsx(Alert, { severity: "error", sx: { mb: 2 }, children: error })), _jsx(TextField, { label: t(BrightPassStrings.EntryForm_FieldTitle), value: common.title, onChange: (e) => updateCommon('title', e.target.value), fullWidth: true, margin: "dense", required: true }), renderTypeFields(), _jsx(TextField, { label: t(BrightPassStrings.EntryForm_FieldNotes), value: common.notes, onChange: (e) => updateCommon('notes', e.target.value), fullWidth: true, margin: "dense", multiline: true, minRows: 2 }), _jsx(TextField, { label: t(BrightPassStrings.EntryForm_FieldTags), value: common.tags, onChange: (e) => updateCommon('tags', e.target.value), fullWidth: true, margin: "dense" }), _jsx(FormControlLabel, { control: _jsx(Checkbox, { checked: common.favorite, onChange: (e) => updateCommon('favorite', e.target.checked) }), label: t(BrightPassStrings.EntryForm_FieldFavorite) }), _jsxs(Box, { display: "flex", gap: 1, justifyContent: "flex-end", mt: 2, children: [_jsx(Button, { onClick: onCancel, disabled: submitting, children: t(BrightPassStrings.EntryForm_Cancel) }), _jsx(Button, { type: "submit", variant: "contained", disabled: submitting || !common.title.trim(), children: submitting ? (_jsx(CircularProgress, { size: 20 })) : (t(BrightPassStrings.EntryForm_Save)) })] })] }));
|
|
194
|
+
};
|
|
195
|
+
export default EntryForm;
|
|
196
|
+
//# sourceMappingURL=EntryForm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntryForm.js","sourceRoot":"","sources":["../../../../../brightpass-react-components/src/lib/components/EntryForm.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* MasterPasswordPrompt — Modal dialog for vault unlock.
|
|
4
|
+
*
|
|
5
|
+
* On correct master password, navigates to vault detail view.
|
|
6
|
+
* On incorrect password, displays an i18n error and remains open.
|
|
7
|
+
*
|
|
8
|
+
* Requirements: 3.3, 3.4, 3.5
|
|
9
|
+
*/
|
|
10
|
+
import { useState } from 'react';
|
|
11
|
+
import { useNavigate } from 'react-router-dom';
|
|
12
|
+
import { Alert, Button, Dialog, DialogActions, DialogContent, DialogTitle, TextField, } from '@mui/material';
|
|
13
|
+
import { BrightPassStrings } from '@brightchain/brightchain-lib';
|
|
14
|
+
import { useBrightPass } from '../context/BrightPassProvider';
|
|
15
|
+
import { useBrightPassTranslation } from '../hooks/useBrightPassTranslation';
|
|
16
|
+
const MasterPasswordPrompt = ({ open, onClose, vaultId, vaultName, }) => {
|
|
17
|
+
const { t } = useBrightPassTranslation();
|
|
18
|
+
const { unlockVault } = useBrightPass();
|
|
19
|
+
const navigate = useNavigate();
|
|
20
|
+
const [masterPassword, setMasterPassword] = useState('');
|
|
21
|
+
const [error, setError] = useState(null);
|
|
22
|
+
const [loading, setLoading] = useState(false);
|
|
23
|
+
const resetState = () => {
|
|
24
|
+
setMasterPassword('');
|
|
25
|
+
setError(null);
|
|
26
|
+
setLoading(false);
|
|
27
|
+
};
|
|
28
|
+
const handleClose = () => {
|
|
29
|
+
resetState();
|
|
30
|
+
onClose();
|
|
31
|
+
};
|
|
32
|
+
const handleSubmit = async () => {
|
|
33
|
+
setLoading(true);
|
|
34
|
+
setError(null);
|
|
35
|
+
try {
|
|
36
|
+
await unlockVault(vaultId, masterPassword);
|
|
37
|
+
resetState();
|
|
38
|
+
onClose();
|
|
39
|
+
navigate(`/brightpass/vault/${vaultId}`);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
setError(t(BrightPassStrings.Error_InvalidMasterPassword));
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
setLoading(false);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const handleKeyDown = (e) => {
|
|
49
|
+
if (e.key === 'Enter' && masterPassword && !loading) {
|
|
50
|
+
handleSubmit();
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
return (_jsxs(Dialog, { open: open, onClose: handleClose, maxWidth: "xs", fullWidth: true, children: [_jsxs(DialogTitle, { children: [t(BrightPassStrings.VaultList_UnlockVault), ": ", vaultName] }), _jsxs(DialogContent, { children: [error && (_jsx(Alert, { severity: "error", sx: { mb: 2 }, children: error })), _jsx(TextField, { autoFocus: true, 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 || !masterPassword, children: t(BrightPassStrings.VaultList_Unlock) })] })] }));
|
|
54
|
+
};
|
|
55
|
+
export default MasterPasswordPrompt;
|
|
56
|
+
//# sourceMappingURL=MasterPasswordPrompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MasterPasswordPrompt.js","sourceRoot":"","sources":["../../../../../brightpass-react-components/src/lib/components/MasterPasswordPrompt.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { BrightPassStrings } from '@brightchain/brightchain-lib';
|
|
3
|
+
import SearchIcon from '@mui/icons-material/Search';
|
|
4
|
+
import StarIcon from '@mui/icons-material/Star';
|
|
5
|
+
import StarBorderIcon from '@mui/icons-material/StarBorder';
|
|
6
|
+
import { Box, Chip, InputAdornment, TextField, ToggleButton, Typography, } from '@mui/material';
|
|
7
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
8
|
+
import { useBrightPassTranslation } from '../hooks/useBrightPassTranslation';
|
|
9
|
+
import { useBrightPassApi } from '../hooks/useBrightPassApi';
|
|
10
|
+
/** All entry types available as filter chips. */
|
|
11
|
+
const ENTRY_TYPES = [
|
|
12
|
+
'login',
|
|
13
|
+
'secure_note',
|
|
14
|
+
'credit_card',
|
|
15
|
+
'identity',
|
|
16
|
+
];
|
|
17
|
+
/**
|
|
18
|
+
* Filters entries client-side based on text query, active type filters, and
|
|
19
|
+
* favorites toggle. Exported for unit/property testing.
|
|
20
|
+
*/
|
|
21
|
+
export function filterEntries(entries, query, activeTypes, favoritesOnly) {
|
|
22
|
+
const lowerQuery = query.trim().toLowerCase();
|
|
23
|
+
return entries.filter((entry) => {
|
|
24
|
+
// Text filter: match title, tags, or siteUrl
|
|
25
|
+
if (lowerQuery) {
|
|
26
|
+
const matchesText = entry.title.toLowerCase().includes(lowerQuery) ||
|
|
27
|
+
entry.tags.some((tag) => tag.toLowerCase().includes(lowerQuery)) ||
|
|
28
|
+
entry.siteUrl.toLowerCase().includes(lowerQuery);
|
|
29
|
+
if (!matchesText)
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
// Type filter: if any chips are active, only show matching types
|
|
33
|
+
if (activeTypes.size > 0 && !activeTypes.has(entry.entryType)) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
// Favorites filter
|
|
37
|
+
if (favoritesOnly && !entry.favorite) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
return true;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
const SearchBar = ({ entries, onFilteredChange, vaultId, onServerSearch, }) => {
|
|
44
|
+
const { t } = useBrightPassTranslation();
|
|
45
|
+
const brightPassApi = useBrightPassApi();
|
|
46
|
+
const [query, setQuery] = useState('');
|
|
47
|
+
const [activeTypes, setActiveTypes] = useState(new Set());
|
|
48
|
+
const [favoritesOnly, setFavoritesOnly] = useState(false);
|
|
49
|
+
const debounceRef = useRef(null);
|
|
50
|
+
// Perform client-side filtering and notify parent
|
|
51
|
+
const applyFilter = useCallback((q, types, favs) => {
|
|
52
|
+
const filtered = filterEntries(entries, q, types, favs);
|
|
53
|
+
onFilteredChange(filtered);
|
|
54
|
+
}, [entries, onFilteredChange]);
|
|
55
|
+
// Debounced text input handler (100ms)
|
|
56
|
+
const handleQueryChange = useCallback((e) => {
|
|
57
|
+
const value = e.target.value;
|
|
58
|
+
setQuery(value);
|
|
59
|
+
if (debounceRef.current) {
|
|
60
|
+
clearTimeout(debounceRef.current);
|
|
61
|
+
}
|
|
62
|
+
debounceRef.current = setTimeout(() => {
|
|
63
|
+
applyFilter(value, activeTypes, favoritesOnly);
|
|
64
|
+
}, 100);
|
|
65
|
+
}, [applyFilter, activeTypes, favoritesOnly]);
|
|
66
|
+
// Toggle a type chip on/off
|
|
67
|
+
const handleTypeToggle = useCallback((type) => {
|
|
68
|
+
setActiveTypes((prev) => {
|
|
69
|
+
const next = new Set(prev);
|
|
70
|
+
if (next.has(type)) {
|
|
71
|
+
next.delete(type);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
next.add(type);
|
|
75
|
+
}
|
|
76
|
+
applyFilter(query, next, favoritesOnly);
|
|
77
|
+
return next;
|
|
78
|
+
});
|
|
79
|
+
}, [applyFilter, query, favoritesOnly]);
|
|
80
|
+
// Toggle favorites filter
|
|
81
|
+
const handleFavoritesToggle = useCallback(() => {
|
|
82
|
+
setFavoritesOnly((prev) => {
|
|
83
|
+
const next = !prev;
|
|
84
|
+
applyFilter(query, activeTypes, next);
|
|
85
|
+
return next;
|
|
86
|
+
});
|
|
87
|
+
}, [applyFilter, query, activeTypes]);
|
|
88
|
+
// Server-side search on Enter/submit
|
|
89
|
+
const handleSubmit = useCallback(async (e) => {
|
|
90
|
+
e.preventDefault();
|
|
91
|
+
if (!onServerSearch)
|
|
92
|
+
return;
|
|
93
|
+
const searchQuery = {
|
|
94
|
+
text: query || undefined,
|
|
95
|
+
type: activeTypes.size === 1
|
|
96
|
+
? Array.from(activeTypes)[0]
|
|
97
|
+
: undefined,
|
|
98
|
+
favorite: favoritesOnly || undefined,
|
|
99
|
+
};
|
|
100
|
+
const results = await brightPassApi.searchEntries(vaultId, searchQuery);
|
|
101
|
+
onServerSearch(results);
|
|
102
|
+
}, [query, activeTypes, favoritesOnly, vaultId, onServerSearch]);
|
|
103
|
+
// Re-apply filter when entries change externally
|
|
104
|
+
useEffect(() => {
|
|
105
|
+
applyFilter(query, activeTypes, favoritesOnly);
|
|
106
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
107
|
+
}, [entries]);
|
|
108
|
+
// Cleanup debounce timer on unmount
|
|
109
|
+
useEffect(() => {
|
|
110
|
+
return () => {
|
|
111
|
+
if (debounceRef.current) {
|
|
112
|
+
clearTimeout(debounceRef.current);
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
}, []);
|
|
116
|
+
const entryTypeLabel = (type) => {
|
|
117
|
+
switch (type) {
|
|
118
|
+
case 'login':
|
|
119
|
+
return t(BrightPassStrings.EntryType_Login);
|
|
120
|
+
case 'secure_note':
|
|
121
|
+
return t(BrightPassStrings.EntryType_SecureNote);
|
|
122
|
+
case 'credit_card':
|
|
123
|
+
return t(BrightPassStrings.EntryType_CreditCard);
|
|
124
|
+
case 'identity':
|
|
125
|
+
return t(BrightPassStrings.EntryType_Identity);
|
|
126
|
+
default:
|
|
127
|
+
return type;
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
return (_jsxs(Box, { component: "form", onSubmit: handleSubmit, sx: { mb: 2 }, children: [_jsx(TextField, { fullWidth: true, variant: "outlined", size: "small", placeholder: t(BrightPassStrings.SearchBar_Placeholder), value: query, onChange: handleQueryChange, InputProps: {
|
|
131
|
+
startAdornment: (_jsx(InputAdornment, { position: "start", children: _jsx(SearchIcon, {}) })),
|
|
132
|
+
}, inputProps: {
|
|
133
|
+
'aria-label': t(BrightPassStrings.SearchBar_Placeholder),
|
|
134
|
+
}, sx: { mb: 1 } }), _jsxs(Box, { display: "flex", alignItems: "center", gap: 1, flexWrap: "wrap", children: [ENTRY_TYPES.map((type) => (_jsx(Chip, { label: entryTypeLabel(type), color: activeTypes.has(type) ? 'primary' : 'default', variant: activeTypes.has(type) ? 'filled' : 'outlined', onClick: () => handleTypeToggle(type), "aria-pressed": activeTypes.has(type) }, type))), _jsxs(ToggleButton, { value: "favorites", selected: favoritesOnly, onChange: handleFavoritesToggle, size: "small", "aria-label": t(BrightPassStrings.SearchBar_FilterFavorites), sx: { borderRadius: '16px', px: 1.5, textTransform: 'none' }, children: [favoritesOnly ? (_jsx(StarIcon, { fontSize: "small", sx: { mr: 0.5 } })) : (_jsx(StarBorderIcon, { fontSize: "small", sx: { mr: 0.5 } })), _jsx(Typography, { variant: "body2", children: t(BrightPassStrings.SearchBar_FilterFavorites) })] })] })] }));
|
|
135
|
+
};
|
|
136
|
+
export default SearchBar;
|
|
137
|
+
//# sourceMappingURL=SearchBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchBar.js","sourceRoot":"","sources":["../../../../../brightpass-react-components/src/lib/components/SearchBar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* BrightPassProvider — React context managing vault state, auto-lock timers,
|
|
4
|
+
* and decrypted data lifecycle.
|
|
5
|
+
*
|
|
6
|
+
* - Holds currently unlocked vault ID, metadata, and decrypted property records
|
|
7
|
+
* - Master password hash kept in-memory only, cleared on lock
|
|
8
|
+
* - Auto-lock after 15 minutes of inactivity (configurable)
|
|
9
|
+
* - Accelerated 5-minute lock timer when browser tab becomes hidden
|
|
10
|
+
* - Clears all decrypted data on lock, unmount, and tab visibility change
|
|
11
|
+
*
|
|
12
|
+
* Requirements: 4.10, 14.4
|
|
13
|
+
*/
|
|
14
|
+
import { createContext, useCallback, useContext, useEffect, useRef, useState, } from 'react';
|
|
15
|
+
import { useBrightPassApi } from '../hooks/useBrightPassApi';
|
|
16
|
+
/** Default inactivity timeout in milliseconds (15 minutes). */
|
|
17
|
+
const DEFAULT_AUTO_LOCK_MS = 15 * 60 * 1000;
|
|
18
|
+
/** Accelerated timeout when tab is hidden (5 minutes). */
|
|
19
|
+
const HIDDEN_TAB_LOCK_MS = 5 * 60 * 1000;
|
|
20
|
+
/** User-activity events that reset the inactivity timer. */
|
|
21
|
+
const ACTIVITY_EVENTS = [
|
|
22
|
+
'mousedown',
|
|
23
|
+
'keydown',
|
|
24
|
+
'scroll',
|
|
25
|
+
'touchstart',
|
|
26
|
+
];
|
|
27
|
+
const BrightPassContext = createContext(undefined);
|
|
28
|
+
export const BrightPassProvider = ({ children, initialAutoLockMs = DEFAULT_AUTO_LOCK_MS, }) => {
|
|
29
|
+
const [vault, setVault] = useState(null);
|
|
30
|
+
const [autoLockTimeout, setAutoLockTimeout] = useState(initialAutoLockMs);
|
|
31
|
+
const brightPassApi = useBrightPassApi();
|
|
32
|
+
const inactivityTimerRef = useRef(null);
|
|
33
|
+
const hiddenTabTimerRef = useRef(null);
|
|
34
|
+
const vaultRef = useRef(vault);
|
|
35
|
+
vaultRef.current = vault;
|
|
36
|
+
// ── Core lock / unlock ──────────────────────────────────────────────
|
|
37
|
+
const clearState = useCallback(() => {
|
|
38
|
+
setVault(null);
|
|
39
|
+
}, []);
|
|
40
|
+
const lockVault = useCallback(() => {
|
|
41
|
+
clearState();
|
|
42
|
+
}, [clearState]);
|
|
43
|
+
const unlockVault = useCallback(async (vaultId, masterPassword) => {
|
|
44
|
+
const decrypted = await brightPassApi.openVault(vaultId, masterPassword);
|
|
45
|
+
// Build metadata from the decrypted response. The API returns a flat
|
|
46
|
+
// IDecryptedVault<string>; we reconstruct VaultMetadata for consumers.
|
|
47
|
+
const metadata = {
|
|
48
|
+
id: decrypted.id,
|
|
49
|
+
name: decrypted.name,
|
|
50
|
+
ownerId: decrypted.ownerId,
|
|
51
|
+
createdAt: new Date(decrypted.createdAt),
|
|
52
|
+
updatedAt: new Date(decrypted.updatedAt),
|
|
53
|
+
entryCount: decrypted.propertyRecords.length,
|
|
54
|
+
sharedWith: [],
|
|
55
|
+
vcblBlockId: '',
|
|
56
|
+
};
|
|
57
|
+
setVault({
|
|
58
|
+
vaultId: decrypted.id,
|
|
59
|
+
metadata,
|
|
60
|
+
propertyRecords: decrypted.propertyRecords,
|
|
61
|
+
});
|
|
62
|
+
}, [brightPassApi]);
|
|
63
|
+
const isVaultUnlocked = useCallback(() => {
|
|
64
|
+
return vaultRef.current !== null;
|
|
65
|
+
}, []);
|
|
66
|
+
// ── Inactivity auto-lock timer ──────────────────────────────────────
|
|
67
|
+
const clearInactivityTimer = useCallback(() => {
|
|
68
|
+
if (inactivityTimerRef.current !== null) {
|
|
69
|
+
clearTimeout(inactivityTimerRef.current);
|
|
70
|
+
inactivityTimerRef.current = null;
|
|
71
|
+
}
|
|
72
|
+
}, []);
|
|
73
|
+
const resetInactivityTimer = useCallback(() => {
|
|
74
|
+
clearInactivityTimer();
|
|
75
|
+
if (vaultRef.current !== null) {
|
|
76
|
+
inactivityTimerRef.current = setTimeout(() => {
|
|
77
|
+
lockVault();
|
|
78
|
+
}, autoLockTimeout);
|
|
79
|
+
}
|
|
80
|
+
}, [autoLockTimeout, clearInactivityTimer, lockVault]);
|
|
81
|
+
// Start / restart inactivity timer whenever vault or timeout changes
|
|
82
|
+
useEffect(() => {
|
|
83
|
+
if (vault === null) {
|
|
84
|
+
clearInactivityTimer();
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
resetInactivityTimer();
|
|
88
|
+
const handler = () => resetInactivityTimer();
|
|
89
|
+
for (const evt of ACTIVITY_EVENTS) {
|
|
90
|
+
document.addEventListener(evt, handler, { passive: true });
|
|
91
|
+
}
|
|
92
|
+
return () => {
|
|
93
|
+
clearInactivityTimer();
|
|
94
|
+
for (const evt of ACTIVITY_EVENTS) {
|
|
95
|
+
document.removeEventListener(evt, handler);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
}, [vault, autoLockTimeout, clearInactivityTimer, resetInactivityTimer]);
|
|
99
|
+
// ── Tab visibility change — accelerated lock timer ──────────────────
|
|
100
|
+
const clearHiddenTabTimer = useCallback(() => {
|
|
101
|
+
if (hiddenTabTimerRef.current !== null) {
|
|
102
|
+
clearTimeout(hiddenTabTimerRef.current);
|
|
103
|
+
hiddenTabTimerRef.current = null;
|
|
104
|
+
}
|
|
105
|
+
}, []);
|
|
106
|
+
useEffect(() => {
|
|
107
|
+
const handleVisibilityChange = () => {
|
|
108
|
+
if (document.visibilityState === 'hidden' && vaultRef.current !== null) {
|
|
109
|
+
// Start accelerated lock timer
|
|
110
|
+
clearHiddenTabTimer();
|
|
111
|
+
hiddenTabTimerRef.current = setTimeout(() => {
|
|
112
|
+
lockVault();
|
|
113
|
+
}, HIDDEN_TAB_LOCK_MS);
|
|
114
|
+
}
|
|
115
|
+
else if (document.visibilityState === 'visible') {
|
|
116
|
+
// Tab came back — cancel the accelerated timer
|
|
117
|
+
clearHiddenTabTimer();
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
document.addEventListener('visibilitychange', handleVisibilityChange);
|
|
121
|
+
return () => {
|
|
122
|
+
document.removeEventListener('visibilitychange', handleVisibilityChange);
|
|
123
|
+
clearHiddenTabTimer();
|
|
124
|
+
};
|
|
125
|
+
}, [clearHiddenTabTimer, lockVault]);
|
|
126
|
+
// ── Cleanup on unmount ──────────────────────────────────────────────
|
|
127
|
+
useEffect(() => {
|
|
128
|
+
return () => {
|
|
129
|
+
clearState();
|
|
130
|
+
};
|
|
131
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
132
|
+
}, []);
|
|
133
|
+
// ── Context value ───────────────────────────────────────────────────
|
|
134
|
+
const value = {
|
|
135
|
+
vault,
|
|
136
|
+
unlockVault,
|
|
137
|
+
lockVault,
|
|
138
|
+
isVaultUnlocked,
|
|
139
|
+
autoLockTimeout,
|
|
140
|
+
setAutoLockTimeout,
|
|
141
|
+
};
|
|
142
|
+
return (_jsx(BrightPassContext.Provider, { value: value, children: children }));
|
|
143
|
+
};
|
|
144
|
+
/**
|
|
145
|
+
* Hook to consume the BrightPass context. Must be used within a
|
|
146
|
+
* `<BrightPassProvider>`.
|
|
147
|
+
*/
|
|
148
|
+
export function useBrightPass() {
|
|
149
|
+
const ctx = useContext(BrightPassContext);
|
|
150
|
+
if (ctx === undefined) {
|
|
151
|
+
throw new Error('useBrightPass must be used within a BrightPassProvider');
|
|
152
|
+
}
|
|
153
|
+
return ctx;
|
|
154
|
+
}
|
|
155
|
+
export { BrightPassContext };
|
|
156
|
+
// Re-export constants for testing
|
|
157
|
+
export { DEFAULT_AUTO_LOCK_MS, HIDDEN_TAB_LOCK_MS };
|
|
158
|
+
//# sourceMappingURL=BrightPassProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BrightPassProvider.js","sourceRoot":"","sources":["../../../../../brightpass-react-components/src/lib/context/BrightPassProvider.tsx"],"names":[],"mappings":"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"}
|