react-use-wizard
Version:
React wizard (stepper) builder without the hassle, powered by hooks.
1 lines • 10.8 kB
Source Map (JSON)
{"version":3,"file":"react-use-wizard.mjs","sources":["../src/wizardContext.ts","../src/useWizard.ts","../src/logger.ts","../src/wizard.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { WizardValues } from './types';\n\nconst WizardContext = React.createContext<WizardValues | null>(null);\n\nif (__DEV__) {\n WizardContext.displayName = 'WizardContext';\n}\n\nexport default WizardContext;\n","import * as React from 'react';\n\nimport { WizardValues } from './types';\nimport WizardContext from './wizardContext';\n\nconst useWizard = () => {\n const context = React.useContext(WizardContext);\n\n if (!context && __DEV__) {\n throw Error('Wrap your step with `Wizard`');\n } else {\n return context as WizardValues;\n }\n};\n\nexport default useWizard;\n","import { LogLevel } from './types';\n/**\n * Log messages in the console with a corresponding urgency\n *\n * @param level The urgency of the message\n * @param message The message to log in the console\n */\nexport const log = (level: LogLevel, message: string) => {\n if (__DEV__) {\n const packageName = '[react-use-wizard]';\n\n switch (level) {\n case 'warn':\n console.warn(`${packageName} ${message}`);\n break;\n case 'error':\n console.error(`${packageName} ${message}`);\n break;\n default:\n console.log(`${packageName} ${message}`);\n }\n }\n};\n","import * as React from 'react';\n\nimport * as logger from './logger';\nimport { Handler, WizardProps } from './types';\nimport WizardContext from './wizardContext';\n\nconst Wizard: React.FC<React.PropsWithChildren<WizardProps>> = React.memo(\n ({\n header,\n footer,\n children,\n onStepChange,\n wrapper: Wrapper,\n startIndex = 0,\n }) => {\n const [activeStep, setActiveStep] = React.useState(startIndex);\n const [isLoading, setIsLoading] = React.useState(false);\n const hasNextStep = React.useRef(true);\n const hasPreviousStep = React.useRef(false);\n const nextStepHandler = React.useRef<Handler>(() => {});\n const stepCount = React.Children.toArray(children).length;\n\n hasNextStep.current = activeStep < stepCount - 1;\n hasPreviousStep.current = activeStep > 0;\n\n const goToNextStep = React.useCallback(() => {\n if (hasNextStep.current) {\n const newActiveStepIndex = activeStep + 1;\n\n setActiveStep(newActiveStepIndex);\n onStepChange?.(newActiveStepIndex);\n }\n }, [activeStep, onStepChange]);\n\n const goToPreviousStep = React.useCallback(() => {\n if (hasPreviousStep.current) {\n nextStepHandler.current = null;\n const newActiveStepIndex = activeStep - 1;\n\n setActiveStep(newActiveStepIndex);\n onStepChange?.(newActiveStepIndex);\n }\n }, [activeStep, onStepChange]);\n\n const goToStep = React.useCallback(\n (stepIndex: number) => {\n if (stepIndex >= 0 && stepIndex < stepCount) {\n nextStepHandler.current = null;\n setActiveStep(stepIndex);\n onStepChange?.(stepIndex);\n } else {\n if (__DEV__) {\n logger.log(\n 'warn',\n [\n `Invalid step index [${stepIndex}] passed to 'goToStep'. `,\n `Ensure the given stepIndex is not out of boundaries.`,\n ].join(''),\n );\n }\n }\n },\n [stepCount, onStepChange],\n );\n\n // Callback to attach the step handler\n const handleStep = React.useRef((handler: Handler) => {\n nextStepHandler.current = handler;\n });\n\n const doNextStep = React.useCallback(async () => {\n if (hasNextStep.current && nextStepHandler.current) {\n try {\n setIsLoading(true);\n await nextStepHandler.current();\n setIsLoading(false);\n nextStepHandler.current = null;\n goToNextStep();\n } catch (error) {\n setIsLoading(false);\n throw error;\n }\n } else {\n goToNextStep();\n }\n }, [goToNextStep]);\n\n const wizardValue = React.useMemo(\n () => ({\n nextStep: doNextStep,\n previousStep: goToPreviousStep,\n handleStep: handleStep.current,\n isLoading,\n activeStep,\n stepCount,\n isFirstStep: !hasPreviousStep.current,\n isLastStep: !hasNextStep.current,\n goToStep,\n }),\n [\n doNextStep,\n goToPreviousStep,\n isLoading,\n activeStep,\n stepCount,\n goToStep,\n ],\n );\n\n const activeStepContent = React.useMemo(() => {\n const reactChildren = React.Children.toArray(children);\n\n if (__DEV__) {\n // No steps passed\n if (reactChildren.length === 0) {\n logger.log(\n 'warn',\n 'Make sure to pass your steps as children in your <Wizard>',\n );\n }\n // The passed start index is invalid\n if (activeStep > reactChildren.length) {\n logger.log('warn', 'An invalid startIndex is passed to <Wizard>');\n }\n // Invalid header element\n if (header && !React.isValidElement(header)) {\n logger.log('error', 'Invalid header passed to <Wizard>');\n }\n // Invalid footer element\n if (footer && !React.isValidElement(footer)) {\n logger.log('error', 'Invalid footer passed to <Wizard>');\n }\n }\n\n return reactChildren[activeStep];\n }, [activeStep, children, header, footer]);\n\n const enhancedActiveStepContent = React.useMemo(\n () =>\n Wrapper\n ? React.cloneElement(Wrapper, { children: activeStepContent })\n : activeStepContent,\n [Wrapper, activeStepContent],\n );\n\n return (\n <WizardContext.Provider value={wizardValue}>\n {header}\n {enhancedActiveStepContent}\n {footer}\n </WizardContext.Provider>\n );\n },\n);\n\nexport default Wizard;\n"],"names":["WizardContext","React","displayName","useWizard","context","Error","log","level","message","packageName","console","warn","error","Wizard","header","footer","children","onStepChange","wrapper","Wrapper","startIndex","activeStep","setActiveStep","isLoading","setIsLoading","hasNextStep","hasPreviousStep","nextStepHandler","stepCount","toArray","length","current","goToNextStep","newActiveStepIndex","goToPreviousStep","goToStep","stepIndex","logger","join","handleStep","handler","doNextStep","wizardValue","nextStep","previousStep","isFirstStep","isLastStep","activeStepContent","reactChildren","enhancedActiveStepContent","Provider","value"],"mappings":"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"}