diff --git a/browser-extensions/chrome/src/components/Layout/Header.tsx b/browser-extensions/chrome/src/components/Layout/Header.tsx index 9d0436916..74d286c77 100644 --- a/browser-extensions/chrome/src/components/Layout/Header.tsx +++ b/browser-extensions/chrome/src/components/Layout/Header.tsx @@ -20,8 +20,6 @@ const Header: React.FC = ({ authContext, clientUrl, handleRefresh, - toggleUserMenu, - isUserMenuOpen, routes = [] }) => { const navigate = useNavigate(); @@ -96,9 +94,7 @@ const Header: React.FC = ({ ) : ( )} diff --git a/browser-extensions/chrome/src/components/Layout/UserMenu.tsx b/browser-extensions/chrome/src/components/Layout/UserMenu.tsx index 7fa1ace59..50d774ad0 100644 --- a/browser-extensions/chrome/src/components/Layout/UserMenu.tsx +++ b/browser-extensions/chrome/src/components/Layout/UserMenu.tsx @@ -6,13 +6,11 @@ import { useLoading } from '../../context/LoadingContext'; interface UserMenuProps { username: string; onRefresh?: () => void; - showRefreshButton?: boolean; } export const UserMenu: React.FC = ({ username, onRefresh, - showRefreshButton = false }) => { const authContext = useAuth(); const [isUserMenuOpen, setIsUserMenuOpen] = useState(false); @@ -54,18 +52,6 @@ export const UserMenu: React.FC = ({ return (
- {showRefreshButton && ( -
-
- -
-
- )} -
+ +
+ Loading... +
+ ); +}; + +export default ReloadButton; \ No newline at end of file diff --git a/browser-extensions/chrome/src/pages/CredentialsList.tsx b/browser-extensions/chrome/src/pages/CredentialsList.tsx index ae947c801..e53f4cda7 100644 --- a/browser-extensions/chrome/src/pages/CredentialsList.tsx +++ b/browser-extensions/chrome/src/pages/CredentialsList.tsx @@ -3,21 +3,24 @@ import { useDb } from '../context/DbContext'; import { Credential } from '../types/Credential'; import { Buffer } from 'buffer'; import { useNavigate } from 'react-router-dom'; - +import { useLoading } from '../context/LoadingContext'; +import { useWebApi } from '../context/WebApiContext'; +import EncryptionUtility from '../utils/EncryptionUtility'; +import { VaultResponse } from '../types/webapi/VaultResponse'; +import ReloadButton from '../components/ReloadButton'; /** * Credentials list page. */ const CredentialsList: React.FC = () => { const dbContext = useDb(); + const webApi = useWebApi(); const [credentials, setCredentials] = useState([]); const navigate = useNavigate(); + const { showLoading, hideLoading } = useLoading(); useEffect(() => { - console.log('loading credentials1'); - console.log(dbContext); if (!dbContext?.sqliteClient) return; - console.log('loading credentials2'); try { const results = dbContext.sqliteClient.getAllCredentials(); setCredentials(results); @@ -26,9 +29,39 @@ const CredentialsList: React.FC = () => { } }, [dbContext.sqliteClient]); + /** + * Retrieve latest vault and refresh the page. + */ + const onRefresh = async () => { + showLoading(); + try { + // Make API call to get latest vault + const vaultResponseJson = await webApi.get('Vault') as VaultResponse; + + // Get derived key from background worker + const passwordHashBase64 = await chrome.runtime.sendMessage({ type: 'GET_DERIVED_KEY' }); + + // Attempt to decrypt the blob + const decryptedBlob = await EncryptionUtility.symmetricDecrypt( + vaultResponseJson.vault.blob, + passwordHashBase64 + ); + + // Initialize the SQLite context again with the newly retrieved decrypted blob + await dbContext.initializeDatabase(passwordHashBase64, decryptedBlob); + } catch (err) { + console.error('Refresh error:', err); + } finally { + hideLoading(); + } + }; + return (
-

Credentials

+
+

Credentials

+ +
{credentials.length === 0 ? (

No credentials found

) : ( diff --git a/browser-extensions/chrome/src/pages/EmailsList.tsx b/browser-extensions/chrome/src/pages/EmailsList.tsx index c25ac47e2..b85081e2a 100644 --- a/browser-extensions/chrome/src/pages/EmailsList.tsx +++ b/browser-extensions/chrome/src/pages/EmailsList.tsx @@ -7,6 +7,7 @@ import LoadingSpinner from '../components/LoadingSpinner'; import { useMinDurationLoading } from '../hooks/useMinDurationLoading'; import EncryptionUtility from '../utils/EncryptionUtility'; import { Buffer } from 'buffer'; +import ReloadButton from '../components/ReloadButton'; /** * Emails list page. */ @@ -142,7 +143,10 @@ const EmailsList: React.FC = () => { return (
-

Emails

+
+

Emails

+ +
{emails.map((email) => (