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

54 lines
1.8 KiB
TypeScript

import { useApplication } from '@/Components/ApplicationProvider'
import {
ContentType,
DecryptedItemInterface,
TrustedContactInterface,
VaultListingInterface,
} from '@standardnotes/snjs'
import { useCallback, useEffect, useLayoutEffect, useState } from 'react'
import { useStateRef } from './useStateRef'
type ItemVaultInfo = {
vault?: VaultListingInterface
lastEditedByContact?: TrustedContactInterface
sharedByContact?: TrustedContactInterface
}
export const useItemVaultInfo = (item: DecryptedItemInterface): ItemVaultInfo => {
const application = useApplication()
const [vault, setVault] = useState<VaultListingInterface>()
const vaultRef = useStateRef(vault)
const [lastEditedByContact, setLastEditedByContact] = useState<TrustedContactInterface>()
const [sharedByContact, setSharedByContact] = useState<TrustedContactInterface>()
const updateInfo = useCallback(() => {
if (!application.featuresController.isEntitledToVaults()) {
return
}
setVault(application.vaultDisplayService.getItemVault(item))
setLastEditedByContact((lastEditedBy) => application.sharedVaults.getItemLastEditedBy(item) || lastEditedBy)
setSharedByContact(application.sharedVaults.getItemSharedBy(item))
}, [application.featuresController, application.sharedVaults, application.vaultDisplayService, item])
useLayoutEffect(() => {
updateInfo()
}, [updateInfo])
useEffect(() => {
return application.items.streamItems(ContentType.TYPES.VaultListing, ({ changed, inserted }) => {
const matchingItem = changed.concat(inserted).find((vault) => vault.uuid === vaultRef.current?.uuid)
if (matchingItem) {
setVault(matchingItem as VaultListingInterface)
}
})
}, [application.items, vaultRef])
return {
vault,
lastEditedByContact,
sharedByContact,
}
}