import { Box, Stepper as MuiStepper, StepperProps as MuiStepperProps, Step, StepLabel, Typography } from '@mui/material'; import React from 'react'; import { Button } from '../Button/Button'; export interface StepperProps extends MuiStepperProps { } const steps = ['Select campaign settings', 'Create an ad group', 'Create an ad']; export const Stepper = ({ color, square, ...rest }: StepperProps) => { const [activeStep, setActiveStep] = React.useState(0); const [skipped, setSkipped] = React.useState(new Set()); const isStepOptional = (step: number) => { return step === 1; }; const isStepSkipped = (step: number) => { return skipped.has(step); }; const handleNext = () => { let newSkipped = skipped; if (isStepSkipped(activeStep)) { newSkipped = new Set(newSkipped.values()); newSkipped.delete(activeStep); } setActiveStep((prevActiveStep) => prevActiveStep + 1); setSkipped(newSkipped); }; const handleBack = () => { setActiveStep((prevActiveStep) => prevActiveStep - 1); }; const handleSkip = () => { if (!isStepOptional(activeStep)) { // You probably want to guard against something like this, // it should never occur unless someone's actively trying to break something. throw new Error("You can't skip a step that isn't optional."); } setActiveStep((prevActiveStep) => prevActiveStep + 1); setSkipped((prevSkipped) => { const newSkipped = new Set(prevSkipped.values()); newSkipped.add(activeStep); return newSkipped; }); }; const handleReset = () => { setActiveStep(0); }; return ( {steps.map((label, index) => { const stepProps: { completed?: boolean } = {}; const labelProps: { optional?: React.ReactNode; } = {}; if (isStepOptional(index)) { labelProps.optional = ( Optional ); } if (isStepSkipped(index)) { stepProps.completed = false; } return ( {label} ); })} {activeStep === steps.length ? ( All steps completed - you're finished ) : ( Step {activeStep + 1} {isStepOptional(activeStep) && ( )} )} ); }