From 2da9158a5dd52edafc20f976fa4f46e4a703224e Mon Sep 17 00:00:00 2001 From: libiqi Date: Fri, 5 Jul 2024 12:27:15 +0800 Subject: [PATCH] Feature Passing Additional Arguments And Programmatic form submission --- src/app/RegistrationForm.tsx | 71 +++++++++++------------------------- src/app/page.tsx | 29 ++++++--------- src/app/sumbit-button.tsx | 17 +++++++++ 3 files changed, 49 insertions(+), 68 deletions(-) create mode 100644 src/app/sumbit-button.tsx diff --git a/src/app/RegistrationForm.tsx b/src/app/RegistrationForm.tsx index 9055adc..3caa9f9 100644 --- a/src/app/RegistrationForm.tsx +++ b/src/app/RegistrationForm.tsx @@ -1,8 +1,6 @@ "use client"; import { useFormState } from "react-dom"; -import { useRef } from "react"; - -import { Button } from "@/components/ui/button"; +import { useEffect, useRef } from "react"; import { Input } from "@/components/ui/input"; import { Form, @@ -16,33 +14,38 @@ import { import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; -import { z } from "zod"; +import { number, z } from "zod"; import { schema } from "./registrationSchema"; +import SubmitButton from "./sumbit-button"; +import { Button } from "@/components/ui/button"; export const RegistrationForm = ({ - onDataAction, onFormAction, }: { - onDataAction: (data: z.infer) => Promise<{ - message: string; - user?: z.infer; - issues?: string[]; - }>; onFormAction: ( + additional: { + userId: number; + }, prevState: { message: string; + success: boolean; user?: z.infer; issues?: string[]; }, data: FormData ) => Promise<{ message: string; + success: boolean; user?: z.infer; issues?: string[]; }>; }) => { - const [state, formAction] = useFormState(onFormAction, { + const withId = onFormAction.bind(null, { + userId: 1 + }) + const [state, formAction] = useFormState(withId, { + success: false, message: "", }); const form = useForm>({ @@ -53,51 +56,19 @@ export const RegistrationForm = ({ email: "", zipcode: "", }, + mode: 'all' }); - const onSubmit = async (data: z.infer) => { - console.log(data); - fetch("/api/register", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(data), - }) - .then((response) => response.json()) - .then((data) => console.log(data)); - // const formData = new FormData(); - // formData.append("first", data.first); - // formData.append("last", data.last); - // formData.append("email", data.email); - // fetch("/api/registerForm", { - // method: "POST", - // body: formData, - // }) - // .then((response) => response.json()) - // .then((data) => console.log(data)); - // console.log(await onDataAction(data)); - // const formData = new FormData(); - // formData.append("first", data.first); - // formData.append("last", data.last); - // formData.append("email", data.email); - // console.log(await onDataAction(data)); - }; - const formRef = useRef(null); - - return ( + return (<> +
{state?.message}
{ - evt.preventDefault(); - form.handleSubmit(() => { - formAction(new FormData(formRef.current!)); - })(evt); - }} className="space-y-8" >
@@ -158,8 +129,8 @@ export const RegistrationForm = ({ )} /> - + - + ); }; diff --git a/src/app/page.tsx b/src/app/page.tsx index 30ad5e5..fd6a4e6 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -4,47 +4,40 @@ import { z } from "zod"; import { schema } from "./registrationSchema"; export default function Home() { - const onDataAction = async (data: z.infer) => { - "use server"; - const parsed = schema.safeParse(data); - - if (parsed.success) { - console.log("User registered"); - return { message: "User registered", user: parsed.data }; - } else { - return { - message: "Invalid data", - issues: parsed.error.issues.map((issue) => issue.message), - }; - } - }; const onFormAction = async ( + additional: { + userId: number; + }, prevState: { message: string; + success: boolean; user?: z.infer; issues?: string[]; }, formData: FormData ) => { "use server"; + console.log(additional, formData) const data = Object.fromEntries(formData); const parsed = await schema.safeParseAsync(data); if (parsed.success) { console.log("User registered"); - return { message: "User registered", user: parsed.data }; + return { success: true, message: "User registered", user: parsed.data }; } else { - return { + const obj = { + success: false, message: "Invalid data", issues: parsed.error.issues.map((issue) => issue.message), - }; + } + console.log(JSON.stringify(obj)) + return obj; } }; return (
diff --git a/src/app/sumbit-button.tsx b/src/app/sumbit-button.tsx new file mode 100644 index 0000000..a48c154 --- /dev/null +++ b/src/app/sumbit-button.tsx @@ -0,0 +1,17 @@ + +import { useFormStatus } from 'react-dom'; +import { Button } from "@/components/ui/button" +import { cn } from "@/lib/utils"; + +interface SubmitButtonProps { + text: string; + className?: string; +} + +export default function SubmitButton(props: SubmitButtonProps) { + const { pending, data, method, action } = useFormStatus(); + return +}