import { useState, useEffect } from 'react' import { DID, DDO, Metadata, Logger } from '@oceanprotocol/lib' import { useOcean } from '../../providers' import ProviderStatus from '../../providers/OceanProvider/ProviderStatus' import { getBestDataTokenPrice, getCheapestPool } from '../../utils/dtUtils' import Pool from './Pool' import { isDDO } from '../../utils' interface UseMetadata { ddo: DDO did: DID | string metadata: Metadata title: string price: string poolAddress: string isLoaded: boolean getPrice: (dataTokenAddress?: string) => Promise getPool: (dataTokenAddress?: string) => Promise } function useMetadata(asset?: DID | string | DDO): UseMetadata { const { ocean, status, config, accountId } = useOcean() const [internalDdo, setDDO] = useState() const [internalDid, setDID] = useState() const [metadata, setMetadata] = useState() const [title, setTitle] = useState() const [isLoaded, setIsLoaded] = useState(false) const [price, setPrice] = useState() const [poolAddress, setPoolAddress] = useState() async function getDDO(did: DID | string): Promise { if (status === ProviderStatus.CONNECTED) { const ddo = await ocean.metadatastore.retrieveDDO(did) return ddo } } async function getPrice(dataTokenAddress?: string): Promise { if (!dataTokenAddress) dataTokenAddress = internalDdo.dataToken return await getBestDataTokenPrice(ocean, accountId, dataTokenAddress) } async function getPool(dataTokenAddress?: string): Promise { if (!dataTokenAddress) dataTokenAddress = internalDdo.dataToken return await getCheapestPool(ocean, accountId, dataTokenAddress) } async function getMetadata(): Promise { if (!internalDdo) return const metadata = internalDdo.findServiceByType('metadata') return metadata.attributes } async function getTitle(): Promise { const metadata = await getMetadata() return metadata.main.name } useEffect(() => { async function init(): Promise { if (ocean && status === ProviderStatus.CONNECTED) { if (!asset) return if (isDDO(asset)) { setDDO(asset) setDID(asset.id) } else { const ddo = await getDDO(asset) Logger.debug('DDO', ddo) setDDO(ddo) setDID(asset) } } } init() }, [ocean, status]) useEffect(() => { if (!accountId) return async function init(): Promise { if (internalDdo) { const metadata = await getMetadata() setMetadata(metadata) setTitle(metadata.main.name) const pool = await getPool() setPoolAddress(pool.address) setPrice(pool.price) setIsLoaded(true) } } init() const interval = setInterval(async () => { const pool = await getPool() setPoolAddress(pool.address) setPrice(pool.price) }, 10000) return () => clearInterval(interval) }, [accountId, internalDdo]) return { ddo: internalDdo, did: internalDid, metadata, title, price, poolAddress, isLoaded, getPrice, getPool } } export { useMetadata, UseMetadata } export default useMetadata