import React, {ReactNode, useState} from "react"; import {Form, Formik, FormikBag, FormikHelpers} from "formik"; import {Button, Spinner, Step, Stepper} from "@material-tailwind/react"; import {ArrowLeft, ArrowRight, Check} from "@phosphor-icons/react"; const Wizard = ({children, initialValues, onSubmit}: { children: ReactNode, initialValues: any, onSubmit: (values: any, bag: FormikHelpers | FormikBag) => Promise }) => { const [stepNumber, setStepNumber] = useState(0); const steps = React.Children.toArray(children); const [snapshot, setSnapshot] = useState(initialValues); const step = steps[stepNumber]; const totalSteps = steps.length; const isFirstStep = stepNumber === 0; const isLastStep = stepNumber === totalSteps - 1; const next = (values: any) => { setSnapshot(values); setStepNumber(Math.min(stepNumber + 1, totalSteps - 1)); }; const previous = (values: any) => { setSnapshot(values); setStepNumber(Math.max(stepNumber - 1, 0)); }; const handleSubmit = async (values: any, bag: FormikBag | FormikHelpers) => { /*// @ts-ignore*/ if (step.props.onSubmit) { /*// @ts-ignore*/ await step.props.onSubmit(values, bag); } if (isLastStep) { return onSubmit(values, bag); } else { await bag.setTouched({}); next(values); } }; return ( {formik => (
{steps.map((child, index) => ( {/*// @ts-ignore*/} {child.props.icon} ))}
{step}
)}
); }; export default Wizard;