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

131 lines
4.1 KiB
TypeScript
Raw Normal View History

2019-04-03 18:41:39 +02:00
import React, { PureComponent } from 'react'
import { Logger } from '@oceanprotocol/squid'
import filesize from 'filesize'
import Button from '../../components/atoms/Button'
import Spinner from '../../components/atoms/Spinner'
2019-04-06 17:55:24 +02:00
import { User } from '../../context/User'
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
interface AssetFileProps {
file: any
ddo: any
}
interface AssetFileState {
isLoading: boolean
error: string
message: string
}
export default class AssetFile extends PureComponent<
AssetFileProps,
AssetFileState
> {
public state = {
isLoading: false,
error: '',
message: 'Decrypting file, please sign...'
}
private resetState = () => this.setState({ isLoading: true, error: '' })
private purchaseAsset = async (ddo: any, index: number) => {
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-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')
const agreementId = await ocean.assets.order(
ddo.id,
service.serviceDefinitionId,
accounts[0]
)
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) {
Logger.log('error', error)
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
return (
<div className={styles.fileWrap}>
<ul key={file.index} className={styles.file}>
<li>
{file.contentType && file.contentType.split('/')[1]}
</li>
<li>
{file.contentLength && filesize(file.contentLength)}
</li>
{/* <li>{file.encoding}</li> */}
{/* <li>{file.compression}</li> */}
</ul>
{this.state.isLoading ? (
<Spinner message={this.state.message} />
) : (
2019-04-06 17:55:24 +02:00
<User.Consumer>
{states =>
states.isLogged ? (
<Button
primary
className={styles.buttonMain}
2019-04-08 10:44:03 +02:00
onClick={() =>
this.purchaseAsset(ddo, file.index)
}
2019-04-06 17:55:24 +02:00
>
Get file
</Button>
2019-04-08 10:44:03 +02:00
) : (
states.isWeb3 && (
<Button
primary
className={styles.buttonMain}
onClick={states.startLogin}
>
Get file
</Button>
)
2019-04-06 17:55:24 +02:00
)
}
</User.Consumer>
2019-04-03 18:41:39 +02:00
)}
{this.state.error !== '' && (
<div className={styles.error}>{this.state.error}</div>
)}
</div>
)
}
}
AssetFile.contextType = User