import { type ObjectAsyncGuard, type ObjectGuard } from '@astral/validations'; import { type FunctionComponent } from 'react'; import type { FieldErrors } from 'react-hook-form'; export type ChangeStepReason = 'prevStep' | 'nextStep'; export type AutoSaveStrategy = 'changeStep'; /** * Идентификатор шага формы. */ export type WizardStepId = string | number; export type WizardStep> = { /** * Идентификатор шага формы. */ id: WizardStepId; /** * Название шага */ label: string; /** * Схема валидации для полей этого шага. * Может быть синхронной (ObjectGuard) или асинхронной (ObjectAsyncGuard). */ validationSchema?: ObjectGuard | ObjectAsyncGuard; /** Компонент, который будет отображаться на этом шаге */ component: FunctionComponent; /** * Текст кнопки "Назад" для этого шага. */ prevButtonText?: string; /** * Функция вызывается если есть ошибка валидации при отправке формы или при переходе на следующий шаг */ onSubmitError?: (errors?: FieldErrors) => void; /** * Текст кнопки "Далее" для этого шага. */ nextButtonText?: string; /** * Условия для пропуска шага. * * @example * { * observableFields: ['fieldName'], * calculate: (formValues) => { * if (formValues?.fieldName === '1') * ) { * return true; * } * * return false; * }, * } */ shouldSkip?: { /** * Отслеживаемые поля */ observableFields: string[]; /** * Функция для определения, следует ли пропустить шаг * @param formValues - Текущее значение формы * @returns {boolean} - true, если шаг следует пропустить, иначе false */ calculate: (formValues: Partial | undefined) => boolean; }; };