2020-08-11 08:20:40 +02:00
|
|
|
import React, { ReactElement, useState, useEffect } from 'react'
|
2021-06-10 11:06:26 +02:00
|
|
|
import Permission from '../Permission'
|
2020-07-08 17:57:53 +02:00
|
|
|
import styles from './index.module.css'
|
|
|
|
import Compute from './Compute'
|
|
|
|
import Consume from './Consume'
|
2021-06-10 10:39:24 +02:00
|
|
|
import { Logger, File as FileMetadata, DID } from '@oceanprotocol/lib'
|
2020-07-23 12:26:08 +02:00
|
|
|
import Tabs from '../../atoms/Tabs'
|
2020-08-11 09:30:17 +02:00
|
|
|
import compareAsBN from '../../../utils/compareAsBN'
|
2020-08-18 17:14:54 +02:00
|
|
|
import Pool from './Pool'
|
2020-11-16 16:21:15 +01:00
|
|
|
import Trade from './Trade'
|
2020-11-20 14:31:28 +01:00
|
|
|
import { useAsset } from '../../../providers/Asset'
|
2021-03-17 11:44:26 +01:00
|
|
|
import { useOcean } from '../../../providers/Ocean'
|
|
|
|
import { useWeb3 } from '../../../providers/Web3'
|
2021-05-27 13:58:52 +02:00
|
|
|
import Web3Feedback from '../../molecules/Web3Feedback'
|
2021-07-12 15:56:23 +02:00
|
|
|
import { getFileInfo } from '../../../utils/provider'
|
2021-06-10 10:39:24 +02:00
|
|
|
import axios from 'axios'
|
2020-07-08 17:57:53 +02:00
|
|
|
|
2020-12-10 14:30:40 +01:00
|
|
|
export default function AssetActions(): ReactElement {
|
2021-06-11 11:23:24 +02:00
|
|
|
const { accountId, balance } = useWeb3()
|
|
|
|
const { ocean, config, account } = useOcean()
|
2021-07-22 11:40:44 +02:00
|
|
|
const { price, ddo, isAssetNetwork } = useAsset()
|
2021-01-21 16:02:48 +01:00
|
|
|
|
2020-10-29 21:34:53 +01:00
|
|
|
const [isBalanceSufficient, setIsBalanceSufficient] = useState<boolean>()
|
2020-10-19 11:33:06 +02:00
|
|
|
const [dtBalance, setDtBalance] = useState<string>()
|
2021-06-10 10:39:24 +02:00
|
|
|
const [fileMetadata, setFileMetadata] = useState<FileMetadata>(Object)
|
|
|
|
const [fileIsLoading, setFileIsLoading] = useState<boolean>(false)
|
2020-12-10 14:30:40 +01:00
|
|
|
const isCompute = Boolean(ddo?.findServiceByType('compute'))
|
2020-08-07 18:12:39 +02:00
|
|
|
|
2021-07-06 08:51:37 +02:00
|
|
|
const [isConsumable, setIsConsumable] = useState<boolean>(true)
|
|
|
|
const [consumableFeedback, setConsumableFeedback] = useState<string>('')
|
|
|
|
|
|
|
|
useEffect(() => {
|
2021-08-16 12:02:01 +02:00
|
|
|
if (!ddo || !accountId || !ocean || !isAssetNetwork) return
|
|
|
|
|
2021-07-06 08:51:37 +02:00
|
|
|
async function checkIsConsumable() {
|
2021-08-16 12:02:01 +02:00
|
|
|
const consumable = await ocean.assets.isConsumable(
|
2021-07-06 08:51:37 +02:00
|
|
|
ddo,
|
|
|
|
accountId.toLowerCase()
|
|
|
|
)
|
|
|
|
if (consumable) {
|
|
|
|
setIsConsumable(consumable.result)
|
|
|
|
setConsumableFeedback(consumable.message)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
checkIsConsumable()
|
2021-08-16 12:02:01 +02:00
|
|
|
}, [accountId, isAssetNetwork, ddo, ocean])
|
2021-07-06 08:51:37 +02:00
|
|
|
|
2021-06-10 10:39:24 +02:00
|
|
|
useEffect(() => {
|
2021-07-12 15:56:23 +02:00
|
|
|
if (!config) return
|
2021-08-16 12:02:01 +02:00
|
|
|
|
2021-07-12 15:56:23 +02:00
|
|
|
const source = axios.CancelToken.source()
|
2021-08-16 12:02:01 +02:00
|
|
|
|
2021-07-12 15:56:23 +02:00
|
|
|
async function initFileInfo() {
|
|
|
|
setFileIsLoading(true)
|
|
|
|
try {
|
|
|
|
const fileInfo = await getFileInfo(
|
|
|
|
DID.parse(`${ddo.id}`),
|
|
|
|
config.providerUri,
|
|
|
|
source.token
|
|
|
|
)
|
|
|
|
|
|
|
|
setFileMetadata(fileInfo.data[0])
|
|
|
|
} catch (error) {
|
|
|
|
Logger.error(error.message)
|
|
|
|
} finally {
|
2021-08-16 12:02:01 +02:00
|
|
|
// this triggers a memory leak warning, no idea how to fix
|
2021-07-12 15:56:23 +02:00
|
|
|
setFileIsLoading(false)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
initFileInfo()
|
2021-08-16 12:02:01 +02:00
|
|
|
|
2021-07-12 15:56:23 +02:00
|
|
|
return () => {
|
|
|
|
source.cancel()
|
|
|
|
}
|
|
|
|
}, [config, ddo])
|
2021-06-10 10:39:24 +02:00
|
|
|
|
2020-10-19 11:33:06 +02:00
|
|
|
// Get and set user DT balance
|
|
|
|
useEffect(() => {
|
|
|
|
if (!ocean || !accountId) return
|
2021-01-21 16:02:48 +01:00
|
|
|
|
2020-10-19 11:33:06 +02:00
|
|
|
async function init() {
|
|
|
|
try {
|
|
|
|
const dtBalance = await ocean.datatokens.balance(
|
|
|
|
ddo.dataToken,
|
|
|
|
accountId
|
|
|
|
)
|
|
|
|
setDtBalance(dtBalance)
|
|
|
|
} catch (e) {
|
|
|
|
Logger.error(e.message)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
init()
|
2021-07-22 11:40:44 +02:00
|
|
|
}, [ocean, accountId, ddo.dataToken, isAssetNetwork])
|
2020-10-19 11:33:06 +02:00
|
|
|
|
2020-08-11 08:20:40 +02:00
|
|
|
// Check user balance against price
|
2020-10-29 21:34:53 +01:00
|
|
|
useEffect(() => {
|
2021-06-16 03:32:11 +02:00
|
|
|
if (price?.type === 'free') setIsBalanceSufficient(true)
|
2021-03-17 11:44:26 +01:00
|
|
|
if (!price?.value || !account || !balance?.ocean || !dtBalance) return
|
2020-08-11 08:20:40 +02:00
|
|
|
|
2020-10-29 21:34:53 +01:00
|
|
|
setIsBalanceSufficient(
|
|
|
|
compareAsBN(balance.ocean, `${price.value}`) || Number(dtBalance) >= 1
|
|
|
|
)
|
2020-08-11 08:20:40 +02:00
|
|
|
|
2020-10-29 21:34:53 +01:00
|
|
|
return () => {
|
|
|
|
setIsBalanceSufficient(false)
|
|
|
|
}
|
2021-03-17 11:44:26 +01:00
|
|
|
}, [balance, account, price, dtBalance])
|
2020-08-11 08:20:40 +02:00
|
|
|
|
2020-07-23 12:26:08 +02:00
|
|
|
const UseContent = isCompute ? (
|
2020-10-19 11:33:06 +02:00
|
|
|
<Compute
|
|
|
|
dtBalance={dtBalance}
|
|
|
|
isBalanceSufficient={isBalanceSufficient}
|
2021-06-10 10:39:24 +02:00
|
|
|
file={fileMetadata}
|
|
|
|
fileIsLoading={fileIsLoading}
|
2021-07-06 08:51:37 +02:00
|
|
|
isConsumable={isConsumable}
|
|
|
|
consumableFeedback={consumableFeedback}
|
2020-10-19 11:33:06 +02:00
|
|
|
/>
|
2020-07-23 12:26:08 +02:00
|
|
|
) : (
|
2020-08-11 08:20:40 +02:00
|
|
|
<Consume
|
|
|
|
ddo={ddo}
|
2020-10-19 11:33:06 +02:00
|
|
|
dtBalance={dtBalance}
|
2020-08-11 08:20:40 +02:00
|
|
|
isBalanceSufficient={isBalanceSufficient}
|
2021-06-10 10:39:24 +02:00
|
|
|
file={fileMetadata}
|
|
|
|
fileIsLoading={fileIsLoading}
|
2021-07-06 08:51:37 +02:00
|
|
|
isConsumable={isConsumable}
|
|
|
|
consumableFeedback={consumableFeedback}
|
2020-08-11 08:20:40 +02:00
|
|
|
/>
|
2020-07-08 17:57:53 +02:00
|
|
|
)
|
2020-07-23 12:26:08 +02:00
|
|
|
|
|
|
|
const tabs = [
|
|
|
|
{
|
|
|
|
title: 'Use',
|
|
|
|
content: UseContent
|
|
|
|
}
|
|
|
|
]
|
|
|
|
|
2021-05-11 10:33:05 +02:00
|
|
|
price?.type === 'pool' &&
|
2020-11-16 16:21:15 +01:00
|
|
|
tabs.push(
|
|
|
|
{
|
|
|
|
title: 'Pool',
|
2020-12-10 14:30:40 +01:00
|
|
|
content: <Pool />
|
2020-11-16 16:21:15 +01:00
|
|
|
},
|
|
|
|
{
|
|
|
|
title: 'Trade',
|
2020-12-10 14:30:40 +01:00
|
|
|
content: <Trade />
|
2020-11-16 16:21:15 +01:00
|
|
|
}
|
|
|
|
)
|
2020-09-23 13:55:53 +02:00
|
|
|
|
2021-05-27 13:58:52 +02:00
|
|
|
return (
|
|
|
|
<>
|
2021-06-11 11:11:45 +02:00
|
|
|
<Permission eventType="consume">
|
|
|
|
<Tabs items={tabs} className={styles.actions} />
|
|
|
|
</Permission>
|
2021-07-15 17:03:03 +02:00
|
|
|
<Web3Feedback
|
|
|
|
isBalanceSufficient={isBalanceSufficient}
|
|
|
|
isAssetNetwork={isAssetNetwork}
|
|
|
|
/>
|
2021-05-27 13:58:52 +02:00
|
|
|
</>
|
|
|
|
)
|
2020-07-08 17:57:53 +02:00
|
|
|
}
|