From 50528317f5406b9751321810fdba1f83b65e59e9 Mon Sep 17 00:00:00 2001 From: Aaron Hong Date: Thu, 30 Jan 2025 17:15:14 -0500 Subject: [PATCH] Add an auto submit form --- .../autoSubmitForm/AutoSubmitForm.stories.tsx | 79 +++++++++++++++++++ .../autoSubmitForm/AutoSubmitForm.tsx | 35 ++++++++ src/components/autoSubmitForm/Form.css | 8 ++ src/components/autoSubmitForm/index.ts | 1 + 4 files changed, 123 insertions(+) create mode 100644 src/components/autoSubmitForm/AutoSubmitForm.stories.tsx create mode 100644 src/components/autoSubmitForm/AutoSubmitForm.tsx create mode 100644 src/components/autoSubmitForm/Form.css create mode 100644 src/components/autoSubmitForm/index.ts diff --git a/src/components/autoSubmitForm/AutoSubmitForm.stories.tsx b/src/components/autoSubmitForm/AutoSubmitForm.stories.tsx new file mode 100644 index 0000000..3fec54c --- /dev/null +++ b/src/components/autoSubmitForm/AutoSubmitForm.stories.tsx @@ -0,0 +1,79 @@ +import type { Meta, StoryObj } from '@storybook/react' +import { AutoSubmitForm } from './AutoSubmitForm' +import { Select } from '../select' +import * as yup from 'yup' +import { FormikHelpers } from 'formik' +import { useState } from 'react' +const meta = { + title: 'Components/AutoSubmitForm', + component: AutoSubmitForm, +} satisfies Meta> + +export default meta +type Story = StoryObj + +type FooValues = { + plan_type: string + line_of_business: string +} + +export const Default: Story = { + args: { + initialValues: { plan_type: '', line_of_business: '' }, + validationSchema: yup.object({ + plan_type: yup.string().required(), + line_of_business: yup.string().required(), + }), + onSubmit: (values) => console.log({ values }), + children: ( +
+ +
+ ), + }, + render: (args) => { + const [formValues, setFormValues] = useState(args.initialValues) + const handleSubmit = ( + values: FooValues, + formikHelpers: FormikHelpers + ) => { + setFormValues(values) + args.onSubmit(values, formikHelpers) + } + + return ( +
+ +
+

Form Values

+
{JSON.stringify(formValues, null, 2)}
+
+
+ ) + }, +} diff --git a/src/components/autoSubmitForm/AutoSubmitForm.tsx b/src/components/autoSubmitForm/AutoSubmitForm.tsx new file mode 100644 index 0000000..43c13a3 --- /dev/null +++ b/src/components/autoSubmitForm/AutoSubmitForm.tsx @@ -0,0 +1,35 @@ +import React from 'react' +import { Formik, FormikConfig, FormikValues, useFormikContext } from 'formik' +import { ReactNode } from 'react' + +type Props = FormikConfig & { + children: ReactNode +} + +export const AutoSubmitForm = ({ + children, + onSubmit, + initialValues, + ...props +}: Props) => { + return ( + initialValues={initialValues} onSubmit={onSubmit} {...props}> + {children} + + ) +} + +type FormFieldsContainerProps = { + children: ReactNode +} +export const FormFieldsContainer = ({ children }: FormFieldsContainerProps) => { + const { values, isValid, dirty, submitForm } = useFormikContext() + + React.useEffect(() => { + if (isValid && dirty) { + submitForm() + } + }, [isValid, dirty, JSON.stringify(values)]) + + return <>{children} +} diff --git a/src/components/autoSubmitForm/Form.css b/src/components/autoSubmitForm/Form.css new file mode 100644 index 0000000..c0ee0d8 --- /dev/null +++ b/src/components/autoSubmitForm/Form.css @@ -0,0 +1,8 @@ +.ant-form-item .ant-form-item-label > label { + align-items: start; + padding-top: 8px; + + &::before { + margin-top: 6px; + } +} diff --git a/src/components/autoSubmitForm/index.ts b/src/components/autoSubmitForm/index.ts new file mode 100644 index 0000000..02b2395 --- /dev/null +++ b/src/components/autoSubmitForm/index.ts @@ -0,0 +1 @@ +export { AutoSubmitForm } from './AutoSubmitForm'