1
0
mirror of https://github.com/oceanprotocol/market.git synced 2024-06-30 05:41:41 +02:00
market/src/components/organisms/JobsList.tsx

145 lines
3.6 KiB
TypeScript
Raw Normal View History

2020-07-13 23:45:20 +02:00
import React, { useState, ReactElement } from 'react'
2020-05-25 14:53:38 +02:00
import Loader from '../atoms/Loader'
import {
useOcean,
OceanConnectionStatus,
useSearch,
ComputeItem
} from '@oceanprotocol/react'
2020-06-02 11:15:21 +02:00
2020-05-25 14:53:38 +02:00
import Price from '../atoms/Price'
import { fromWei } from 'web3-utils'
import Table from '../atoms/Table'
import Button from '../atoms/Button'
2020-07-16 13:39:02 +02:00
import { MetadataMain, Logger } from '@oceanprotocol/lib'
2020-05-25 14:53:38 +02:00
import DateCell from '../atoms/Table/DateCell'
import DdoLinkCell from '../atoms/Table/DdoLinkCell'
2020-05-27 16:20:31 +02:00
import shortid from 'shortid'
2020-06-02 11:15:21 +02:00
import ActionsCell from '../atoms/Table/ActionsCell'
import JobDetailsDialog from '../molecules/JobDetailsDialog'
2020-05-25 14:53:38 +02:00
const columns = [
{
name: 'Created',
selector: 'dateCreated',
sortable: true,
cell: function getCell(row: any) {
return <DateCell date={row.dateCreated} />
}
},
{
name: 'Finished',
selector: 'dateFinished',
sortable: true,
cell: function getCell(row: any) {
return <DateCell date={row.dateFinished} />
}
},
{
name: 'Name',
selector: 'name',
sortable: true,
cell: function getCell(row: any) {
return <DdoLinkCell id={row.id} name={row.name} />
}
},
{
name: 'Price',
selector: 'price',
sortable: true,
cell: function getCell(row: any) {
return <Price price={fromWei(row.price)} small />
}
},
{
name: 'Status',
selector: 'status'
},
{
name: 'Actions',
2020-06-02 11:15:21 +02:00
selector: 'actions',
cell: function getCell(row: any) {
return (
<ActionsCell handleOnClickViewJobDetails={row.onClickViewJobDetails} />
)
}
2020-05-25 14:53:38 +02:00
}
]
2020-07-09 13:42:06 +02:00
export default function JobsList(): ReactElement {
2020-06-02 11:15:21 +02:00
const { ocean, status, accountId } = useOcean()
2020-05-25 14:53:38 +02:00
const [jobList, setJobList] = useState<any[]>([])
const [isLoading, setIsLoading] = useState(false)
const [userAgreed, setUserAgreed] = useState(false)
const { getComputeItems } = useSearch()
2020-06-02 11:15:21 +02:00
const [isOpen, setIsOpen] = useState(false)
const [detailsComputeItem, setDetailsComputeItem] = useState<ComputeItem>()
const onClickViewJobDetails = (compute: ComputeItem) => {
setDetailsComputeItem(compute)
setIsOpen(true)
}
const dialogClose = () => {
setIsOpen(false)
}
2020-05-25 14:53:38 +02:00
const getJobs = async () => {
2020-05-27 16:23:14 +02:00
if (!accountId || !ocean || status !== OceanConnectionStatus.CONNECTED)
return
2020-05-25 14:53:38 +02:00
setIsLoading(true)
setUserAgreed(true)
try {
2020-06-02 11:15:21 +02:00
const computeItems = await getComputeItems()
2020-05-26 15:42:45 +02:00
if (!computeItems) return
const data = computeItems.map((item) => {
const { attributes } = item.ddo.findServiceByType('metadata')
2020-07-16 13:39:02 +02:00
const { name, price } = attributes.main as MetadataMain
2020-05-25 14:53:38 +02:00
return {
dateCreated: item.job.dateCreated,
dateFinished: item.job.dateFinished,
status: item.job.statusText,
name: name,
price: price,
2020-05-27 16:20:31 +02:00
did: item.ddo.id,
2020-06-02 11:15:21 +02:00
id: shortid.generate(),
onClickViewJobDetails: () => onClickViewJobDetails(item)
2020-05-25 14:53:38 +02:00
}
})
setJobList(data)
setIsLoading(false)
} catch (err) {
2020-05-27 16:20:31 +02:00
Logger.error(err)
2020-05-25 14:53:38 +02:00
// TODO: no error handling
} finally {
setIsLoading(false)
}
}
return isLoading ? (
<Loader />
2020-05-27 16:20:31 +02:00
) : accountId && ocean ? (
2020-05-25 14:53:38 +02:00
userAgreed ? (
2020-06-02 11:15:21 +02:00
<>
<JobDetailsDialog
computeItem={detailsComputeItem}
isOpen={isOpen}
onClose={dialogClose}
/>
<Table data={jobList} columns={columns} />
</>
2020-05-25 14:53:38 +02:00
) : (
2020-05-27 16:23:14 +02:00
<>
<div>
<Button style="primary" onClick={getJobs}>
2020-05-27 16:23:14 +02:00
Sign to retrieve jobs
2020-05-25 14:53:38 +02:00
</Button>
2020-05-27 16:23:14 +02:00
</div>
</>
)
2020-05-25 14:53:38 +02:00
) : (
2020-05-27 16:23:14 +02:00
<div>Connect your wallet to see your compute jobs.</div>
)
2020-05-25 14:53:38 +02:00
}