import React from 'react'; import { makeStyles, Theme, createStyles } from '@material-ui/core/styles'; import Stepper from '@material-ui/core/Stepper'; import Step from '@material-ui/core/Step'; import StepButton from '@material-ui/core/StepButton'; import Button from '@material-ui/core/Button'; import Typography from '@material-ui/core/Typography'; const useStyles = makeStyles((theme: Theme) => createStyles({ root: { width: '100%', }, button: { marginRight: theme.spacing(1), }, completed: { display: 'inline-block', }, instructions: { marginTop: theme.spacing(1), marginBottom: theme.spacing(1), }, }), ); function getSteps() { return ['Select campaign settings', 'Create an ad group', 'Create an ad']; } function getStepContent(step: number) { switch (step) { case 0: return 'Step 1: Select campaign settings...'; case 1: return 'Step 2: What is an ad group anyways?'; case 2: return 'Step 3: This is the bit I really care about!'; default: return 'Unknown step'; } } export default function HorizontalNonLinearStepper() { const classes = useStyles(); const [activeStep, setActiveStep] = React.useState(0); const [completed, setCompleted] = React.useState<{ [k: number]: boolean }>({}); const steps = getSteps(); const totalSteps = () => { return steps.length; }; const completedSteps = () => { return Object.keys(completed).length; }; const isLastStep = () => { return activeStep === totalSteps() - 1; }; const allStepsCompleted = () => { return 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 been completed steps.findIndex((step, i) => !(i in completed)) : activeStep + 1; setActiveStep(newActiveStep); }; const handleBack = () => { setActiveStep((prevActiveStep) => prevActiveStep - 1); }; const handleStep = (step: number) => () => { setActiveStep(step); }; const handleComplete = () => { const newCompleted = completed; newCompleted[activeStep] = true; setCompleted(newCompleted); handleNext(); }; const handleReset = () => { setActiveStep(0); setCompleted({}); }; return (
{steps.map((label, index) => ( {label} ))}
{allStepsCompleted() ? (
All steps completed - you're finished
) : (
{getStepContent(activeStep)}
{activeStep !== steps.length && (completed[activeStep] ? ( Step {activeStep + 1} already completed ) : ( ))}
)}
); }