1
0
mirror of https://github.com/oceanprotocol/market.git synced 2024-12-02 05:57:29 +01:00
2020-10-19 16:40:09 +02:00

123 lines
3.5 KiB
TypeScript

import React, { ReactElement, useState } from 'react'
import { Formik } from 'formik'
import { usePublish, usePricing } from '@oceanprotocol/react'
import styles from './index.module.css'
import PublishForm from './PublishForm'
import Web3Feedback from '../../molecules/Wallet/Feedback'
import { FormContent } from '../../../@types/Form'
import { initialValues, validationSchema } from '../../../models/FormPublish'
import { transformPublishFormToMetadata } from './utils'
import Preview from './Preview'
import { MetadataPublishForm } from '../../../@types/MetaData'
import { useUserPreferences } from '../../../providers/UserPreferences'
import { DDO, Logger, Metadata } from '@oceanprotocol/lib'
import { Persist } from '../../atoms/FormikPersist'
import Debug from './Debug'
import Feedback from './Feedback'
const formName = 'ocean-publish-form'
export default function PublishPage({
content
}: {
content: { form: FormContent }
}): ReactElement {
const { debug } = useUserPreferences()
const { publish, publishError, isLoading, publishStepText } = usePublish()
const [success, setSuccess] = useState<string>()
const [error, setError] = useState<string>()
const [isPricing, setIsPricing] = useState<boolean>()
const [ddo, setDdo] = useState<DDO>()
const hasFeedback = isLoading || error || success
async function handleSubmit(
values: Partial<MetadataPublishForm>,
resetForm: () => void
): Promise<void> {
const metadata = transformPublishFormToMetadata(values)
const serviceType = values.access === 'Download' ? 'access' : 'compute'
try {
Logger.log(
'Publish with ',
metadata,
serviceType,
values.dataTokenOptions
)
const ddo = await publish(
(metadata as unknown) as Metadata,
serviceType,
values.dataTokenOptions
)
// Publish failed
if (publishError) {
setError(publishError)
Logger.error(publishError)
return
}
if (!ddo) return
// Publish succeeded
setDdo(ddo)
resetForm()
// Create pricing
setIsPricing(true)
// setSuccess('🎉 Successfully published your data set. 🎉')
} catch (error) {
setError(error.message)
Logger.error(error.message)
}
}
return (
<Formik
initialValues={initialValues}
initialStatus="empty"
validationSchema={validationSchema}
onSubmit={async (values, { setSubmitting, resetForm }) => {
// move user's focus to top of screen
window.scrollTo({ top: 0, left: 0, behavior: 'smooth' })
// kick off publishing
await handleSubmit(values, resetForm)
setSubmitting(false)
}}
>
{({ values }) => (
<>
<Persist name={formName} ignoreFields={['isSubmitting']} />
{hasFeedback ? (
<Feedback
error={error}
success={success}
publishStepText={publishStepText}
ddo={ddo}
isPricing={isPricing}
setError={setError}
/>
) : (
<article className={styles.grid}>
<PublishForm content={content.form} />
<aside>
<div className={styles.sticky}>
<Preview values={values} />
<Web3Feedback />
</div>
</aside>
</article>
)}
{debug === true && <Debug values={values} />}
</>
)}
</Formik>
)
}