Use this code to add a component hook to your React application to generate fields in your form with very simple code.
import React from 'react';
import { Formik, Form, useField, useFormik } from 'formik';
import * as Yup from 'yup';
import "./TaskForm.css"
import { useEffect, useState } from "react";
import { Link } from "react-router-dom";
import { useParams } from 'react-router';
// FOR NON LOGGED IN
import APIService from '/src/axios/http';
// FOR AUTHENTICATED
import axiosClient from "../../axios/client.js";
import MyModal from "../log/MyModal";
import { useStateContext } from "../../context/ContextProvider.jsx";
import { MySelect, MyTexArea } from "../../components/utilities/FormFields"
// And now we can use these
export function TaskForm() {
  const { task_id } = useParams();
  const [apiErrs, setApiErrs] = useState(null)
  const { modalContent, setModalContent } = useStateContext();
  const [errors, setErrors] = useState([])
  const [formValues, setFormValues] = useState({
    task_type: '',
    points: '',
    task: task_id ? 'Loading....' : '',
  })
  const showErrorMsg = (errorsArr, set) => {
    setErrors(errorsArr);
    if (typeof set.color == "undefined") set.color = 'primary'
    if (typeof set.title == "undefined") set.title = 'Modal Message'
    console.log(`LINE 186 errorsArr=`, errorsArr);
    let HTML = `<ol className="alert alert-${set.color} list-unstyled">`;
    errorsArr.forEach(erroMsg => {
      HTML += `<li className="m-3">${erroMsg}</li>`;
    });
    HTML += `</ol>`;
    // UPDATE THE CONTEXT TO SHOW THE MESSAGES IN THE MODAL
    setModalContent({
      ...modalContent,
      title: set.title,
      color: set.color,
      body: HTML,
      show: true,
      backdrop: 'static'
    });
  }
  const componentSettings = {
    nextRoute: "/NOTNEEDED", // /download/download/:fileSecret
    pageTitle: "Add Log",
    apiRoute: `/tasks`, // submit media files
    initApiRoute: '/NotNeeded' // inital route to validate fileSecret
  };
  document.title = componentSettings.pageTitle;
  const task_type = {
    ab: "yes/no",
    text: "text",
    link: "Link"
  }
  let task_typeArr = [];
  for (let [property, value] of Object.entries(task_type)) {
    task_typeArr.push(property);
  }
  if (task_id) {
    useEffect(() => {
      axiosClient.get(`/tasks/${task_id}`)
        .then(({ data }) => {
          console.log(`LINE 999 data=`, data);
          setFormValues(data);
          // const fields = ['task'];
          //fields.forEach(field => setFieldValue(field, data[field], false));
        })
        .catch(() => {
        })
    }, [])
  }
  return (
    <>
      <h1> Task Form: {task_id && task_id} | <Link to="/tasks" >All</Link></h1>
      {apiErrs && Object.entries(apiErrs).map(([errProp, errValue], index) => { return (<div key={index} className='alert alert-danger' title={errProp}>{errValue}</div>) }
      )}
      <Formik
        enableReinitialize={true}
        initialValues={formValues}
        validationSchema={Yup.object({
          task_type: Yup.string().required('Please select a Task Type'),
          points: Yup.string().required('Please select points for this task'),
          task: Yup.string().required('Please enter the task description'),
        })}
        onSubmit={(postData, { setSubmitting }) => {
          console.log(`LINE 46 postData=`, postData);
          postData.apiRoute = componentSettings.apiRoute;
          // ADD NEW  // EDIT ITEM task_id
          if (task_id) componentSettings.apiRoute = componentSettings.apiRoute + `/${task_id}`;
          axiosClient.put(componentSettings.apiRoute, postData)
            .then(({ res }) => {
              console.log(`LINE 99 =res`, res);
              showErrorMsg([`${task_id ? 'Edited' : 'Added'} successfuly`], { color: 'success', title: "Task Edded Successfully" });
            })
            .catch((err) => {
              console.log(`LINE 56 =err`, err);
              setApiErrs(err.response.data.errors);
            })
          setSubmitting(false);
        }}
      >
        <Form validate="true">
          <div className="row">
            <div className="col">
              <MySelect label="Points" name="points" className="form-control mb-3" required="required">
                <option>--Select Points--</option>
                {[...Array(10)].map((e, i) =>
                  <option value={i} key={i}>{i}</option>
                )}
              </MySelect>
            </div>
            <div className="col">
              <MySelect label="Task Type" name="task_type" className="form-control mb-3" required="required">
                <option>--Select Task Type--</option>
                {Object.entries(task_type).map(([task_name, task_value], index) =>
                  <option value={task_name} key={index}>{task_value}</option>
                )}
              </MySelect>
            </div>
          </div>
          <div className="row">
            <div className="col">
              <MyTexArea
                label="Task"
                name="task"
                placeholder="Write Task"
                className="form-control"
              />
            </div>
          </div>
          <button type="submit" className='btn btn-primary mt-3'>Submit</button>
        </Form>
      </Formik >
      <div><MyModal show={false} /></div>
    </>
  );
};
export default TaskForm