# Continuing with components for dynamic React Native form, dynamic form validation - Wed, Thurs 25th-26th Nov, 2020 These last couple of days I have continued building out the screen and component needed to show a dynamic list of form fields in C+. Checkbox.tsx looks something like this: ```typescript= export const Checkbox: React.FC<CheckboxProps> = ({ colorScheme = 'dark', checked = false, onValueChange, size = 'sm', ...props }) => { const [isChecked, setIsChecked] = useState(checked) useEffect(() => { setIsChecked(checked) }, [checked]) const { colors } = useTheme() const handleChange = () => { setIsChecked((prevState) => { onValueChange && onValueChange(!prevState) return !prevState }) } return ( <CheckboxOuter size={size} colorScheme={colorScheme} onPress={handleChange} accessibilityRole="checkbox" accessibilityState={{ checked: isChecked }} {...props} > <>{isChecked && <Checkmark color={colors.green} size={sizes[size] * 0.8} />}</> </CheckboxOuter> ) } ``` As before, I'm using Formik to manage things like form values, touched fields, etc, and Yup for validation. Fortunately, the validation I receive from the API is usually quite simple. I'm updating my Yup schema thusly: ```typescript= useEffect(() => { // if field is not required, don't validate const requiredElements = (nominationFormElements ?? []).filter((element) => element.validation.some((validationObj) => validationObj.name === 'required') ) // create dynamic schema of required form fields const nominationFormSchema = requiredElements.reduce((acc, curr) => { const requiredValidation = curr.validation.find((validationObj) => validationObj.name === 'required') switch (curr.type) { case 'checkbox': return { ...acc, [curr.id]: yup.array().min(1, requiredValidation?.message ?? 'This field is required'), } case 'file': return acc default: return { ...acc, [curr.id]: yup.string().required(requiredValidation?.message ?? 'This field is required'), } } }, {}) // validation schema is stored in state, update setValidationSchema((prevValidationSchema) => ({ ...prevValidationSchema, NominationForm: yup.object().shape(nominationFormSchema), })) }, [nominationFormElements, setValidationSchema]) ``` Formik is great, but since [this is React Native](https://formik.org/docs/guides/react-native), it's as straightforward as HTML forms. For some fields (such as a `TextInput`), you can simply pass Formik's `handleChange` method straight. For others (such as my checkbox or a `switch`), since Formik expects a React change event, and the `switch` only exposes a boolean value, you have to manage the value change yourself using `setFieldValue`. It's not bad, just something to be aware of. ###### tags: `programmingjournal` `2020` `C+` `nominations` `Formik` `yup` `validation` `dynamic` `checkbox` `switch` `form`