59 lines
1.8 KiB
TypeScript
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,
|
|
}
|
|
}
|