From 1e2f3023bc5d8417193281c57c7b144fc66fef6a Mon Sep 17 00:00:00 2001 From: gbuomprisco Date: Wed, 10 Jul 2024 15:04:10 +0800 Subject: [PATCH] Add onSubmit callback to multi-step form The multi-step form has been updated to include an onSubmit callback, enhancing its functionality. This is achieved via a hook `useMutation` from `@tanstack/react-query` that handles submission operations. This change enables the application to perform specific operations upon submission. --- packages/ui/src/makerkit/multi-step-form.tsx | 26 +++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/packages/ui/src/makerkit/multi-step-form.tsx b/packages/ui/src/makerkit/multi-step-form.tsx index 9b245ce2d..b3f8c8f44 100644 --- a/packages/ui/src/makerkit/multi-step-form.tsx +++ b/packages/ui/src/makerkit/multi-step-form.tsx @@ -16,6 +16,7 @@ import { Path, UseFormReturn } from 'react-hook-form'; import { z } from 'zod'; import { cn } from '../utils'; +import {useMutation} from "@tanstack/react-query"; interface MultiStepFormProps { schema: T; @@ -77,7 +78,7 @@ export function MultiStepForm({ }, [children]); const stepNames = steps.map((step) => step.props.name); - const multiStepForm = useMultiStepForm(schema, form, stepNames); + const multiStepForm = useMultiStepForm(schema, form, stepNames, onSubmit); return ( @@ -169,6 +170,7 @@ export function useMultiStepForm( schema: Schema, form: UseFormReturn>, stepNames: string[], + onSubmit: (data: z.infer) => void, ) { const [state, setState] = useState({ currentStepIndex: 0, @@ -282,6 +284,12 @@ export function useMultiStepForm( const isValid = form.formState.isValid; const errors = form.formState.errors; + const mutation = useMutation({ + mutationFn: () => { + return form.handleSubmit(onSubmit)(); + } + }); + return useMemo( () => ({ form, @@ -297,9 +305,11 @@ export function useMultiStepForm( isStepValid, isValid, errors, + mutation, }), [ form, + mutation, stepNames, state.currentStepIndex, state.direction, @@ -406,11 +416,15 @@ function AnimatedStep({ const visibilityClasses = isActive ? 'opacity-100' : 'opacity-0 absolute'; - const transformClasses = cn('translate-x-0', isActive ? {} : { - '-translate-x-full': direction === 'forward' || index < currentIndex, - 'translate-x-full': direction === 'backward' || index > currentIndex, - }); - + const transformClasses = cn( + 'translate-x-0', + isActive + ? {} + : { + '-translate-x-full': direction === 'forward' || index < currentIndex, + 'translate-x-full': direction === 'backward' || index > currentIndex, + }, + ); const className = cn(baseClasses, visibilityClasses, transformClasses);