import { TextField, Typography } from '@mui/material'; import { type FormikErrors, type FormikValues, useFormikContext } from 'formik'; import { useEffect, useState } from 'react'; import Wizard from '.'; import type { StepComponentProps } from './models'; export default { title: 'Wizard' }; export const oneStep = (): JSX.Element => ( ( Step 1 ), skipFormChangeCheck: true, stepName: 'First step' } ]} /> ); export const oneStepWithoutActionsBar = (): JSX.Element => ( ( Step 1 ), hasActionsBar: false, skipFormChangeCheck: true, stepName: 'First step' } ]} /> ); export const threeStepsWithMediumSize = (): JSX.Element => ( ( Step 1 ), skipFormChangeCheck: true, stepName: 'First step' }, { Component: (): JSX.Element => ( Step 2 ), skipFormChangeCheck: true, stepName: 'Second step' }, { Component: (): JSX.Element => ( Step 3 ), skipFormChangeCheck: true, stepName: 'Third step' } ]} width="md" /> ); export const threeStepsWithCustomActionsBarLabels = (): JSX.Element => ( ( Step 1 ), skipFormChangeCheck: true, stepName: 'First step' }, { Component: (): JSX.Element => ( Step 2 ), skipFormChangeCheck: true, stepName: 'Second step' }, { Component: (): JSX.Element => ( Step 3 ), skipFormChangeCheck: true, stepName: 'Third step' } ]} width="md" /> ); export const threeStepsWithFullHeight = (): JSX.Element => ( ( Step 1 ), skipFormChangeCheck: true, stepName: 'First step' }, { Component: (): JSX.Element => ( Step 2 ), skipFormChangeCheck: true, stepName: 'Second step' }, { Component: (): JSX.Element => ( Step 3 ), skipFormChangeCheck: true, stepName: 'Third step' } ]} width="md" /> ); export const threeStepsWithCustomConfirmDialogLabels = (): JSX.Element => ( ( Step 1 ), skipFormChangeCheck: true, stepName: 'First step' }, { Component: (): JSX.Element => ( Step 2 ), skipFormChangeCheck: true, stepName: 'Second step' }, { Component: (): JSX.Element => ( Step 3 ), skipFormChangeCheck: true, stepName: 'Third step' } ]} width="md" /> ); export const twoStepsWithSendingRequest = (): JSX.Element => ( ( Sending request... ), skipFormChangeCheck: true, stepName: 'First step' }, { Component: (): JSX.Element => ( Step 2 ), skipFormChangeCheck: true, stepName: 'Second step' } ]} /> ); interface Values { email?: string; password?: string; } const FirstStepWithTextField = (): JSX.Element => { const { handleChange, handleBlur, values, errors, touched } = useFormikContext(); return ( ); }; const SecondStep = ({ disableNextOnSendingRequests }: StepComponentProps): JSX.Element => { const { setFieldValue, values, errors, touched, handleChange, handleBlur } = useFormikContext(); useEffect(() => { if (!values.password) { disableNextOnSendingRequests([true, false, true]); setTimeout(() => { disableNextOnSendingRequests([false, false, false]); setFieldValue('password', 'pwd'); }, 1000); } }, [disableNextOnSendingRequests, setFieldValue, values.password]); return ( ); }; const ThirdStep = (submitted: boolean): (() => JSX.Element) => { const Step = (): JSX.Element => { const { values } = useFormikContext(); return ( {!submitted ? JSON.stringify(values) : 'Values submitted'} ); }; return Step; }; const Form = (): JSX.Element => { const [submitted, setSubmitted] = useState(false); return ( { setTimeout(() => { setSubmitting(false); setSubmitted(true); }, 500); }} open steps={[ { Component: FirstStepWithTextField, stepName: 'First Step', validate: (values: Values): FormikErrors => { const errors: FormikErrors = {}; if (!values.email) { errors.email = 'Required'; } return errors; } }, { Component: SecondStep, stepName: 'Second Step', validate: (values: Values): FormikErrors => { const errors: FormikErrors = {}; if (!values.password) { errors.password = 'Required'; } else if (values.password.length < 6) { errors.password = 'Password too short'; } return errors; } }, { Component: ThirdStep(submitted), stepName: 'Third Step' } ]} /> ); }; export const wizardWithInputsAndValidation = (): JSX.Element =>
;