import*asReactfrom"react";import{ErrorMessage,Field,Form,FormikProps,withFormik}from"formik";import{Component}from"react";import*asYupfrom"yup";import{compose}from"recompose";import{IWithBackedErrors,withBackedErrors}from"./withBackendErrors";import{set,transform}from"lodash";interfaceIPerson{
name: string;
age: number;}interfaceISampleForm{
person: IPerson;
isActive: boolean;}classSampleFormextendsComponent<FormikProps<ISampleForm>&IWithBackedErrors>{render(){const{ values, errors, status }=this.props;return(<div><Form><label>Name</label><Fieldname="person.name"/><ErrorMessagename="person.name"/><Fieldname="person.age"type="number"/><ErrorMessagename="person.age"/><Fieldname="isActive"type="checkbox"/><ErrorMessagename="isActive"/>{/*1st call setBackendErrors to create backend errors state*/}<buttononClick={()=>{this.props.setBackendErrors(backendErrors.errors.fields,this.props.setTouched);}}type="button">
Validate form
</button><buttontype="submit"disabled={!this.props.isValid}>
Send sample form
</button></Form><h5>Errors:</h5><pre>{JSON.stringify(errors,null,2)}</pre><h5>Values:</h5><pre>{JSON.stringify(values,null,2)}</pre></div>);}}constvalidationSchema=Yup.object<ISampleForm>().shape({person: Yup.object<IPerson>().shape({name: Yup.string().required("Field is required."),age: Yup.number().min(18,"Max age is 18").max(60,"Min age is 60").required("Field is required.")}),isActive: Yup.boolean()});exportconstbackendErrors={message: "Validation error",errors: {fields: {"person.name": ["person.name.notBlank","person.name.isExist"],"person.age": ["person.age.notBlank"]}}};exportdefaultcompose<any,any>(/*2nd use withBackedErrors to pass formik backend errors as prop, if backend errors structure is not as FormikErrors then use function to map values*/withBackedErrors<ISampleForm>(errors=>{returntransform(errors,(result,values: string[],key: string)=>{set(result,key,values.join(" "));},{});}),withFormik<IWithBackedErrors,ISampleForm>({mapPropsToValues(){return{person: {name: "",age: 0},isActive: false};},handleSubmit(){console.log("submit");},validate: (values,{ validateBackendErrorsCallback })=>{/*3rd tell fromik to validate backend errors*/returnvalidateBackendErrorsCallback();},validationSchema: validationSchema}))(SampleForm);