Refactor get metadata call (#771)

This commit is contained in:
Leendert de Borst
2025-04-16 22:09:49 +02:00
parent c0b0c97106
commit 39f8157683
3 changed files with 19 additions and 22 deletions

View File

@@ -118,9 +118,12 @@ function RootLayoutNav() {
}
// If the vault revision is higher, fetch the latest vault
const vaultMetadata = await dbContext.getVaultMetadata();
const vaultRevisionNumber = vaultMetadata?.vaultRevisionNumber ?? 0;
console.log('Vault revision:', statusResponse.vaultRevision);
console.log('Current vault revision:', dbContext.vaultRevision);
if (statusResponse.vaultRevision > dbContext.vaultRevision) {
console.log('Current vault revision:', vaultRevisionNumber);
if (statusResponse.vaultRevision > vaultRevisionNumber) {
const vaultResponseJson = await webApi.get<VaultResponse>('Vault');
const vaultError = webApi.validateVaultResponse(vaultResponseJson);

View File

@@ -10,7 +10,7 @@ type DbContextType = {
dbAvailable: boolean;
initializeDatabase: (vaultResponse: VaultResponse, derivedKey: string | null) => Promise<void>;
clearDatabase: () => void;
vaultMetadata: VaultMetadata | null;
getVaultMetadata: () => Promise<VaultMetadata | null>;
}
const DbContext = createContext<DbContextType | undefined>(undefined);
@@ -36,11 +36,6 @@ export const DbProvider: React.FC<{ children: React.ReactNode }> = ({ children }
*/
const [dbAvailable, setDbAvailable] = useState(false);
/**
* Vault metadata containing public/private email domains and revision number
*/
const [vaultMetadata, setVaultMetadata] = useState<VaultMetadata | null>(null);
const initializeDatabase = useCallback(async (vaultResponse: VaultResponse, derivedKey: string | null = null) => {
// If the derived key is provided, store it in the keychain.
// Otherwise we assume the encryption key is already stored in the keychain.
@@ -62,7 +57,6 @@ export const DbProvider: React.FC<{ children: React.ReactNode }> = ({ children }
setDbInitialized(true);
setDbAvailable(true);
setVaultMetadata(metadata);
}, []);
const checkStoredVault = useCallback(async () => {
@@ -74,22 +68,18 @@ export const DbProvider: React.FC<{ children: React.ReactNode }> = ({ children }
if (metadata) {
setDbInitialized(true);
setDbAvailable(true);
setVaultMetadata(metadata);
} else {
setDbInitialized(true);
setDbAvailable(false);
setVaultMetadata(null);
}
} else {
setDbInitialized(true);
setDbAvailable(false);
setVaultMetadata(null);
}
} catch (error) {
console.error('Error checking vault initialization:', error);
setDbInitialized(true);
setDbAvailable(false);
setVaultMetadata(null);
}
}, []);
@@ -107,19 +97,25 @@ export const DbProvider: React.FC<{ children: React.ReactNode }> = ({ children }
*/
const clearDatabase = useCallback(() : void => {
setDbInitialized(false);
setVaultMetadata(null);
// TODO: implement actual vault clearing.
credentialManager.clearVault();
}, []);
/**
* Get the current vault metadata directly from SQLite client
*/
const getVaultMetadata = useCallback(async () : Promise<VaultMetadata | null> => {
return await sqliteClient.getVaultMetadata();
}, []);
const contextValue = useMemo(() => ({
sqliteClient,
dbInitialized,
dbAvailable,
initializeDatabase,
clearDatabase,
vaultMetadata
}), [sqliteClient, dbInitialized, dbAvailable, initializeDatabase, clearDatabase, vaultMetadata]);
getVaultMetadata
}), [sqliteClient, dbInitialized, dbAvailable, initializeDatabase, clearDatabase, getVaultMetadata]);
return (
<DbContext.Provider value={contextValue}>

View File

@@ -1,7 +1,5 @@
export type VaultResponse = {
success: boolean, error?: string,
vault?: string,
publicEmailDomains?: string[],
privateEmailDomains?: string[],
vaultRevisionNumber?: number
export type VaultMetadata = {
publicEmailDomains: string[],
privateEmailDomains: string[],
vaultRevisionNumber: number
};