import { observer } from 'mobx-react-lite' import { FunctionComponent, useCallback, useRef, useState } from 'react' import Icon from '@/Components/Icon/Icon' import { KeyboardKey } from '@standardnotes/ui-services' import Popover from '../Popover/Popover' import { classNames, DecryptedItemInterface, VaultListingInterface } from '@standardnotes/snjs' import { useApplication } from '../ApplicationProvider' import MenuItem from '../Menu/MenuItem' import Menu from '../Menu/Menu' import { featureTrunkVaultsEnabled } from '@/FeatureTrunk' type Props = { iconClassName: string items: DecryptedItemInterface[] } const AddToVaultMenuOption: FunctionComponent = ({ iconClassName, items }) => { const application = useApplication() const menuContainerRef = useRef(null) const buttonRef = useRef(null) const vaults = application.vaults.getVaults() const [isSubMenuOpen, setIsSubMenuOpen] = useState(false) const toggleSubMenu = useCallback(() => { setIsSubMenuOpen((isOpen) => !isOpen) }, []) const addItemsToVault = useCallback( async (vault: VaultListingInterface) => { if (application.vaults.isVaultLocked(vault)) { const unlocked = await application.vaultDisplayService.unlockVault(vault) if (!unlocked) { return } } for (const item of items) { await application.vaults.moveItemToVault(vault, item) } }, [application.vaultDisplayService, application.vaults, items], ) const removeItemsFromVault = useCallback(async () => { for (const item of items) { const vault = application.vaults.getItemVault(item) if (!vault) { continue } if (application.vaults.isVaultLocked(vault)) { const unlocked = await application.vaultDisplayService.unlockVault(vault) if (!unlocked) { return } } await application.vaults.removeItemFromVault(item) } }, [application.vaultDisplayService, application.vaults, items]) const doesVaultContainItems = (vault: VaultListingInterface) => { return items.every((item) => item.key_system_identifier === vault.systemIdentifier) } const doSomeItemsBelongToVault = items.some((item) => application.vaults.isItemInVault(item)) const singleItemVault = items.length === 1 ? application.vaults.getItemVault(items[0]) : undefined if (!featureTrunkVaultsEnabled()) { return null } return (
{ if (event.key === KeyboardKey.Escape) { setIsSubMenuOpen(false) } }} ref={buttonRef} >
Move to vault
{doSomeItemsBelongToVault && ( { void removeItemsFromVault() }} >
Move out of {singleItemVault ? singleItemVault.name : 'vaults'}
)} {vaults.map((vault) => { if (singleItemVault) { return null } return ( { doesVaultContainItems(vault) ? void removeItemsFromVault() : void addItemsToVault(vault) }} >
{vault.name} {application.vaults.isVaultLocked(vault) && }
) })}
) } export default observer(AddToVaultMenuOption)