From 722966f50eb0a57b1c54e2a0030aca6ebda58931 Mon Sep 17 00:00:00 2001 From: Ardeman Date: Mon, 3 Mar 2025 05:16:31 +0800 Subject: [PATCH] feat: implement subscription form with validation and fetcher integration --- app/layouts/news/form-subscription.tsx | 72 +++++++++++++++++++------- 1 file changed, 54 insertions(+), 18 deletions(-) diff --git a/app/layouts/news/form-subscription.tsx b/app/layouts/news/form-subscription.tsx index 99ce7e8..770f292 100644 --- a/app/layouts/news/form-subscription.tsx +++ b/app/layouts/news/form-subscription.tsx @@ -1,29 +1,65 @@ +import { zodResolver } from '@hookform/resolvers/zod' +import { useFetcher, useRouteLoaderData } from 'react-router' +import { RemixFormProvider, useRemixForm } from 'remix-hook-form' +import { z } from 'zod' + import { Button } from '~/components/ui/button' +import { Select } from '~/components/ui/select' +import type { loader } from '~/routes/_layout' + +export const subscribeSchema = z + .object({ + email: z.string().email('Email tidak valid'), + password: z.string().min(6, 'Kata sandi minimal 6 karakter'), + rePassword: z.string().min(6, 'Kata sandi minimal 6 karakter'), + phone: z.string().min(10, 'No telepon tidak valid'), + subscribe_plan: z.string().min(1, 'Pilih salah satu subscription'), + }) + .refine((field) => field.password === field.rePassword, { + message: 'Kata sandi tidak sama', + path: ['rePassword'], + }) + +export type TSubscribeSchema = z.infer export default function FormSubscription() { + const fetcher = useFetcher() + const loaderData = useRouteLoaderData('routes/_layout') + const subscriptions = loaderData?.subscriptionsData + + const formMethods = useRemixForm({ + mode: 'onSubmit', + fetcher, + resolver: zodResolver(subscribeSchema), + }) + + const { handleSubmit } = formMethods + return (
-
-
- {/* Subscribe*/} -
- - -
+ + +