@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
@@ -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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"}