import React, { useReducer } from "react" import { Box, Button, Step, StepLabel, Stepper } from "@mui/material" import { faAngleLeft } from "@fortawesome/free-solid-svg-icons" import { cloneDeep } from "lodash" import { Icon } from "./icon" interface IFormStepperStep { label: string, render: (onComplete: (formResponse: any) => void, prevFormResponse: any) => React.ReactNode } interface IFormStepperProps { steps: IFormStepperStep[] onComplete?: (data: any) => void } export function FormStepper({ steps, onComplete }: IFormStepperProps) { const [state, setFormResponse] = useReducer((prevState: any, action: { type: "next" response: any } | { type: "prev" }) => { const state = cloneDeep(prevState) switch (action.type) { case "next": state.responses[state.currentStep] = action.response state.currentStep = Math.min(state.currentStep + 1, steps.length - 1) return state case "prev": state.currentStep = Math.max(state.currentStep - 1, 0) return state } }, { currentStep: 0, responses: [] }) console.log(state) return ( <> { steps.map((step, index) => { const last = index === steps.length - 1 const lastCompleted = last && state.currentStep === steps.length - 1 return {step.label} }) } {steps[state.currentStep].render( (formResponse) => { setFormResponse({ type: "next", response: formResponse }) if (state.currentStep === steps.length - 1) { onComplete?.(formResponse) } }, state.responses[state.currentStep - 1] )} { state.currentStep > 0 && } ) }