mirror of
https://github.com/oceanprotocol/market.git
synced 2024-12-02 05:57:29 +01:00
115 lines
3.0 KiB
TypeScript
115 lines
3.0 KiB
TypeScript
import React, { ReactElement, useEffect, FormEvent, ChangeEvent } from 'react'
|
|
import { useStaticQuery, graphql } from 'gatsby'
|
|
import styles from './FormPublish.module.css'
|
|
import { useOcean } from '@oceanprotocol/react'
|
|
import { useFormikContext, Field, Form, FormikContextType } from 'formik'
|
|
import Input from '../../atoms/Input'
|
|
import Button from '../../atoms/Button'
|
|
import { FormContent, FormFieldProps } from '../../../@types/Form'
|
|
import { MetadataPublishFormDataset } from '../../../@types/MetaData'
|
|
import stylesIndex from './index.module.css'
|
|
|
|
const query = graphql`
|
|
query {
|
|
content: allFile(
|
|
filter: { relativePath: { eq: "pages/publish/form-dataset.json" } }
|
|
) {
|
|
edges {
|
|
node {
|
|
childPublishJson {
|
|
title
|
|
data {
|
|
name
|
|
placeholder
|
|
label
|
|
help
|
|
type
|
|
required
|
|
sortOptions
|
|
options
|
|
}
|
|
warning
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
`
|
|
|
|
export default function FormPublish(): ReactElement {
|
|
const data = useStaticQuery(query)
|
|
const content: FormContent = data.content.edges[0].node.childPublishJson
|
|
const { ocean, account } = useOcean()
|
|
const {
|
|
status,
|
|
setStatus,
|
|
isValid,
|
|
setErrors,
|
|
setTouched,
|
|
resetForm,
|
|
initialValues,
|
|
validateField,
|
|
setFieldValue
|
|
}: FormikContextType<MetadataPublishFormDataset> = useFormikContext()
|
|
|
|
// reset form validation on every mount
|
|
useEffect(() => {
|
|
setErrors({})
|
|
setTouched({})
|
|
|
|
// setSubmitting(false)
|
|
}, [setErrors, setTouched])
|
|
|
|
// Manually handle change events instead of using `handleChange` from Formik.
|
|
// Workaround for default `validateOnChange` not kicking in
|
|
function handleFieldChange(
|
|
e: ChangeEvent<HTMLInputElement>,
|
|
field: FormFieldProps
|
|
) {
|
|
validateField(field.name)
|
|
setFieldValue(field.name, e.target.value)
|
|
}
|
|
|
|
const resetFormAndClearStorage = (e: FormEvent<Element>) => {
|
|
e.preventDefault()
|
|
resetForm({ values: initialValues, status: 'empty' })
|
|
setStatus('empty')
|
|
}
|
|
|
|
return (
|
|
<Form
|
|
className={styles.form}
|
|
// do we need this?
|
|
onChange={() => status === 'empty' && setStatus(null)}
|
|
>
|
|
<h2 className={stylesIndex.formTitle}>{content.title}</h2>
|
|
{content.data.map((field: FormFieldProps) => (
|
|
<Field
|
|
key={field.name}
|
|
{...field}
|
|
component={Input}
|
|
onChange={(e: ChangeEvent<HTMLInputElement>) =>
|
|
handleFieldChange(e, field)
|
|
}
|
|
/>
|
|
))}
|
|
|
|
<footer className={styles.actions}>
|
|
<Button
|
|
style="primary"
|
|
type="submit"
|
|
disabled={!ocean || !account || !isValid || status === 'empty'}
|
|
>
|
|
Submit
|
|
</Button>
|
|
|
|
{status !== 'empty' && (
|
|
<Button style="text" size="small" onClick={resetFormAndClearStorage}>
|
|
Reset Form
|
|
</Button>
|
|
)}
|
|
</footer>
|
|
</Form>
|
|
)
|
|
}
|