diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/Vaults/Vaults.tsx b/packages/web/src/javascripts/Components/Preferences/Panes/Vaults/Vaults.tsx
index c95cf73c9..fdae8c89d 100644
--- a/packages/web/src/javascripts/Components/Preferences/Panes/Vaults/Vaults.tsx
+++ b/packages/web/src/javascripts/Components/Preferences/Panes/Vaults/Vaults.tsx
@@ -23,7 +23,6 @@ import EditVaultModal from './Vaults/VaultModal/EditVaultModal'
import PreferencesPane from '../../PreferencesComponents/PreferencesPane'
import { ToastType, addToast } from '@standardnotes/toast'
import NoProSubscription from '../Account/NoProSubscription'
-import HorizontalSeparator from '@/Components/Shared/HorizontalSeparator'
const Vaults = () => {
const application = useApplication()
@@ -170,13 +169,11 @@ const Vaults = () => {
) : (
-
-
+
Please upgrade in order to increase your shared vault limit.}
/>
-
)}
diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/Vaults/Vaults/VaultItem.tsx b/packages/web/src/javascripts/Components/Preferences/Panes/Vaults/Vaults/VaultItem.tsx
index 170a86f13..c1da81414 100644
--- a/packages/web/src/javascripts/Components/Preferences/Panes/Vaults/Vaults/VaultItem.tsx
+++ b/packages/web/src/javascripts/Components/Preferences/Panes/Vaults/Vaults/VaultItem.tsx
@@ -1,6 +1,6 @@
import { formatSizeToReadableString } from '@standardnotes/filepicker'
-import { ButtonType, VaultListingInterface, isClientDisplayableError } from '@standardnotes/snjs'
-import { useCallback, useState } from 'react'
+import { ButtonType, VaultListingInterface, VaultLockServiceEvent, isClientDisplayableError } from '@standardnotes/snjs'
+import { useCallback, useEffect, useState } from 'react'
import { useApplication } from '@/Components/ApplicationProvider'
import Button from '@/Components/Button/Button'
@@ -21,6 +21,28 @@ const VaultItem = ({ vault }: Props) => {
const [isVaultModalOpen, setIsVaultModalOpen] = useState(false)
const closeVaultModal = () => setIsVaultModalOpen(false)
+ const isVaultLockable = application.vaultLocks.isVaultLockable(vault)
+ const [isVaultLocked, setIsVaultLocked] = useState(() => application.vaultLocks.isVaultLocked(vault))
+ useEffect(() => {
+ return application.vaultLocks.addEventObserver((event) => {
+ if (event === VaultLockServiceEvent.VaultLocked || event === VaultLockServiceEvent.VaultUnlocked) {
+ setIsVaultLocked(application.vaultLocks.isVaultLocked(vault))
+ }
+ })
+ }, [application.vaultLocks, vault])
+
+ const toggleLock = useCallback(async () => {
+ if (!isVaultLockable) {
+ return
+ }
+
+ if (isVaultLocked) {
+ application.vaultDisplayService.unlockVault(vault).catch(console.error)
+ } else {
+ application.vaultLocks.lockNonPersistentVault(vault).catch(console.error)
+ }
+ }, [application.vaultDisplayService, application.vaultLocks, isVaultLockable, isVaultLocked, vault])
+
const isAdmin = !vault.isSharedVaultListing() ? true : application.vaultUsers.isCurrentUserSharedVaultAdmin(vault)
const deleteVault = useCallback(async () => {
@@ -129,19 +151,22 @@ const VaultItem = ({ vault }: Props) => {
File storage used: {formatSizeToReadableString(vault.sharing?.fileBytesUsed ?? 0)}
-
-
- {isAdmin &&
}
+
+
+ {isVaultLockable && (
+
+ )}
+ {isAdmin && }
{!isAdmin && vault.isSharedVaultListing() && (
-
+
)}
{vault.isSharedVaultListing() ? (
-
+
) : (
)}