export type WizardNavigation = | { readonly kind: "navigate"; readonly step: number } | { readonly kind: "blocked"; readonly step: number; readonly error: string }; const IDENTITY_STEP = 1; export const ADD_PROVIDER_WIZARD_STEPS = ["Driver", "Identity", "Config"] as const; /** * Resolve navigation within the add-provider wizard. * * Moving forward past Identity requires a valid instance id, whether the user * advances one step at a time or skips directly to Config from a step header. * A blocked skip lands on Identity so its existing inline validation is * visible. Backward navigation is always preserved. */ export function resolveWizardNavigation( currentStep: number, requestedStep: number, stepCount: number, validation: { readonly instanceIdError: string | null }, ): WizardNavigation { const lastStep = Math.max(0, stepCount - 1); const targetStep = Math.max(0, Math.min(lastStep, requestedStep)); const movesForwardPastIdentity = currentStep <= IDENTITY_STEP && targetStep > IDENTITY_STEP; if (movesForwardPastIdentity && validation.instanceIdError !== null) { return { kind: "blocked", step: Math.min(IDENTITY_STEP, lastStep), error: validation.instanceIdError, }; } return { kind: "navigate", step: targetStep }; }