import * as React from 'react'; import Box from '@mui/material/Box'; import Stepper from '@mui/material/Stepper'; import Step from '@mui/material/Step'; import StepButton from '@mui/material/StepButton'; import Button from '@mui/material/Button'; import Typography from '@mui/material/Typography'; const steps = ['Select campaign settings', 'Create an ad group', 'Create an ad']; export default function HorizontalNonLinearStepper() { const [activeStep, setActiveStep] = React.useState(0); const [completed, setCompleted] = React.useState({}); const totalSteps = steps.length; const completedSteps = Object.keys(completed).length; const isLastStep = activeStep === totalSteps - 1; const allStepsCompleted = completedSteps === totalSteps; const handleNext = () => { const newActiveStep = isLastStep && !allStepsCompleted ? // It's the last step, but not all steps have been completed, // find the first step that has not been completed steps.findIndex((_step, i) => !(i in completed)) : activeStep + 1; setActiveStep(newActiveStep); }; const handleBack = () => { setActiveStep((prevActiveStep) => prevActiveStep - 1); }; const handleStep = (step) => () => { setActiveStep(step); }; const handleComplete = () => { setCompleted({ ...completed, [activeStep]: true, }); handleNext(); }; const handleReset = () => { setActiveStep(0); setCompleted({}); }; const resetButtonRef = React.useRef(null); const nextButtonRef = React.useRef(null); const previousActiveStepRef = React.useRef(activeStep); const previousCompletedRef = React.useRef(completed); // Manage focus when the completed steps change. React.useEffect(() => { const previousCompleted = previousCompletedRef.current; previousCompletedRef.current = completed; if (allStepsCompleted) { // If the user has completed all steps and hits "Finish", focus the "Reset" button. resetButtonRef.current.focus(); return; } if ( Object.keys(completed).length === 0 && Object.keys(previousCompleted).length !== 0 ) { // If the user has completed all steps and hits "Reset", focus the "Next" button. nextButtonRef.current.focus(); } }, [completed, allStepsCompleted]); // Manage focus when the active step changes. React.useEffect(() => { if (activeStep === 0 && previousActiveStepRef.current === 1) { // If the user navigated to first step via "Back" button, focus the "Next" button. nextButtonRef.current.focus(); } previousActiveStepRef.current = activeStep; }, [activeStep]); return ( {steps.map((label, index) => ( {label} ))}
{allStepsCompleted ? ( All steps completed - you're finished ) : ( Step {activeStep + 1} {activeStep !== steps.length && (completed[activeStep] ? ( Step {activeStep + 1} already completed ) : ( ))} )}
); }