mirror of
https://github.com/oceanprotocol/commons.git
synced 2023-03-15 18:03:00 +01:00
136 lines
4.0 KiB
TypeScript
136 lines
4.0 KiB
TypeScript
import React, { PureComponent } from 'react'
|
|
import { Logger, DDO, File } from '@oceanprotocol/squid'
|
|
import filesize from 'filesize'
|
|
import Button from '../../components/atoms/Button'
|
|
import Spinner from '../../components/atoms/Spinner'
|
|
import { User } from '../../context'
|
|
import styles from './AssetFile.module.scss'
|
|
import ReactGA from 'react-ga'
|
|
|
|
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...'
|
|
}
|
|
|
|
interface AssetFileProps {
|
|
file: File
|
|
ddo: DDO
|
|
}
|
|
|
|
interface AssetFileState {
|
|
isLoading: boolean
|
|
error: string
|
|
step: number | null
|
|
}
|
|
|
|
export default class AssetFile extends PureComponent<
|
|
AssetFileProps,
|
|
AssetFileState
|
|
> {
|
|
public state = {
|
|
isLoading: false,
|
|
error: '',
|
|
step: null
|
|
}
|
|
|
|
private resetState = () =>
|
|
this.setState({
|
|
isLoading: true,
|
|
error: '',
|
|
step: null
|
|
})
|
|
|
|
private purchaseAsset = async (ddo: DDO, index: number) => {
|
|
this.resetState()
|
|
|
|
ReactGA.event({
|
|
category: 'Purchase',
|
|
action: 'purchaseAsset-start ' + ddo.id
|
|
})
|
|
|
|
const { ocean } = this.context
|
|
|
|
try {
|
|
const accounts = await ocean.accounts.list()
|
|
const service = ddo.findServiceByType('Access')
|
|
|
|
const agreementId = await ocean.assets
|
|
.order(ddo.id, service.serviceDefinitionId, accounts[0])
|
|
.next((step: number) => this.setState({ step }))
|
|
|
|
// manually add another step here for better UX
|
|
this.setState({ step: 4 })
|
|
|
|
const path = await ocean.assets.consume(
|
|
agreementId,
|
|
ddo.id,
|
|
service.serviceDefinitionId,
|
|
accounts[0],
|
|
'',
|
|
index
|
|
)
|
|
Logger.log('path', path)
|
|
ReactGA.event({
|
|
category: 'Purchase',
|
|
action: 'purchaseAsset-end ' + ddo.id
|
|
})
|
|
this.setState({ isLoading: false })
|
|
} catch (error) {
|
|
Logger.log('error', error.message)
|
|
this.setState({ isLoading: false, error: error.message })
|
|
ReactGA.event({
|
|
category: 'Purchase',
|
|
action: 'purchaseAsset-error ' + error.message
|
|
})
|
|
}
|
|
}
|
|
|
|
public render() {
|
|
const { ddo, file } = this.props
|
|
const { isLoading, message, error, step } = this.state
|
|
const { isLogged, isOceanNetwork } = this.context
|
|
const { index } = file
|
|
|
|
return (
|
|
<div className={styles.fileWrap}>
|
|
<ul key={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>
|
|
|
|
{isLoading ? (
|
|
<Spinner
|
|
message={
|
|
step === null ? messages.start : messages[step]
|
|
}
|
|
/>
|
|
) : (
|
|
<Button
|
|
primary
|
|
className={styles.buttonMain}
|
|
// weird 0 hack so TypeScript is happy
|
|
onClick={() => this.purchaseAsset(ddo, index || 0)}
|
|
disabled={!isLogged || !isOceanNetwork}
|
|
>
|
|
Get file
|
|
</Button>
|
|
)}
|
|
|
|
{error !== '' && <div className={styles.error}>{error}</div>}
|
|
</div>
|
|
)
|
|
}
|
|
}
|
|
|
|
AssetFile.contextType = User
|