Files
standardnotes-app-web/packages/web/src/javascripts/Hooks/useVault.ts

59 lines
1.8 KiB
TypeScript

import { useApplication } from '@/Components/ApplicationProvider'
import {
KeySystemPasswordType,
KeySystemRootKeyStorageMode,
VaultListingInterface,
VaultLockServiceEvent,
} from '@standardnotes/snjs'
import { useState, useEffect, useCallback } from 'react'
export const useVault = (vault: VaultListingInterface) => {
const application = useApplication()
const canShowLockOption =
vault.keyPasswordType === KeySystemPasswordType.UserInputted &&
vault.keyStorageMode === KeySystemRootKeyStorageMode.Ephemeral
const [isLocked, setIsLocked] = useState(() => application.vaultLocks.isVaultLocked(vault))
useEffect(() => {
return application.vaultLocks.addEventObserver((event) => {
if (event === VaultLockServiceEvent.VaultLocked || event === VaultLockServiceEvent.VaultUnlocked) {
setIsLocked(application.vaultLocks.isVaultLocked(vault))
}
})
}, [application.vaultLocks, vault])
const toggleLock = useCallback(async () => {
if (!canShowLockOption) {
return
}
if (isLocked) {
application.vaultDisplayService.unlockVault(vault).catch(console.error)
} else {
application.vaultLocks.lockNonPersistentVault(vault).catch(console.error)
}
}, [application.vaultDisplayService, application.vaultLocks, canShowLockOption, isLocked, vault])
const isCurrentUserAdmin = !vault.isSharedVaultListing()
? true
: application.vaultUsers.isCurrentUserSharedVaultAdmin(vault)
const ensureVaultIsUnlocked = useCallback(async () => {
if (!application.vaultLocks.isVaultLocked(vault)) {
return true
}
const unlocked = await application.vaultDisplayService.unlockVault(vault)
return unlocked
}, [application, vault])
return {
canShowLockOption,
isLocked,
toggleLock,
ensureVaultIsUnlocked,
isCurrentUserAdmin,
}
}