commons/client/src/routes/Details/AssetFile.tsx

136 lines
4.0 KiB
TypeScript
Raw Normal View History

2019-04-03 18:41:39 +02:00
import React, { PureComponent } from 'react'
2019-04-30 19:19:28 +02:00
import { Logger, DDO, File } from '@oceanprotocol/squid'
2019-04-03 18:41:39 +02:00
import filesize from 'filesize'
import Button from '../../components/atoms/Button'
import Spinner from '../../components/atoms/Spinner'
import { User } from '../../context'
2019-04-03 18:41:39 +02:00
import styles from './AssetFile.module.scss'
2019-04-08 11:35:10 +02:00
import ReactGA from 'react-ga'
2019-04-03 18:41:39 +02:00
2019-05-10 13:03:19 +02:00
export const messages = {
start: 'Decrypting file URL...',
0: '1/3<br />Asking for agreement signature...',
1: '1/3<br />Agreement initialized.',
2: '2/3<br />Asking for two payment confirmations...',
3: '2/3<br />Payment confirmed. Requesting access...',
4: '3/3<br /> Access granted. Consuming file...'
}
2019-04-03 18:41:39 +02:00
interface AssetFileProps {
2019-04-30 19:19:28 +02:00
file: File
ddo: DDO
2019-04-03 18:41:39 +02:00
}
interface AssetFileState {
isLoading: boolean
error: string
2019-04-25 14:28:50 +02:00
step: number | null
2019-04-03 18:41:39 +02:00
}
export default class AssetFile extends PureComponent<
AssetFileProps,
AssetFileState
> {
public state = {
isLoading: false,
error: '',
2019-04-25 14:28:50 +02:00
step: null
2019-04-03 18:41:39 +02:00
}
2019-04-25 11:37:15 +02:00
private resetState = () =>
2019-05-06 13:07:38 +02:00
this.setState({
isLoading: true,
error: '',
step: null
})
2019-04-03 18:41:39 +02:00
2019-04-30 19:19:28 +02:00
private purchaseAsset = async (ddo: DDO, index: number) => {
2019-04-03 18:41:39 +02:00
this.resetState()
2019-04-08 11:35:10 +02:00
ReactGA.event({
category: 'Purchase',
action: 'purchaseAsset-start ' + ddo.id
})
2019-04-03 18:41:39 +02:00
2019-04-08 11:35:10 +02:00
const { ocean } = this.context
2019-04-08 19:46:53 +02:00
2019-04-03 18:41:39 +02:00
try {
2019-04-08 11:35:10 +02:00
const accounts = await ocean.accounts.list()
2019-04-03 18:41:39 +02:00
const service = ddo.findServiceByType('Access')
2019-04-25 11:37:15 +02:00
const agreementId = await ocean.assets
.order(ddo.id, service.serviceDefinitionId, accounts[0])
.next((step: number) => this.setState({ step }))
2019-04-03 18:41:39 +02:00
2019-05-10 11:51:36 +02:00
// manually add another step here for better UX
this.setState({ step: 4 })
2019-04-25 14:28:50 +02:00
2019-04-03 18:41:39 +02:00
const path = await ocean.assets.consume(
agreementId,
ddo.id,
service.serviceDefinitionId,
accounts[0],
'',
index
)
Logger.log('path', path)
2019-04-08 11:35:10 +02:00
ReactGA.event({
category: 'Purchase',
action: 'purchaseAsset-end ' + ddo.id
})
2019-04-03 18:41:39 +02:00
this.setState({ isLoading: false })
} catch (error) {
2019-05-10 13:03:19 +02:00
Logger.log('error', error.message)
2019-04-03 18:41:39 +02:00
this.setState({ isLoading: false, error: error.message })
2019-04-08 11:35:10 +02:00
ReactGA.event({
category: 'Purchase',
2019-04-08 11:41:06 +02:00
action: 'purchaseAsset-error ' + error.message
2019-04-08 11:35:10 +02:00
})
2019-04-03 18:41:39 +02:00
}
}
public render() {
const { ddo, file } = this.props
2019-04-25 11:37:15 +02:00
const { isLoading, message, error, step } = this.state
2019-05-14 12:52:41 +02:00
const { isLogged, isOceanNetwork } = this.context
2019-04-30 19:19:28 +02:00
const { index } = file
2019-04-03 18:41:39 +02:00
return (
<div className={styles.fileWrap}>
<ul key={index} className={styles.file}>
2019-04-03 18:41:39 +02:00
<li>
{file.contentType && file.contentType.split('/')[1]}
</li>
<li>
{file.contentLength && filesize(file.contentLength)}
</li>
{/* <li>{file.encoding}</li> */}
{/* <li>{file.compression}</li> */}
</ul>
2019-04-08 19:46:53 +02:00
{isLoading ? (
2019-05-10 13:03:19 +02:00
<Spinner
message={
step === null ? messages.start : messages[step]
}
/>
2019-04-03 18:41:39 +02:00
) : (
2019-04-08 19:46:53 +02:00
<Button
primary
className={styles.buttonMain}
2019-05-10 13:03:19 +02:00
// weird 0 hack so TypeScript is happy
onClick={() => this.purchaseAsset(ddo, index || 0)}
2019-05-14 12:52:41 +02:00
disabled={!isLogged || !isOceanNetwork}
2019-04-08 19:46:53 +02:00
>
Get file
</Button>
2019-04-03 18:41:39 +02:00
)}
2019-04-08 19:46:53 +02:00
{error !== '' && <div className={styles.error}>{error}</div>}
2019-04-03 18:41:39 +02:00
</div>
)
}
}
AssetFile.contextType = User