import React, { ReactElement, useEffect, FormEvent, ChangeEvent } from 'react' 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 { AlgorithmPublishForm } from '../../../@types/MetaData' export default function FormPublish({ content }: { content: FormContent }): ReactElement { const { ocean, account } = useOcean() const { status, setStatus, isValid, setErrors, setTouched, resetForm, initialValues, validateField, setFieldValue }: FormikContextType = useFormikContext() // reset form validation on every mount useEffect(() => { setErrors({}) setTouched({}) resetForm({ values: initialValues, status: 'empty' }) // 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, field: FormFieldProps ) { const value = field.type === 'checkbox' ? !JSON.parse(e.target.value) : e.target.value validateField(field.name) setFieldValue(field.name, value) } const resetFormAndClearStorage = (e: FormEvent) => { e.preventDefault() resetForm({ values: initialValues, status: 'empty' }) setStatus('empty') } return (
status === 'empty' && setStatus(null)} > {content.data.map((field: FormFieldProps) => ( ) => handleFieldChange(e, field) } /> ))} ) }