serverless-workflow-examples/serverless-workflow-loanbroker-showcase/loanbroker-js/pages/loan/new.tsx (77 lines of code) (raw):

import { ErrorMessage, Field, Form, Formik } from "formik"; import { useRouter } from "next/router"; import { useRecoilState } from "recoil"; import { layout } from "../../components/layout/MainLayout"; import LoanRequest from "../../model/LoanRequest"; import Communication from "../../services/Communication"; import { pendingState } from "../../state/atoms"; import { NextPageWithLayout } from "../_app"; const initialValues: LoanRequest = { SSN: "", amount: 0, term: 0 }; const NewLoan: NextPageWithLayout = () => { const router = useRouter(); const [pending, setPending] = useRecoilState(pendingState); return ( <div className="animated fadeIn"> <h1>Loan Application Form</h1> <Formik initialValues={initialValues} validate={(values) => { const errors = {}; return errors; }} onSubmit={(values, { setSubmitting }) => { Communication.createLoan(values) .then((res: any) => { setSubmitting(false); setPending((old) => [...old, res.data]); router.push("/loan"); }) .catch((error: any) => { setSubmitting(false); }); }} > {({ isSubmitting }) => ( <Form> <div className="mb-3"> <label>SSN</label> <Field className="form-control" type="text" placeholder="123-45-6789" name="SSN" /> <ErrorMessage name="SSN" component="div" /> </div> <div className="mb-3"> <label>Term</label> <Field className="form-control" type="number" placeholder="30" name="term" /> <ErrorMessage name="term" component="div" /> </div> <div className="mb-3"> <label>Amount</label> <Field className="form-control" type="number" placeholder="50000" name="amount" /> <ErrorMessage name="amount" component="div" /> </div> <button type="submit" className="btn btn-primary" disabled={isSubmitting} > <span className={`spinner-border spinner-border-sm ${ isSubmitting ? "" : "visually-hidden" }`} role="status" aria-hidden="true" ></span>{" "} Apply </button> </Form> )} </Formik> </div> ); }; NewLoan.getLayout = layout; export default NewLoan;