import { zodResolver } from '@hookform/resolvers/zod' import { useEffect, useState } from 'react' import { useFetcher, useRouteLoaderData } from 'react-router' import { RemixFormProvider, useRemixForm } from 'remix-hook-form' import { z } from 'zod' import { Button } from '~/components/ui/button' import { Combobox } from '~/components/ui/combobox' import { useNewsContext } from '~/contexts/news' import type { loader } from '~/routes/_news' export const subscribeSchema = z.object({ subscribe_plan: z .object({ id: z.string(), code: z.string(), name: z.string(), }) .optional() .nullable() .refine((data) => !!data, { message: 'Please select a subscription', }), }) export type TSubscribeSchema = z.infer export default function FormSubscription() { const { setIsSubscribeOpen, setIsSuccessOpen } = useNewsContext() const fetcher = useFetcher() const [error, setError] = useState() const [disabled, setDisabled] = useState(false) const loaderData = useRouteLoaderData('routes/_news') const subscriptions = loaderData?.subscriptionsData const formMethods = useRemixForm({ mode: 'onSubmit', fetcher, resolver: zodResolver(subscribeSchema), }) const { handleSubmit } = formMethods useEffect(() => { if (!fetcher.data?.success) { setError(fetcher.data?.message) setDisabled(false) return } setDisabled(true) setError(undefined) setIsSubscribeOpen(false) setIsSuccessOpen('payment') // eslint-disable-next-line react-hooks/exhaustive-deps }, [fetcher]) return (
{error && (
{error}
)}
) }