wizzard-stepper-react 1.3.1 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +239 -34
- package/dist/index.cjs +482 -125
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +191 -23
- package/dist/index.d.ts +191 -23
- package/dist/index.js +484 -125
- package/dist/index.js.map +1 -1
- package/package.json +11 -7
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/context/WizardContext.tsx","../src/adapters/persistence/MemoryAdapter.ts","../src/utils/data.ts","../src/hooks/useWizard.ts","../src/adapters/persistence/LocalStorageAdapter.ts","../src/adapters/validation/ZodAdapter.ts","../src/adapters/validation/YupAdapter.ts"],"sourcesContent":["export * from './types';\nexport * from './context/WizardContext';\nexport * from './hooks/useWizard';\n\nexport * from './adapters/persistence/MemoryAdapter';\nexport * from './adapters/persistence/LocalStorageAdapter';\n\nexport * from './adapters/validation/ZodAdapter';\nexport * from './adapters/validation/YupAdapter';\nexport * from './utils/data';\n","import React, { createContext, useContext, useEffect, useMemo, useState, useCallback } from 'react';\nimport type {\n IWizardConfig,\n IWizardContext,\n PersistenceMode,\n IPersistenceAdapter,\n} from '../types';\nimport { MemoryAdapter } from '../adapters/persistence/MemoryAdapter';\nimport { getByPath, setByPath } from '../utils/data';\n\nconst WizardContext = createContext<IWizardContext<any> | undefined>(undefined);\n\ninterface WizardProviderProps<T> {\n config: IWizardConfig<T>;\n initialData?: T;\n children: React.ReactNode;\n}\n\nexport function WizardProvider<T extends Record<string, any>>({\n config,\n initialData,\n children,\n}: WizardProviderProps<T>) {\n const [currentStepId, setCurrentStepId] = useState<string>('');\n const [wizardData, setWizardData] = useState<T>((initialData || {}) as T);\n const [visitedSteps, setVisitedSteps] = useState<Set<string>>(new Set());\n const [completedSteps, setCompletedSteps] = useState<Set<string>>(new Set());\n const [errorSteps, setErrorSteps] = useState<Set<string>>(new Set());\n const [allErrors, setAllErrors] = useState<Record<string, Record<string, string>>>({});\n const [isLoading, setIsLoading] = useState<boolean>(true);\n\n // Persistence Setup\n const persistenceAdapter = useMemo<IPersistenceAdapter>(() => {\n return config.persistence?.adapter || new MemoryAdapter();\n }, [config.persistence?.adapter]);\n\n const persistenceMode = config.persistence?.mode || 'onStepChange';\n\n // Calculate Active Steps (Conditional Logic)\n const activeSteps = useMemo(() => {\n return config.steps.filter((step) => {\n if (step.condition) {\n return step.condition(wizardData);\n }\n return true;\n });\n }, [config.steps, wizardData]);\n\n // Set initial step if not set\n useEffect(() => {\n if (!currentStepId && activeSteps.length > 0) {\n setCurrentStepId(activeSteps[0].id);\n setIsLoading(false);\n }\n }, [activeSteps, currentStepId]);\n\n // Derived state\n const currentStep = useMemo(() => activeSteps.find((s) => s.id === currentStepId) || null, [activeSteps, currentStepId]);\n const currentStepIndex = useMemo(() => activeSteps.findIndex((s) => s.id === currentStepId), [activeSteps, currentStepId]);\n const isFirstStep = currentStepIndex === 0;\n const isLastStep = currentStepIndex === activeSteps.length - 1;\n\n // Constants\n const META_KEY = '__wizzard_meta__';\n\n // Hydration Helper\n const hydrate = useCallback(() => {\n setIsLoading(true);\n \n // 1. Load Metadata (Current Step, Visited, etc.)\n const metaFn = persistenceAdapter.getStep<{\n currentStepId: string;\n visited: string[];\n completed: string[];\n }>(META_KEY);\n\n if (metaFn) {\n if (metaFn.currentStepId) setCurrentStepId(metaFn.currentStepId);\n if (metaFn.visited) setVisitedSteps(new Set(metaFn.visited));\n if (metaFn.completed) setCompletedSteps(new Set(metaFn.completed));\n }\n\n // 2. Load Data\n // We assume data is distributed across steps OR stored centrally.\n // Given the current implementation saves 'wizardData' to each stepId, \n // we can iterate steps.\n const loadedData: Partial<T> = {};\n config.steps.forEach(step => {\n const stepData = persistenceAdapter.getStep(step.id);\n if (stepData) {\n Object.assign(loadedData, stepData);\n }\n });\n\n if (Object.keys(loadedData).length > 0) {\n setWizardData(prev => ({ ...prev, ...loadedData }));\n }\n setIsLoading(false);\n }, [config.steps, persistenceAdapter]);\n\n useEffect(() => {\n hydrate();\n }, [hydrate]);\n\n // Save logic\n const saveData = useCallback((mode: PersistenceMode, stepId: string, data: any) => {\n if (mode === persistenceMode || mode === 'manual') {\n persistenceAdapter.saveStep(stepId, data);\n \n // Also save metadata whenever we save data (if appropriate)\n // Or we can save metadata explicitly on navigation.\n }\n }, [persistenceAdapter, persistenceMode]);\n\n // Explicit Metadata Save\n\n // Action: Set Step Data\n const setStepData = useCallback((stepId: string, data: any) => {\n setWizardData((prev) => {\n const newData = { ...prev, ...data };\n // Save if mode is 'onChange'\n if (persistenceMode === 'onChange') {\n // We must save the FULL new data, not just the partial 'data' update, \n // otherwise we overwrite the storage with just the single field.\n saveData('onChange', stepId, newData); \n }\n return newData;\n });\n }, [persistenceMode, saveData]);\n\n // Action: Set Data by Path\n const setData = useCallback((path: string, value: any) => {\n setWizardData((prev) => {\n const newData = setByPath(prev, path, value);\n \n if (persistenceMode === 'onChange') {\n saveData('onChange', currentStepId, newData);\n }\n return newData;\n });\n }, [persistenceMode, saveData, currentStepId]);\n\n // Action: Get Data by Path\n const getData = useCallback((path: string, defaultValue?: any) => {\n return getByPath(wizardData, path, defaultValue);\n }, [wizardData]);\n\n // Action: Handle specific field change (helper)\n const handleStepChange = useCallback((field: string, value: any) => {\n if (!currentStepId) return;\n setData(field, value);\n }, [setData, currentStepId]);\n \n // Validation Logic\n const validateStep = useCallback(async (stepId: string): Promise<boolean> => {\n const step = config.steps.find(s => s.id === stepId);\n if (!step) return true;\n \n // Check if adapter exists\n if (!step.validationAdapter) return true;\n\n const result = await step.validationAdapter.validate(wizardData);\n \n if (!result.isValid) {\n setAllErrors(prev => ({\n ...prev,\n [stepId]: result.errors || {}\n }));\n setErrorSteps(prev => new Set(prev).add(stepId));\n return false;\n } else {\n setAllErrors(prev => {\n const next = { ...prev };\n delete next[stepId];\n return next;\n });\n setErrorSteps(prev => {\n const next = new Set(prev);\n next.delete(stepId);\n return next;\n });\n return true;\n }\n }, [config.steps, wizardData]);\n\n const validateAll = useCallback(async (): Promise<boolean> => {\n let isValid = true;\n for (const step of activeSteps) {\n const stepValid = await validateStep(step.id);\n if (!stepValid) isValid = false;\n }\n return isValid;\n }, [activeSteps, validateStep]);\n\n // Navigation\n const goToStep = useCallback(async (stepId: string): Promise<boolean> => {\n const targetIndex = activeSteps.findIndex(s => s.id === stepId);\n if (targetIndex === -1) return false;\n\n // If moving forward, validate current\n if (targetIndex > currentStepIndex) {\n const shouldValidate = currentStep?.autoValidate ?? config.autoValidate ?? true;\n if (shouldValidate) {\n const isValid = await validateStep(currentStepId);\n if (!isValid) return false; // Block\n }\n }\n \n // Save current step data logic\n if (persistenceMode === 'onStepChange' && currentStep) {\n saveData('onStepChange', currentStepId, wizardData); \n }\n\n // Update State\n const nextVisited = new Set(visitedSteps).add(currentStepId);\n setVisitedSteps(nextVisited);\n setCurrentStepId(stepId);\n \n // Persist Metadata (New Step Position)\n // We need to pass the *new* values because state updates are async\n if (persistenceMode !== 'manual') {\n persistenceAdapter.saveStep(META_KEY, {\n currentStepId: stepId,\n visited: Array.from(nextVisited),\n completed: Array.from(completedSteps)\n });\n }\n\n window.scrollTo(0, 0);\n return true;\n }, [activeSteps, currentStepId, currentStep, currentStepIndex, config.autoValidate, persistenceMode, saveData, wizardData, validateStep, visitedSteps, completedSteps, persistenceAdapter]);\n\n const goToNextStep = useCallback(async () => {\n if (isLastStep) return;\n const nextStep = activeSteps[currentStepIndex + 1];\n if (nextStep) {\n // Validation happens inside goToStep. If it fails, we shouldn't mark as completed.\n const success = await goToStep(nextStep.id);\n \n if (success) {\n // Mark completed logic ONLY on success\n const nextCompleted = new Set(completedSteps).add(currentStepId);\n setCompletedSteps(nextCompleted);\n \n // We need to update metadata again to include the new 'completed' status.\n // The previous save in goToStep didn't know about this new completion.\n if (persistenceMode !== 'manual') {\n persistenceAdapter.saveStep(META_KEY, {\n currentStepId: nextStep.id,\n visited: Array.from(new Set(visitedSteps).add(currentStepId)),\n completed: Array.from(nextCompleted) // Updated completed steps\n });\n }\n }\n }\n }, [activeSteps, currentStepIndex, isLastStep, currentStepId, goToStep, visitedSteps, completedSteps, persistenceMode, persistenceAdapter]);\n\n const goToPrevStep = useCallback(() => {\n if (isFirstStep) return;\n const prevStep = activeSteps[currentStepIndex - 1];\n if (prevStep) {\n goToStep(prevStep.id);\n }\n }, [activeSteps, currentStepIndex, isFirstStep, goToStep]);\n\n // Context Value\n const value = {\n currentStep,\n currentStepIndex,\n isFirstStep,\n isLastStep,\n isLoading,\n activeSteps,\n wizardData,\n allErrors,\n visitedSteps,\n completedSteps,\n errorSteps,\n goToNextStep,\n goToPrevStep,\n goToStep,\n setStepData,\n handleStepChange,\n validateStep,\n validateAll,\n save: useCallback(() => saveData('manual', currentStepId, wizardData), [saveData, currentStepId, wizardData]),\n clearStorage: useCallback(() => persistenceAdapter.clear(), [persistenceAdapter]),\n setData,\n getData,\n };\n\n return <WizardContext.Provider value={value}>{children}</WizardContext.Provider>;\n}\n\nexport function useWizardContext<T = any>() {\n const context = useContext(WizardContext);\n if (!context) {\n throw new Error('useWizardContext must be used within a WizardProvider');\n }\n return context as IWizardContext<T>;\n}\n","import type { IPersistenceAdapter } from '../../types';\n\nexport class MemoryAdapter implements IPersistenceAdapter {\n private storage: Record<string, any> = {};\n\n saveStep<T>(stepId: string, data: T): void {\n this.storage[stepId] = data;\n }\n\n getStep<T>(stepId: string): T | undefined {\n return this.storage[stepId] as T;\n }\n\n clear(): void {\n this.storage = {};\n }\n}\n","/**\n * Retrieves a value from an object by path (dot notation or brackets)\n */\nexport function getByPath(obj: any, path: string, defaultValue?: any): any {\n if (!path) return obj;\n const keys = path.replace(/\\[(\\d+)\\]/g, '.$1').split('.').filter(Boolean);\n let result = obj;\n for (const key of keys) {\n if (result === undefined || result === null) return defaultValue;\n result = result[key];\n }\n return result !== undefined ? result : defaultValue;\n}\n\n/**\n * Immutably sets a value in an object by path\n */\nexport function setByPath<T extends object>(obj: T, path: string, value: any): T {\n if (!path) return value as unknown as T;\n const keys = path.replace(/\\[(\\d+)\\]/g, '.$1').split('.').filter(Boolean);\n\n const update = (current: any, index: number): any => {\n if (index === keys.length) return value;\n\n const key = keys[index];\n const isKeyNumeric = !isNaN(Number(key)) && key.trim() !== '';\n\n let nextLevel = current;\n if (!nextLevel || typeof nextLevel !== 'object') {\n nextLevel = isKeyNumeric ? [] : {};\n } else {\n nextLevel = Array.isArray(nextLevel) ? [...nextLevel] : { ...nextLevel };\n }\n\n const nextKey = isKeyNumeric ? Number(key) : key;\n nextLevel[nextKey] = update(nextLevel[nextKey], index + 1);\n return nextLevel;\n };\n\n return update(obj, 0);\n}\n","import { useWizardContext } from '../context/WizardContext';\n\nexport const useWizard = <T = any>() => {\n return useWizardContext<T>();\n};\n","import type { IPersistenceAdapter } from '../../types';\n\nexport class LocalStorageAdapter implements IPersistenceAdapter {\n private prefix: string;\n\n constructor(prefix: string = 'wizard_') {\n this.prefix = prefix;\n }\n\n private getKey(stepId: string): string {\n return `${this.prefix}${stepId}`;\n }\n\n saveStep<T>(stepId: string, data: T): void {\n if (typeof window === 'undefined') return;\n try {\n localStorage.setItem(this.getKey(stepId), JSON.stringify(data));\n } catch (error) {\n console.warn('LocalStorageAdapter: Failed to save step', error);\n }\n }\n\n getStep<T>(stepId: string): T | undefined {\n if (typeof window === 'undefined') return undefined;\n try {\n const item = localStorage.getItem(this.getKey(stepId));\n return item ? JSON.parse(item) : undefined;\n } catch (error) {\n console.warn('LocalStorageAdapter: Failed to get step', error);\n return undefined;\n }\n }\n\n clear(): void {\n if (typeof window === 'undefined') return;\n Object.keys(localStorage).forEach((key) => {\n if (key.startsWith(this.prefix)) {\n localStorage.removeItem(key);\n }\n });\n }\n}\n","import type { IValidatorAdapter, ValidationResult } from '../../types';\nimport { ZodType } from 'zod';\n\nexport class ZodAdapter<T> implements IValidatorAdapter<T> {\n private schema: ZodType<T>;\n\n constructor(schema: ZodType<T>) {\n this.schema = schema;\n }\n\n async validate(data: T): Promise<ValidationResult> {\n const result = await this.schema.safeParseAsync(data);\n if (result.success) {\n return { isValid: true };\n }\n\n // Explicitly handle error case\n const errors: Record<string, string> = {};\n result.error.issues.forEach((err) => {\n const path = err.path.join('.'); // nested.field\n errors[path] = err.message;\n });\n return { isValid: false, errors };\n }\n}\n","import type { IValidatorAdapter, ValidationResult } from '../../types';\nimport { Schema, ValidationError } from 'yup';\n\nexport class YupAdapter<T> implements IValidatorAdapter<T> {\n private schema: Schema<T>;\n\n constructor(schema: Schema<T>) {\n this.schema = schema;\n }\n\n async validate(data: T): Promise<ValidationResult> {\n try {\n await this.schema.validate(data, { abortEarly: false });\n return { isValid: true };\n } catch (err) {\n if (err instanceof ValidationError) {\n const errors: Record<string, string> = {};\n err.inner.forEach((error) => {\n if (error.path) {\n errors[error.path] = error.message;\n }\n });\n return { isValid: false, errors };\n }\n throw err;\n }\n }\n}\n"],"mappings":"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","names":["value"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/context/WizardContext.tsx","../src/adapters/persistence/MemoryAdapter.ts","../src/utils/data.ts","../src/components/WizardStepRenderer.tsx","../src/hooks/useWizard.ts","../src/factory.tsx","../src/adapters/persistence/LocalStorageAdapter.ts","../src/adapters/validation/ZodAdapter.ts","../src/adapters/validation/YupAdapter.ts"],"sourcesContent":["export * from './types';\nexport * from './context/WizardContext';\n\n// Components\nexport { WizardStepRenderer } from \"./components/WizardStepRenderer\";\n\n// Utils\nexport { createWizardFactory } from \"./factory\";\nexport * from './hooks/useWizard';\n\nexport * from './adapters/persistence/MemoryAdapter';\nexport * from './adapters/persistence/LocalStorageAdapter';\n\nexport * from './adapters/validation/ZodAdapter';\nexport * from './adapters/validation/YupAdapter';\nexport * from './utils/data';\n","import React, {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useState,\n useCallback,\n useSyncExternalStore,\n useRef,\n useTransition,\n} from \"react\";\nimport type {\n IWizardConfig,\n PersistenceMode,\n IPersistenceAdapter,\n IStepConfig,\n IWizardContext,\n} from \"../types\";\nimport { MemoryAdapter } from \"../adapters/persistence/MemoryAdapter\";\nimport { getByPath, setByPath } from \"../utils/data\";\n\nexport interface IWizardState<T = unknown> {\n currentStep: IStepConfig<unknown, T> | null;\n currentStepIndex: number;\n isFirstStep: boolean;\n isLastStep: boolean;\n isLoading: boolean;\n isPending: boolean;\n activeSteps: IStepConfig<unknown, T>[];\n visitedSteps: Set<string>;\n completedSteps: Set<string>;\n errorSteps: Set<string>;\n store: WizardStore<T>;\n}\n\nexport interface IWizardActions {\n goToNextStep: () => Promise<void>;\n goToPrevStep: () => void;\n goToStep: (stepId: string) => Promise<boolean>;\n setStepData: (stepId: string, data: unknown) => void;\n handleStepChange: (field: string, value: unknown) => void;\n validateStep: (sid: string) => Promise<boolean>;\n validateAll: () => Promise<{\n isValid: boolean;\n errors: Record<string, Record<string, string>>;\n }>;\n save: () => void;\n clearStorage: () => void;\n setData: (\n path: string,\n value: unknown,\n options?: { debounceValidation?: number }\n ) => void;\n updateData: (data: Partial<any>, options?: { replace?: boolean }) => void;\n getData: (path: string, defaultValue?: unknown) => unknown;\n}\n\nconst WizardStateContext = createContext<IWizardState<any> | undefined>(\n undefined\n);\nconst WizardActionsContext = createContext<IWizardActions | undefined>(\n undefined\n);\n\n// Advanced: Store for granular subscriptions\nexport class WizardStore<T> {\n private state: { data: T; errors: Record<string, Record<string, string>> };\n private listeners: Set<() => void> = new Set();\n\n constructor(initialData: T) {\n this.state = { data: initialData, errors: {} };\n }\n\n getSnapshot = () => this.state;\n\n update(newData: T) {\n this.state = { ...this.state, data: newData };\n this.notify();\n }\n\n updateErrors(newErrors: Record<string, Record<string, string>>) {\n this.state = { ...this.state, errors: newErrors };\n this.notify();\n }\n\n private notify() {\n this.listeners.forEach((l) => l());\n }\n\n subscribe = (listener: () => void) => {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n };\n}\n\ninterface WizardProviderProps<T> {\n config: IWizardConfig<T>;\n initialData?: T;\n initialStepId?: string; // New: Start from any step\n children: React.ReactNode;\n}\n\nexport function WizardProvider<T extends Record<string, any>>({\n config,\n initialData,\n initialStepId,\n children,\n}: WizardProviderProps<T>) {\n const [currentStepId, setCurrentStepId] = useState<string>(\"\");\n const [visitedSteps, setVisitedSteps] = useState<Set<string>>(new Set());\n const [completedSteps, setCompletedSteps] = useState<Set<string>>(new Set());\n const [errorSteps, setErrorSteps] = useState<Set<string>>(new Set());\n const [, setAllErrorsState] = useState<\n Record<string, Record<string, string>>\n >({});\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [isPending, startTransition] = useTransition();\n\n // Store for granular data and errors\n const storeRef = useRef(new WizardStore<T>((initialData || {}) as T));\n\n // local state for dependencies\n const [wizardData, setWizardData] = useState<T>((initialData || {}) as T);\n\n // Persistence Setup\n const persistenceAdapter = useMemo<IPersistenceAdapter>(() => {\n return config.persistence?.adapter || new MemoryAdapter();\n }, [config.persistence?.adapter]);\n\n const persistenceMode = config.persistence?.mode || \"onStepChange\";\n\n // Calculate Active Steps (Conditional Logic) - Stabilized to prevent global re-renders\n const [activeSteps, setActiveSteps] = useState(() =>\n config.steps.filter((s) => !s.condition || s.condition(wizardData))\n );\n\n useEffect(() => {\n const nextActiveSteps = config.steps.filter((step) => {\n if (step.condition) {\n return step.condition(wizardData);\n }\n return true;\n });\n\n // Simple ID check for stability\n const currentIds = activeSteps.map((s) => s.id).join(\",\");\n const nextIds = nextActiveSteps.map((s) => s.id).join(\",\");\n\n if (currentIds !== nextIds) {\n setActiveSteps(nextActiveSteps);\n }\n }, [config.steps, wizardData, activeSteps]);\n\n // Set initial step if not set (with optional initialStepId)\n useEffect(() => {\n if (!currentStepId && activeSteps.length > 0) {\n if (initialStepId) {\n // Validation: verify initialStepId exists in active steps\n const target = activeSteps.find((s) => s.id === initialStepId);\n if (target) {\n setCurrentStepId(target.id);\n } else {\n // Fallback if initial is invalid/hidden\n setCurrentStepId(activeSteps[0].id);\n }\n } else {\n setCurrentStepId(activeSteps[0].id);\n }\n setIsLoading(false);\n }\n }, [activeSteps, currentStepId, initialStepId]);\n\n // Derived state\n const currentStep = useMemo(\n () => activeSteps.find((s) => s.id === currentStepId) || null,\n [activeSteps, currentStepId]\n );\n const currentStepIndex = useMemo(\n () => activeSteps.findIndex((s) => s.id === currentStepId),\n [activeSteps, currentStepId]\n );\n const isFirstStep = currentStepIndex === 0;\n const isLastStep = currentStepIndex === activeSteps.length - 1;\n\n // Constants\n const META_KEY = \"__wizzard_meta__\";\n\n // Hydration Helper\n const hydrate = useCallback(() => {\n setIsLoading(true);\n\n const metaFn = persistenceAdapter.getStep<{\n currentStepId: string;\n visited: string[];\n completed: string[];\n }>(META_KEY);\n\n if (metaFn) {\n if (metaFn.currentStepId) setCurrentStepId(metaFn.currentStepId);\n if (metaFn.visited) setVisitedSteps(new Set(metaFn.visited));\n if (metaFn.completed) setCompletedSteps(new Set(metaFn.completed));\n }\n\n const loadedData: Partial<T> = {};\n config.steps.forEach((step) => {\n const stepData = persistenceAdapter.getStep(step.id);\n if (stepData) {\n Object.assign(loadedData, stepData);\n }\n });\n\n if (Object.keys(loadedData).length > 0) {\n setWizardData((prev) => {\n const newData = { ...prev, ...loadedData };\n storeRef.current.update(newData);\n return newData;\n });\n }\n setIsLoading(false);\n }, [config.steps, persistenceAdapter]);\n\n useEffect(() => {\n hydrate();\n }, [hydrate]);\n\n // Save logic stabilized\n const saveData = useCallback(\n (mode: PersistenceMode, stepId: string, data: any) => {\n // Granular Check: Does the current step have a custom adapter?\n const stepConfig = config.steps.find((s) => s.id === stepId);\n const stepAdapter = stepConfig?.persistenceAdapter;\n\n // Determine which adapter to use (Granular > Global > Default)\n const adapterToUse = stepAdapter || persistenceAdapter;\n\n if (mode === persistenceMode || mode === \"manual\") {\n adapterToUse.saveStep(stepId, data);\n }\n },\n [persistenceAdapter, persistenceMode, config.steps]\n );\n\n // Debounce timeout for validation\n const validationTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n\n const validateStep = useCallback(\n async (stepId: string, data: T): Promise<boolean> => {\n const step = config.steps.find((s) => s.id === stepId);\n if (!step || !step.validationAdapter) return true;\n\n const result = await step.validationAdapter.validate(data);\n\n if (!result.isValid) {\n const newAllErrors = {\n ...storeRef.current.getSnapshot().errors,\n [stepId]: result.errors || {},\n };\n storeRef.current.updateErrors(newAllErrors);\n setAllErrorsState(newAllErrors);\n setErrorSteps((prev) => {\n const next = new Set(prev);\n next.add(stepId);\n return next;\n });\n return false;\n } else {\n const newAllErrors = { ...storeRef.current.getSnapshot().errors };\n delete newAllErrors[stepId];\n storeRef.current.updateErrors(newAllErrors);\n setAllErrorsState(newAllErrors);\n setErrorSteps((prev) => {\n const next = new Set(prev);\n next.delete(stepId);\n return next;\n });\n return true;\n }\n },\n [config.steps]\n );\n\n // Actions stabilized with useCallback\n const setStepData = useCallback(\n (stepId: string, data: any) => {\n const prevData = storeRef.current.getSnapshot().data;\n const newData = { ...prevData, ...data };\n\n storeRef.current.update(newData);\n startTransition(() => {\n setWizardData(newData);\n });\n\n if (persistenceMode === \"onChange\") {\n saveData(\"onChange\", stepId, newData);\n }\n },\n [persistenceMode, saveData]\n );\n\n const setData = useCallback(\n (path: string, value: any, options?: { debounceValidation?: number }) => {\n const prevData = storeRef.current.getSnapshot().data;\n const newData = setByPath(prevData, path, value);\n\n // 1. Immediate store update (for useWizardValue)\n storeRef.current.update(newData);\n\n // 2. Transition update (for useWizardState/Summary)\n startTransition(() => {\n setWizardData(newData);\n });\n\n // 3. Debounced validation logic\n if (options?.debounceValidation) {\n if (validationTimeoutRef.current)\n clearTimeout(validationTimeoutRef.current);\n validationTimeoutRef.current = setTimeout(() => {\n try {\n validateStep(currentStepId, newData).catch((err) => {\n console.error(\"[Wizard] Debounced validation failed:\", err);\n });\n } catch (e) {\n console.error(\"[Wizard] Error starting validation:\", e);\n }\n }, options.debounceValidation);\n } else {\n validateStep(currentStepId, newData);\n }\n\n if (persistenceMode === \"onChange\") {\n saveData(\"onChange\", currentStepId, newData);\n }\n },\n [persistenceMode, saveData, currentStepId, validateStep]\n );\n\n const updateData = useCallback(\n (data: Partial<T>, options?: { replace?: boolean }) => {\n const prevData = storeRef.current.getSnapshot().data;\n const newData = options?.replace ? (data as T) : { ...prevData, ...data };\n\n // 1. Update Store\n storeRef.current.update(newData);\n\n // 2. Update React State\n startTransition(() => {\n setWizardData(newData);\n });\n\n // 3. Persist\n // Auto-fill should implicitly update storage regardless of mode\n config.steps.forEach((step) => {\n saveData(\"manual\", step.id, newData);\n });\n },\n [saveData, config.steps]\n );\n\n const getData = useCallback((path: string, defaultValue?: any) => {\n return getByPath(storeRef.current.getSnapshot().data, path, defaultValue);\n }, []);\n\n // Action: Handle specific field change (helper)\n const handleStepChange = useCallback(\n (field: string, value: any) => {\n if (!currentStepId) return;\n setData(field, value);\n },\n [setData, currentStepId]\n );\n\n const validateAll = useCallback(async (): Promise<{\n isValid: boolean;\n errors: Record<string, Record<string, string>>;\n }> => {\n let isValid = true;\n const currentData = storeRef.current.getSnapshot().data;\n for (const step of activeSteps) {\n const stepValid = await validateStep(step.id, currentData);\n if (!stepValid) isValid = false;\n }\n const finalErrors = storeRef.current.getSnapshot().errors;\n return { isValid, errors: finalErrors };\n }, [activeSteps, validateStep]);\n\n const goToStep = useCallback(\n async (stepId: string): Promise<boolean> => {\n const targetIndex = activeSteps.findIndex((s) => s.id === stepId);\n if (targetIndex === -1) return false;\n\n const currentData = storeRef.current.getSnapshot().data;\n\n if (targetIndex > currentStepIndex) {\n const shouldValidate =\n currentStep?.autoValidate ?? config.autoValidate ?? true;\n if (shouldValidate) {\n const isValid = await validateStep(currentStepId, currentData);\n if (!isValid) return false;\n }\n }\n\n if (persistenceMode === \"onStepChange\" && currentStep) {\n saveData(\"onStepChange\", currentStepId, currentData);\n }\n\n const nextVisited = new Set(visitedSteps).add(currentStepId);\n setVisitedSteps(nextVisited);\n setCurrentStepId(stepId);\n\n if (persistenceMode !== \"manual\") {\n persistenceAdapter.saveStep(META_KEY, {\n currentStepId: stepId,\n visited: Array.from(nextVisited),\n completed: Array.from(completedSteps),\n });\n }\n\n // Lifecycle Callback\n if (config.onStepChange) {\n config.onStepChange(currentStepId, stepId, currentData); // Call hook\n }\n\n window.scrollTo(0, 0);\n return true;\n },\n [\n activeSteps,\n currentStepId,\n currentStep,\n currentStepIndex,\n config.autoValidate,\n persistenceMode,\n saveData,\n validateStep,\n visitedSteps,\n completedSteps,\n persistenceAdapter,\n ]\n );\n\n const goToNextStep = useCallback(async () => {\n if (isLastStep) return;\n const nextStep = activeSteps[currentStepIndex + 1];\n if (nextStep) {\n const success = await goToStep(nextStep.id);\n if (success) {\n const nextCompleted = new Set(completedSteps).add(currentStepId);\n setCompletedSteps(nextCompleted);\n\n if (persistenceMode !== \"manual\") {\n persistenceAdapter.saveStep(META_KEY, {\n currentStepId: nextStep.id,\n visited: Array.from(new Set(visitedSteps).add(currentStepId)),\n completed: Array.from(nextCompleted),\n });\n }\n }\n }\n }, [\n activeSteps,\n currentStepIndex,\n isLastStep,\n currentStepId,\n goToStep,\n visitedSteps,\n completedSteps,\n persistenceMode,\n persistenceAdapter,\n ]);\n\n const goToPrevStep = useCallback(() => {\n if (isFirstStep) return;\n const prevStep = activeSteps[currentStepIndex - 1];\n if (prevStep) {\n goToStep(prevStep.id);\n }\n }, [activeSteps, currentStepIndex, isFirstStep, goToStep]);\n\n const clearStorage = useCallback(\n () => persistenceAdapter.clear(),\n [persistenceAdapter]\n );\n\n const save = useCallback(\n () =>\n saveData(\"manual\", currentStepId, storeRef.current.getSnapshot().data),\n [saveData, currentStepId]\n );\n\n // Split values\n const stateValue = useMemo<IWizardState<T>>(\n () => ({\n currentStep,\n currentStepIndex,\n isFirstStep,\n isLastStep,\n isLoading,\n isPending,\n activeSteps,\n visitedSteps,\n completedSteps,\n errorSteps,\n store: storeRef.current,\n }),\n [\n currentStep,\n currentStepIndex,\n isFirstStep,\n isLastStep,\n isLoading,\n isPending,\n activeSteps,\n visitedSteps,\n completedSteps,\n errorSteps,\n ]\n );\n\n const actionsValue = useMemo<IWizardActions>(\n () => ({\n goToNextStep,\n goToPrevStep,\n goToStep,\n setStepData,\n handleStepChange,\n validateStep: (sid: string) =>\n validateStep(sid, storeRef.current.getSnapshot().data),\n validateAll,\n save,\n clearStorage,\n setData,\n updateData,\n getData,\n }),\n [\n goToNextStep,\n goToPrevStep,\n goToStep,\n setStepData,\n handleStepChange,\n validateStep,\n validateAll,\n save,\n clearStorage,\n setData,\n updateData,\n getData,\n ]\n );\n\n return (\n <WizardStateContext.Provider value={stateValue}>\n <WizardActionsContext.Provider value={actionsValue}>\n {children}\n </WizardActionsContext.Provider>\n </WizardStateContext.Provider>\n );\n}\n\nexport function useWizardState<T = unknown>(): IWizardState<T> {\n const context = useContext(WizardStateContext);\n if (!context) {\n throw new Error(\"useWizardState must be used within a WizardProvider\");\n }\n return context as IWizardState<T>;\n}\n\nexport function useWizardValue<TValue = any>(path: string): TValue {\n const { store } = useWizardState();\n const lastStateRef = useRef<any>(null);\n const lastValueRef = useRef<any>(null);\n\n const getSnapshot = useCallback(() => {\n const fullState = store.getSnapshot();\n const data = fullState.data;\n if (data === lastStateRef.current) {\n return lastValueRef.current;\n }\n const value = getByPath(data, path);\n lastStateRef.current = data;\n lastValueRef.current = value;\n return value;\n }, [store, path]);\n\n return useSyncExternalStore(store.subscribe, getSnapshot);\n}\n\nexport function useWizardError(path: string): string | undefined {\n const { store } = useWizardState();\n const lastStateRef = useRef<any>(null);\n const lastValueRef = useRef<any>(null);\n\n const getSnapshot = useCallback(() => {\n const fullState = store.getSnapshot();\n const errors = fullState.errors;\n if (errors === lastStateRef.current) {\n return lastValueRef.current;\n }\n\n // Flatten errors from all steps or use a specific step?\n // Usually validation results are nested like { children: { \"0.name\": \"error\" } }\n // but the adapter flattened them to \"children.0.name\"\n let foundError: string | undefined;\n Object.values(errors).forEach((stepErrors) => {\n const typedStepErrors = stepErrors as Record<string, string>;\n if (typedStepErrors[path]) foundError = typedStepErrors[path];\n });\n\n lastStateRef.current = errors;\n lastValueRef.current = foundError;\n return foundError;\n }, [store, path]);\n\n return useSyncExternalStore(store.subscribe, getSnapshot);\n}\n\nexport function useWizardSelector<TSelected = any>(\n selector: (state: any) => TSelected\n): TSelected {\n const { store } = useWizardState();\n const lastStateRef = useRef<any>(null);\n const lastResultRef = useRef<any>(null);\n\n const getSnapshot = useCallback(() => {\n const fullState = store.getSnapshot();\n if (fullState === lastStateRef.current) {\n return lastResultRef.current;\n }\n // We pass only data to the selector for convenience, or the whole store state?\n // Let's pass the whole thing in case they need errors\n const result = selector(fullState.data);\n lastStateRef.current = fullState;\n lastResultRef.current = result;\n return result;\n }, [store, selector]);\n\n return useSyncExternalStore(store.subscribe, getSnapshot);\n}\n\nexport function useWizardActions(): IWizardActions {\n const context = useContext(WizardActionsContext);\n if (!context) {\n throw new Error(\"useWizardActions must be used within a WizardProvider\");\n }\n return context;\n}\n\nexport function useWizardContext<T = any>(): IWizardContext<T> & {\n store: WizardStore<T>;\n} {\n const state = useWizardState<T>();\n const actions = useWizardActions();\n\n // Backward compatibility: subscribe to everything\n const wizardData = useWizardSelector<T>((s) => s as T);\n const fullState = state.store.getSnapshot();\n\n return useMemo(\n () => ({\n ...state,\n ...actions,\n wizardData,\n allErrors: fullState.errors,\n }),\n [state, actions, wizardData, fullState.errors]\n );\n}\n","import type { IPersistenceAdapter } from '../../types';\n\nexport class MemoryAdapter implements IPersistenceAdapter {\n private storage: Record<string, any> = {};\n\n saveStep<T>(stepId: string, data: T): void {\n this.storage[stepId] = data;\n }\n\n getStep<T>(stepId: string): T | undefined {\n return this.storage[stepId] as T;\n }\n\n clear(): void {\n this.storage = {};\n }\n}\n","/**\n * Retrieves a value from an object by path (dot notation or brackets)\n */\nexport function getByPath(obj: any, path: string, defaultValue?: unknown): unknown {\n if (!path) return obj;\n const keys = path.replace(/\\[(\\d+)\\]/g, '.$1').split('.').filter(Boolean);\n let result = obj;\n for (const key of keys) {\n if (result === undefined || result === null) return defaultValue;\n result = result[key];\n }\n return result !== undefined ? result : defaultValue;\n}\n\n/**\n * Immutably sets a value in an object by path\n */\nexport function setByPath<T extends object>(obj: T, path: string, value: unknown): T {\n if (!path) return value as unknown as T;\n if (!path.includes('.') && !path.includes('[') && !path.includes(']')) {\n return { ...obj, [path]: value };\n }\n const keys = path.replace(/\\[(\\d+)\\]/g, '.$1').split('.').filter(Boolean);\n\n const update = (current: any, index: number): any => {\n if (index === keys.length) return value;\n\n const key = keys[index];\n const isKeyNumeric = !isNaN(Number(key)) && key.trim() !== '';\n\n let nextLevel = current;\n if (!nextLevel || typeof nextLevel !== 'object') {\n nextLevel = isKeyNumeric ? [] : {};\n } else {\n nextLevel = Array.isArray(nextLevel) ? [...nextLevel] : { ...nextLevel };\n }\n\n const nextKey = isKeyNumeric ? Number(key) : key;\n nextLevel[nextKey] = update(nextLevel[nextKey], index + 1);\n return nextLevel;\n };\n\n return update(obj, 0);\n}\n","import React, { useMemo } from \"react\";\nimport { useWizardContext } from \"../context/WizardContext\";\n\ninterface WizardStepRendererProps {\n /**\n * Optional wrapper component for each step.\n * Useful for adding animations (e.g., Framer Motion).\n */\n wrapper?: React.ComponentType<{ children: React.ReactNode; key: string }>;\n}\n\n/**\n * A declarative component that renders the current step based on the configuration.\n * It looks for the `component` property in your `steps` config.\n */\nexport const WizardStepRenderer: React.FC<WizardStepRendererProps> = ({\n wrapper: Wrapper,\n}) => {\n const { currentStep } = useWizardContext();\n\n const StepComponent = useMemo(() => {\n if (!currentStep?.component) return null;\n return currentStep.component;\n }, [currentStep]);\n\n if (!currentStep || !StepComponent) {\n return null;\n }\n\n const content = <StepComponent />;\n\n if (Wrapper) {\n return <Wrapper key={currentStep.id}>{content}</Wrapper>;\n }\n\n return content;\n};\n","import { useWizardContext } from '../context/WizardContext';\nimport type { IWizardContext } from '../types';\n\nexport const useWizard = <T = any>(): IWizardContext<T> => {\n return useWizardContext<T>();\n};\n","import React from \"react\";\nimport {\n WizardProvider as BaseWizardProvider,\n useWizardContext as useBaseWizardContext,\n useWizardValue as useBaseWizardValue,\n useWizardSelector as useBaseWizardSelector,\n useWizardError as useBaseWizardError,\n useWizardActions as useBaseWizardActions,\n useWizardState as useBaseWizardState,\n} from \"./context/WizardContext\";\nimport { useWizard as useBaseWizard } from \"./hooks/useWizard\";\nimport type { IWizardConfig, IWizardContext, IStepConfig } from \"./types\";\nimport type { Path, PathValue } from \"./utils/types\";\n\n/**\n * createWizardFactory\n *\n * Creates a strongly-typed set of Wizard components and hooks for a specific data schema.\n * This ensures full type safety across your entire wizard implementation without manual casting.\n *\n * @template TSchema The shape of your wizard's global data state\n */\nexport function createWizardFactory<TSchema extends Record<string, any>>() {\n /**\n * Typed Provider\n */\n const WizardProvider = ({\n config,\n initialData,\n children,\n }: {\n config: IWizardConfig<TSchema>;\n initialData?: Partial<TSchema>;\n children: React.ReactNode;\n }) => {\n return (\n <BaseWizardProvider<TSchema>\n config={config}\n initialData={initialData as TSchema}\n >\n {children}\n </BaseWizardProvider>\n );\n };\n\n /**\n * Typed useWizard\n * Returns the full context with TSchema typed data and methods\n */\n const useWizard = (): IWizardContext<TSchema> => {\n return useBaseWizard<TSchema>();\n };\n\n /**\n * Typed useWizardContext\n * similar to useWizard but explicit about strict context usage\n */\n const useWizardContext = () => {\n return useBaseWizardContext<TSchema>();\n };\n\n /**\n * Typed useWizardValue\n * @param path Dot-notation path to the value\n */\n const useWizardValue = <P extends Path<TSchema>>(\n path: P\n ): PathValue<TSchema, P> => {\n return useBaseWizardValue<PathValue<TSchema, P>>(path);\n };\n\n /**\n * Typed useWizardSelector\n * @param selector Function to select a slice of state\n */\n const useWizardSelector = <TSelected,>(\n selector: (state: TSchema) => TSelected\n ): TSelected => {\n return useBaseWizardSelector<TSelected>(selector);\n };\n\n /**\n * Typed useWizardError\n * @param path Dot-notation path to check for errors\n */\n const useWizardError = <P extends Path<TSchema>>(\n path: P\n ): string | undefined => {\n return useBaseWizardError(path);\n };\n\n /**\n * Typed useWizardActions\n * No generic needed for actions usually, but we wrap it for consistency\n */\n const useWizardActions = () => {\n return useBaseWizardActions();\n };\n\n /**\n * Typed useWizardState\n * Access to raw internal state if needed (advanced)\n */\n const useWizardState = () => {\n return useBaseWizardState();\n };\n\n /**\n * Helper to create a typed step configuration.\n * By using this helper, TypeScript can infer TStepData from the validationAdapter or other properties.\n */\n const createStep = <TStepData = unknown,>(\n config: IStepConfig<TStepData, TSchema>\n ) => config;\n\n return {\n WizardProvider,\n useWizard,\n useWizardContext,\n useWizardValue,\n useWizardSelector,\n useWizardError,\n useWizardActions,\n useWizardState,\n createStep,\n };\n}\n","import type { IPersistenceAdapter } from '../../types';\n\nexport class LocalStorageAdapter implements IPersistenceAdapter {\n private prefix: string;\n\n constructor(prefix: string = 'wizard_') {\n this.prefix = prefix;\n }\n\n private getKey(stepId: string): string {\n return `${this.prefix}${stepId}`;\n }\n\n saveStep<T>(stepId: string, data: T): void {\n if (typeof window === 'undefined') return;\n try {\n localStorage.setItem(this.getKey(stepId), JSON.stringify(data));\n } catch (error) {\n console.warn('LocalStorageAdapter: Failed to save step', error);\n }\n }\n\n getStep<T>(stepId: string): T | undefined {\n if (typeof window === 'undefined') return undefined;\n try {\n const item = localStorage.getItem(this.getKey(stepId));\n return item ? JSON.parse(item) : undefined;\n } catch (error) {\n console.warn('LocalStorageAdapter: Failed to get step', error);\n return undefined;\n }\n }\n\n clear(): void {\n if (typeof window === 'undefined') return;\n Object.keys(localStorage).forEach((key) => {\n if (key.startsWith(this.prefix)) {\n localStorage.removeItem(key);\n }\n });\n }\n}\n","import type { IValidatorAdapter, ValidationResult } from '../../types';\nimport type { ZodLikeSchema } from './internal-types';\n\nexport class ZodAdapter<T> implements IValidatorAdapter<T> {\n private schema: ZodLikeSchema<T>;\n\n constructor(schema: ZodLikeSchema<T>) {\n this.schema = schema;\n }\n\n async validate(data: unknown): Promise<ValidationResult> {\n const result = await this.schema.safeParseAsync(data as T);\n if (result.success) {\n return { isValid: true };\n }\n\n // Explicitly handle error case\n const errors: Record<string, string> = {};\n if (result.error) {\n result.error.issues.forEach((err) => {\n const path = err.path.join('.'); // nested.field\n errors[path] = err.message;\n });\n }\n return { isValid: false, errors };\n }\n}\n","import type { IValidatorAdapter, ValidationResult } from '../../types';\nimport type { YupLikeSchema, YupLikeError } from './internal-types';\n\nexport class YupAdapter<T> implements IValidatorAdapter<T> {\n private schema: YupLikeSchema<T>;\n\n constructor(schema: YupLikeSchema<T>) {\n this.schema = schema;\n }\n\n async validate(data: unknown): Promise<ValidationResult> {\n try {\n await this.schema.validate(data as T, { abortEarly: false });\n return { isValid: true };\n } catch (err) {\n if (err && typeof err === 'object' && 'inner' in err) {\n const yupError = err as YupLikeError;\n const errors: Record<string, string> = {};\n yupError.inner.forEach((error) => {\n if (error.path) {\n errors[error.path] = error.message;\n }\n });\n return { isValid: false, errors };\n }\n throw err;\n }\n }\n}\n"],"mappings":"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","names":["import_react","import_jsx_runtime","import_jsx_runtime","WizardProvider","useWizard","useWizardContext","useWizardValue","useWizardSelector","useWizardError","useWizardActions","useWizardState"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
import { ZodType } from 'zod';
|
|
4
|
-
import { Schema } from 'yup';
|
|
2
|
+
import React$1 from 'react';
|
|
5
3
|
|
|
6
4
|
/**
|
|
7
5
|
* Validation Result Interface
|
|
@@ -53,6 +51,15 @@ interface IStepConfig<TStepData = unknown, TGlobalContext = unknown> {
|
|
|
53
51
|
* Override global auto-validation setting for this step
|
|
54
52
|
*/
|
|
55
53
|
autoValidate?: boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Optional React Component to render for this step.
|
|
56
|
+
* Used by the <WizardStepRenderer /> component.
|
|
57
|
+
*/
|
|
58
|
+
component?: React.ComponentType<any>;
|
|
59
|
+
/**
|
|
60
|
+
* Override global persistence adapter for this specific step.
|
|
61
|
+
*/
|
|
62
|
+
persistenceAdapter?: IPersistenceAdapter;
|
|
56
63
|
}
|
|
57
64
|
/**
|
|
58
65
|
* Wizard Configuration
|
|
@@ -62,7 +69,7 @@ interface IWizardConfig<T = unknown> {
|
|
|
62
69
|
/**
|
|
63
70
|
* Array of step configurations
|
|
64
71
|
*/
|
|
65
|
-
steps: IStepConfig<
|
|
72
|
+
steps: IStepConfig<unknown, T>[];
|
|
66
73
|
/**
|
|
67
74
|
* Global auto-validation setting (default: true)
|
|
68
75
|
*/
|
|
@@ -78,20 +85,26 @@ interface IWizardConfig<T = unknown> {
|
|
|
78
85
|
*/
|
|
79
86
|
storageKey?: string;
|
|
80
87
|
};
|
|
88
|
+
/**
|
|
89
|
+
* Callback triggered when step changes.
|
|
90
|
+
* Useful for routing integration or analytics.
|
|
91
|
+
*/
|
|
92
|
+
onStepChange?: (fromStep: string | null, toStep: string, data: T) => void;
|
|
81
93
|
}
|
|
82
94
|
/**
|
|
83
95
|
* Core Wizard Context State
|
|
84
96
|
*/
|
|
85
97
|
interface IWizardContext<T = unknown> {
|
|
86
|
-
currentStep: IStepConfig<
|
|
98
|
+
currentStep: IStepConfig<unknown, T> | null;
|
|
87
99
|
currentStepIndex: number;
|
|
88
100
|
isFirstStep: boolean;
|
|
89
101
|
isLastStep: boolean;
|
|
90
102
|
isLoading: boolean;
|
|
103
|
+
isPending?: boolean;
|
|
91
104
|
/**
|
|
92
105
|
* Active steps (those meeting conditions)
|
|
93
106
|
*/
|
|
94
|
-
activeSteps: IStepConfig<
|
|
107
|
+
activeSteps: IStepConfig<unknown, T>[];
|
|
95
108
|
/**
|
|
96
109
|
* Unified Wizard Data
|
|
97
110
|
*/
|
|
@@ -111,36 +124,167 @@ interface IWizardContext<T = unknown> {
|
|
|
111
124
|
*/
|
|
112
125
|
goToNextStep: () => Promise<void>;
|
|
113
126
|
goToPrevStep: () => void;
|
|
114
|
-
goToStep: (stepId: string) =>
|
|
127
|
+
goToStep: (stepId: string) => Promise<boolean>;
|
|
115
128
|
/**
|
|
116
129
|
* Data Actions
|
|
117
130
|
*/
|
|
118
|
-
setStepData: (stepId: string, data:
|
|
119
|
-
handleStepChange: (field: string, value:
|
|
131
|
+
setStepData: (stepId: string, data: unknown) => void;
|
|
132
|
+
handleStepChange: (field: string, value: unknown) => void;
|
|
120
133
|
/**
|
|
121
134
|
* Set data by path (supports dot notation and arrays, e.g., 'user.name' or 'items[0].value')
|
|
122
135
|
*/
|
|
123
|
-
setData: (path: string, value:
|
|
136
|
+
setData: (path: string, value: unknown, options?: {
|
|
137
|
+
debounceValidation?: number;
|
|
138
|
+
}) => void;
|
|
139
|
+
/**
|
|
140
|
+
* Bulk update wizard data.
|
|
141
|
+
* @param data Partial data to merge.
|
|
142
|
+
* @param options.replace If true, replaces entire state instead of merging.
|
|
143
|
+
*/
|
|
144
|
+
updateData: (data: Partial<T>, options?: {
|
|
145
|
+
replace?: boolean;
|
|
146
|
+
}) => void;
|
|
124
147
|
/**
|
|
125
148
|
* Get data by path
|
|
126
149
|
*/
|
|
127
|
-
getData: (path: string, defaultValue?:
|
|
150
|
+
getData: (path: string, defaultValue?: unknown) => unknown;
|
|
128
151
|
/**
|
|
129
152
|
* Validation & Persistence
|
|
130
153
|
*/
|
|
131
|
-
validateStep: (
|
|
132
|
-
validateAll: () => Promise<
|
|
154
|
+
validateStep: (sid: string) => Promise<boolean>;
|
|
155
|
+
validateAll: () => Promise<{
|
|
156
|
+
isValid: boolean;
|
|
157
|
+
errors: Record<string, Record<string, string>>;
|
|
158
|
+
}>;
|
|
133
159
|
save: () => void;
|
|
134
160
|
clearStorage: () => void;
|
|
135
161
|
}
|
|
136
162
|
|
|
163
|
+
interface IWizardState<T = unknown> {
|
|
164
|
+
currentStep: IStepConfig<unknown, T> | null;
|
|
165
|
+
currentStepIndex: number;
|
|
166
|
+
isFirstStep: boolean;
|
|
167
|
+
isLastStep: boolean;
|
|
168
|
+
isLoading: boolean;
|
|
169
|
+
isPending: boolean;
|
|
170
|
+
activeSteps: IStepConfig<unknown, T>[];
|
|
171
|
+
visitedSteps: Set<string>;
|
|
172
|
+
completedSteps: Set<string>;
|
|
173
|
+
errorSteps: Set<string>;
|
|
174
|
+
store: WizardStore<T>;
|
|
175
|
+
}
|
|
176
|
+
interface IWizardActions {
|
|
177
|
+
goToNextStep: () => Promise<void>;
|
|
178
|
+
goToPrevStep: () => void;
|
|
179
|
+
goToStep: (stepId: string) => Promise<boolean>;
|
|
180
|
+
setStepData: (stepId: string, data: unknown) => void;
|
|
181
|
+
handleStepChange: (field: string, value: unknown) => void;
|
|
182
|
+
validateStep: (sid: string) => Promise<boolean>;
|
|
183
|
+
validateAll: () => Promise<{
|
|
184
|
+
isValid: boolean;
|
|
185
|
+
errors: Record<string, Record<string, string>>;
|
|
186
|
+
}>;
|
|
187
|
+
save: () => void;
|
|
188
|
+
clearStorage: () => void;
|
|
189
|
+
setData: (path: string, value: unknown, options?: {
|
|
190
|
+
debounceValidation?: number;
|
|
191
|
+
}) => void;
|
|
192
|
+
updateData: (data: Partial<any>, options?: {
|
|
193
|
+
replace?: boolean;
|
|
194
|
+
}) => void;
|
|
195
|
+
getData: (path: string, defaultValue?: unknown) => unknown;
|
|
196
|
+
}
|
|
197
|
+
declare class WizardStore<T> {
|
|
198
|
+
private state;
|
|
199
|
+
private listeners;
|
|
200
|
+
constructor(initialData: T);
|
|
201
|
+
getSnapshot: () => {
|
|
202
|
+
data: T;
|
|
203
|
+
errors: Record<string, Record<string, string>>;
|
|
204
|
+
};
|
|
205
|
+
update(newData: T): void;
|
|
206
|
+
updateErrors(newErrors: Record<string, Record<string, string>>): void;
|
|
207
|
+
private notify;
|
|
208
|
+
subscribe: (listener: () => void) => () => boolean;
|
|
209
|
+
}
|
|
137
210
|
interface WizardProviderProps<T> {
|
|
138
211
|
config: IWizardConfig<T>;
|
|
139
212
|
initialData?: T;
|
|
140
|
-
|
|
213
|
+
initialStepId?: string;
|
|
214
|
+
children: React$1.ReactNode;
|
|
141
215
|
}
|
|
142
|
-
declare function WizardProvider<T extends Record<string, any>>({ config, initialData, children, }: WizardProviderProps<T>): react_jsx_runtime.JSX.Element;
|
|
143
|
-
declare function
|
|
216
|
+
declare function WizardProvider<T extends Record<string, any>>({ config, initialData, initialStepId, children, }: WizardProviderProps<T>): react_jsx_runtime.JSX.Element;
|
|
217
|
+
declare function useWizardState<T = unknown>(): IWizardState<T>;
|
|
218
|
+
declare function useWizardValue<TValue = any>(path: string): TValue;
|
|
219
|
+
declare function useWizardError(path: string): string | undefined;
|
|
220
|
+
declare function useWizardSelector<TSelected = any>(selector: (state: any) => TSelected): TSelected;
|
|
221
|
+
declare function useWizardActions(): IWizardActions;
|
|
222
|
+
declare function useWizardContext<T = any>(): IWizardContext<T> & {
|
|
223
|
+
store: WizardStore<T>;
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
interface WizardStepRendererProps {
|
|
227
|
+
/**
|
|
228
|
+
* Optional wrapper component for each step.
|
|
229
|
+
* Useful for adding animations (e.g., Framer Motion).
|
|
230
|
+
*/
|
|
231
|
+
wrapper?: React$1.ComponentType<{
|
|
232
|
+
children: React$1.ReactNode;
|
|
233
|
+
key: string;
|
|
234
|
+
}>;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* A declarative component that renders the current step based on the configuration.
|
|
238
|
+
* It looks for the `component` property in your `steps` config.
|
|
239
|
+
*/
|
|
240
|
+
declare const WizardStepRenderer: React$1.FC<WizardStepRendererProps>;
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Utility types for dot-notation paths
|
|
244
|
+
* heavily inspired by react-hook-form and generic type manipulations
|
|
245
|
+
*/
|
|
246
|
+
type Primitive = null | undefined | string | number | boolean | symbol | bigint;
|
|
247
|
+
type IsTuple<T extends ReadonlyArray<any>> = number extends T['length'] ? false : true;
|
|
248
|
+
type TupleKeys<T extends ReadonlyArray<any>> = Exclude<keyof T, keyof any[]>;
|
|
249
|
+
type PathImpl<K extends string | number, V> = V extends Primitive ? `${K}` : `${K}` | `${K}.${Path<V>}`;
|
|
250
|
+
/**
|
|
251
|
+
* Path<T>: Generates all valid dot-notation paths for type T
|
|
252
|
+
*/
|
|
253
|
+
type Path<T> = T extends ReadonlyArray<infer V> ? IsTuple<T> extends true ? {
|
|
254
|
+
[K in TupleKeys<T>]-?: PathImpl<K & string, T[K]>;
|
|
255
|
+
}[TupleKeys<T>] : PathImpl<number, V> : {
|
|
256
|
+
[K in keyof T]-?: PathImpl<K & string, T[K]>;
|
|
257
|
+
}[keyof T];
|
|
258
|
+
/**
|
|
259
|
+
* PathValue<T, P>: Infers the value type at a specific path P of type T
|
|
260
|
+
*/
|
|
261
|
+
type PathValue<T, P extends Path<T>> = T extends any ? P extends `${infer K}.${infer R}` ? K extends keyof T ? R extends Path<T[K]> ? PathValue<T[K], R> : never : K extends `${number}` ? T extends ReadonlyArray<infer V> ? R extends Path<V> ? PathValue<V, R> : never : never : never : P extends keyof T ? T[P] : P extends `${number}` ? T extends ReadonlyArray<infer V> ? V : never : never : never;
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* createWizardFactory
|
|
265
|
+
*
|
|
266
|
+
* Creates a strongly-typed set of Wizard components and hooks for a specific data schema.
|
|
267
|
+
* This ensures full type safety across your entire wizard implementation without manual casting.
|
|
268
|
+
*
|
|
269
|
+
* @template TSchema The shape of your wizard's global data state
|
|
270
|
+
*/
|
|
271
|
+
declare function createWizardFactory<TSchema extends Record<string, any>>(): {
|
|
272
|
+
WizardProvider: ({ config, initialData, children, }: {
|
|
273
|
+
config: IWizardConfig<TSchema>;
|
|
274
|
+
initialData?: Partial<TSchema>;
|
|
275
|
+
children: React$1.ReactNode;
|
|
276
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
277
|
+
useWizard: () => IWizardContext<TSchema>;
|
|
278
|
+
useWizardContext: () => IWizardContext<TSchema> & {
|
|
279
|
+
store: WizardStore<TSchema>;
|
|
280
|
+
};
|
|
281
|
+
useWizardValue: <P extends Path<TSchema>>(path: P) => PathValue<TSchema, P>;
|
|
282
|
+
useWizardSelector: <TSelected>(selector: (state: TSchema) => TSelected) => TSelected;
|
|
283
|
+
useWizardError: <P extends Path<TSchema>>(path: P) => string | undefined;
|
|
284
|
+
useWizardActions: () => IWizardActions;
|
|
285
|
+
useWizardState: () => IWizardState<unknown>;
|
|
286
|
+
createStep: <TStepData = unknown>(config: IStepConfig<TStepData, TSchema>) => IStepConfig<TStepData, TSchema>;
|
|
287
|
+
};
|
|
144
288
|
|
|
145
289
|
declare const useWizard: <T = any>() => IWizardContext<T>;
|
|
146
290
|
|
|
@@ -160,25 +304,49 @@ declare class LocalStorageAdapter implements IPersistenceAdapter {
|
|
|
160
304
|
clear(): void;
|
|
161
305
|
}
|
|
162
306
|
|
|
307
|
+
/**
|
|
308
|
+
* Minimal structural interface for Zod-like schemas.
|
|
309
|
+
*/
|
|
310
|
+
interface ZodLikeSchema<T = any> {
|
|
311
|
+
safeParseAsync: (data: T) => Promise<{
|
|
312
|
+
success: boolean;
|
|
313
|
+
data?: T;
|
|
314
|
+
error?: {
|
|
315
|
+
issues: Array<{
|
|
316
|
+
path: any[];
|
|
317
|
+
message: string;
|
|
318
|
+
}>;
|
|
319
|
+
};
|
|
320
|
+
}>;
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Minimal structural interface for Yup-like schemas.
|
|
324
|
+
*/
|
|
325
|
+
interface YupLikeSchema<T = any> {
|
|
326
|
+
validate: (data: T, options: {
|
|
327
|
+
abortEarly: boolean;
|
|
328
|
+
}) => Promise<any>;
|
|
329
|
+
}
|
|
330
|
+
|
|
163
331
|
declare class ZodAdapter<T> implements IValidatorAdapter<T> {
|
|
164
332
|
private schema;
|
|
165
|
-
constructor(schema:
|
|
166
|
-
validate(data:
|
|
333
|
+
constructor(schema: ZodLikeSchema<T>);
|
|
334
|
+
validate(data: unknown): Promise<ValidationResult>;
|
|
167
335
|
}
|
|
168
336
|
|
|
169
337
|
declare class YupAdapter<T> implements IValidatorAdapter<T> {
|
|
170
338
|
private schema;
|
|
171
|
-
constructor(schema:
|
|
172
|
-
validate(data:
|
|
339
|
+
constructor(schema: YupLikeSchema<T>);
|
|
340
|
+
validate(data: unknown): Promise<ValidationResult>;
|
|
173
341
|
}
|
|
174
342
|
|
|
175
343
|
/**
|
|
176
344
|
* Retrieves a value from an object by path (dot notation or brackets)
|
|
177
345
|
*/
|
|
178
|
-
declare function getByPath(obj: any, path: string, defaultValue?:
|
|
346
|
+
declare function getByPath(obj: any, path: string, defaultValue?: unknown): unknown;
|
|
179
347
|
/**
|
|
180
348
|
* Immutably sets a value in an object by path
|
|
181
349
|
*/
|
|
182
|
-
declare function setByPath<T extends object>(obj: T, path: string, value:
|
|
350
|
+
declare function setByPath<T extends object>(obj: T, path: string, value: unknown): T;
|
|
183
351
|
|
|
184
|
-
export { type IPersistenceAdapter, type IStepConfig, type IValidatorAdapter, type IWizardConfig, type IWizardContext, LocalStorageAdapter, MemoryAdapter, type PersistenceMode, type ValidationResult, WizardProvider, YupAdapter, ZodAdapter, getByPath, setByPath, useWizard, useWizardContext };
|
|
352
|
+
export { type IPersistenceAdapter, type IStepConfig, type IValidatorAdapter, type IWizardActions, type IWizardConfig, type IWizardContext, type IWizardState, LocalStorageAdapter, MemoryAdapter, type PersistenceMode, type ValidationResult, WizardProvider, WizardStepRenderer, WizardStore, YupAdapter, ZodAdapter, createWizardFactory, getByPath, setByPath, useWizard, useWizardActions, useWizardContext, useWizardError, useWizardSelector, useWizardState, useWizardValue };
|