From 7b186350d893e848a99379d097f16fc67fa7cdc2 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 2 Aug 2022 15:58:44 +0200 Subject: [PATCH] chore: rendering the errors for the async validation Signed-off-by: blam --- .../TemplateWizardPage/Stepper/Stepper.tsx | 40 +++++++++++++++---- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/Stepper.tsx b/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/Stepper.tsx index 240139ae5c..bb37e3143c 100644 --- a/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/Stepper.tsx +++ b/plugins/scaffolder/src/next/TemplateWizardPage/Stepper/Stepper.tsx @@ -22,7 +22,7 @@ import { Button, makeStyles, } from '@material-ui/core'; -import { FieldValidation, FormValidation, withTheme } from '@rjsf/core'; +import { FormValidation, withTheme } from '@rjsf/core'; import { Theme as MuiTheme } from '@rjsf/material-ui'; import React, { useMemo, useState } from 'react'; import { FieldExtensionOptions } from '../../../extensions'; @@ -56,6 +56,7 @@ export const Stepper = (props: StepperProps) => { const apiHolder = useApiHolder(); const [activeStep, setActiveStep] = useState(0); const [formState, setFormState] = useState({}); + const [errors, setErrors] = useState(); const styles = useStyles(); const extensions = useMemo(() => { @@ -81,15 +82,37 @@ export const Stepper = (props: StepperProps) => { }; const handleNext = async ({ formData }: { formData: JsonObject }) => { - console.log('running validation'); + setErrors(undefined); - const errors = await validator(formData, { - addError: () => {}, - __errors: [], - } as any); + const errorContext: any = {}; + for (const [key] of Object.entries(formData)) { + const localFieldContext = { + __errors: [] as string[], + addError: (message: string) => { + localFieldContext.__errors.push(message); + }, + }; + errorContext[key] = localFieldContext; + } - console.log('errors'); - setActiveStep(prevActiveStep => prevActiveStep + 1); + const returnedValidation = await validator( + formData, + errorContext as FormValidation, + ); + + const hasErrors = Object.values(returnedValidation).some(i => { + if ('__errors' in i) { + return i.__errors.length > 0; + } + return false; + }); + + if (hasErrors) { + setErrors(returnedValidation); + } else { + setErrors(undefined); + setActiveStep(prevActiveStep => prevActiveStep + 1); + } setFormState(current => ({ ...current, ...formData })); }; @@ -104,6 +127,7 @@ export const Stepper = (props: StepperProps) => {