mirror of
https://github.com/oceanprotocol/market.git
synced 2024-12-02 05:57:29 +01:00
Merge pull request #1786 from oceanprotocol/issue-1775-edit-paymentCollector
Allowing publisher to edit payment collector
This commit is contained in:
commit
8d17c30f41
@ -66,6 +66,13 @@
|
|||||||
"type": "tags",
|
"type": "tags",
|
||||||
"placeholder": "e.g. logistics",
|
"placeholder": "e.g. logistics",
|
||||||
"required": false
|
"required": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "paymentCollector",
|
||||||
|
"label": "Payment Collector Address",
|
||||||
|
"placeholder": "e.g. 0X123ABC...",
|
||||||
|
"help": "This address will receive the revenue from all sales. More info available in our [docs](https://docs.oceanprotocol.com/core-concepts/datanft-and-datatoken#revenue).",
|
||||||
|
"required": false
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,29 @@
|
|||||||
import React, { ReactElement } from 'react'
|
import React, { ReactElement, useState, useEffect } from 'react'
|
||||||
import MetaItem from './MetaItem'
|
import MetaItem from './MetaItem'
|
||||||
import styles from './MetaFull.module.css'
|
import styles from './MetaFull.module.css'
|
||||||
import Publisher from '@shared/Publisher'
|
import Publisher from '@shared/Publisher'
|
||||||
import { useAsset } from '@context/Asset'
|
import { useAsset } from '@context/Asset'
|
||||||
import { Asset } from '@oceanprotocol/lib'
|
import { useWeb3 } from '@context/Web3'
|
||||||
|
import { Asset, Datatoken, LoggerInstance } from '@oceanprotocol/lib'
|
||||||
|
|
||||||
export default function MetaFull({ ddo }: { ddo: Asset }): ReactElement {
|
export default function MetaFull({ ddo }: { ddo: Asset }): ReactElement {
|
||||||
|
const [paymentCollector, setPaymentCollector] = useState<string>()
|
||||||
const { isInPurgatory } = useAsset()
|
const { isInPurgatory } = useAsset()
|
||||||
|
const { web3 } = useWeb3()
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
async function getInitialPaymentCollector() {
|
||||||
|
try {
|
||||||
|
const datatoken = new Datatoken(web3)
|
||||||
|
setPaymentCollector(
|
||||||
|
await datatoken.getPaymentCollector(ddo.datatokens[0].address)
|
||||||
|
)
|
||||||
|
} catch (error) {
|
||||||
|
LoggerInstance.error('[MetaFull: getInitialPaymentCollector]', error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getInitialPaymentCollector()
|
||||||
|
}, [ddo, web3])
|
||||||
|
|
||||||
function DockerImage() {
|
function DockerImage() {
|
||||||
const containerInfo = ddo?.metadata?.algorithm?.container
|
const containerInfo = ddo?.metadata?.algorithm?.container
|
||||||
@ -23,6 +40,12 @@ export default function MetaFull({ ddo }: { ddo: Asset }): ReactElement {
|
|||||||
title="Owner"
|
title="Owner"
|
||||||
content={<Publisher account={ddo?.nft?.owner} />}
|
content={<Publisher account={ddo?.nft?.owner} />}
|
||||||
/>
|
/>
|
||||||
|
{paymentCollector && paymentCollector !== ddo?.nft?.owner && (
|
||||||
|
<MetaItem
|
||||||
|
title="Revenue Sent To"
|
||||||
|
content={<Publisher account={paymentCollector} />}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
|
||||||
{ddo?.metadata?.type === 'algorithm' && ddo?.metadata?.algorithm && (
|
{ddo?.metadata?.type === 'algorithm' && ddo?.metadata?.algorithm && (
|
||||||
<MetaItem title="Docker Image" content={<DockerImage />} />
|
<MetaItem title="Docker Image" content={<DockerImage />} />
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
import React, { ReactElement, useState } from 'react'
|
import React, { ReactElement, useState, useEffect } from 'react'
|
||||||
import { Formik } from 'formik'
|
import { Formik } from 'formik'
|
||||||
import {
|
import {
|
||||||
LoggerInstance,
|
LoggerInstance,
|
||||||
Metadata,
|
Metadata,
|
||||||
FixedRateExchange,
|
FixedRateExchange,
|
||||||
Asset,
|
Asset,
|
||||||
Service
|
Service,
|
||||||
|
Datatoken
|
||||||
} from '@oceanprotocol/lib'
|
} from '@oceanprotocol/lib'
|
||||||
import { validationSchema } from './_validation'
|
import { validationSchema } from './_validation'
|
||||||
import { getInitialValues } from './_constants'
|
import { getInitialValues } from './_constants'
|
||||||
@ -36,10 +37,28 @@ export default function Edit({
|
|||||||
const { accountId, web3 } = useWeb3()
|
const { accountId, web3 } = useWeb3()
|
||||||
const newAbortController = useAbortController()
|
const newAbortController = useAbortController()
|
||||||
const [success, setSuccess] = useState<string>()
|
const [success, setSuccess] = useState<string>()
|
||||||
|
const [paymentCollector, setPaymentCollector] = useState<string>()
|
||||||
const [error, setError] = useState<string>()
|
const [error, setError] = useState<string>()
|
||||||
const isComputeType = asset?.services[0]?.type === 'compute'
|
const isComputeType = asset?.services[0]?.type === 'compute'
|
||||||
const hasFeedback = error || success
|
const hasFeedback = error || success
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
async function getInitialPaymentCollector() {
|
||||||
|
try {
|
||||||
|
const datatoken = new Datatoken(web3)
|
||||||
|
setPaymentCollector(
|
||||||
|
await datatoken.getPaymentCollector(asset?.datatokens[0].address)
|
||||||
|
)
|
||||||
|
} catch (error) {
|
||||||
|
LoggerInstance.error(
|
||||||
|
'[EditMetadata: getInitialPaymentCollector]',
|
||||||
|
error
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getInitialPaymentCollector()
|
||||||
|
}, [asset, web3])
|
||||||
|
|
||||||
async function updateFixedPrice(newPrice: string) {
|
async function updateFixedPrice(newPrice: string) {
|
||||||
const config = getOceanConfig(asset.chainId)
|
const config = getOceanConfig(asset.chainId)
|
||||||
|
|
||||||
@ -81,6 +100,15 @@ export default function Edit({
|
|||||||
values.price !== asset.accessDetails.price &&
|
values.price !== asset.accessDetails.price &&
|
||||||
(await updateFixedPrice(values.price))
|
(await updateFixedPrice(values.price))
|
||||||
|
|
||||||
|
if (values.paymentCollector !== paymentCollector) {
|
||||||
|
const datatoken = new Datatoken(web3)
|
||||||
|
await datatoken.setPaymentCollector(
|
||||||
|
asset?.datatokens[0].address,
|
||||||
|
accountId,
|
||||||
|
values.paymentCollector
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
if (values.files[0]?.url) {
|
if (values.files[0]?.url) {
|
||||||
const file = {
|
const file = {
|
||||||
nftAddress: asset.nftAddress,
|
nftAddress: asset.nftAddress,
|
||||||
@ -147,7 +175,8 @@ export default function Edit({
|
|||||||
initialValues={getInitialValues(
|
initialValues={getInitialValues(
|
||||||
asset?.metadata,
|
asset?.metadata,
|
||||||
asset?.services[0]?.timeout,
|
asset?.services[0]?.timeout,
|
||||||
asset?.accessDetails?.price
|
asset?.accessDetails?.price,
|
||||||
|
paymentCollector
|
||||||
)}
|
)}
|
||||||
validationSchema={validationSchema}
|
validationSchema={validationSchema}
|
||||||
onSubmit={async (values, { resetForm }) => {
|
onSubmit={async (values, { resetForm }) => {
|
||||||
|
15
src/components/Asset/Edit/FormActions.test.tsx
Normal file
15
src/components/Asset/Edit/FormActions.test.tsx
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import { render, screen } from '@testing-library/react'
|
||||||
|
import React from 'react'
|
||||||
|
import { useFormikContext } from 'formik'
|
||||||
|
import FormActions from './FormActions'
|
||||||
|
|
||||||
|
jest.mock('formik')
|
||||||
|
|
||||||
|
describe('src/components/Asset/Edit/FormActions.tsx', () => {
|
||||||
|
it('renders fixed price', () => {
|
||||||
|
const isValid = true
|
||||||
|
;(useFormikContext as jest.Mock).mockReturnValue([isValid])
|
||||||
|
render(<FormActions />)
|
||||||
|
expect(screen.getByText('Submit')).toBeInTheDocument()
|
||||||
|
})
|
||||||
|
})
|
@ -1,5 +1,5 @@
|
|||||||
import React, { ReactElement, useEffect } from 'react'
|
import React, { ReactElement, useEffect } from 'react'
|
||||||
import { Field, Form, useField, useFormikContext } from 'formik'
|
import { Field, Form, useFormikContext } from 'formik'
|
||||||
import Input, { InputProps } from '@shared/FormInput'
|
import Input, { InputProps } from '@shared/FormInput'
|
||||||
import FormActions from './FormActions'
|
import FormActions from './FormActions'
|
||||||
import { useAsset } from '@context/Asset'
|
import { useAsset } from '@context/Asset'
|
||||||
|
@ -5,7 +5,8 @@ import { ComputeEditForm, MetadataEditForm } from './_types'
|
|||||||
export function getInitialValues(
|
export function getInitialValues(
|
||||||
metadata: Metadata,
|
metadata: Metadata,
|
||||||
timeout: number,
|
timeout: number,
|
||||||
price: string
|
price: string,
|
||||||
|
paymentCollector: string
|
||||||
): Partial<MetadataEditForm> {
|
): Partial<MetadataEditForm> {
|
||||||
return {
|
return {
|
||||||
name: metadata?.name,
|
name: metadata?.name,
|
||||||
@ -15,7 +16,8 @@ export function getInitialValues(
|
|||||||
files: [{ url: '', type: '' }],
|
files: [{ url: '', type: '' }],
|
||||||
timeout: secondsToString(timeout),
|
timeout: secondsToString(timeout),
|
||||||
author: metadata?.author,
|
author: metadata?.author,
|
||||||
tags: metadata?.tags
|
tags: metadata?.tags,
|
||||||
|
paymentCollector
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@ export interface MetadataEditForm {
|
|||||||
name: string
|
name: string
|
||||||
description: string
|
description: string
|
||||||
timeout: string
|
timeout: string
|
||||||
|
paymentCollector: string
|
||||||
price?: string
|
price?: string
|
||||||
files: FileInfo[]
|
files: FileInfo[]
|
||||||
links?: FileInfo[]
|
links?: FileInfo[]
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import { FileInfo } from '@oceanprotocol/lib'
|
import { FileInfo } from '@oceanprotocol/lib'
|
||||||
import * as Yup from 'yup'
|
import * as Yup from 'yup'
|
||||||
|
import web3 from 'web3'
|
||||||
|
|
||||||
export const validationSchema = Yup.object().shape({
|
export const validationSchema = Yup.object().shape({
|
||||||
name: Yup.string()
|
name: Yup.string()
|
||||||
@ -41,7 +42,14 @@ export const validationSchema = Yup.object().shape({
|
|||||||
.nullable(),
|
.nullable(),
|
||||||
timeout: Yup.string().required('Required'),
|
timeout: Yup.string().required('Required'),
|
||||||
author: Yup.string().nullable(),
|
author: Yup.string().nullable(),
|
||||||
tags: Yup.array<string[]>().nullable()
|
tags: Yup.array<string[]>().nullable(),
|
||||||
|
paymentCollector: Yup.string().test(
|
||||||
|
'ValidAddress',
|
||||||
|
'Must be a valid Ethereum Address.',
|
||||||
|
(value) => {
|
||||||
|
return web3.utils.isAddress(value)
|
||||||
|
}
|
||||||
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
export const computeSettingsValidationSchema = Yup.object().shape({
|
export const computeSettingsValidationSchema = Yup.object().shape({
|
||||||
|
Loading…
Reference in New Issue
Block a user