rhf-stepper 0.1.8 → 0.2.1
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/LICENSE +21 -0
- package/README.md +2 -0
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +36 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +36 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Omer Kosar
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
A lightweight, headless multi-step form helper for [react-hook-form](https://react-hook-form.com). Build wizards, multi-step forms, and stepped workflows with automatic per-step validation. Bring your own UI — rhf-stepper handles the logic.
|
|
4
4
|
|
|
5
|
+
[Documentation](https://rhf-stepper-docs-git-master-omerrkosars-projects.vercel.app/docs)
|
|
6
|
+
|
|
5
7
|
## Installation
|
|
6
8
|
|
|
7
9
|
```bash
|
package/dist/index.d.mts
CHANGED
|
@@ -19,14 +19,14 @@ type StepValidationMode = 'all' | 'forward' | 'none';
|
|
|
19
19
|
type FormContextValue<TFieldValues extends FieldValues = FieldValues> = {
|
|
20
20
|
form: UseFormReturn<TFieldValues>;
|
|
21
21
|
currentStep: number | number[] | null;
|
|
22
|
-
setCurrentStep: (step: number | number[]) => Promise<boolean>;
|
|
22
|
+
setCurrentStep: (step: number | number[], beforeStepChange?: (values: Partial<TFieldValues>) => Promise<void>) => Promise<boolean>;
|
|
23
23
|
currentStepNode: StepTree | undefined;
|
|
24
24
|
currentStepArr: string[] | null;
|
|
25
25
|
validatedFields: string[];
|
|
26
26
|
isFirstStep: boolean;
|
|
27
27
|
isLastStep: boolean;
|
|
28
|
-
next: () => Promise<boolean>;
|
|
29
|
-
prev: () => Promise<boolean>;
|
|
28
|
+
next: (beforeStepChange?: (values: Partial<TFieldValues>) => Promise<void>) => Promise<boolean>;
|
|
29
|
+
prev: (beforeStepChange?: (values: Partial<TFieldValues>) => Promise<void>) => Promise<boolean>;
|
|
30
30
|
};
|
|
31
31
|
declare function useFormContext<TFieldValues extends FieldValues = FieldValues>(): FormContextValue<TFieldValues>;
|
|
32
32
|
interface FormProps<TFieldValues extends FieldValues = FieldValues> extends Omit<React.ComponentProps<'form'>, 'onSubmit' | 'children'> {
|
package/dist/index.d.ts
CHANGED
|
@@ -19,14 +19,14 @@ type StepValidationMode = 'all' | 'forward' | 'none';
|
|
|
19
19
|
type FormContextValue<TFieldValues extends FieldValues = FieldValues> = {
|
|
20
20
|
form: UseFormReturn<TFieldValues>;
|
|
21
21
|
currentStep: number | number[] | null;
|
|
22
|
-
setCurrentStep: (step: number | number[]) => Promise<boolean>;
|
|
22
|
+
setCurrentStep: (step: number | number[], beforeStepChange?: (values: Partial<TFieldValues>) => Promise<void>) => Promise<boolean>;
|
|
23
23
|
currentStepNode: StepTree | undefined;
|
|
24
24
|
currentStepArr: string[] | null;
|
|
25
25
|
validatedFields: string[];
|
|
26
26
|
isFirstStep: boolean;
|
|
27
27
|
isLastStep: boolean;
|
|
28
|
-
next: () => Promise<boolean>;
|
|
29
|
-
prev: () => Promise<boolean>;
|
|
28
|
+
next: (beforeStepChange?: (values: Partial<TFieldValues>) => Promise<void>) => Promise<boolean>;
|
|
29
|
+
prev: (beforeStepChange?: (values: Partial<TFieldValues>) => Promise<void>) => Promise<boolean>;
|
|
30
30
|
};
|
|
31
31
|
declare function useFormContext<TFieldValues extends FieldValues = FieldValues>(): FormContextValue<TFieldValues>;
|
|
32
32
|
interface FormProps<TFieldValues extends FieldValues = FieldValues> extends Omit<React.ComponentProps<'form'>, 'onSubmit' | 'children'> {
|
package/dist/index.js
CHANGED
|
@@ -89,6 +89,24 @@ function Step({ children }) {
|
|
|
89
89
|
return /* @__PURE__ */ jsxRuntime.jsx(StepContext.Provider, { value: contextValue, children });
|
|
90
90
|
}
|
|
91
91
|
Step.displayName = "Step";
|
|
92
|
+
function buildNestedValues(fields, values) {
|
|
93
|
+
const result = {};
|
|
94
|
+
for (let i = 0; i < fields.length; i++) {
|
|
95
|
+
const segments = fields[i].split(".");
|
|
96
|
+
let current = result;
|
|
97
|
+
for (let j = 0; j < segments.length - 1; j++) {
|
|
98
|
+
const segment = segments[j];
|
|
99
|
+
const nextSegment = segments[j + 1];
|
|
100
|
+
const isNextNumeric = /^\d+$/.test(nextSegment);
|
|
101
|
+
if (current[segment] === void 0) {
|
|
102
|
+
current[segment] = isNextNumeric ? [] : {};
|
|
103
|
+
}
|
|
104
|
+
current = current[segment];
|
|
105
|
+
}
|
|
106
|
+
current[segments[segments.length - 1]] = values[i];
|
|
107
|
+
}
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
92
110
|
function comparePaths(a, b) {
|
|
93
111
|
var _a, _b;
|
|
94
112
|
for (let i = 0; i < Math.max(a.length, b.length); i++) {
|
|
@@ -201,7 +219,7 @@ function FormInner({ form, onSubmit, stepValidationMode = "forward", children, .
|
|
|
201
219
|
return isLeafParent(currentStepNode) ? currentStepNode : null;
|
|
202
220
|
}, [currentStepNode]);
|
|
203
221
|
const _setCurrentStep = react.useCallback(
|
|
204
|
-
async (step) => {
|
|
222
|
+
async (step, beforeStepChange) => {
|
|
205
223
|
const path = typeof step === "number" ? [0, step] : [0, ...step];
|
|
206
224
|
if (currentStep && currentStepArr && stepValidationMode !== "none") {
|
|
207
225
|
const isForward = comparePaths(path, currentStep) > 0;
|
|
@@ -215,6 +233,11 @@ function FormInner({ form, onSubmit, stepValidationMode = "forward", children, .
|
|
|
215
233
|
setValidatedFields((prev2) => [.../* @__PURE__ */ new Set([...prev2, ...currentStepArr])]);
|
|
216
234
|
}
|
|
217
235
|
}
|
|
236
|
+
if (beforeStepChange && currentStepArr) {
|
|
237
|
+
const watchedValues = form.watch(currentStepArr);
|
|
238
|
+
const values = buildNestedValues(currentStepArr, watchedValues);
|
|
239
|
+
await beforeStepChange(values);
|
|
240
|
+
}
|
|
218
241
|
setCurrentStep(path);
|
|
219
242
|
return true;
|
|
220
243
|
},
|
|
@@ -228,7 +251,7 @@ function FormInner({ form, onSubmit, stepValidationMode = "forward", children, .
|
|
|
228
251
|
() => currentStep ? getNextLeafParentPath(steps, currentStep) === null : true,
|
|
229
252
|
[steps, currentStep]
|
|
230
253
|
);
|
|
231
|
-
const next = react.useCallback(async () => {
|
|
254
|
+
const next = react.useCallback(async (beforeStepChange) => {
|
|
232
255
|
if (!currentStep) return false;
|
|
233
256
|
const nextPath = getNextLeafParentPath(steps, currentStep);
|
|
234
257
|
if (currentStepArr && stepValidationMode !== "none") {
|
|
@@ -240,12 +263,17 @@ function FormInner({ form, onSubmit, stepValidationMode = "forward", children, .
|
|
|
240
263
|
setValidatedFields((prev2) => [.../* @__PURE__ */ new Set([...prev2, ...currentStepArr])]);
|
|
241
264
|
}
|
|
242
265
|
if (nextPath) {
|
|
266
|
+
if (beforeStepChange && currentStepArr) {
|
|
267
|
+
const watchedValues = form.watch(currentStepArr);
|
|
268
|
+
const values = buildNestedValues(currentStepArr, watchedValues);
|
|
269
|
+
await beforeStepChange(values);
|
|
270
|
+
}
|
|
243
271
|
setCurrentStep(nextPath);
|
|
244
272
|
return true;
|
|
245
273
|
}
|
|
246
274
|
return false;
|
|
247
275
|
}, [steps, currentStep, currentStepArr, form, stepValidationMode]);
|
|
248
|
-
const prev = react.useCallback(async () => {
|
|
276
|
+
const prev = react.useCallback(async (beforeStepChange) => {
|
|
249
277
|
if (!currentStep) return false;
|
|
250
278
|
const prevPath = getPrevLeafParentPath(steps, currentStep);
|
|
251
279
|
if (currentStepArr && stepValidationMode === "all") {
|
|
@@ -257,6 +285,11 @@ function FormInner({ form, onSubmit, stepValidationMode = "forward", children, .
|
|
|
257
285
|
setValidatedFields((prev2) => [.../* @__PURE__ */ new Set([...prev2, ...currentStepArr])]);
|
|
258
286
|
}
|
|
259
287
|
if (prevPath) {
|
|
288
|
+
if (beforeStepChange && currentStepArr) {
|
|
289
|
+
const watchedValues = form.watch(currentStepArr);
|
|
290
|
+
const values = buildNestedValues(currentStepArr, watchedValues);
|
|
291
|
+
await beforeStepChange(values);
|
|
292
|
+
}
|
|
260
293
|
setCurrentStep(prevPath);
|
|
261
294
|
return true;
|
|
262
295
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/step.tsx","../src/form.tsx","../src/controller.tsx"],"names":["createContext","useContext","useMemo","useRef","useState","useCallback","steps","useEffect","stepRef","prev","jsx","forwardRef","RHFController"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'\n\nimport { useInternalFormContext } from './form'\nimport { type StepTree } from './types'\n\ntype StepContextValue = {\n step?: number\n registrationKey: number\n registerField: (elements: StepTree) => void\n registerStep: (elements: StepTree, stepRef: React.RefObject<number | undefined>, step?: number) => void\n rebuildSteps: () => void\n changeStepAtIndex: (steps: StepTree, index: number) => void\n}\n\nconst StepContext = createContext<StepContextValue | null>(null)\n\nfunction useStep(): StepContextValue | null {\n return useContext(StepContext)\n}\n\nfunction Step({ children }: { children: React.ReactNode }) {\n const stepContext = useStep()\n const formContext = useInternalFormContext()\n\n const {\n registerStep: registerStepFromParent,\n step: stepFromParent,\n rebuildSteps: rebuildStepsFromParent,\n changeStepAtIndex: changeStepAtIndexFromParent,\n registrationKey: registrationKeyFromParent,\n } = stepContext ?? formContext\n\n const isRoot = useMemo(() => {\n if (!stepContext) return true\n return false\n }, [stepContext])\n const stepRef = useRef<number | undefined>(undefined)\n const [steps, setSteps] = useState<StepTree>([])\n const [registrationKey, setRegistrationKey] = useState(0)\n\n const changeStepAtIndex = useCallback((steps: StepTree, index: number): void => {\n setSteps((prevSteps) => {\n const newSteps = [...prevSteps]\n newSteps[index] = steps\n return newSteps\n })\n }, [])\n\n useEffect(() => {\n if (isRoot && steps.length === 0) return\n const stepList = steps.length ? steps : ['']\n if (stepRef.current !== undefined) {\n changeStepAtIndexFromParent(stepList, stepRef.current)\n } else {\n registerStepFromParent(stepList, stepRef)\n }\n }, [registrationKeyFromParent, steps, isRoot])\n\n useEffect(() => {\n if (stepFromParent !== undefined) {\n rebuildStepsFromParent()\n }\n return () => {\n rebuildStepsFromParent()\n }\n }, [])\n\n const registerField = useCallback(\n (elements: StepTree): void => {\n setSteps((prevSteps) => {\n return [...prevSteps, ...elements]\n })\n },\n [steps],\n )\n\n const registerStep = useCallback(\n (elements: StepTree, stepRef: React.RefObject<number | undefined>, step?: number): void => {\n setSteps((prevSteps: StepTree) => {\n const stepNumber = step ?? prevSteps.length\n stepRef.current = stepNumber\n const newSteps = [...prevSteps]\n newSteps.splice(stepNumber, 0, elements)\n return newSteps\n })\n },\n [steps],\n )\n\n const rebuildSteps = useCallback(() => {\n setSteps([])\n setRegistrationKey((prev) => prev + 1)\n }, [])\n\n const contextValue = useMemo<StepContextValue>(\n () => ({\n // eslint-disable-next-line react-hooks/refs\n step: stepRef.current,\n registrationKey,\n changeStepAtIndex,\n registerField,\n registerStep,\n rebuildSteps,\n }),\n [registrationKey, changeStepAtIndex, registerField, registerStep, rebuildSteps],\n )\n\n // eslint-disable-next-line react-hooks/refs\n return <StepContext.Provider value={contextValue}>{children}</StepContext.Provider>\n}\n\nStep.displayName = 'Step'\n\nexport { Step, useStep }\nexport type { StepContextValue }\n","import { createContext, forwardRef, useCallback, useContext, useMemo, useRef, useState } from 'react'\nimport { type FieldValues, Path, type UseFormReturn } from 'react-hook-form'\n\nimport { Step } from './step'\nimport { type StepTree, type StepValidationMode } from './types'\n\nfunction comparePaths(a: number[], b: number[]): number {\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const ai = a[i] ?? -1\n const bi = b[i] ?? -1\n if (ai !== bi) return ai - bi\n }\n return 0\n}\n\nfunction getNodeAtPath(tree: StepTree, path: number[]): StepTree | undefined {\n let current: StepTree = tree\n for (const index of path) {\n if (!Array.isArray(current) || index >= current.length) return undefined\n current = current[index]\n }\n return current\n}\n\nfunction isLeafParent(node: StepTree): node is string[] {\n return Array.isArray(node) && node.length > 0 && node.every((child) => typeof child === 'string')\n}\n\nfunction getFirstLeafParentPath(tree: StepTree, path: number[]): number[] | null {\n const node = getNodeAtPath(tree, path)\n if (node === undefined) return null\n if (isLeafParent(node)) return path\n if (Array.isArray(node) && node.length > 0) {\n for (let i = 0; i < node.length; i++) {\n const found = getFirstLeafParentPath(tree, [...path, i])\n if (found) return found\n }\n }\n return null\n}\n\nfunction getLastLeafParentPath(tree: StepTree, path: number[]): number[] | null {\n const node = getNodeAtPath(tree, path)\n if (node === undefined) return null\n if (isLeafParent(node)) return path\n if (Array.isArray(node) && node.length > 0) {\n for (let i = node.length - 1; i >= 0; i--) {\n const found = getLastLeafParentPath(tree, [...path, i])\n if (found) return found\n }\n }\n return null\n}\n\nfunction getPrevLeafParentPath(tree: StepTree, path: number[]): number[] | null {\n const current = [...path]\n while (current.length > 0) {\n const lastIndex = current[current.length - 1]\n const parentPath = current.slice(0, -1)\n const parent = getNodeAtPath(tree, parentPath)\n\n if (Array.isArray(parent)) {\n for (let i = lastIndex - 1; i >= 0; i--) {\n const found = getLastLeafParentPath(tree, [...parentPath, i])\n if (found) return found\n }\n }\n\n current.pop()\n }\n\n return null\n}\n\nfunction getNextLeafParentPath(tree: StepTree, path: number[]): number[] | null {\n const current = [...path]\n while (current.length > 0) {\n const lastIndex = current[current.length - 1]\n const parentPath = current.slice(0, -1)\n const parent = getNodeAtPath(tree, parentPath)\n\n if (Array.isArray(parent)) {\n for (let i = lastIndex + 1; i < parent.length; i++) {\n const found = getFirstLeafParentPath(tree, [...parentPath, i])\n if (found) return found\n }\n }\n\n current.pop()\n }\n\n return null\n}\n\ntype FormContextValue<TFieldValues extends FieldValues = FieldValues> = {\n form: UseFormReturn<TFieldValues>\n currentStep: number | number[] | null\n setCurrentStep: (step: number | number[]) => Promise<boolean>\n currentStepNode: StepTree | undefined\n currentStepArr: string[] | null\n validatedFields: string[]\n isFirstStep: boolean\n isLastStep: boolean\n next: () => Promise<boolean>\n prev: () => Promise<boolean>\n}\n\ntype InternalFormContextValue = {\n step?: number\n registrationKey: number\n rebuildSteps: () => void\n registerStep: (elements: StepTree, stepRef: React.RefObject<number | undefined>, step?: number) => void\n changeStepAtIndex: (elements: StepTree, index: number) => void\n}\n\nconst FormContext = createContext<FormContextValue | null>(null)\nconst InternalFormContext = createContext<InternalFormContextValue | null>(null)\n\nfunction useFormContext<TFieldValues extends FieldValues = FieldValues>(): FormContextValue<TFieldValues> {\n const context = useContext(FormContext)\n if (!context) {\n throw new Error('useFormContext must be used within a <Form>')\n }\n return context as unknown as FormContextValue<TFieldValues>\n}\n\nfunction useInternalFormContext(): InternalFormContextValue {\n const context = useContext(InternalFormContext)\n if (!context) {\n throw new Error('useInternalFormContext must be used within a <Form>')\n }\n return context\n}\n\ninterface FormProps<TFieldValues extends FieldValues = FieldValues>\n extends Omit<React.ComponentProps<'form'>, 'onSubmit' | 'children'> {\n form: UseFormReturn<TFieldValues>\n onSubmit: (values: TFieldValues) => void\n stepValidationMode?: StepValidationMode\n children: React.ReactNode | ((context: FormContextValue<TFieldValues>) => React.ReactNode)\n}\n\nfunction FormInner<TFieldValues extends FieldValues = FieldValues>(\n { form, onSubmit, stepValidationMode = 'forward', children, ...props }: FormProps<TFieldValues>,\n ref: React.Ref<HTMLFormElement>,\n) {\n const [steps, setSteps] = useState<StepTree>([])\n const [currentStep, setCurrentStep] = useState<number[] | null>(null)\n const [validatedFields, setValidatedFields] = useState<string[]>([])\n const [registrationKey, setRegistrationKey] = useState(0)\n\n const stepRef = useRef<number | undefined>(undefined)\n\n const _currentStep = useMemo<number | number[] | null>(() => {\n if (!currentStep) return null\n const sliced = currentStep.slice(1)\n return sliced.length === 1 ? sliced[0] : sliced\n }, [currentStep])\n\n const currentStepNode = useMemo(\n () => (currentStep ? getNodeAtPath(steps, currentStep) : undefined),\n [steps, currentStep],\n )\n\n const currentStepArr = useMemo<string[] | null>(() => {\n if (!currentStepNode) return null\n return isLeafParent(currentStepNode) ? currentStepNode : null\n }, [currentStepNode])\n\n const _setCurrentStep = useCallback(\n async (step: number | number[]): Promise<boolean> => {\n const path = typeof step === 'number' ? [0, step] : [0, ...step]\n if (currentStep && currentStepArr && stepValidationMode !== 'none') {\n const isForward = comparePaths(path, currentStep) > 0\n const shouldValidate = stepValidationMode === 'all' || (stepValidationMode === 'forward' && isForward)\n if (shouldValidate) {\n const isValid = await form.trigger(currentStepArr as Path<TFieldValues>[])\n if (!isValid) {\n setValidatedFields((prev) => prev.filter((field) => !currentStepArr.includes(field)))\n return false\n }\n setValidatedFields((prev) => [...new Set([...prev, ...currentStepArr])])\n }\n }\n setCurrentStep(path)\n return true\n },\n [currentStep, currentStepArr, form, stepValidationMode],\n )\n\n const isFirstStep = useMemo(\n () => (currentStep ? getPrevLeafParentPath(steps, currentStep) === null : true),\n [steps, currentStep],\n )\n\n const isLastStep = useMemo(\n () => (currentStep ? getNextLeafParentPath(steps, currentStep) === null : true),\n [steps, currentStep],\n )\n\n const next = useCallback(async (): Promise<boolean> => {\n if (!currentStep) return false\n const nextPath = getNextLeafParentPath(steps, currentStep)\n if (currentStepArr && stepValidationMode !== 'none') {\n const isValid = await form.trigger(currentStepArr as Path<TFieldValues>[])\n if (!isValid) {\n setValidatedFields((prev) => prev.filter((field) => !currentStepArr.includes(field)))\n return false\n }\n setValidatedFields((prev) => [...new Set([...prev, ...currentStepArr])])\n }\n if (nextPath) {\n setCurrentStep(nextPath)\n return true\n }\n return false\n }, [steps, currentStep, currentStepArr, form, stepValidationMode])\n\n const prev = useCallback(async (): Promise<boolean> => {\n if (!currentStep) return false\n const prevPath = getPrevLeafParentPath(steps, currentStep)\n if (currentStepArr && stepValidationMode === 'all') {\n const isValid = await form.trigger(currentStepArr as Path<TFieldValues>[])\n if (!isValid) {\n setValidatedFields((prev) => prev.filter((field) => !currentStepArr.includes(field)))\n return false\n }\n setValidatedFields((prev) => [...new Set([...prev, ...currentStepArr])])\n }\n if (prevPath) {\n setCurrentStep(prevPath)\n return true\n }\n return false\n }, [steps, currentStep, currentStepArr, form, stepValidationMode])\n\n const registerStep = useCallback(\n (elements: StepTree, stepRef: React.RefObject<number | undefined>, step?: number): void => {\n setSteps((prevSteps: StepTree) => {\n const stepNumber = step ?? (Array.isArray(prevSteps) ? prevSteps.length : 0)\n stepRef.current = stepNumber\n const newSteps = Array.isArray(prevSteps) ? [...prevSteps] : [prevSteps]\n newSteps.splice(stepNumber, 0, elements)\n\n if (currentStep === null) {\n const firstLeafParent = getFirstLeafParentPath(newSteps, [0])\n if (firstLeafParent) {\n setCurrentStep(firstLeafParent)\n }\n }\n\n return newSteps\n })\n },\n [currentStep],\n )\n\n const rebuildSteps = useCallback(() => {\n setSteps([])\n setRegistrationKey((prev) => prev + 1)\n }, [])\n\n const changeStepAtIndex = useCallback((steps: StepTree, index: number): void => {\n setSteps((prevSteps) => {\n const newSteps = Array.isArray(prevSteps) ? [...prevSteps] : [prevSteps]\n newSteps[index] = steps\n return newSteps\n })\n }, [])\n\n const publicContextValue = useMemo<FormContextValue>(\n () => ({\n currentStep: _currentStep,\n setCurrentStep: _setCurrentStep,\n currentStepNode,\n currentStepArr,\n validatedFields,\n isFirstStep,\n isLastStep,\n form: form as unknown as UseFormReturn<FieldValues>,\n next,\n prev,\n }),\n [\n form,\n _currentStep,\n _setCurrentStep,\n currentStepNode,\n currentStepArr,\n validatedFields,\n isFirstStep,\n isLastStep,\n next,\n prev,\n ],\n )\n\n const internalContextValue = useMemo<InternalFormContextValue>(\n () => ({\n // eslint-disable-next-line react-hooks/refs\n step: stepRef.current,\n registrationKey,\n rebuildSteps,\n registerStep,\n changeStepAtIndex,\n }),\n [registrationKey, rebuildSteps, registerStep, changeStepAtIndex],\n )\n\n const resolvedChildren =\n // eslint-disable-next-line react-hooks/refs\n typeof children === 'function' ? children(publicContextValue as unknown as FormContextValue<TFieldValues>) : children\n\n return (\n // eslint-disable-next-line react-hooks/refs\n <FormContext.Provider value={publicContextValue}>\n <InternalFormContext.Provider value={internalContextValue}>\n <form ref={ref} onSubmit={form.handleSubmit(onSubmit)} {...props}>\n <Step>{resolvedChildren}</Step>\n </form>\n </InternalFormContext.Provider>\n </FormContext.Provider>\n )\n}\n\nconst Form = forwardRef(FormInner) as <TFieldValues extends FieldValues = FieldValues>(\n props: FormProps<TFieldValues> & { ref?: React.Ref<HTMLFormElement> },\n) => React.JSX.Element\n\n;(Form as React.NamedExoticComponent & { displayName?: string }).displayName = 'Form'\n\nexport { Form, useFormContext, useInternalFormContext }\nexport type { FormContextValue, FormProps, InternalFormContextValue }\n","import { ComponentProps, useEffect } from 'react'\nimport {\n type Control,\n Controller as RHFController,\n type ControllerFieldState,\n type ControllerRenderProps,\n type FieldPath,\n type FieldValues,\n type UseFormStateReturn,\n} from 'react-hook-form'\n\nimport { useFormContext } from './form'\nimport { useStep } from './step'\n\ntype ControllerRenderArgs<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> = {\n field: ControllerRenderProps<TFieldValues, TName>\n fieldState: ControllerFieldState\n formState: UseFormStateReturn<TFieldValues>\n}\n\ntype ControllerProps<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> = ComponentProps<typeof RHFController<TFieldValues, TName>>\n\nfunction Controller<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({ name, control, ...rest }: ControllerProps<TFieldValues, TName>) {\n const formContext = useFormContext<TFieldValues>()\n const stepContext = useStep()\n const resolvedControl = control ?? (formContext.form.control as unknown as Control<TFieldValues>)\n\n useEffect(() => {\n if (stepContext) {\n stepContext.registerField([name as string])\n }\n }, [stepContext?.registrationKey])\n\n useEffect(() => {\n if (stepContext?.step !== undefined) {\n stepContext?.rebuildSteps()\n }\n return () => {\n stepContext?.rebuildSteps()\n }\n }, [])\n\n return <RHFController name={name} control={resolvedControl} {...rest} />\n}\n\nController.displayName = 'Controller'\n\nexport { Controller }\nexport type { ControllerProps, ControllerRenderArgs }\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/step.tsx","../src/form.tsx","../src/controller.tsx"],"names":["createContext","useContext","useMemo","useRef","useState","useCallback","steps","useEffect","stepRef","prev","jsx","forwardRef","RHFController"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'\n\nimport { useInternalFormContext } from './form'\nimport { type StepTree } from './types'\n\ntype StepContextValue = {\n step?: number\n registrationKey: number\n registerField: (elements: StepTree) => void\n registerStep: (elements: StepTree, stepRef: React.RefObject<number | undefined>, step?: number) => void\n rebuildSteps: () => void\n changeStepAtIndex: (steps: StepTree, index: number) => void\n}\n\nconst StepContext = createContext<StepContextValue | null>(null)\n\nfunction useStep(): StepContextValue | null {\n return useContext(StepContext)\n}\n\nfunction Step({ children }: { children: React.ReactNode }) {\n const stepContext = useStep()\n const formContext = useInternalFormContext()\n\n const {\n registerStep: registerStepFromParent,\n step: stepFromParent,\n rebuildSteps: rebuildStepsFromParent,\n changeStepAtIndex: changeStepAtIndexFromParent,\n registrationKey: registrationKeyFromParent,\n } = stepContext ?? formContext\n\n const isRoot = useMemo(() => {\n if (!stepContext) return true\n return false\n }, [stepContext])\n const stepRef = useRef<number | undefined>(undefined)\n const [steps, setSteps] = useState<StepTree>([])\n const [registrationKey, setRegistrationKey] = useState(0)\n\n const changeStepAtIndex = useCallback((steps: StepTree, index: number): void => {\n setSteps((prevSteps) => {\n const newSteps = [...prevSteps]\n newSteps[index] = steps\n return newSteps\n })\n }, [])\n\n useEffect(() => {\n if (isRoot && steps.length === 0) return\n const stepList = steps.length ? steps : ['']\n if (stepRef.current !== undefined) {\n changeStepAtIndexFromParent(stepList, stepRef.current)\n } else {\n registerStepFromParent(stepList, stepRef)\n }\n }, [registrationKeyFromParent, steps, isRoot])\n\n useEffect(() => {\n if (stepFromParent !== undefined) {\n rebuildStepsFromParent()\n }\n return () => {\n rebuildStepsFromParent()\n }\n }, [])\n\n const registerField = useCallback(\n (elements: StepTree): void => {\n setSteps((prevSteps) => {\n return [...prevSteps, ...elements]\n })\n },\n [steps],\n )\n\n const registerStep = useCallback(\n (elements: StepTree, stepRef: React.RefObject<number | undefined>, step?: number): void => {\n setSteps((prevSteps: StepTree) => {\n const stepNumber = step ?? prevSteps.length\n stepRef.current = stepNumber\n const newSteps = [...prevSteps]\n newSteps.splice(stepNumber, 0, elements)\n return newSteps\n })\n },\n [steps],\n )\n\n const rebuildSteps = useCallback(() => {\n setSteps([])\n setRegistrationKey((prev) => prev + 1)\n }, [])\n\n const contextValue = useMemo<StepContextValue>(\n () => ({\n // eslint-disable-next-line react-hooks/refs\n step: stepRef.current,\n registrationKey,\n changeStepAtIndex,\n registerField,\n registerStep,\n rebuildSteps,\n }),\n [registrationKey, changeStepAtIndex, registerField, registerStep, rebuildSteps],\n )\n\n // eslint-disable-next-line react-hooks/refs\n return <StepContext.Provider value={contextValue}>{children}</StepContext.Provider>\n}\n\nStep.displayName = 'Step'\n\nexport { Step, useStep }\nexport type { StepContextValue }\n","import { createContext, forwardRef, useCallback, useContext, useMemo, useRef, useState } from 'react'\nimport { type FieldValues, Path, type UseFormReturn } from 'react-hook-form'\n\nimport { Step } from './step'\nimport { type StepTree, type StepValidationMode } from './types'\n\nfunction buildNestedValues(fields: string[], values: unknown[]): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (let i = 0; i < fields.length; i++) {\n const segments = fields[i].split('.')\n let current: Record<string, unknown> = result\n for (let j = 0; j < segments.length - 1; j++) {\n const segment = segments[j]\n const nextSegment = segments[j + 1]\n const isNextNumeric = /^\\d+$/.test(nextSegment)\n if (current[segment] === undefined) {\n current[segment] = isNextNumeric ? [] : {}\n }\n current = current[segment] as Record<string, unknown>\n }\n current[segments[segments.length - 1]] = values[i]\n }\n return result\n}\n\nfunction comparePaths(a: number[], b: number[]): number {\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const ai = a[i] ?? -1\n const bi = b[i] ?? -1\n if (ai !== bi) return ai - bi\n }\n return 0\n}\n\nfunction getNodeAtPath(tree: StepTree, path: number[]): StepTree | undefined {\n let current: StepTree = tree\n for (const index of path) {\n if (!Array.isArray(current) || index >= current.length) return undefined\n current = current[index]\n }\n return current\n}\n\nfunction isLeafParent(node: StepTree): node is string[] {\n return Array.isArray(node) && node.length > 0 && node.every((child) => typeof child === 'string')\n}\n\nfunction getFirstLeafParentPath(tree: StepTree, path: number[]): number[] | null {\n const node = getNodeAtPath(tree, path)\n if (node === undefined) return null\n if (isLeafParent(node)) return path\n if (Array.isArray(node) && node.length > 0) {\n for (let i = 0; i < node.length; i++) {\n const found = getFirstLeafParentPath(tree, [...path, i])\n if (found) return found\n }\n }\n return null\n}\n\nfunction getLastLeafParentPath(tree: StepTree, path: number[]): number[] | null {\n const node = getNodeAtPath(tree, path)\n if (node === undefined) return null\n if (isLeafParent(node)) return path\n if (Array.isArray(node) && node.length > 0) {\n for (let i = node.length - 1; i >= 0; i--) {\n const found = getLastLeafParentPath(tree, [...path, i])\n if (found) return found\n }\n }\n return null\n}\n\nfunction getPrevLeafParentPath(tree: StepTree, path: number[]): number[] | null {\n const current = [...path]\n while (current.length > 0) {\n const lastIndex = current[current.length - 1]\n const parentPath = current.slice(0, -1)\n const parent = getNodeAtPath(tree, parentPath)\n\n if (Array.isArray(parent)) {\n for (let i = lastIndex - 1; i >= 0; i--) {\n const found = getLastLeafParentPath(tree, [...parentPath, i])\n if (found) return found\n }\n }\n\n current.pop()\n }\n\n return null\n}\n\nfunction getNextLeafParentPath(tree: StepTree, path: number[]): number[] | null {\n const current = [...path]\n while (current.length > 0) {\n const lastIndex = current[current.length - 1]\n const parentPath = current.slice(0, -1)\n const parent = getNodeAtPath(tree, parentPath)\n\n if (Array.isArray(parent)) {\n for (let i = lastIndex + 1; i < parent.length; i++) {\n const found = getFirstLeafParentPath(tree, [...parentPath, i])\n if (found) return found\n }\n }\n\n current.pop()\n }\n\n return null\n}\n\ntype FormContextValue<TFieldValues extends FieldValues = FieldValues> = {\n form: UseFormReturn<TFieldValues>\n currentStep: number | number[] | null\n setCurrentStep: (step: number | number[], beforeStepChange?: (values: Partial<TFieldValues>) => Promise<void>) => Promise<boolean>\n currentStepNode: StepTree | undefined\n currentStepArr: string[] | null\n validatedFields: string[]\n isFirstStep: boolean\n isLastStep: boolean\n next: (beforeStepChange?: (values: Partial<TFieldValues>) => Promise<void>) => Promise<boolean>\n prev: (beforeStepChange?: (values: Partial<TFieldValues>) => Promise<void>) => Promise<boolean>\n}\n\ntype InternalFormContextValue = {\n step?: number\n registrationKey: number\n rebuildSteps: () => void\n registerStep: (elements: StepTree, stepRef: React.RefObject<number | undefined>, step?: number) => void\n changeStepAtIndex: (elements: StepTree, index: number) => void\n}\n\nconst FormContext = createContext<FormContextValue | null>(null)\nconst InternalFormContext = createContext<InternalFormContextValue | null>(null)\n\nfunction useFormContext<TFieldValues extends FieldValues = FieldValues>(): FormContextValue<TFieldValues> {\n const context = useContext(FormContext)\n if (!context) {\n throw new Error('useFormContext must be used within a <Form>')\n }\n return context as unknown as FormContextValue<TFieldValues>\n}\n\nfunction useInternalFormContext(): InternalFormContextValue {\n const context = useContext(InternalFormContext)\n if (!context) {\n throw new Error('useInternalFormContext must be used within a <Form>')\n }\n return context\n}\n\ninterface FormProps<TFieldValues extends FieldValues = FieldValues>\n extends Omit<React.ComponentProps<'form'>, 'onSubmit' | 'children'> {\n form: UseFormReturn<TFieldValues>\n onSubmit: (values: TFieldValues) => void\n stepValidationMode?: StepValidationMode\n children: React.ReactNode | ((context: FormContextValue<TFieldValues>) => React.ReactNode)\n}\n\nfunction FormInner<TFieldValues extends FieldValues = FieldValues>(\n { form, onSubmit, stepValidationMode = 'forward', children, ...props }: FormProps<TFieldValues>,\n ref: React.Ref<HTMLFormElement>,\n) {\n const [steps, setSteps] = useState<StepTree>([])\n const [currentStep, setCurrentStep] = useState<number[] | null>(null)\n const [validatedFields, setValidatedFields] = useState<string[]>([])\n const [registrationKey, setRegistrationKey] = useState(0)\n\n const stepRef = useRef<number | undefined>(undefined)\n\n const _currentStep = useMemo<number | number[] | null>(() => {\n if (!currentStep) return null\n const sliced = currentStep.slice(1)\n return sliced.length === 1 ? sliced[0] : sliced\n }, [currentStep])\n\n const currentStepNode = useMemo(\n () => (currentStep ? getNodeAtPath(steps, currentStep) : undefined),\n [steps, currentStep],\n )\n\n const currentStepArr = useMemo<string[] | null>(() => {\n if (!currentStepNode) return null\n return isLeafParent(currentStepNode) ? currentStepNode : null\n }, [currentStepNode])\n\n const _setCurrentStep = useCallback(\n async (step: number | number[], beforeStepChange?: (values: Partial<TFieldValues>) => Promise<void>): Promise<boolean> => {\n const path = typeof step === 'number' ? [0, step] : [0, ...step]\n if (currentStep && currentStepArr && stepValidationMode !== 'none') {\n const isForward = comparePaths(path, currentStep) > 0\n const shouldValidate = stepValidationMode === 'all' || (stepValidationMode === 'forward' && isForward)\n if (shouldValidate) {\n const isValid = await form.trigger(currentStepArr as Path<TFieldValues>[])\n if (!isValid) {\n setValidatedFields((prev) => prev.filter((field) => !currentStepArr.includes(field)))\n return false\n }\n setValidatedFields((prev) => [...new Set([...prev, ...currentStepArr])])\n }\n }\n if (beforeStepChange && currentStepArr) {\n const watchedValues = form.watch(currentStepArr as Path<TFieldValues>[])\n const values = buildNestedValues(currentStepArr, watchedValues) as Partial<TFieldValues>\n await beforeStepChange(values)\n }\n setCurrentStep(path)\n return true\n },\n [currentStep, currentStepArr, form, stepValidationMode],\n )\n\n const isFirstStep = useMemo(\n () => (currentStep ? getPrevLeafParentPath(steps, currentStep) === null : true),\n [steps, currentStep],\n )\n\n const isLastStep = useMemo(\n () => (currentStep ? getNextLeafParentPath(steps, currentStep) === null : true),\n [steps, currentStep],\n )\n\n const next = useCallback(async (beforeStepChange?: (values: Partial<TFieldValues>) => Promise<void>): Promise<boolean> => {\n if (!currentStep) return false\n const nextPath = getNextLeafParentPath(steps, currentStep)\n if (currentStepArr && stepValidationMode !== 'none') {\n const isValid = await form.trigger(currentStepArr as Path<TFieldValues>[])\n if (!isValid) {\n setValidatedFields((prev) => prev.filter((field) => !currentStepArr.includes(field)))\n return false\n }\n setValidatedFields((prev) => [...new Set([...prev, ...currentStepArr])])\n }\n if (nextPath) {\n if (beforeStepChange && currentStepArr) {\n const watchedValues = form.watch(currentStepArr as Path<TFieldValues>[])\n const values = buildNestedValues(currentStepArr, watchedValues) as Partial<TFieldValues>\n await beforeStepChange(values)\n }\n setCurrentStep(nextPath)\n return true\n }\n return false\n }, [steps, currentStep, currentStepArr, form, stepValidationMode])\n\n const prev = useCallback(async (beforeStepChange?: (values: Partial<TFieldValues>) => Promise<void>): Promise<boolean> => {\n if (!currentStep) return false\n const prevPath = getPrevLeafParentPath(steps, currentStep)\n if (currentStepArr && stepValidationMode === 'all') {\n const isValid = await form.trigger(currentStepArr as Path<TFieldValues>[])\n if (!isValid) {\n setValidatedFields((prev) => prev.filter((field) => !currentStepArr.includes(field)))\n return false\n }\n setValidatedFields((prev) => [...new Set([...prev, ...currentStepArr])])\n }\n if (prevPath) {\n if (beforeStepChange && currentStepArr) {\n const watchedValues = form.watch(currentStepArr as Path<TFieldValues>[])\n const values = buildNestedValues(currentStepArr, watchedValues) as Partial<TFieldValues>\n await beforeStepChange(values)\n }\n setCurrentStep(prevPath)\n return true\n }\n return false\n }, [steps, currentStep, currentStepArr, form, stepValidationMode])\n\n const registerStep = useCallback(\n (elements: StepTree, stepRef: React.RefObject<number | undefined>, step?: number): void => {\n setSteps((prevSteps: StepTree) => {\n const stepNumber = step ?? (Array.isArray(prevSteps) ? prevSteps.length : 0)\n stepRef.current = stepNumber\n const newSteps = Array.isArray(prevSteps) ? [...prevSteps] : [prevSteps]\n newSteps.splice(stepNumber, 0, elements)\n\n if (currentStep === null) {\n const firstLeafParent = getFirstLeafParentPath(newSteps, [0])\n if (firstLeafParent) {\n setCurrentStep(firstLeafParent)\n }\n }\n\n return newSteps\n })\n },\n [currentStep],\n )\n\n const rebuildSteps = useCallback(() => {\n setSteps([])\n setRegistrationKey((prev) => prev + 1)\n }, [])\n\n const changeStepAtIndex = useCallback((steps: StepTree, index: number): void => {\n setSteps((prevSteps) => {\n const newSteps = Array.isArray(prevSteps) ? [...prevSteps] : [prevSteps]\n newSteps[index] = steps\n return newSteps\n })\n }, [])\n\n const publicContextValue = useMemo<FormContextValue>(\n () => ({\n currentStep: _currentStep,\n setCurrentStep: _setCurrentStep,\n currentStepNode,\n currentStepArr,\n validatedFields,\n isFirstStep,\n isLastStep,\n form: form as unknown as UseFormReturn<FieldValues>,\n next,\n prev,\n }),\n [\n form,\n _currentStep,\n _setCurrentStep,\n currentStepNode,\n currentStepArr,\n validatedFields,\n isFirstStep,\n isLastStep,\n next,\n prev,\n ],\n )\n\n const internalContextValue = useMemo<InternalFormContextValue>(\n () => ({\n // eslint-disable-next-line react-hooks/refs\n step: stepRef.current,\n registrationKey,\n rebuildSteps,\n registerStep,\n changeStepAtIndex,\n }),\n [registrationKey, rebuildSteps, registerStep, changeStepAtIndex],\n )\n\n const resolvedChildren =\n // eslint-disable-next-line react-hooks/refs\n typeof children === 'function' ? children(publicContextValue as unknown as FormContextValue<TFieldValues>) : children\n\n return (\n // eslint-disable-next-line react-hooks/refs\n <FormContext.Provider value={publicContextValue}>\n <InternalFormContext.Provider value={internalContextValue}>\n <form ref={ref} onSubmit={form.handleSubmit(onSubmit)} {...props}>\n <Step>{resolvedChildren}</Step>\n </form>\n </InternalFormContext.Provider>\n </FormContext.Provider>\n )\n}\n\nconst Form = forwardRef(FormInner) as <TFieldValues extends FieldValues = FieldValues>(\n props: FormProps<TFieldValues> & { ref?: React.Ref<HTMLFormElement> },\n) => React.JSX.Element\n\n;(Form as React.NamedExoticComponent & { displayName?: string }).displayName = 'Form'\n\nexport { Form, useFormContext, useInternalFormContext }\nexport type { FormContextValue, FormProps, InternalFormContextValue }\n","import { ComponentProps, useEffect } from 'react'\nimport {\n type Control,\n Controller as RHFController,\n type ControllerFieldState,\n type ControllerRenderProps,\n type FieldPath,\n type FieldValues,\n type UseFormStateReturn,\n} from 'react-hook-form'\n\nimport { useFormContext } from './form'\nimport { useStep } from './step'\n\ntype ControllerRenderArgs<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> = {\n field: ControllerRenderProps<TFieldValues, TName>\n fieldState: ControllerFieldState\n formState: UseFormStateReturn<TFieldValues>\n}\n\ntype ControllerProps<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> = ComponentProps<typeof RHFController<TFieldValues, TName>>\n\nfunction Controller<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({ name, control, ...rest }: ControllerProps<TFieldValues, TName>) {\n const formContext = useFormContext<TFieldValues>()\n const stepContext = useStep()\n const resolvedControl = control ?? (formContext.form.control as unknown as Control<TFieldValues>)\n\n useEffect(() => {\n if (stepContext) {\n stepContext.registerField([name as string])\n }\n }, [stepContext?.registrationKey])\n\n useEffect(() => {\n if (stepContext?.step !== undefined) {\n stepContext?.rebuildSteps()\n }\n return () => {\n stepContext?.rebuildSteps()\n }\n }, [])\n\n return <RHFController name={name} control={resolvedControl} {...rest} />\n}\n\nController.displayName = 'Controller'\n\nexport { Controller }\nexport type { ControllerProps, ControllerRenderArgs }\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -87,6 +87,24 @@ function Step({ children }) {
|
|
|
87
87
|
return /* @__PURE__ */ jsx(StepContext.Provider, { value: contextValue, children });
|
|
88
88
|
}
|
|
89
89
|
Step.displayName = "Step";
|
|
90
|
+
function buildNestedValues(fields, values) {
|
|
91
|
+
const result = {};
|
|
92
|
+
for (let i = 0; i < fields.length; i++) {
|
|
93
|
+
const segments = fields[i].split(".");
|
|
94
|
+
let current = result;
|
|
95
|
+
for (let j = 0; j < segments.length - 1; j++) {
|
|
96
|
+
const segment = segments[j];
|
|
97
|
+
const nextSegment = segments[j + 1];
|
|
98
|
+
const isNextNumeric = /^\d+$/.test(nextSegment);
|
|
99
|
+
if (current[segment] === void 0) {
|
|
100
|
+
current[segment] = isNextNumeric ? [] : {};
|
|
101
|
+
}
|
|
102
|
+
current = current[segment];
|
|
103
|
+
}
|
|
104
|
+
current[segments[segments.length - 1]] = values[i];
|
|
105
|
+
}
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
90
108
|
function comparePaths(a, b) {
|
|
91
109
|
var _a, _b;
|
|
92
110
|
for (let i = 0; i < Math.max(a.length, b.length); i++) {
|
|
@@ -199,7 +217,7 @@ function FormInner({ form, onSubmit, stepValidationMode = "forward", children, .
|
|
|
199
217
|
return isLeafParent(currentStepNode) ? currentStepNode : null;
|
|
200
218
|
}, [currentStepNode]);
|
|
201
219
|
const _setCurrentStep = useCallback(
|
|
202
|
-
async (step) => {
|
|
220
|
+
async (step, beforeStepChange) => {
|
|
203
221
|
const path = typeof step === "number" ? [0, step] : [0, ...step];
|
|
204
222
|
if (currentStep && currentStepArr && stepValidationMode !== "none") {
|
|
205
223
|
const isForward = comparePaths(path, currentStep) > 0;
|
|
@@ -213,6 +231,11 @@ function FormInner({ form, onSubmit, stepValidationMode = "forward", children, .
|
|
|
213
231
|
setValidatedFields((prev2) => [.../* @__PURE__ */ new Set([...prev2, ...currentStepArr])]);
|
|
214
232
|
}
|
|
215
233
|
}
|
|
234
|
+
if (beforeStepChange && currentStepArr) {
|
|
235
|
+
const watchedValues = form.watch(currentStepArr);
|
|
236
|
+
const values = buildNestedValues(currentStepArr, watchedValues);
|
|
237
|
+
await beforeStepChange(values);
|
|
238
|
+
}
|
|
216
239
|
setCurrentStep(path);
|
|
217
240
|
return true;
|
|
218
241
|
},
|
|
@@ -226,7 +249,7 @@ function FormInner({ form, onSubmit, stepValidationMode = "forward", children, .
|
|
|
226
249
|
() => currentStep ? getNextLeafParentPath(steps, currentStep) === null : true,
|
|
227
250
|
[steps, currentStep]
|
|
228
251
|
);
|
|
229
|
-
const next = useCallback(async () => {
|
|
252
|
+
const next = useCallback(async (beforeStepChange) => {
|
|
230
253
|
if (!currentStep) return false;
|
|
231
254
|
const nextPath = getNextLeafParentPath(steps, currentStep);
|
|
232
255
|
if (currentStepArr && stepValidationMode !== "none") {
|
|
@@ -238,12 +261,17 @@ function FormInner({ form, onSubmit, stepValidationMode = "forward", children, .
|
|
|
238
261
|
setValidatedFields((prev2) => [.../* @__PURE__ */ new Set([...prev2, ...currentStepArr])]);
|
|
239
262
|
}
|
|
240
263
|
if (nextPath) {
|
|
264
|
+
if (beforeStepChange && currentStepArr) {
|
|
265
|
+
const watchedValues = form.watch(currentStepArr);
|
|
266
|
+
const values = buildNestedValues(currentStepArr, watchedValues);
|
|
267
|
+
await beforeStepChange(values);
|
|
268
|
+
}
|
|
241
269
|
setCurrentStep(nextPath);
|
|
242
270
|
return true;
|
|
243
271
|
}
|
|
244
272
|
return false;
|
|
245
273
|
}, [steps, currentStep, currentStepArr, form, stepValidationMode]);
|
|
246
|
-
const prev = useCallback(async () => {
|
|
274
|
+
const prev = useCallback(async (beforeStepChange) => {
|
|
247
275
|
if (!currentStep) return false;
|
|
248
276
|
const prevPath = getPrevLeafParentPath(steps, currentStep);
|
|
249
277
|
if (currentStepArr && stepValidationMode === "all") {
|
|
@@ -255,6 +283,11 @@ function FormInner({ form, onSubmit, stepValidationMode = "forward", children, .
|
|
|
255
283
|
setValidatedFields((prev2) => [.../* @__PURE__ */ new Set([...prev2, ...currentStepArr])]);
|
|
256
284
|
}
|
|
257
285
|
if (prevPath) {
|
|
286
|
+
if (beforeStepChange && currentStepArr) {
|
|
287
|
+
const watchedValues = form.watch(currentStepArr);
|
|
288
|
+
const values = buildNestedValues(currentStepArr, watchedValues);
|
|
289
|
+
await beforeStepChange(values);
|
|
290
|
+
}
|
|
258
291
|
setCurrentStep(prevPath);
|
|
259
292
|
return true;
|
|
260
293
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/step.tsx","../src/form.tsx","../src/controller.tsx"],"names":["steps","stepRef","createContext","useContext","useState","useRef","useMemo","useCallback","prev","jsx","useEffect","RHFController"],"mappings":";;;;;AAcA,IAAM,WAAA,GAAc,cAAuC,IAAI,CAAA;AAE/D,SAAS,OAAA,GAAmC;AAC1C,EAAA,OAAO,WAAW,WAAW,CAAA;AAC/B;AAEA,SAAS,IAAA,CAAK,EAAE,QAAA,EAAS,EAAkC;AACzD,EAAA,MAAM,cAAc,OAAA,EAAQ;AAC5B,EAAA,MAAM,cAAc,sBAAA,EAAuB;AAE3C,EAAA,MAAM;AAAA,IACJ,YAAA,EAAc,sBAAA;AAAA,IACd,IAAA,EAAM,cAAA;AAAA,IACN,YAAA,EAAc,sBAAA;AAAA,IACd,iBAAA,EAAmB,2BAAA;AAAA,IACnB,eAAA,EAAiB;AAAA,MACf,WAAA,IAAA,IAAA,GAAA,WAAA,GAAe,WAAA;AAEnB,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAM;AAC3B,IAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AACzB,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAChB,EAAA,MAAM,OAAA,GAAU,OAA2B,MAAS,CAAA;AACpD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAA,CAAmB,EAAE,CAAA;AAC/C,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAS,CAAC,CAAA;AAExD,EAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,CAACA,MAAAA,EAAiB,KAAA,KAAwB;AAC9E,IAAA,QAAA,CAAS,CAAC,SAAA,KAAc;AACtB,MAAA,MAAM,QAAA,GAAW,CAAC,GAAG,SAAS,CAAA;AAC9B,MAAA,QAAA,CAAS,KAAK,CAAA,GAAIA,MAAAA;AAClB,MAAA,OAAO,QAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,MAAA,IAAU,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAClC,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,GAAS,KAAA,GAAQ,CAAC,EAAE,CAAA;AAC3C,IAAA,IAAI,OAAA,CAAQ,YAAY,MAAA,EAAW;AACjC,MAAA,2BAAA,CAA4B,QAAA,EAAU,QAAQ,OAAO,CAAA;AAAA,IACvD,CAAA,MAAO;AACL,MAAA,sBAAA,CAAuB,UAAU,OAAO,CAAA;AAAA,IAC1C;AAAA,EACF,CAAA,EAAG,CAAC,yBAAA,EAA2B,KAAA,EAAO,MAAM,CAAC,CAAA;AAE7C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,mBAAmB,MAAA,EAAW;AAChC,MAAA,sBAAA,EAAuB;AAAA,IACzB;AACA,IAAA,OAAO,MAAM;AACX,MAAA,sBAAA,EAAuB;AAAA,IACzB,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,CAAC,QAAA,KAA6B;AAC5B,MAAA,QAAA,CAAS,CAAC,SAAA,KAAc;AACtB,QAAA,OAAO,CAAC,GAAG,SAAA,EAAW,GAAG,QAAQ,CAAA;AAAA,MACnC,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,KAAK;AAAA,GACR;AAEA,EAAA,MAAM,YAAA,GAAe,WAAA;AAAA,IACnB,CAAC,QAAA,EAAoBC,QAAAA,EAA8C,IAAA,KAAwB;AACzF,MAAA,QAAA,CAAS,CAAC,SAAA,KAAwB;AAChC,QAAA,MAAM,UAAA,GAAa,sBAAQ,SAAA,CAAU,MAAA;AACrC,QAAAA,SAAQ,OAAA,GAAU,UAAA;AAClB,QAAA,MAAM,QAAA,GAAW,CAAC,GAAG,SAAS,CAAA;AAC9B,QAAA,QAAA,CAAS,MAAA,CAAO,UAAA,EAAY,CAAA,EAAG,QAAQ,CAAA;AACvC,QAAA,OAAO,QAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,KAAK;AAAA,GACR;AAEA,EAAA,MAAM,YAAA,GAAe,YAAY,MAAM;AACrC,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,kBAAA,CAAmB,CAAC,IAAA,KAAS,IAAA,GAAO,CAAC,CAAA;AAAA,EACvC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAe,OAAA;AAAA,IACnB,OAAO;AAAA;AAAA,MAEL,MAAM,OAAA,CAAQ,OAAA;AAAA,MACd,eAAA;AAAA,MACA,iBAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,eAAA,EAAiB,iBAAA,EAAmB,aAAA,EAAe,cAAc,YAAY;AAAA,GAChF;AAGA,EAAA,2BAAQ,WAAA,CAAY,QAAA,EAAZ,EAAqB,KAAA,EAAO,cAAe,QAAA,EAAS,CAAA;AAC9D;AAEA,IAAA,CAAK,WAAA,GAAc,MAAA;ACzGnB,SAAS,YAAA,CAAa,GAAa,CAAA,EAAqB;AANxD,EAAA,IAAA,EAAA,EAAA,EAAA;AAOE,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAM,CAAA,EAAG,CAAA,EAAA,EAAK;AACrD,IAAA,MAAM,EAAA,GAAA,CAAK,EAAA,GAAA,CAAA,CAAE,CAAC,CAAA,KAAH,IAAA,GAAA,EAAA,GAAQ,EAAA;AACnB,IAAA,MAAM,EAAA,GAAA,CAAK,EAAA,GAAA,CAAA,CAAE,CAAC,CAAA,KAAH,IAAA,GAAA,EAAA,GAAQ,EAAA;AACnB,IAAA,IAAI,EAAA,KAAO,EAAA,EAAI,OAAO,EAAA,GAAK,EAAA;AAAA,EAC7B;AACA,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,aAAA,CAAc,MAAgB,IAAA,EAAsC;AAC3E,EAAA,IAAI,OAAA,GAAoB,IAAA;AACxB,EAAA,KAAA,MAAW,SAAS,IAAA,EAAM;AACxB,IAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,OAAO,KAAK,KAAA,IAAS,OAAA,CAAQ,QAAQ,OAAO,MAAA;AAC/D,IAAA,OAAA,GAAU,QAAQ,KAAK,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,aAAa,IAAA,EAAkC;AACtD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,CAAC,KAAA,KAAU,OAAO,UAAU,QAAQ,CAAA;AAClG;AAEA,SAAS,sBAAA,CAAuB,MAAgB,IAAA,EAAiC;AAC/E,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,IAAA,EAAM,IAAI,CAAA;AACrC,EAAA,IAAI,IAAA,KAAS,QAAW,OAAO,IAAA;AAC/B,EAAA,IAAI,YAAA,CAAa,IAAI,CAAA,EAAG,OAAO,IAAA;AAC/B,EAAA,IAAI,MAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,IAAA,CAAK,SAAS,CAAA,EAAG;AAC1C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,QAAQ,sBAAA,CAAuB,IAAA,EAAM,CAAC,GAAG,IAAA,EAAM,CAAC,CAAC,CAAA;AACvD,MAAA,IAAI,OAAO,OAAO,KAAA;AAAA,IACpB;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,qBAAA,CAAsB,MAAgB,IAAA,EAAiC;AAC9E,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,IAAA,EAAM,IAAI,CAAA;AACrC,EAAA,IAAI,IAAA,KAAS,QAAW,OAAO,IAAA;AAC/B,EAAA,IAAI,YAAA,CAAa,IAAI,CAAA,EAAG,OAAO,IAAA;AAC/B,EAAA,IAAI,MAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,IAAA,CAAK,SAAS,CAAA,EAAG;AAC1C,IAAA,KAAA,IAAS,IAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,QAAQ,qBAAA,CAAsB,IAAA,EAAM,CAAC,GAAG,IAAA,EAAM,CAAC,CAAC,CAAA;AACtD,MAAA,IAAI,OAAO,OAAO,KAAA;AAAA,IACpB;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,qBAAA,CAAsB,MAAgB,IAAA,EAAiC;AAC9E,EAAA,MAAM,OAAA,GAAU,CAAC,GAAG,IAAI,CAAA;AACxB,EAAA,OAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AACzB,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAC5C,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACtC,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,IAAA,EAAM,UAAU,CAAA;AAE7C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,MAAA,KAAA,IAAS,CAAA,GAAI,SAAA,GAAY,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACvC,QAAA,MAAM,QAAQ,qBAAA,CAAsB,IAAA,EAAM,CAAC,GAAG,UAAA,EAAY,CAAC,CAAC,CAAA;AAC5D,QAAA,IAAI,OAAO,OAAO,KAAA;AAAA,MACpB;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,EACd;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,qBAAA,CAAsB,MAAgB,IAAA,EAAiC;AAC9E,EAAA,MAAM,OAAA,GAAU,CAAC,GAAG,IAAI,CAAA;AACxB,EAAA,OAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AACzB,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAC5C,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACtC,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,IAAA,EAAM,UAAU,CAAA;AAE7C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,MAAA,KAAA,IAAS,IAAI,SAAA,GAAY,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AAClD,QAAA,MAAM,QAAQ,sBAAA,CAAuB,IAAA,EAAM,CAAC,GAAG,UAAA,EAAY,CAAC,CAAC,CAAA;AAC7D,QAAA,IAAI,OAAO,OAAO,KAAA;AAAA,MACpB;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,EACd;AAEA,EAAA,OAAO,IAAA;AACT;AAuBA,IAAM,WAAA,GAAcC,cAAuC,IAAI,CAAA;AAC/D,IAAM,mBAAA,GAAsBA,cAA+C,IAAI,CAAA;AAE/E,SAAS,cAAA,GAAiG;AACxG,EAAA,MAAM,OAAA,GAAUC,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,sBAAA,GAAmD;AAC1D,EAAA,MAAM,OAAA,GAAUA,WAAW,mBAAmB,CAAA;AAC9C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,EACvE;AACA,EAAA,OAAO,OAAA;AACT;AAUA,SAAS,SAAA,CACP,EAAE,IAAA,EAAM,QAAA,EAAU,kBAAA,GAAqB,WAAW,QAAA,EAAU,GAAG,KAAA,EAAM,EACrE,GAAA,EACA;AACA,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIC,QAAAA,CAAmB,EAAE,CAAA;AAC/C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAA0B,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,QAAAA,CAAmB,EAAE,CAAA;AACnE,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAS,CAAC,CAAA;AAExD,EAAA,MAAM,OAAA,GAAUC,OAA2B,MAAS,CAAA;AAEpD,EAAA,MAAM,YAAA,GAAeC,QAAkC,MAAM;AAC3D,IAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AACzB,IAAA,MAAM,MAAA,GAAS,WAAA,CAAY,KAAA,CAAM,CAAC,CAAA;AAClC,IAAA,OAAO,MAAA,CAAO,MAAA,KAAW,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,GAAI,MAAA;AAAA,EAC3C,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,eAAA,GAAkBA,OAAAA;AAAA,IACtB,MAAO,WAAA,GAAc,aAAA,CAAc,KAAA,EAAO,WAAW,CAAA,GAAI,MAAA;AAAA,IACzD,CAAC,OAAO,WAAW;AAAA,GACrB;AAEA,EAAA,MAAM,cAAA,GAAiBA,QAAyB,MAAM;AACpD,IAAA,IAAI,CAAC,iBAAiB,OAAO,IAAA;AAC7B,IAAA,OAAO,YAAA,CAAa,eAAe,CAAA,GAAI,eAAA,GAAkB,IAAA;AAAA,EAC3D,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAEpB,EAAA,MAAM,eAAA,GAAkBC,WAAAA;AAAA,IACtB,OAAO,IAAA,KAA8C;AACnD,MAAA,MAAM,IAAA,GAAO,OAAO,IAAA,KAAS,QAAA,GAAW,CAAC,CAAA,EAAG,IAAI,CAAA,GAAI,CAAC,CAAA,EAAG,GAAG,IAAI,CAAA;AAC/D,MAAA,IAAI,WAAA,IAAe,cAAA,IAAkB,kBAAA,KAAuB,MAAA,EAAQ;AAClE,QAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,EAAM,WAAW,CAAA,GAAI,CAAA;AACpD,QAAA,MAAM,cAAA,GAAiB,kBAAA,KAAuB,KAAA,IAAU,kBAAA,KAAuB,SAAA,IAAa,SAAA;AAC5F,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,cAAsC,CAAA;AACzE,UAAA,IAAI,CAAC,OAAA,EAAS;AACZ,YAAA,kBAAA,CAAmB,CAACC,KAAAA,KAASA,KAAAA,CAAK,MAAA,CAAO,CAAC,KAAA,KAAU,CAAC,cAAA,CAAe,QAAA,CAAS,KAAK,CAAC,CAAC,CAAA;AACpF,YAAA,OAAO,KAAA;AAAA,UACT;AACA,UAAA,kBAAA,CAAmB,CAACA,KAAAA,KAAS,CAAC,mBAAG,IAAI,GAAA,CAAI,CAAC,GAAGA,KAAAA,EAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;AAAA,QACzE;AAAA,MACF;AACA,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,WAAA,EAAa,cAAA,EAAgB,IAAA,EAAM,kBAAkB;AAAA,GACxD;AAEA,EAAA,MAAM,WAAA,GAAcF,OAAAA;AAAA,IAClB,MAAO,WAAA,GAAc,qBAAA,CAAsB,KAAA,EAAO,WAAW,MAAM,IAAA,GAAO,IAAA;AAAA,IAC1E,CAAC,OAAO,WAAW;AAAA,GACrB;AAEA,EAAA,MAAM,UAAA,GAAaA,OAAAA;AAAA,IACjB,MAAO,WAAA,GAAc,qBAAA,CAAsB,KAAA,EAAO,WAAW,MAAM,IAAA,GAAO,IAAA;AAAA,IAC1E,CAAC,OAAO,WAAW;AAAA,GACrB;AAEA,EAAA,MAAM,IAAA,GAAOC,YAAY,YAA8B;AACrD,IAAA,IAAI,CAAC,aAAa,OAAO,KAAA;AACzB,IAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,KAAA,EAAO,WAAW,CAAA;AACzD,IAAA,IAAI,cAAA,IAAkB,uBAAuB,MAAA,EAAQ;AACnD,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,cAAsC,CAAA;AACzE,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,kBAAA,CAAmB,CAACC,KAAAA,KAASA,KAAAA,CAAK,MAAA,CAAO,CAAC,KAAA,KAAU,CAAC,cAAA,CAAe,QAAA,CAAS,KAAK,CAAC,CAAC,CAAA;AACpF,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,kBAAA,CAAmB,CAACA,KAAAA,KAAS,CAAC,mBAAG,IAAI,GAAA,CAAI,CAAC,GAAGA,KAAAA,EAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;AAAA,IACzE;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,cAAA,CAAe,QAAQ,CAAA;AACvB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA;AAAA,EACT,GAAG,CAAC,KAAA,EAAO,aAAa,cAAA,EAAgB,IAAA,EAAM,kBAAkB,CAAC,CAAA;AAEjE,EAAA,MAAM,IAAA,GAAOD,YAAY,YAA8B;AACrD,IAAA,IAAI,CAAC,aAAa,OAAO,KAAA;AACzB,IAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,KAAA,EAAO,WAAW,CAAA;AACzD,IAAA,IAAI,cAAA,IAAkB,uBAAuB,KAAA,EAAO;AAClD,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,cAAsC,CAAA;AACzE,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,kBAAA,CAAmB,CAACC,KAAAA,KAASA,KAAAA,CAAK,MAAA,CAAO,CAAC,KAAA,KAAU,CAAC,cAAA,CAAe,QAAA,CAAS,KAAK,CAAC,CAAC,CAAA;AACpF,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,kBAAA,CAAmB,CAACA,KAAAA,KAAS,CAAC,mBAAG,IAAI,GAAA,CAAI,CAAC,GAAGA,KAAAA,EAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;AAAA,IACzE;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,cAAA,CAAe,QAAQ,CAAA;AACvB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA;AAAA,EACT,GAAG,CAAC,KAAA,EAAO,aAAa,cAAA,EAAgB,IAAA,EAAM,kBAAkB,CAAC,CAAA;AAEjE,EAAA,MAAM,YAAA,GAAeD,WAAAA;AAAA,IACnB,CAAC,QAAA,EAAoBN,QAAAA,EAA8C,IAAA,KAAwB;AACzF,MAAA,QAAA,CAAS,CAAC,SAAA,KAAwB;AAChC,QAAA,MAAM,aAAa,IAAA,IAAA,IAAA,GAAA,IAAA,GAAS,KAAA,CAAM,QAAQ,SAAS,CAAA,GAAI,UAAU,MAAA,GAAS,CAAA;AAC1E,QAAAA,SAAQ,OAAA,GAAU,UAAA;AAClB,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,GAAI,CAAC,GAAG,SAAS,CAAA,GAAI,CAAC,SAAS,CAAA;AACvE,QAAA,QAAA,CAAS,MAAA,CAAO,UAAA,EAAY,CAAA,EAAG,QAAQ,CAAA;AAEvC,QAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,UAAA,MAAM,eAAA,GAAkB,sBAAA,CAAuB,QAAA,EAAU,CAAC,CAAC,CAAC,CAAA;AAC5D,UAAA,IAAI,eAAA,EAAiB;AACnB,YAAA,cAAA,CAAe,eAAe,CAAA;AAAA,UAChC;AAAA,QACF;AAEA,QAAA,OAAO,QAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,MAAM,YAAA,GAAeM,YAAY,MAAM;AACrC,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,kBAAA,CAAmB,CAACC,KAAAA,KAASA,KAAAA,GAAO,CAAC,CAAA;AAAA,EACvC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,iBAAA,GAAoBD,WAAAA,CAAY,CAACP,MAAAA,EAAiB,KAAA,KAAwB;AAC9E,IAAA,QAAA,CAAS,CAAC,SAAA,KAAc;AACtB,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,GAAI,CAAC,GAAG,SAAS,CAAA,GAAI,CAAC,SAAS,CAAA;AACvE,MAAA,QAAA,CAAS,KAAK,CAAA,GAAIA,MAAAA;AAClB,MAAA,OAAO,QAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,kBAAA,GAAqBM,OAAAA;AAAA,IACzB,OAAO;AAAA,MACL,WAAA,EAAa,YAAA;AAAA,MACb,cAAA,EAAgB,eAAA;AAAA,MAChB,eAAA;AAAA,MACA,cAAA;AAAA,MACA,eAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA;AAAA,MACA,YAAA;AAAA,MACA,eAAA;AAAA,MACA,eAAA;AAAA,MACA,cAAA;AAAA,MACA,eAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,oBAAA,GAAuBA,OAAAA;AAAA,IAC3B,OAAO;AAAA;AAAA,MAEL,MAAM,OAAA,CAAQ,OAAA;AAAA,MACd,eAAA;AAAA,MACA,YAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,eAAA,EAAiB,YAAA,EAAc,YAAA,EAAc,iBAAiB;AAAA,GACjE;AAEA,EAAA,MAAM,gBAAA;AAAA;AAAA,IAEJ,OAAO,QAAA,KAAa,UAAA,GAAa,QAAA,CAAS,kBAA+D,CAAA,GAAI;AAAA,GAAA;AAE/G,EAAA;AAAA;AAAA,oBAEEG,GAAAA,CAAC,WAAA,CAAY,QAAA,EAAZ,EAAqB,KAAA,EAAO,kBAAA,EAC3B,QAAA,kBAAAA,GAAAA,CAAC,mBAAA,CAAoB,QAAA,EAApB,EAA6B,OAAO,oBAAA,EACnC,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,GAAA,EAAU,QAAA,EAAU,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAA,EAAI,GAAG,KAAA,EACzD,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAM,QAAA,EAAA,gBAAA,EAAiB,CAAA,EAC1B,GACF,CAAA,EACF;AAAA;AAEJ;AAEA,IAAM,IAAA,GAAO,WAAW,SAAS;AAI/B,IAAA,CAA+D,WAAA,GAAc,MAAA;AC7S/E,SAAS,WAGP,EAAE,IAAA,EAAM,OAAA,EAAS,GAAG,MAAK,EAAyC;AAClE,EAAA,MAAM,cAAc,cAAA,EAA6B;AACjD,EAAA,MAAM,cAAc,OAAA,EAAQ;AAC5B,EAAA,MAAM,eAAA,GAAkB,OAAA,IAAA,IAAA,GAAA,OAAA,GAAY,WAAA,CAAY,IAAA,CAAK,OAAA;AAErD,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,WAAA,CAAY,aAAA,CAAc,CAAC,IAAc,CAAC,CAAA;AAAA,IAC5C;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,IAAA,IAAA,GAAA,MAAA,GAAA,WAAA,CAAa,eAAe,CAAC,CAAA;AAEjC,EAAAA,UAAU,MAAM;AACd,IAAA,IAAA,CAAI,WAAA,IAAA,IAAA,GAAA,MAAA,GAAA,WAAA,CAAa,UAAS,MAAA,EAAW;AACnC,MAAA,WAAA,IAAA,IAAA,GAAA,MAAA,GAAA,WAAA,CAAa,YAAA,EAAA;AAAA,IACf;AACA,IAAA,OAAO,MAAM;AACX,MAAA,WAAA,IAAA,IAAA,GAAA,MAAA,GAAA,WAAA,CAAa,YAAA,EAAA;AAAA,IACf,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBAAOD,GAAAA,CAACE,YAAA,EAAA,EAAc,MAAY,OAAA,EAAS,eAAA,EAAkB,GAAG,IAAA,EAAM,CAAA;AACxE;AAEA,UAAA,CAAW,WAAA,GAAc,YAAA","file":"index.mjs","sourcesContent":["import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'\n\nimport { useInternalFormContext } from './form'\nimport { type StepTree } from './types'\n\ntype StepContextValue = {\n step?: number\n registrationKey: number\n registerField: (elements: StepTree) => void\n registerStep: (elements: StepTree, stepRef: React.RefObject<number | undefined>, step?: number) => void\n rebuildSteps: () => void\n changeStepAtIndex: (steps: StepTree, index: number) => void\n}\n\nconst StepContext = createContext<StepContextValue | null>(null)\n\nfunction useStep(): StepContextValue | null {\n return useContext(StepContext)\n}\n\nfunction Step({ children }: { children: React.ReactNode }) {\n const stepContext = useStep()\n const formContext = useInternalFormContext()\n\n const {\n registerStep: registerStepFromParent,\n step: stepFromParent,\n rebuildSteps: rebuildStepsFromParent,\n changeStepAtIndex: changeStepAtIndexFromParent,\n registrationKey: registrationKeyFromParent,\n } = stepContext ?? formContext\n\n const isRoot = useMemo(() => {\n if (!stepContext) return true\n return false\n }, [stepContext])\n const stepRef = useRef<number | undefined>(undefined)\n const [steps, setSteps] = useState<StepTree>([])\n const [registrationKey, setRegistrationKey] = useState(0)\n\n const changeStepAtIndex = useCallback((steps: StepTree, index: number): void => {\n setSteps((prevSteps) => {\n const newSteps = [...prevSteps]\n newSteps[index] = steps\n return newSteps\n })\n }, [])\n\n useEffect(() => {\n if (isRoot && steps.length === 0) return\n const stepList = steps.length ? steps : ['']\n if (stepRef.current !== undefined) {\n changeStepAtIndexFromParent(stepList, stepRef.current)\n } else {\n registerStepFromParent(stepList, stepRef)\n }\n }, [registrationKeyFromParent, steps, isRoot])\n\n useEffect(() => {\n if (stepFromParent !== undefined) {\n rebuildStepsFromParent()\n }\n return () => {\n rebuildStepsFromParent()\n }\n }, [])\n\n const registerField = useCallback(\n (elements: StepTree): void => {\n setSteps((prevSteps) => {\n return [...prevSteps, ...elements]\n })\n },\n [steps],\n )\n\n const registerStep = useCallback(\n (elements: StepTree, stepRef: React.RefObject<number | undefined>, step?: number): void => {\n setSteps((prevSteps: StepTree) => {\n const stepNumber = step ?? prevSteps.length\n stepRef.current = stepNumber\n const newSteps = [...prevSteps]\n newSteps.splice(stepNumber, 0, elements)\n return newSteps\n })\n },\n [steps],\n )\n\n const rebuildSteps = useCallback(() => {\n setSteps([])\n setRegistrationKey((prev) => prev + 1)\n }, [])\n\n const contextValue = useMemo<StepContextValue>(\n () => ({\n // eslint-disable-next-line react-hooks/refs\n step: stepRef.current,\n registrationKey,\n changeStepAtIndex,\n registerField,\n registerStep,\n rebuildSteps,\n }),\n [registrationKey, changeStepAtIndex, registerField, registerStep, rebuildSteps],\n )\n\n // eslint-disable-next-line react-hooks/refs\n return <StepContext.Provider value={contextValue}>{children}</StepContext.Provider>\n}\n\nStep.displayName = 'Step'\n\nexport { Step, useStep }\nexport type { StepContextValue }\n","import { createContext, forwardRef, useCallback, useContext, useMemo, useRef, useState } from 'react'\nimport { type FieldValues, Path, type UseFormReturn } from 'react-hook-form'\n\nimport { Step } from './step'\nimport { type StepTree, type StepValidationMode } from './types'\n\nfunction comparePaths(a: number[], b: number[]): number {\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const ai = a[i] ?? -1\n const bi = b[i] ?? -1\n if (ai !== bi) return ai - bi\n }\n return 0\n}\n\nfunction getNodeAtPath(tree: StepTree, path: number[]): StepTree | undefined {\n let current: StepTree = tree\n for (const index of path) {\n if (!Array.isArray(current) || index >= current.length) return undefined\n current = current[index]\n }\n return current\n}\n\nfunction isLeafParent(node: StepTree): node is string[] {\n return Array.isArray(node) && node.length > 0 && node.every((child) => typeof child === 'string')\n}\n\nfunction getFirstLeafParentPath(tree: StepTree, path: number[]): number[] | null {\n const node = getNodeAtPath(tree, path)\n if (node === undefined) return null\n if (isLeafParent(node)) return path\n if (Array.isArray(node) && node.length > 0) {\n for (let i = 0; i < node.length; i++) {\n const found = getFirstLeafParentPath(tree, [...path, i])\n if (found) return found\n }\n }\n return null\n}\n\nfunction getLastLeafParentPath(tree: StepTree, path: number[]): number[] | null {\n const node = getNodeAtPath(tree, path)\n if (node === undefined) return null\n if (isLeafParent(node)) return path\n if (Array.isArray(node) && node.length > 0) {\n for (let i = node.length - 1; i >= 0; i--) {\n const found = getLastLeafParentPath(tree, [...path, i])\n if (found) return found\n }\n }\n return null\n}\n\nfunction getPrevLeafParentPath(tree: StepTree, path: number[]): number[] | null {\n const current = [...path]\n while (current.length > 0) {\n const lastIndex = current[current.length - 1]\n const parentPath = current.slice(0, -1)\n const parent = getNodeAtPath(tree, parentPath)\n\n if (Array.isArray(parent)) {\n for (let i = lastIndex - 1; i >= 0; i--) {\n const found = getLastLeafParentPath(tree, [...parentPath, i])\n if (found) return found\n }\n }\n\n current.pop()\n }\n\n return null\n}\n\nfunction getNextLeafParentPath(tree: StepTree, path: number[]): number[] | null {\n const current = [...path]\n while (current.length > 0) {\n const lastIndex = current[current.length - 1]\n const parentPath = current.slice(0, -1)\n const parent = getNodeAtPath(tree, parentPath)\n\n if (Array.isArray(parent)) {\n for (let i = lastIndex + 1; i < parent.length; i++) {\n const found = getFirstLeafParentPath(tree, [...parentPath, i])\n if (found) return found\n }\n }\n\n current.pop()\n }\n\n return null\n}\n\ntype FormContextValue<TFieldValues extends FieldValues = FieldValues> = {\n form: UseFormReturn<TFieldValues>\n currentStep: number | number[] | null\n setCurrentStep: (step: number | number[]) => Promise<boolean>\n currentStepNode: StepTree | undefined\n currentStepArr: string[] | null\n validatedFields: string[]\n isFirstStep: boolean\n isLastStep: boolean\n next: () => Promise<boolean>\n prev: () => Promise<boolean>\n}\n\ntype InternalFormContextValue = {\n step?: number\n registrationKey: number\n rebuildSteps: () => void\n registerStep: (elements: StepTree, stepRef: React.RefObject<number | undefined>, step?: number) => void\n changeStepAtIndex: (elements: StepTree, index: number) => void\n}\n\nconst FormContext = createContext<FormContextValue | null>(null)\nconst InternalFormContext = createContext<InternalFormContextValue | null>(null)\n\nfunction useFormContext<TFieldValues extends FieldValues = FieldValues>(): FormContextValue<TFieldValues> {\n const context = useContext(FormContext)\n if (!context) {\n throw new Error('useFormContext must be used within a <Form>')\n }\n return context as unknown as FormContextValue<TFieldValues>\n}\n\nfunction useInternalFormContext(): InternalFormContextValue {\n const context = useContext(InternalFormContext)\n if (!context) {\n throw new Error('useInternalFormContext must be used within a <Form>')\n }\n return context\n}\n\ninterface FormProps<TFieldValues extends FieldValues = FieldValues>\n extends Omit<React.ComponentProps<'form'>, 'onSubmit' | 'children'> {\n form: UseFormReturn<TFieldValues>\n onSubmit: (values: TFieldValues) => void\n stepValidationMode?: StepValidationMode\n children: React.ReactNode | ((context: FormContextValue<TFieldValues>) => React.ReactNode)\n}\n\nfunction FormInner<TFieldValues extends FieldValues = FieldValues>(\n { form, onSubmit, stepValidationMode = 'forward', children, ...props }: FormProps<TFieldValues>,\n ref: React.Ref<HTMLFormElement>,\n) {\n const [steps, setSteps] = useState<StepTree>([])\n const [currentStep, setCurrentStep] = useState<number[] | null>(null)\n const [validatedFields, setValidatedFields] = useState<string[]>([])\n const [registrationKey, setRegistrationKey] = useState(0)\n\n const stepRef = useRef<number | undefined>(undefined)\n\n const _currentStep = useMemo<number | number[] | null>(() => {\n if (!currentStep) return null\n const sliced = currentStep.slice(1)\n return sliced.length === 1 ? sliced[0] : sliced\n }, [currentStep])\n\n const currentStepNode = useMemo(\n () => (currentStep ? getNodeAtPath(steps, currentStep) : undefined),\n [steps, currentStep],\n )\n\n const currentStepArr = useMemo<string[] | null>(() => {\n if (!currentStepNode) return null\n return isLeafParent(currentStepNode) ? currentStepNode : null\n }, [currentStepNode])\n\n const _setCurrentStep = useCallback(\n async (step: number | number[]): Promise<boolean> => {\n const path = typeof step === 'number' ? [0, step] : [0, ...step]\n if (currentStep && currentStepArr && stepValidationMode !== 'none') {\n const isForward = comparePaths(path, currentStep) > 0\n const shouldValidate = stepValidationMode === 'all' || (stepValidationMode === 'forward' && isForward)\n if (shouldValidate) {\n const isValid = await form.trigger(currentStepArr as Path<TFieldValues>[])\n if (!isValid) {\n setValidatedFields((prev) => prev.filter((field) => !currentStepArr.includes(field)))\n return false\n }\n setValidatedFields((prev) => [...new Set([...prev, ...currentStepArr])])\n }\n }\n setCurrentStep(path)\n return true\n },\n [currentStep, currentStepArr, form, stepValidationMode],\n )\n\n const isFirstStep = useMemo(\n () => (currentStep ? getPrevLeafParentPath(steps, currentStep) === null : true),\n [steps, currentStep],\n )\n\n const isLastStep = useMemo(\n () => (currentStep ? getNextLeafParentPath(steps, currentStep) === null : true),\n [steps, currentStep],\n )\n\n const next = useCallback(async (): Promise<boolean> => {\n if (!currentStep) return false\n const nextPath = getNextLeafParentPath(steps, currentStep)\n if (currentStepArr && stepValidationMode !== 'none') {\n const isValid = await form.trigger(currentStepArr as Path<TFieldValues>[])\n if (!isValid) {\n setValidatedFields((prev) => prev.filter((field) => !currentStepArr.includes(field)))\n return false\n }\n setValidatedFields((prev) => [...new Set([...prev, ...currentStepArr])])\n }\n if (nextPath) {\n setCurrentStep(nextPath)\n return true\n }\n return false\n }, [steps, currentStep, currentStepArr, form, stepValidationMode])\n\n const prev = useCallback(async (): Promise<boolean> => {\n if (!currentStep) return false\n const prevPath = getPrevLeafParentPath(steps, currentStep)\n if (currentStepArr && stepValidationMode === 'all') {\n const isValid = await form.trigger(currentStepArr as Path<TFieldValues>[])\n if (!isValid) {\n setValidatedFields((prev) => prev.filter((field) => !currentStepArr.includes(field)))\n return false\n }\n setValidatedFields((prev) => [...new Set([...prev, ...currentStepArr])])\n }\n if (prevPath) {\n setCurrentStep(prevPath)\n return true\n }\n return false\n }, [steps, currentStep, currentStepArr, form, stepValidationMode])\n\n const registerStep = useCallback(\n (elements: StepTree, stepRef: React.RefObject<number | undefined>, step?: number): void => {\n setSteps((prevSteps: StepTree) => {\n const stepNumber = step ?? (Array.isArray(prevSteps) ? prevSteps.length : 0)\n stepRef.current = stepNumber\n const newSteps = Array.isArray(prevSteps) ? [...prevSteps] : [prevSteps]\n newSteps.splice(stepNumber, 0, elements)\n\n if (currentStep === null) {\n const firstLeafParent = getFirstLeafParentPath(newSteps, [0])\n if (firstLeafParent) {\n setCurrentStep(firstLeafParent)\n }\n }\n\n return newSteps\n })\n },\n [currentStep],\n )\n\n const rebuildSteps = useCallback(() => {\n setSteps([])\n setRegistrationKey((prev) => prev + 1)\n }, [])\n\n const changeStepAtIndex = useCallback((steps: StepTree, index: number): void => {\n setSteps((prevSteps) => {\n const newSteps = Array.isArray(prevSteps) ? [...prevSteps] : [prevSteps]\n newSteps[index] = steps\n return newSteps\n })\n }, [])\n\n const publicContextValue = useMemo<FormContextValue>(\n () => ({\n currentStep: _currentStep,\n setCurrentStep: _setCurrentStep,\n currentStepNode,\n currentStepArr,\n validatedFields,\n isFirstStep,\n isLastStep,\n form: form as unknown as UseFormReturn<FieldValues>,\n next,\n prev,\n }),\n [\n form,\n _currentStep,\n _setCurrentStep,\n currentStepNode,\n currentStepArr,\n validatedFields,\n isFirstStep,\n isLastStep,\n next,\n prev,\n ],\n )\n\n const internalContextValue = useMemo<InternalFormContextValue>(\n () => ({\n // eslint-disable-next-line react-hooks/refs\n step: stepRef.current,\n registrationKey,\n rebuildSteps,\n registerStep,\n changeStepAtIndex,\n }),\n [registrationKey, rebuildSteps, registerStep, changeStepAtIndex],\n )\n\n const resolvedChildren =\n // eslint-disable-next-line react-hooks/refs\n typeof children === 'function' ? children(publicContextValue as unknown as FormContextValue<TFieldValues>) : children\n\n return (\n // eslint-disable-next-line react-hooks/refs\n <FormContext.Provider value={publicContextValue}>\n <InternalFormContext.Provider value={internalContextValue}>\n <form ref={ref} onSubmit={form.handleSubmit(onSubmit)} {...props}>\n <Step>{resolvedChildren}</Step>\n </form>\n </InternalFormContext.Provider>\n </FormContext.Provider>\n )\n}\n\nconst Form = forwardRef(FormInner) as <TFieldValues extends FieldValues = FieldValues>(\n props: FormProps<TFieldValues> & { ref?: React.Ref<HTMLFormElement> },\n) => React.JSX.Element\n\n;(Form as React.NamedExoticComponent & { displayName?: string }).displayName = 'Form'\n\nexport { Form, useFormContext, useInternalFormContext }\nexport type { FormContextValue, FormProps, InternalFormContextValue }\n","import { ComponentProps, useEffect } from 'react'\nimport {\n type Control,\n Controller as RHFController,\n type ControllerFieldState,\n type ControllerRenderProps,\n type FieldPath,\n type FieldValues,\n type UseFormStateReturn,\n} from 'react-hook-form'\n\nimport { useFormContext } from './form'\nimport { useStep } from './step'\n\ntype ControllerRenderArgs<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> = {\n field: ControllerRenderProps<TFieldValues, TName>\n fieldState: ControllerFieldState\n formState: UseFormStateReturn<TFieldValues>\n}\n\ntype ControllerProps<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> = ComponentProps<typeof RHFController<TFieldValues, TName>>\n\nfunction Controller<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({ name, control, ...rest }: ControllerProps<TFieldValues, TName>) {\n const formContext = useFormContext<TFieldValues>()\n const stepContext = useStep()\n const resolvedControl = control ?? (formContext.form.control as unknown as Control<TFieldValues>)\n\n useEffect(() => {\n if (stepContext) {\n stepContext.registerField([name as string])\n }\n }, [stepContext?.registrationKey])\n\n useEffect(() => {\n if (stepContext?.step !== undefined) {\n stepContext?.rebuildSteps()\n }\n return () => {\n stepContext?.rebuildSteps()\n }\n }, [])\n\n return <RHFController name={name} control={resolvedControl} {...rest} />\n}\n\nController.displayName = 'Controller'\n\nexport { Controller }\nexport type { ControllerProps, ControllerRenderArgs }\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/step.tsx","../src/form.tsx","../src/controller.tsx"],"names":["steps","stepRef","createContext","useContext","useState","useRef","useMemo","useCallback","prev","jsx","useEffect","RHFController"],"mappings":"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","file":"index.mjs","sourcesContent":["import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'\n\nimport { useInternalFormContext } from './form'\nimport { type StepTree } from './types'\n\ntype StepContextValue = {\n step?: number\n registrationKey: number\n registerField: (elements: StepTree) => void\n registerStep: (elements: StepTree, stepRef: React.RefObject<number | undefined>, step?: number) => void\n rebuildSteps: () => void\n changeStepAtIndex: (steps: StepTree, index: number) => void\n}\n\nconst StepContext = createContext<StepContextValue | null>(null)\n\nfunction useStep(): StepContextValue | null {\n return useContext(StepContext)\n}\n\nfunction Step({ children }: { children: React.ReactNode }) {\n const stepContext = useStep()\n const formContext = useInternalFormContext()\n\n const {\n registerStep: registerStepFromParent,\n step: stepFromParent,\n rebuildSteps: rebuildStepsFromParent,\n changeStepAtIndex: changeStepAtIndexFromParent,\n registrationKey: registrationKeyFromParent,\n } = stepContext ?? formContext\n\n const isRoot = useMemo(() => {\n if (!stepContext) return true\n return false\n }, [stepContext])\n const stepRef = useRef<number | undefined>(undefined)\n const [steps, setSteps] = useState<StepTree>([])\n const [registrationKey, setRegistrationKey] = useState(0)\n\n const changeStepAtIndex = useCallback((steps: StepTree, index: number): void => {\n setSteps((prevSteps) => {\n const newSteps = [...prevSteps]\n newSteps[index] = steps\n return newSteps\n })\n }, [])\n\n useEffect(() => {\n if (isRoot && steps.length === 0) return\n const stepList = steps.length ? steps : ['']\n if (stepRef.current !== undefined) {\n changeStepAtIndexFromParent(stepList, stepRef.current)\n } else {\n registerStepFromParent(stepList, stepRef)\n }\n }, [registrationKeyFromParent, steps, isRoot])\n\n useEffect(() => {\n if (stepFromParent !== undefined) {\n rebuildStepsFromParent()\n }\n return () => {\n rebuildStepsFromParent()\n }\n }, [])\n\n const registerField = useCallback(\n (elements: StepTree): void => {\n setSteps((prevSteps) => {\n return [...prevSteps, ...elements]\n })\n },\n [steps],\n )\n\n const registerStep = useCallback(\n (elements: StepTree, stepRef: React.RefObject<number | undefined>, step?: number): void => {\n setSteps((prevSteps: StepTree) => {\n const stepNumber = step ?? prevSteps.length\n stepRef.current = stepNumber\n const newSteps = [...prevSteps]\n newSteps.splice(stepNumber, 0, elements)\n return newSteps\n })\n },\n [steps],\n )\n\n const rebuildSteps = useCallback(() => {\n setSteps([])\n setRegistrationKey((prev) => prev + 1)\n }, [])\n\n const contextValue = useMemo<StepContextValue>(\n () => ({\n // eslint-disable-next-line react-hooks/refs\n step: stepRef.current,\n registrationKey,\n changeStepAtIndex,\n registerField,\n registerStep,\n rebuildSteps,\n }),\n [registrationKey, changeStepAtIndex, registerField, registerStep, rebuildSteps],\n )\n\n // eslint-disable-next-line react-hooks/refs\n return <StepContext.Provider value={contextValue}>{children}</StepContext.Provider>\n}\n\nStep.displayName = 'Step'\n\nexport { Step, useStep }\nexport type { StepContextValue }\n","import { createContext, forwardRef, useCallback, useContext, useMemo, useRef, useState } from 'react'\nimport { type FieldValues, Path, type UseFormReturn } from 'react-hook-form'\n\nimport { Step } from './step'\nimport { type StepTree, type StepValidationMode } from './types'\n\nfunction buildNestedValues(fields: string[], values: unknown[]): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (let i = 0; i < fields.length; i++) {\n const segments = fields[i].split('.')\n let current: Record<string, unknown> = result\n for (let j = 0; j < segments.length - 1; j++) {\n const segment = segments[j]\n const nextSegment = segments[j + 1]\n const isNextNumeric = /^\\d+$/.test(nextSegment)\n if (current[segment] === undefined) {\n current[segment] = isNextNumeric ? [] : {}\n }\n current = current[segment] as Record<string, unknown>\n }\n current[segments[segments.length - 1]] = values[i]\n }\n return result\n}\n\nfunction comparePaths(a: number[], b: number[]): number {\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const ai = a[i] ?? -1\n const bi = b[i] ?? -1\n if (ai !== bi) return ai - bi\n }\n return 0\n}\n\nfunction getNodeAtPath(tree: StepTree, path: number[]): StepTree | undefined {\n let current: StepTree = tree\n for (const index of path) {\n if (!Array.isArray(current) || index >= current.length) return undefined\n current = current[index]\n }\n return current\n}\n\nfunction isLeafParent(node: StepTree): node is string[] {\n return Array.isArray(node) && node.length > 0 && node.every((child) => typeof child === 'string')\n}\n\nfunction getFirstLeafParentPath(tree: StepTree, path: number[]): number[] | null {\n const node = getNodeAtPath(tree, path)\n if (node === undefined) return null\n if (isLeafParent(node)) return path\n if (Array.isArray(node) && node.length > 0) {\n for (let i = 0; i < node.length; i++) {\n const found = getFirstLeafParentPath(tree, [...path, i])\n if (found) return found\n }\n }\n return null\n}\n\nfunction getLastLeafParentPath(tree: StepTree, path: number[]): number[] | null {\n const node = getNodeAtPath(tree, path)\n if (node === undefined) return null\n if (isLeafParent(node)) return path\n if (Array.isArray(node) && node.length > 0) {\n for (let i = node.length - 1; i >= 0; i--) {\n const found = getLastLeafParentPath(tree, [...path, i])\n if (found) return found\n }\n }\n return null\n}\n\nfunction getPrevLeafParentPath(tree: StepTree, path: number[]): number[] | null {\n const current = [...path]\n while (current.length > 0) {\n const lastIndex = current[current.length - 1]\n const parentPath = current.slice(0, -1)\n const parent = getNodeAtPath(tree, parentPath)\n\n if (Array.isArray(parent)) {\n for (let i = lastIndex - 1; i >= 0; i--) {\n const found = getLastLeafParentPath(tree, [...parentPath, i])\n if (found) return found\n }\n }\n\n current.pop()\n }\n\n return null\n}\n\nfunction getNextLeafParentPath(tree: StepTree, path: number[]): number[] | null {\n const current = [...path]\n while (current.length > 0) {\n const lastIndex = current[current.length - 1]\n const parentPath = current.slice(0, -1)\n const parent = getNodeAtPath(tree, parentPath)\n\n if (Array.isArray(parent)) {\n for (let i = lastIndex + 1; i < parent.length; i++) {\n const found = getFirstLeafParentPath(tree, [...parentPath, i])\n if (found) return found\n }\n }\n\n current.pop()\n }\n\n return null\n}\n\ntype FormContextValue<TFieldValues extends FieldValues = FieldValues> = {\n form: UseFormReturn<TFieldValues>\n currentStep: number | number[] | null\n setCurrentStep: (step: number | number[], beforeStepChange?: (values: Partial<TFieldValues>) => Promise<void>) => Promise<boolean>\n currentStepNode: StepTree | undefined\n currentStepArr: string[] | null\n validatedFields: string[]\n isFirstStep: boolean\n isLastStep: boolean\n next: (beforeStepChange?: (values: Partial<TFieldValues>) => Promise<void>) => Promise<boolean>\n prev: (beforeStepChange?: (values: Partial<TFieldValues>) => Promise<void>) => Promise<boolean>\n}\n\ntype InternalFormContextValue = {\n step?: number\n registrationKey: number\n rebuildSteps: () => void\n registerStep: (elements: StepTree, stepRef: React.RefObject<number | undefined>, step?: number) => void\n changeStepAtIndex: (elements: StepTree, index: number) => void\n}\n\nconst FormContext = createContext<FormContextValue | null>(null)\nconst InternalFormContext = createContext<InternalFormContextValue | null>(null)\n\nfunction useFormContext<TFieldValues extends FieldValues = FieldValues>(): FormContextValue<TFieldValues> {\n const context = useContext(FormContext)\n if (!context) {\n throw new Error('useFormContext must be used within a <Form>')\n }\n return context as unknown as FormContextValue<TFieldValues>\n}\n\nfunction useInternalFormContext(): InternalFormContextValue {\n const context = useContext(InternalFormContext)\n if (!context) {\n throw new Error('useInternalFormContext must be used within a <Form>')\n }\n return context\n}\n\ninterface FormProps<TFieldValues extends FieldValues = FieldValues>\n extends Omit<React.ComponentProps<'form'>, 'onSubmit' | 'children'> {\n form: UseFormReturn<TFieldValues>\n onSubmit: (values: TFieldValues) => void\n stepValidationMode?: StepValidationMode\n children: React.ReactNode | ((context: FormContextValue<TFieldValues>) => React.ReactNode)\n}\n\nfunction FormInner<TFieldValues extends FieldValues = FieldValues>(\n { form, onSubmit, stepValidationMode = 'forward', children, ...props }: FormProps<TFieldValues>,\n ref: React.Ref<HTMLFormElement>,\n) {\n const [steps, setSteps] = useState<StepTree>([])\n const [currentStep, setCurrentStep] = useState<number[] | null>(null)\n const [validatedFields, setValidatedFields] = useState<string[]>([])\n const [registrationKey, setRegistrationKey] = useState(0)\n\n const stepRef = useRef<number | undefined>(undefined)\n\n const _currentStep = useMemo<number | number[] | null>(() => {\n if (!currentStep) return null\n const sliced = currentStep.slice(1)\n return sliced.length === 1 ? sliced[0] : sliced\n }, [currentStep])\n\n const currentStepNode = useMemo(\n () => (currentStep ? getNodeAtPath(steps, currentStep) : undefined),\n [steps, currentStep],\n )\n\n const currentStepArr = useMemo<string[] | null>(() => {\n if (!currentStepNode) return null\n return isLeafParent(currentStepNode) ? currentStepNode : null\n }, [currentStepNode])\n\n const _setCurrentStep = useCallback(\n async (step: number | number[], beforeStepChange?: (values: Partial<TFieldValues>) => Promise<void>): Promise<boolean> => {\n const path = typeof step === 'number' ? [0, step] : [0, ...step]\n if (currentStep && currentStepArr && stepValidationMode !== 'none') {\n const isForward = comparePaths(path, currentStep) > 0\n const shouldValidate = stepValidationMode === 'all' || (stepValidationMode === 'forward' && isForward)\n if (shouldValidate) {\n const isValid = await form.trigger(currentStepArr as Path<TFieldValues>[])\n if (!isValid) {\n setValidatedFields((prev) => prev.filter((field) => !currentStepArr.includes(field)))\n return false\n }\n setValidatedFields((prev) => [...new Set([...prev, ...currentStepArr])])\n }\n }\n if (beforeStepChange && currentStepArr) {\n const watchedValues = form.watch(currentStepArr as Path<TFieldValues>[])\n const values = buildNestedValues(currentStepArr, watchedValues) as Partial<TFieldValues>\n await beforeStepChange(values)\n }\n setCurrentStep(path)\n return true\n },\n [currentStep, currentStepArr, form, stepValidationMode],\n )\n\n const isFirstStep = useMemo(\n () => (currentStep ? getPrevLeafParentPath(steps, currentStep) === null : true),\n [steps, currentStep],\n )\n\n const isLastStep = useMemo(\n () => (currentStep ? getNextLeafParentPath(steps, currentStep) === null : true),\n [steps, currentStep],\n )\n\n const next = useCallback(async (beforeStepChange?: (values: Partial<TFieldValues>) => Promise<void>): Promise<boolean> => {\n if (!currentStep) return false\n const nextPath = getNextLeafParentPath(steps, currentStep)\n if (currentStepArr && stepValidationMode !== 'none') {\n const isValid = await form.trigger(currentStepArr as Path<TFieldValues>[])\n if (!isValid) {\n setValidatedFields((prev) => prev.filter((field) => !currentStepArr.includes(field)))\n return false\n }\n setValidatedFields((prev) => [...new Set([...prev, ...currentStepArr])])\n }\n if (nextPath) {\n if (beforeStepChange && currentStepArr) {\n const watchedValues = form.watch(currentStepArr as Path<TFieldValues>[])\n const values = buildNestedValues(currentStepArr, watchedValues) as Partial<TFieldValues>\n await beforeStepChange(values)\n }\n setCurrentStep(nextPath)\n return true\n }\n return false\n }, [steps, currentStep, currentStepArr, form, stepValidationMode])\n\n const prev = useCallback(async (beforeStepChange?: (values: Partial<TFieldValues>) => Promise<void>): Promise<boolean> => {\n if (!currentStep) return false\n const prevPath = getPrevLeafParentPath(steps, currentStep)\n if (currentStepArr && stepValidationMode === 'all') {\n const isValid = await form.trigger(currentStepArr as Path<TFieldValues>[])\n if (!isValid) {\n setValidatedFields((prev) => prev.filter((field) => !currentStepArr.includes(field)))\n return false\n }\n setValidatedFields((prev) => [...new Set([...prev, ...currentStepArr])])\n }\n if (prevPath) {\n if (beforeStepChange && currentStepArr) {\n const watchedValues = form.watch(currentStepArr as Path<TFieldValues>[])\n const values = buildNestedValues(currentStepArr, watchedValues) as Partial<TFieldValues>\n await beforeStepChange(values)\n }\n setCurrentStep(prevPath)\n return true\n }\n return false\n }, [steps, currentStep, currentStepArr, form, stepValidationMode])\n\n const registerStep = useCallback(\n (elements: StepTree, stepRef: React.RefObject<number | undefined>, step?: number): void => {\n setSteps((prevSteps: StepTree) => {\n const stepNumber = step ?? (Array.isArray(prevSteps) ? prevSteps.length : 0)\n stepRef.current = stepNumber\n const newSteps = Array.isArray(prevSteps) ? [...prevSteps] : [prevSteps]\n newSteps.splice(stepNumber, 0, elements)\n\n if (currentStep === null) {\n const firstLeafParent = getFirstLeafParentPath(newSteps, [0])\n if (firstLeafParent) {\n setCurrentStep(firstLeafParent)\n }\n }\n\n return newSteps\n })\n },\n [currentStep],\n )\n\n const rebuildSteps = useCallback(() => {\n setSteps([])\n setRegistrationKey((prev) => prev + 1)\n }, [])\n\n const changeStepAtIndex = useCallback((steps: StepTree, index: number): void => {\n setSteps((prevSteps) => {\n const newSteps = Array.isArray(prevSteps) ? [...prevSteps] : [prevSteps]\n newSteps[index] = steps\n return newSteps\n })\n }, [])\n\n const publicContextValue = useMemo<FormContextValue>(\n () => ({\n currentStep: _currentStep,\n setCurrentStep: _setCurrentStep,\n currentStepNode,\n currentStepArr,\n validatedFields,\n isFirstStep,\n isLastStep,\n form: form as unknown as UseFormReturn<FieldValues>,\n next,\n prev,\n }),\n [\n form,\n _currentStep,\n _setCurrentStep,\n currentStepNode,\n currentStepArr,\n validatedFields,\n isFirstStep,\n isLastStep,\n next,\n prev,\n ],\n )\n\n const internalContextValue = useMemo<InternalFormContextValue>(\n () => ({\n // eslint-disable-next-line react-hooks/refs\n step: stepRef.current,\n registrationKey,\n rebuildSteps,\n registerStep,\n changeStepAtIndex,\n }),\n [registrationKey, rebuildSteps, registerStep, changeStepAtIndex],\n )\n\n const resolvedChildren =\n // eslint-disable-next-line react-hooks/refs\n typeof children === 'function' ? children(publicContextValue as unknown as FormContextValue<TFieldValues>) : children\n\n return (\n // eslint-disable-next-line react-hooks/refs\n <FormContext.Provider value={publicContextValue}>\n <InternalFormContext.Provider value={internalContextValue}>\n <form ref={ref} onSubmit={form.handleSubmit(onSubmit)} {...props}>\n <Step>{resolvedChildren}</Step>\n </form>\n </InternalFormContext.Provider>\n </FormContext.Provider>\n )\n}\n\nconst Form = forwardRef(FormInner) as <TFieldValues extends FieldValues = FieldValues>(\n props: FormProps<TFieldValues> & { ref?: React.Ref<HTMLFormElement> },\n) => React.JSX.Element\n\n;(Form as React.NamedExoticComponent & { displayName?: string }).displayName = 'Form'\n\nexport { Form, useFormContext, useInternalFormContext }\nexport type { FormContextValue, FormProps, InternalFormContextValue }\n","import { ComponentProps, useEffect } from 'react'\nimport {\n type Control,\n Controller as RHFController,\n type ControllerFieldState,\n type ControllerRenderProps,\n type FieldPath,\n type FieldValues,\n type UseFormStateReturn,\n} from 'react-hook-form'\n\nimport { useFormContext } from './form'\nimport { useStep } from './step'\n\ntype ControllerRenderArgs<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> = {\n field: ControllerRenderProps<TFieldValues, TName>\n fieldState: ControllerFieldState\n formState: UseFormStateReturn<TFieldValues>\n}\n\ntype ControllerProps<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> = ComponentProps<typeof RHFController<TFieldValues, TName>>\n\nfunction Controller<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({ name, control, ...rest }: ControllerProps<TFieldValues, TName>) {\n const formContext = useFormContext<TFieldValues>()\n const stepContext = useStep()\n const resolvedControl = control ?? (formContext.form.control as unknown as Control<TFieldValues>)\n\n useEffect(() => {\n if (stepContext) {\n stepContext.registerField([name as string])\n }\n }, [stepContext?.registrationKey])\n\n useEffect(() => {\n if (stepContext?.step !== undefined) {\n stepContext?.rebuildSteps()\n }\n return () => {\n stepContext?.rebuildSteps()\n }\n }, [])\n\n return <RHFController name={name} control={resolvedControl} {...rest} />\n}\n\nController.displayName = 'Controller'\n\nexport { Controller }\nexport type { ControllerProps, ControllerRenderArgs }\n"]}
|