react/src/hooks/useConsume/useConsume.ts

80 lines
2.3 KiB
TypeScript
Raw Normal View History

2020-04-27 10:34:22 +02:00
import { useState } from 'react'
import { useOcean } from '../../providers'
2020-05-08 13:11:30 +02:00
import { feedback } from '../../utils'
2020-07-09 14:33:22 +02:00
import { DID } from '@oceanprotocol/lib'
import { ServiceType } from '@oceanprotocol/lib/dist/node/ddo/interfaces/Service'
2020-04-25 02:27:45 +02:00
2020-04-27 10:34:22 +02:00
interface UseConsume {
2020-07-09 14:33:22 +02:00
consume: (did: DID | string, serviceType: ServiceType) => Promise<void>
2020-04-27 10:34:22 +02:00
consumeStep?: number
2020-05-08 13:11:30 +02:00
consumeStepText?: string
2020-04-27 10:34:22 +02:00
consumeError?: string
2020-05-11 13:47:21 +02:00
isLoading: boolean
2020-04-27 10:34:22 +02:00
}
2020-04-25 02:27:45 +02:00
2020-04-27 14:58:37 +02:00
// TODO: do something with this object,
// consumeStep should probably return one of those strings
// instead of just a number
2020-05-08 13:11:30 +02:00
export const consumeFeedback: { [key in number]: string } = {
...feedback,
2020-07-09 14:33:22 +02:00
3: '3/3 Access granted. Consuming file...'
2020-04-27 10:34:22 +02:00
}
function useConsume(): UseConsume {
const { ocean, account, accountId } = useOcean()
2020-05-11 13:47:21 +02:00
const [isLoading, setIsLoading] = useState(false)
2020-04-27 10:34:22 +02:00
const [consumeStep, setConsumeStep] = useState<number | undefined>()
2020-05-08 13:11:30 +02:00
const [consumeStepText, setConsumeStepText] = useState<string | undefined>()
2020-04-27 10:34:22 +02:00
const [consumeError, setConsumeError] = useState<string | undefined>()
2020-07-09 14:33:22 +02:00
async function consume(did: string, serviceType: ServiceType): Promise<void> {
2020-04-27 10:34:22 +02:00
if (!ocean || !account) return
2020-05-11 13:47:21 +02:00
setIsLoading(true)
2020-04-27 10:34:22 +02:00
setConsumeError(undefined)
try {
2020-07-09 14:33:22 +02:00
setConsumeStep(0)
setConsumeStepText(consumeFeedback[0])
const ddo = await ocean.metadatastore.retrieveDDO(did)
setConsumeStep(1)
setConsumeStepText(consumeFeedback[1])
const order = await ocean.assets
.order(did, serviceType, accountId)
setConsumeStep(2)
setConsumeStepText(consumeFeedback[2])
const res = JSON.parse(order)
const tokenTransfer = await ocean.datatokens.transfer(
res['dataToken'],
res['to'],
res['numTokens'],
res['from']
)
setConsumeStep(3)
setConsumeStepText(consumeFeedback[3])
await ocean.assets.download(
did,
(tokenTransfer as any).transactionHash,
ddo.dataToken,
account,
''
2020-04-27 10:34:22 +02:00
)
2020-05-11 13:47:21 +02:00
2020-04-27 10:34:22 +02:00
setConsumeStep(4)
2020-05-08 13:11:30 +02:00
setConsumeStepText(consumeFeedback[4])
2020-07-09 14:33:22 +02:00
2020-04-27 10:34:22 +02:00
} catch (error) {
setConsumeError(error.message)
} finally {
setConsumeStep(undefined)
2020-05-11 13:47:21 +02:00
setIsLoading(false)
2020-04-27 10:34:22 +02:00
}
}
2020-05-11 13:47:21 +02:00
return { consume, consumeStep, consumeStepText, consumeError, isLoading }
2020-04-27 10:34:22 +02:00
}
export { useConsume, UseConsume }
2020-04-25 02:27:45 +02:00
export default useConsume