import classnames from 'classnames' import { Formik, Form, FastField } from 'formik' import * as R from 'ramda' import React, { useState } from 'react' import ErrorMessage from '../../components/ErrorMessage' import { Button } from '../../components/buttons' import { SecretInput } from '../../components/inputs/formik' const FormRenderer = ({ validationSchema, elements, value, save, buttonLabel = 'Save changes', buttonClass, }) => { const initialValues = R.compose( R.mergeAll, R.map(({ code }) => ({ [code]: (value && value[code]) ?? '' })), )(elements) const values = R.mergeRight(initialValues, value) const [saveError, setSaveError] = useState([]) const saveNonEmptySecret = it => { const emptySecretFields = R.compose( R.map(R.prop('code')), R.filter( elem => R.prop('component', elem) === SecretInput && R.isEmpty(it[R.prop('code', elem)]), ), )(elements) return save(R.omit(emptySecretFields, it)).catch(() => { setSaveError({ save: 'Failed to save changes' }) }) } return ( {({ errors }) => (
{elements.map( ({ component, code, display, settings, inputProps }) => (
), )}
{!R.isEmpty(R.mergeRight(errors, saveError)) && ( {R.head(R.values(R.mergeRight(errors, saveError)))} )}
)}
) } export default FormRenderer