rhf-stepper 1.0.0 → 1.0.2
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/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +110 -90
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +110 -90
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.d.mts
CHANGED
|
@@ -15,7 +15,7 @@ declare namespace Controller {
|
|
|
15
15
|
|
|
16
16
|
declare function useController<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>(props: UseControllerProps<TFieldValues, TName>): UseControllerReturn<TFieldValues, TName>;
|
|
17
17
|
|
|
18
|
-
type StepValidationMode =
|
|
18
|
+
type StepValidationMode = "all" | "forward" | "none";
|
|
19
19
|
type MaybePromise<T = void> = T | Promise<T>;
|
|
20
20
|
|
|
21
21
|
type StepperContextValue<TFieldValues extends FieldValues = FieldValues> = {
|
|
@@ -33,7 +33,7 @@ interface StepperProps<TFieldValues extends FieldValues = FieldValues> {
|
|
|
33
33
|
stepValidationMode?: StepValidationMode;
|
|
34
34
|
children: React.ReactNode | ((context: StepperContextValue<TFieldValues>) => React.ReactNode);
|
|
35
35
|
}
|
|
36
|
-
declare function Stepper<TFieldValues extends FieldValues = FieldValues>({ form: formProps, stepValidationMode, children }: StepperProps<TFieldValues>): react_jsx_runtime.JSX.Element;
|
|
36
|
+
declare function Stepper<TFieldValues extends FieldValues = FieldValues>({ form: formProps, stepValidationMode, children, }: StepperProps<TFieldValues>): react_jsx_runtime.JSX.Element;
|
|
37
37
|
declare function useStepper<TFieldValues extends FieldValues = FieldValues>(): StepperContextValue<TFieldValues>;
|
|
38
38
|
|
|
39
39
|
declare function Step({ children }: {
|
package/dist/index.d.ts
CHANGED
|
@@ -15,7 +15,7 @@ declare namespace Controller {
|
|
|
15
15
|
|
|
16
16
|
declare function useController<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>(props: UseControllerProps<TFieldValues, TName>): UseControllerReturn<TFieldValues, TName>;
|
|
17
17
|
|
|
18
|
-
type StepValidationMode =
|
|
18
|
+
type StepValidationMode = "all" | "forward" | "none";
|
|
19
19
|
type MaybePromise<T = void> = T | Promise<T>;
|
|
20
20
|
|
|
21
21
|
type StepperContextValue<TFieldValues extends FieldValues = FieldValues> = {
|
|
@@ -33,7 +33,7 @@ interface StepperProps<TFieldValues extends FieldValues = FieldValues> {
|
|
|
33
33
|
stepValidationMode?: StepValidationMode;
|
|
34
34
|
children: React.ReactNode | ((context: StepperContextValue<TFieldValues>) => React.ReactNode);
|
|
35
35
|
}
|
|
36
|
-
declare function Stepper<TFieldValues extends FieldValues = FieldValues>({ form: formProps, stepValidationMode, children }: StepperProps<TFieldValues>): react_jsx_runtime.JSX.Element;
|
|
36
|
+
declare function Stepper<TFieldValues extends FieldValues = FieldValues>({ form: formProps, stepValidationMode, children, }: StepperProps<TFieldValues>): react_jsx_runtime.JSX.Element;
|
|
37
37
|
declare function useStepper<TFieldValues extends FieldValues = FieldValues>(): StepperContextValue<TFieldValues>;
|
|
38
38
|
|
|
39
39
|
declare function Step({ children }: {
|
package/dist/index.js
CHANGED
|
@@ -25,27 +25,38 @@ function buildNestedValues(fields, values) {
|
|
|
25
25
|
}
|
|
26
26
|
return result;
|
|
27
27
|
}
|
|
28
|
+
function generateGUID() {
|
|
29
|
+
function s4() {
|
|
30
|
+
return Math.floor((1 + Math.random()) * 65536).toString(16).substring(1);
|
|
31
|
+
}
|
|
32
|
+
return s4() + s4() + "-" + s4() + "-" + s4() + "-" + s4() + "-" + s4() + s4() + s4();
|
|
33
|
+
}
|
|
28
34
|
var StepperContext = react.createContext(null);
|
|
29
35
|
var InternalStepperContext = react.createContext(null);
|
|
30
36
|
function useInternalStepperContext() {
|
|
31
37
|
const context = react.useContext(InternalStepperContext);
|
|
32
38
|
if (!context) {
|
|
33
|
-
throw new Error("
|
|
39
|
+
throw new Error("<Step> must be used within a <Stepper>");
|
|
34
40
|
}
|
|
35
41
|
return context;
|
|
36
42
|
}
|
|
37
|
-
function Stepper({
|
|
43
|
+
function Stepper({
|
|
44
|
+
form: formProps,
|
|
45
|
+
stepValidationMode = "forward",
|
|
46
|
+
children
|
|
47
|
+
}) {
|
|
38
48
|
const formContext = reactHookForm.useFormContext();
|
|
39
49
|
const form = formProps != null ? formProps : formContext;
|
|
40
|
-
const [steps, setSteps] = react.useState(
|
|
50
|
+
const [steps, setSteps] = react.useState({});
|
|
51
|
+
const [stepOrder, setStepOrder] = react.useState([]);
|
|
41
52
|
const [activeStep, setActiveStep] = react.useState(-1);
|
|
42
53
|
const [validSteps, setValidSteps] = react.useState([]);
|
|
43
54
|
const [registrationKey, setRegistrationKey] = react.useState(0);
|
|
44
55
|
const stepRef = react.useRef(void 0);
|
|
45
56
|
const fields = react.useMemo(() => {
|
|
46
|
-
if (activeStep === -1 || !steps[activeStep]) return null;
|
|
47
|
-
return Array.from(new Set(steps[activeStep]));
|
|
48
|
-
}, [steps, activeStep]);
|
|
57
|
+
if (activeStep === -1 || !steps[stepOrder[activeStep]]) return null;
|
|
58
|
+
return Array.from(new Set(steps[stepOrder[activeStep]]));
|
|
59
|
+
}, [steps, stepOrder, activeStep]);
|
|
49
60
|
const jumpTo = react.useCallback(
|
|
50
61
|
async (step, onLeave) => {
|
|
51
62
|
if (activeStep !== -1 && fields && stepValidationMode !== "none") {
|
|
@@ -62,7 +73,10 @@ function Stepper({ form: formProps, stepValidationMode = "forward", children })
|
|
|
62
73
|
}
|
|
63
74
|
if (onLeave && fields) {
|
|
64
75
|
const watchedValues = form.watch(fields);
|
|
65
|
-
const values = buildNestedValues(
|
|
76
|
+
const values = buildNestedValues(
|
|
77
|
+
fields,
|
|
78
|
+
watchedValues
|
|
79
|
+
);
|
|
66
80
|
await onLeave(values);
|
|
67
81
|
}
|
|
68
82
|
setActiveStep(step);
|
|
@@ -75,55 +89,66 @@ function Stepper({ form: formProps, stepValidationMode = "forward", children })
|
|
|
75
89
|
[activeStep]
|
|
76
90
|
);
|
|
77
91
|
const isLastStep = react.useMemo(
|
|
78
|
-
() => activeStep === -1 || activeStep ===
|
|
79
|
-
[activeStep,
|
|
92
|
+
() => activeStep === -1 || activeStep === stepOrder.length - 1,
|
|
93
|
+
[activeStep, stepOrder.length]
|
|
80
94
|
);
|
|
81
|
-
const next = react.useCallback(
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
95
|
+
const next = react.useCallback(
|
|
96
|
+
async (onLeave) => {
|
|
97
|
+
const callback = typeof onLeave === "function" ? onLeave : void 0;
|
|
98
|
+
if (activeStep === -1 || activeStep >= stepOrder.length - 1) return false;
|
|
99
|
+
if (fields && stepValidationMode !== "none") {
|
|
100
|
+
const isValid = await form.trigger(fields);
|
|
101
|
+
if (!isValid) {
|
|
102
|
+
setValidSteps((prev2) => prev2.filter((s) => s !== activeStep));
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
setValidSteps((prev2) => [.../* @__PURE__ */ new Set([...prev2, activeStep])]);
|
|
89
106
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
setActiveStep(activeStep + 1);
|
|
98
|
-
return true;
|
|
99
|
-
}, [steps.length, activeStep, fields, form, stepValidationMode]);
|
|
100
|
-
const prev = react.useCallback(async (onLeave) => {
|
|
101
|
-
const callback = typeof onLeave === "function" ? onLeave : void 0;
|
|
102
|
-
if (activeStep === -1 || activeStep <= 0) return false;
|
|
103
|
-
if (fields && stepValidationMode === "all") {
|
|
104
|
-
const isValid = await form.trigger(fields);
|
|
105
|
-
if (!isValid) {
|
|
106
|
-
setValidSteps((prev2) => prev2.filter((s) => s !== activeStep));
|
|
107
|
-
return false;
|
|
107
|
+
if (callback && fields) {
|
|
108
|
+
const watchedValues = form.watch(fields);
|
|
109
|
+
const values = buildNestedValues(
|
|
110
|
+
fields,
|
|
111
|
+
watchedValues
|
|
112
|
+
);
|
|
113
|
+
await callback(values);
|
|
108
114
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
115
|
+
setActiveStep(activeStep + 1);
|
|
116
|
+
return true;
|
|
117
|
+
},
|
|
118
|
+
[stepOrder.length, activeStep, fields, form, stepValidationMode]
|
|
119
|
+
);
|
|
120
|
+
const prev = react.useCallback(
|
|
121
|
+
async (onLeave) => {
|
|
122
|
+
const callback = typeof onLeave === "function" ? onLeave : void 0;
|
|
123
|
+
if (activeStep === -1 || activeStep <= 0) return false;
|
|
124
|
+
if (fields && stepValidationMode === "all") {
|
|
125
|
+
const isValid = await form.trigger(fields);
|
|
126
|
+
if (!isValid) {
|
|
127
|
+
setValidSteps((prev2) => prev2.filter((s) => s !== activeStep));
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
setValidSteps((prev2) => [.../* @__PURE__ */ new Set([...prev2, activeStep])]);
|
|
131
|
+
}
|
|
132
|
+
if (callback && fields) {
|
|
133
|
+
const watchedValues = form.watch(fields);
|
|
134
|
+
const values = buildNestedValues(
|
|
135
|
+
fields,
|
|
136
|
+
watchedValues
|
|
137
|
+
);
|
|
138
|
+
await callback(values);
|
|
139
|
+
}
|
|
140
|
+
setActiveStep(activeStep - 1);
|
|
141
|
+
return true;
|
|
142
|
+
},
|
|
143
|
+
[activeStep, fields, form, stepValidationMode]
|
|
144
|
+
);
|
|
119
145
|
const registerStep = react.useCallback(
|
|
120
|
-
(elements,
|
|
146
|
+
(elements, id) => {
|
|
121
147
|
setSteps((prevSteps) => {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
newSteps.
|
|
126
|
-
if (activeStep === -1 && newSteps.length > 0) {
|
|
148
|
+
stepRef.current = id;
|
|
149
|
+
const newSteps = { ...prevSteps };
|
|
150
|
+
newSteps[id] = elements;
|
|
151
|
+
if (activeStep === -1 && Object.keys(newSteps).length > 0) {
|
|
127
152
|
setActiveStep(0);
|
|
128
153
|
}
|
|
129
154
|
return newSteps;
|
|
@@ -131,17 +156,18 @@ function Stepper({ form: formProps, stepValidationMode = "forward", children })
|
|
|
131
156
|
},
|
|
132
157
|
[activeStep]
|
|
133
158
|
);
|
|
159
|
+
const registerStepOrder = react.useCallback(
|
|
160
|
+
(id) => {
|
|
161
|
+
setStepOrder((prevSteps) => {
|
|
162
|
+
return Array.from(/* @__PURE__ */ new Set([...prevSteps, id]));
|
|
163
|
+
});
|
|
164
|
+
},
|
|
165
|
+
[activeStep]
|
|
166
|
+
);
|
|
134
167
|
const rebuildSteps = react.useCallback(() => {
|
|
135
|
-
|
|
168
|
+
setStepOrder([]);
|
|
136
169
|
setRegistrationKey((prev2) => prev2 + 1);
|
|
137
170
|
}, []);
|
|
138
|
-
const changeStepAtIndex = react.useCallback((elements, index) => {
|
|
139
|
-
setSteps((prevSteps) => {
|
|
140
|
-
const newSteps = [...prevSteps];
|
|
141
|
-
newSteps[index] = elements;
|
|
142
|
-
return newSteps;
|
|
143
|
-
});
|
|
144
|
-
}, []);
|
|
145
171
|
const publicContextValue = react.useMemo(
|
|
146
172
|
() => ({
|
|
147
173
|
activeStep,
|
|
@@ -170,14 +196,21 @@ function Stepper({ form: formProps, stepValidationMode = "forward", children })
|
|
|
170
196
|
step: stepRef.current,
|
|
171
197
|
registrationKey,
|
|
172
198
|
rebuildSteps,
|
|
173
|
-
|
|
174
|
-
|
|
199
|
+
registerStepOrder,
|
|
200
|
+
registerStep
|
|
175
201
|
}),
|
|
176
|
-
[
|
|
202
|
+
[
|
|
203
|
+
registrationKey,
|
|
204
|
+
rebuildSteps,
|
|
205
|
+
registerStepOrder,
|
|
206
|
+
registerStep
|
|
207
|
+
]
|
|
177
208
|
);
|
|
178
209
|
const resolvedChildren = (
|
|
179
210
|
// eslint-disable-next-line react-hooks/refs
|
|
180
|
-
typeof children === "function" ? children(
|
|
211
|
+
typeof children === "function" ? children(
|
|
212
|
+
publicContextValue
|
|
213
|
+
) : children
|
|
181
214
|
);
|
|
182
215
|
return (
|
|
183
216
|
// eslint-disable-next-line react-hooks/refs
|
|
@@ -198,23 +231,23 @@ function Step({ children }) {
|
|
|
198
231
|
registerStep: registerStepFromParent,
|
|
199
232
|
step: stepFromParent,
|
|
200
233
|
rebuildSteps: rebuildStepsFromParent,
|
|
201
|
-
|
|
234
|
+
registerStepOrder,
|
|
202
235
|
registrationKey: registrationKeyFromParent
|
|
203
236
|
} = formContext;
|
|
204
237
|
const stepRef = react.useRef(void 0);
|
|
238
|
+
const [id] = react.useState(generateGUID());
|
|
205
239
|
const [steps, setSteps] = react.useState([]);
|
|
206
240
|
const [registrationKey, setRegistrationKey] = react.useState(0);
|
|
207
|
-
const changeStepAtIndex = react.useCallback((elements, _index) => {
|
|
208
|
-
setSteps(elements);
|
|
209
|
-
}, []);
|
|
210
241
|
react.useEffect(() => {
|
|
211
242
|
const stepList = steps.length ? steps : [""];
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
243
|
+
registerStepFromParent(stepList, id);
|
|
244
|
+
registerStepOrder(id);
|
|
245
|
+
}, [steps]);
|
|
246
|
+
react.useEffect(() => {
|
|
247
|
+
if (registrationKeyFromParent) {
|
|
248
|
+
registerStepOrder(id);
|
|
216
249
|
}
|
|
217
|
-
}, [registrationKeyFromParent
|
|
250
|
+
}, [registrationKeyFromParent]);
|
|
218
251
|
react.useEffect(() => {
|
|
219
252
|
if (stepFromParent !== void 0) {
|
|
220
253
|
rebuildStepsFromParent();
|
|
@@ -226,24 +259,13 @@ function Step({ children }) {
|
|
|
226
259
|
const registerField = react.useCallback(
|
|
227
260
|
(element) => {
|
|
228
261
|
setSteps((prevSteps) => {
|
|
229
|
-
return [...prevSteps, element];
|
|
230
|
-
});
|
|
231
|
-
},
|
|
232
|
-
[steps]
|
|
233
|
-
);
|
|
234
|
-
const registerStep = react.useCallback(
|
|
235
|
-
(elements, stepRef2, step) => {
|
|
236
|
-
setSteps((prevSteps) => {
|
|
237
|
-
const stepNumber = step != null ? step : prevSteps.length;
|
|
238
|
-
stepRef2.current = stepNumber;
|
|
239
|
-
const newSteps = [...prevSteps];
|
|
240
|
-
newSteps.splice(stepNumber, 0, ...elements);
|
|
241
|
-
return newSteps;
|
|
262
|
+
return Array.from(/* @__PURE__ */ new Set([...prevSteps, element]));
|
|
242
263
|
});
|
|
243
264
|
},
|
|
244
265
|
[steps]
|
|
245
266
|
);
|
|
246
267
|
const rebuildSteps = react.useCallback(() => {
|
|
268
|
+
stepRef.current = void 0;
|
|
247
269
|
setSteps([]);
|
|
248
270
|
setRegistrationKey((prev) => prev + 1);
|
|
249
271
|
}, []);
|
|
@@ -252,12 +274,10 @@ function Step({ children }) {
|
|
|
252
274
|
// eslint-disable-next-line react-hooks/refs
|
|
253
275
|
step: stepRef.current,
|
|
254
276
|
registrationKey,
|
|
255
|
-
changeStepAtIndex,
|
|
256
277
|
registerField,
|
|
257
|
-
registerStep,
|
|
258
278
|
rebuildSteps
|
|
259
279
|
}),
|
|
260
|
-
[registrationKey,
|
|
280
|
+
[registrationKey, registerField, rebuildSteps]
|
|
261
281
|
);
|
|
262
282
|
return /* @__PURE__ */ jsxRuntime.jsx(StepContext.Provider, { value: contextValue, children });
|
|
263
283
|
}
|
|
@@ -265,7 +285,7 @@ Step.displayName = "Step";
|
|
|
265
285
|
function Controller({ name, ...rest }) {
|
|
266
286
|
const stepContext = useStep();
|
|
267
287
|
react.useEffect(() => {
|
|
268
|
-
if (stepContext
|
|
288
|
+
if (stepContext) {
|
|
269
289
|
stepContext.registerField(name);
|
|
270
290
|
}
|
|
271
291
|
}, [stepContext == null ? void 0 : stepContext.registrationKey]);
|
|
@@ -283,7 +303,7 @@ Controller.displayName = "Controller";
|
|
|
283
303
|
function useController(props) {
|
|
284
304
|
const stepContext = useStep();
|
|
285
305
|
react.useEffect(() => {
|
|
286
|
-
if (stepContext
|
|
306
|
+
if (stepContext) {
|
|
287
307
|
stepContext.registerField(props.name);
|
|
288
308
|
}
|
|
289
309
|
}, [stepContext == null ? void 0 : stepContext.registrationKey]);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/helper.ts","../src/stepper.tsx","../src/step.tsx","../src/controller.tsx","../src/use-controller.tsx"],"names":["createContext","useContext","useFormContext","useState","useRef","useMemo","useCallback","prev","stepRef","jsx","useEffect","RHFController","useRHFController"],"mappings":"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","file":"index.js","sourcesContent":["function 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\nexport { buildNestedValues }\n","import { createContext, useCallback, useContext, useMemo, useRef, useState } from 'react'\nimport { type FieldValues, Path, useFormContext, type UseFormReturn } from 'react-hook-form'\n\nimport { buildNestedValues } from './helper'\nimport { type StepValidationMode, type MaybePromise } from './types'\n\ntype StepperContextValue<TFieldValues extends FieldValues = FieldValues> = {\n activeStep: number\n jumpTo: (step: number, onLeave?: (values: Partial<TFieldValues>) => MaybePromise<void>) => Promise<boolean>\n fields: string[] | null\n validSteps: number[]\n isFirstStep: boolean\n isLastStep: boolean\n next: (onLeave?: ((values: Partial<TFieldValues>) => MaybePromise<void>) | unknown) => Promise<boolean>\n prev: (onLeave?: ((values: Partial<TFieldValues>) => MaybePromise<void>) | unknown) => Promise<boolean>\n}\n\ntype InternalStepperContextValue = {\n step?: number\n registrationKey: number\n rebuildSteps: () => void\n registerStep: (elements: string[], stepRef: React.RefObject<number | undefined>, step?: number) => void\n changeStepAtIndex: (elements: string[], index: number) => void\n}\n\nconst StepperContext = createContext<StepperContextValue | null>(null)\nconst InternalStepperContext = createContext<InternalStepperContextValue | null>(null)\n\n\nfunction useInternalStepperContext(): InternalStepperContextValue {\n const context = useContext(InternalStepperContext)\n if (!context) {\n throw new Error('useInternalStepperContext must be used within a <Stepper>')\n }\n return context\n}\n\ninterface StepperProps<TFieldValues extends FieldValues = FieldValues> {\n form?: UseFormReturn<TFieldValues>\n stepValidationMode?: StepValidationMode\n children: React.ReactNode | ((context: StepperContextValue<TFieldValues>) => React.ReactNode)\n}\n\nfunction Stepper<TFieldValues extends FieldValues = FieldValues>(\n { form:formProps, stepValidationMode = 'forward', children }: StepperProps<TFieldValues>,\n) {\n const formContext = useFormContext()\n\n const form = formProps ?? formContext as UseFormReturn<TFieldValues>\n const [steps, setSteps] = useState<string[][]>([])\n const [activeStep, setActiveStep] = useState(-1)\n const [validSteps, setValidSteps] = useState<number[]>([])\n const [registrationKey, setRegistrationKey] = useState(0)\n\n const stepRef = useRef<number | undefined>(undefined)\n\n const fields = useMemo<string[] | null>(() => {\n if (activeStep === -1 || !steps[activeStep]) return null\n return Array.from(new Set(steps[activeStep]))\n }, [steps, activeStep])\n\n const jumpTo = useCallback(\n async (step: number, onLeave?: (values: Partial<TFieldValues>) => MaybePromise<void>): Promise<boolean> => {\n if (activeStep !== -1 && fields && stepValidationMode !== 'none') {\n const isForward = step > activeStep\n const shouldValidate = stepValidationMode === 'all' || (stepValidationMode === 'forward' && isForward)\n if (shouldValidate) {\n const isValid = await form.trigger(fields as Path<TFieldValues>[])\n if (!isValid) {\n setValidSteps((prev) => prev.filter((s) => s !== activeStep))\n return false\n }\n setValidSteps((prev) => [...new Set([...prev, activeStep])])\n }\n }\n if (onLeave && fields) {\n const watchedValues = form.watch(fields as Path<TFieldValues>[])\n const values = buildNestedValues(fields, watchedValues) as Partial<TFieldValues>\n await onLeave(values)\n }\n setActiveStep(step)\n return true\n },\n [activeStep, fields, form, stepValidationMode],\n )\n\n const isFirstStep = useMemo(\n () => activeStep === -1 || activeStep === 0,\n [activeStep],\n )\n\n const isLastStep = useMemo(\n () => activeStep === -1 || activeStep === steps.length - 1,\n [activeStep, steps.length],\n )\n\n const next = useCallback(async (onLeave?: ((values: Partial<TFieldValues>) => MaybePromise<void>) | unknown): Promise<boolean> => {\n const callback = typeof onLeave === 'function' ? onLeave as (values: Partial<TFieldValues>) => MaybePromise<void> : undefined\n if (activeStep === -1 || activeStep >= steps.length - 1) return false\n if (fields && stepValidationMode !== 'none') {\n const isValid = await form.trigger(fields as Path<TFieldValues>[])\n if (!isValid) {\n setValidSteps((prev) => prev.filter((s) => s !== activeStep))\n return false\n }\n setValidSteps((prev) => [...new Set([...prev, activeStep])])\n }\n if (callback && fields) {\n const watchedValues = form.watch(fields as Path<TFieldValues>[])\n const values = buildNestedValues(fields, watchedValues) as Partial<TFieldValues>\n await callback(values)\n }\n setActiveStep(activeStep + 1)\n return true\n }, [steps.length, activeStep, fields, form, stepValidationMode])\n\n const prev = useCallback(async (onLeave?: ((values: Partial<TFieldValues>) => MaybePromise<void>) | unknown): Promise<boolean> => {\n const callback = typeof onLeave === 'function' ? onLeave as (values: Partial<TFieldValues>) => MaybePromise<void> : undefined\n if (activeStep === -1 || activeStep <= 0) return false\n if (fields && stepValidationMode === 'all') {\n const isValid = await form.trigger(fields as Path<TFieldValues>[])\n if (!isValid) {\n setValidSteps((prev) => prev.filter((s) => s !== activeStep))\n return false\n }\n setValidSteps((prev) => [...new Set([...prev, activeStep])])\n }\n if (callback && fields) {\n const watchedValues = form.watch(fields as Path<TFieldValues>[])\n const values = buildNestedValues(fields, watchedValues) as Partial<TFieldValues>\n await callback(values)\n }\n setActiveStep(activeStep - 1)\n return true\n }, [activeStep, fields, form, stepValidationMode])\n\n const registerStep = useCallback(\n (elements: string[], stepRef: React.RefObject<number | undefined>, step?: number): void => {\n setSteps((prevSteps) => {\n const stepNumber = step ?? prevSteps.length\n stepRef.current = stepNumber\n const newSteps = [...prevSteps]\n newSteps.splice(stepNumber, 0, elements)\n\n if (activeStep === -1 && newSteps.length > 0) {\n setActiveStep(0)\n }\n\n return newSteps\n })\n },\n [activeStep],\n )\n\n const rebuildSteps = useCallback(() => {\n setSteps([])\n setRegistrationKey((prev) => prev + 1)\n }, [])\n\n\n const changeStepAtIndex = useCallback((elements: string[], index: number): void => {\n setSteps((prevSteps) => {\n const newSteps = [...prevSteps]\n newSteps[index] = elements\n return newSteps\n })\n }, [])\n\n\n const publicContextValue = useMemo<StepperContextValue>(\n () => ({\n activeStep,\n jumpTo,\n fields,\n validSteps,\n isFirstStep,\n isLastStep,\n next,\n prev,\n }),\n [\n activeStep,\n jumpTo,\n fields,\n validSteps,\n isFirstStep,\n isLastStep,\n next,\n prev,\n ],\n )\n\n const internalContextValue = useMemo<InternalStepperContextValue>(\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 StepperContextValue<TFieldValues>) : children\n\n return (\n // eslint-disable-next-line react-hooks/refs\n <StepperContext.Provider value={publicContextValue}>\n <InternalStepperContext.Provider value={internalContextValue}>\n {resolvedChildren}\n </InternalStepperContext.Provider>\n </StepperContext.Provider>\n )\n}\n\nfunction useStepper<TFieldValues extends FieldValues = FieldValues>(): StepperContextValue<TFieldValues> {\n const context = useContext(StepperContext)\n return context as unknown as StepperContextValue<TFieldValues>\n}\n\nexport { Stepper, StepperContext, InternalStepperContext, useInternalStepperContext, useStepper }\nexport type { StepperProps, StepperContextValue, InternalStepperContextValue }\n","import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'\n\nimport { useInternalStepperContext } from './stepper'\n\ntype StepContextValue = {\n step?: number\n registrationKey: number\n registerField: (elements: string) => void\n registerStep: (elements: string[], stepRef: React.RefObject<number | undefined>, step?: number) => void\n rebuildSteps: () => void\n changeStepAtIndex: (elements: string[], 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 formContext = useInternalStepperContext()\n\n const {\n registerStep: registerStepFromParent,\n step: stepFromParent,\n rebuildSteps: rebuildStepsFromParent,\n changeStepAtIndex: changeStepAtIndexFromParent,\n registrationKey: registrationKeyFromParent,\n } = formContext\n\n\n const stepRef = useRef<number | undefined>(undefined)\n const [steps, setSteps] = useState<string[]>([])\n\n const [registrationKey, setRegistrationKey] = useState(0)\n\n const changeStepAtIndex = useCallback((elements: string[], _index: number): void => {\n setSteps(elements)\n }, [])\n\n useEffect(() => {\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])\n\n useEffect(() => {\n if (stepFromParent !== undefined) {\n rebuildStepsFromParent()\n }\n return () => {\n rebuildStepsFromParent()\n }\n }, [])\n\n const registerField = useCallback(\n (element: string): void => {\n setSteps((prevSteps) => {\n return [...prevSteps, element]\n })\n },\n [steps],\n )\n\n const registerStep = useCallback(\n (elements: string[], stepRef: React.RefObject<number | undefined>, step?: number): void => {\n setSteps((prevSteps) => {\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 { 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 { 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, ...rest }: ControllerProps<TFieldValues, TName>) {\n const stepContext = useStep()\n\n useEffect(() => {\n if (stepContext && stepContext?.registrationKey !== 0) {\n stepContext.registerField(name)\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} {...rest} />\n}\n\nController.displayName = 'Controller'\n\nexport { Controller }\nexport type { ControllerProps, ControllerRenderArgs }\n","import { useEffect } from 'react'\nimport {\n type Control,\n type FieldPath,\n type FieldValues,\n type UseControllerProps,\n type UseControllerReturn,\n useController as useRHFController,\n} from 'react-hook-form'\n\nimport { useStep } from './step'\n\nfunction useController<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>(props: UseControllerProps<TFieldValues, TName>): UseControllerReturn<TFieldValues, TName> {\n const stepContext = useStep()\n\n useEffect(() => {\n if (stepContext && stepContext?.registrationKey !== 0) {\n stepContext.registerField(props.name)\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 useRHFController({ ...props })\n}\n\nexport { useController }\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/helper.ts","../src/stepper.tsx","../src/step.tsx","../src/controller.tsx","../src/use-controller.tsx"],"names":["createContext","useContext","useFormContext","useState","useRef","useMemo","useCallback","prev","jsx","useEffect","RHFController","useRHFController"],"mappings":"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","file":"index.js","sourcesContent":["function buildNestedValues(\n fields: string[],\n values: unknown[],\n): 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 generateGUID() {\n function s4() {\n return Math.floor((1 + Math.random()) * 0x10000)\n .toString(16)\n .substring(1);\n }\n return (\n s4() +\n s4() +\n \"-\" +\n s4() +\n \"-\" +\n s4() +\n \"-\" +\n s4() +\n \"-\" +\n s4() +\n s4() +\n s4()\n );\n}\n\nexport { buildNestedValues, generateGUID };\n","import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n type FieldValues,\n Path,\n useFormContext,\n type UseFormReturn,\n} from \"react-hook-form\";\n\nimport { buildNestedValues, generateGUID } from \"./helper\";\nimport { type StepValidationMode, type MaybePromise } from \"./types\";\n\ntype StepperContextValue<TFieldValues extends FieldValues = FieldValues> = {\n activeStep: number;\n jumpTo: (\n step: number,\n onLeave?: (values: Partial<TFieldValues>) => MaybePromise<void>,\n ) => Promise<boolean>;\n fields: string[] | null;\n validSteps: number[];\n isFirstStep: boolean;\n isLastStep: boolean;\n next: (\n onLeave?: ((values: Partial<TFieldValues>) => MaybePromise<void>) | unknown,\n ) => Promise<boolean>;\n prev: (\n onLeave?: ((values: Partial<TFieldValues>) => MaybePromise<void>) | unknown,\n ) => Promise<boolean>;\n};\n\ntype InternalStepperContextValue = {\n step?: string;\n registrationKey: number;\n rebuildSteps: () => void;\n registerStepOrder: (id: string) => void;\n registerStep: (elements: string[], id: string) => void;\n};\n\nconst StepperContext = createContext<StepperContextValue | null>(null);\nconst InternalStepperContext =\n createContext<InternalStepperContextValue | null>(null);\n\nfunction useInternalStepperContext(): InternalStepperContextValue {\n const context = useContext(InternalStepperContext);\n if (!context) {\n throw new Error('<Step> must be used within a <Stepper>')\n }\n return context as unknown as InternalStepperContextValue;\n}\n\ninterface StepperProps<TFieldValues extends FieldValues = FieldValues> {\n form?: UseFormReturn<TFieldValues>;\n stepValidationMode?: StepValidationMode;\n children:\n | React.ReactNode\n | ((context: StepperContextValue<TFieldValues>) => React.ReactNode);\n}\n\nfunction Stepper<TFieldValues extends FieldValues = FieldValues>({\n form: formProps,\n stepValidationMode = \"forward\",\n children,\n}: StepperProps<TFieldValues>) {\n const formContext = useFormContext();\n\n const form = formProps ?? (formContext as UseFormReturn<TFieldValues>);\n const [steps, setSteps] = useState<Record<string, string[]>>({});\n const [stepOrder, setStepOrder] = useState<string[]>([]);\n const [activeStep, setActiveStep] = useState(-1);\n const [validSteps, setValidSteps] = useState<number[]>([]);\n const [registrationKey, setRegistrationKey] = useState(0);\n\n const stepRef = useRef<string | undefined>(undefined);\n\n const fields = useMemo<string[] | null>(() => {\n if (activeStep === -1 || !steps[stepOrder[activeStep]]) return null;\n return Array.from(new Set(steps[stepOrder[activeStep]]));\n }, [steps, stepOrder, activeStep]);\n\n const jumpTo = useCallback(\n async (\n step: number,\n onLeave?: (values: Partial<TFieldValues>) => MaybePromise<void>,\n ): Promise<boolean> => {\n if (activeStep !== -1 && fields && stepValidationMode !== \"none\") {\n const isForward = step > activeStep;\n const shouldValidate =\n stepValidationMode === \"all\" ||\n (stepValidationMode === \"forward\" && isForward);\n if (shouldValidate) {\n const isValid = await form.trigger(fields as Path<TFieldValues>[]);\n if (!isValid) {\n setValidSteps((prev) => prev.filter((s) => s !== activeStep));\n return false;\n }\n setValidSteps((prev) => [...new Set([...prev, activeStep])]);\n }\n }\n if (onLeave && fields) {\n const watchedValues = form.watch(fields as Path<TFieldValues>[]);\n const values = buildNestedValues(\n fields,\n watchedValues,\n ) as Partial<TFieldValues>;\n await onLeave(values);\n }\n setActiveStep(step);\n return true;\n },\n [activeStep, fields, form, stepValidationMode],\n );\n\n const isFirstStep = useMemo(\n () => activeStep === -1 || activeStep === 0,\n [activeStep],\n );\n\n const isLastStep = useMemo(\n () => activeStep === -1 || activeStep === stepOrder.length - 1,\n [activeStep, stepOrder.length],\n );\n\n const next = useCallback(\n async (\n onLeave?:\n | ((values: Partial<TFieldValues>) => MaybePromise<void>)\n | unknown,\n ): Promise<boolean> => {\n const callback =\n typeof onLeave === \"function\"\n ? (onLeave as (values: Partial<TFieldValues>) => MaybePromise<void>)\n : undefined;\n if (activeStep === -1 || activeStep >= stepOrder.length - 1) return false;\n if (fields && stepValidationMode !== \"none\") {\n const isValid = await form.trigger(fields as Path<TFieldValues>[]);\n if (!isValid) {\n setValidSteps((prev) => prev.filter((s) => s !== activeStep));\n return false;\n }\n setValidSteps((prev) => [...new Set([...prev, activeStep])]);\n }\n if (callback && fields) {\n const watchedValues = form.watch(fields as Path<TFieldValues>[]);\n const values = buildNestedValues(\n fields,\n watchedValues,\n ) as Partial<TFieldValues>;\n await callback(values);\n }\n setActiveStep(activeStep + 1);\n return true;\n },\n [stepOrder.length, activeStep, fields, form, stepValidationMode],\n );\n\n const prev = useCallback(\n async (\n onLeave?:\n | ((values: Partial<TFieldValues>) => MaybePromise<void>)\n | unknown,\n ): Promise<boolean> => {\n const callback =\n typeof onLeave === \"function\"\n ? (onLeave as (values: Partial<TFieldValues>) => MaybePromise<void>)\n : undefined;\n if (activeStep === -1 || activeStep <= 0) return false;\n if (fields && stepValidationMode === \"all\") {\n const isValid = await form.trigger(fields as Path<TFieldValues>[]);\n if (!isValid) {\n setValidSteps((prev) => prev.filter((s) => s !== activeStep));\n return false;\n }\n setValidSteps((prev) => [...new Set([...prev, activeStep])]);\n }\n if (callback && fields) {\n const watchedValues = form.watch(fields as Path<TFieldValues>[]);\n const values = buildNestedValues(\n fields,\n watchedValues,\n ) as Partial<TFieldValues>;\n await callback(values);\n }\n setActiveStep(activeStep - 1);\n return true;\n },\n [activeStep, fields, form, stepValidationMode],\n );\n\n const registerStep = useCallback(\n (elements: string[], id: string): void => {\n setSteps((prevSteps) => {\n stepRef.current = id;\n const newSteps = { ...prevSteps };\n newSteps[id] = elements;\n\n if (activeStep === -1 && Object.keys(newSteps).length > 0) {\n setActiveStep(0);\n }\n\n return newSteps;\n });\n },\n [activeStep],\n );\n\n const registerStepOrder = useCallback(\n (id: string): void => {\n setStepOrder((prevSteps) => {\n return Array.from(new Set([...prevSteps, id]));\n });\n },\n [activeStep],\n );\n\n const rebuildSteps = useCallback(() => {\n setStepOrder([]);\n setRegistrationKey((prev) => prev + 1);\n }, []);\n\n\n const publicContextValue = useMemo<StepperContextValue>(\n () => ({\n activeStep,\n jumpTo,\n fields,\n validSteps,\n isFirstStep,\n isLastStep,\n next,\n prev,\n }),\n [\n activeStep,\n jumpTo,\n fields,\n validSteps,\n isFirstStep,\n isLastStep,\n next,\n prev,\n ],\n );\n\n const internalContextValue = useMemo<InternalStepperContextValue>(\n () => ({\n // eslint-disable-next-line react-hooks/refs\n step: stepRef.current,\n registrationKey,\n rebuildSteps,\n registerStepOrder,\n registerStep,\n }),\n [\n registrationKey,\n rebuildSteps,\n registerStepOrder,\n registerStep,\n ],\n );\n\n const resolvedChildren =\n // eslint-disable-next-line react-hooks/refs\n typeof children === \"function\"\n ? children(\n publicContextValue as unknown as StepperContextValue<TFieldValues>,\n )\n : children;\n\n return (\n // eslint-disable-next-line react-hooks/refs\n <StepperContext.Provider value={publicContextValue}>\n <InternalStepperContext.Provider value={internalContextValue}>\n {resolvedChildren}\n </InternalStepperContext.Provider>\n </StepperContext.Provider>\n );\n}\n\nfunction useStepper<\n TFieldValues extends FieldValues = FieldValues,\n>(): StepperContextValue<TFieldValues> {\n const context = useContext(StepperContext);\n return context as unknown as StepperContextValue<TFieldValues>;\n}\n\nexport {\n Stepper,\n StepperContext,\n InternalStepperContext,\n useInternalStepperContext,\n useStepper,\n};\nexport type { StepperProps, StepperContextValue, InternalStepperContextValue };\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { useInternalStepperContext } from \"./stepper\";\nimport { generateGUID } from \"./helper\";\n\ntype StepContextValue = {\n step?: string;\n registrationKey: number;\n registerField: (elements: string) => void;\n rebuildSteps: () => 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 formContext = useInternalStepperContext();\n\n const {\n registerStep: registerStepFromParent,\n step: stepFromParent,\n rebuildSteps: rebuildStepsFromParent,\n registerStepOrder,\n registrationKey: registrationKeyFromParent,\n } = formContext;\n\n const stepRef = useRef<string | undefined>(undefined);\n\n const [id] = useState(generateGUID());\n const [steps, setSteps] = useState<string[]>([]);\n\n const [registrationKey, setRegistrationKey] = useState(0);\n\n useEffect(() => {\n const stepList = steps.length ? steps : [\"\"];\n registerStepFromParent(stepList, id);\n registerStepOrder(id);\n }, [steps]);\n\n useEffect(() => {\n if (registrationKeyFromParent) {\n registerStepOrder(id);\n }\n }, [registrationKeyFromParent]);\n\n useEffect(() => {\n if (stepFromParent !== undefined) {\n rebuildStepsFromParent();\n }\n return () => {\n rebuildStepsFromParent();\n };\n }, []);\n\n const registerField = useCallback(\n (element: string): void => {\n setSteps((prevSteps) => {\n return Array.from(new Set([...prevSteps, element]));\n });\n },\n [steps],\n );\n\n const rebuildSteps = useCallback(() => {\n stepRef.current = undefined;\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 registerField,\n rebuildSteps,\n }),\n [registrationKey, registerField, rebuildSteps],\n );\n\n // eslint-disable-next-line react-hooks/refs\n return (\n <StepContext.Provider value={contextValue}>{children}</StepContext.Provider>\n );\n}\n\nStep.displayName = \"Step\";\n\nexport { Step, useStep };\nexport type { StepContextValue };\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 { 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, ...rest }: ControllerProps<TFieldValues, TName>) {\n const stepContext = useStep();\n\n useEffect(() => {\n if (stepContext) {\n stepContext.registerField(name);\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} {...rest} />;\n}\n\nController.displayName = \"Controller\";\n\nexport { Controller };\nexport type { ControllerProps, ControllerRenderArgs };\n","import { useEffect } from \"react\";\nimport {\n type Control,\n type FieldPath,\n type FieldValues,\n type UseControllerProps,\n type UseControllerReturn,\n useController as useRHFController,\n} from \"react-hook-form\";\n\nimport { useStep } from \"./step\";\n\nfunction useController<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>(\n props: UseControllerProps<TFieldValues, TName>,\n): UseControllerReturn<TFieldValues, TName> {\n const stepContext = useStep();\n\n useEffect(() => {\n if (stepContext) {\n stepContext.registerField(props.name);\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 useRHFController({ ...props });\n}\n\nexport { useController };\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -23,27 +23,38 @@ function buildNestedValues(fields, values) {
|
|
|
23
23
|
}
|
|
24
24
|
return result;
|
|
25
25
|
}
|
|
26
|
+
function generateGUID() {
|
|
27
|
+
function s4() {
|
|
28
|
+
return Math.floor((1 + Math.random()) * 65536).toString(16).substring(1);
|
|
29
|
+
}
|
|
30
|
+
return s4() + s4() + "-" + s4() + "-" + s4() + "-" + s4() + "-" + s4() + s4() + s4();
|
|
31
|
+
}
|
|
26
32
|
var StepperContext = createContext(null);
|
|
27
33
|
var InternalStepperContext = createContext(null);
|
|
28
34
|
function useInternalStepperContext() {
|
|
29
35
|
const context = useContext(InternalStepperContext);
|
|
30
36
|
if (!context) {
|
|
31
|
-
throw new Error("
|
|
37
|
+
throw new Error("<Step> must be used within a <Stepper>");
|
|
32
38
|
}
|
|
33
39
|
return context;
|
|
34
40
|
}
|
|
35
|
-
function Stepper({
|
|
41
|
+
function Stepper({
|
|
42
|
+
form: formProps,
|
|
43
|
+
stepValidationMode = "forward",
|
|
44
|
+
children
|
|
45
|
+
}) {
|
|
36
46
|
const formContext = useFormContext();
|
|
37
47
|
const form = formProps != null ? formProps : formContext;
|
|
38
|
-
const [steps, setSteps] = useState(
|
|
48
|
+
const [steps, setSteps] = useState({});
|
|
49
|
+
const [stepOrder, setStepOrder] = useState([]);
|
|
39
50
|
const [activeStep, setActiveStep] = useState(-1);
|
|
40
51
|
const [validSteps, setValidSteps] = useState([]);
|
|
41
52
|
const [registrationKey, setRegistrationKey] = useState(0);
|
|
42
53
|
const stepRef = useRef(void 0);
|
|
43
54
|
const fields = useMemo(() => {
|
|
44
|
-
if (activeStep === -1 || !steps[activeStep]) return null;
|
|
45
|
-
return Array.from(new Set(steps[activeStep]));
|
|
46
|
-
}, [steps, activeStep]);
|
|
55
|
+
if (activeStep === -1 || !steps[stepOrder[activeStep]]) return null;
|
|
56
|
+
return Array.from(new Set(steps[stepOrder[activeStep]]));
|
|
57
|
+
}, [steps, stepOrder, activeStep]);
|
|
47
58
|
const jumpTo = useCallback(
|
|
48
59
|
async (step, onLeave) => {
|
|
49
60
|
if (activeStep !== -1 && fields && stepValidationMode !== "none") {
|
|
@@ -60,7 +71,10 @@ function Stepper({ form: formProps, stepValidationMode = "forward", children })
|
|
|
60
71
|
}
|
|
61
72
|
if (onLeave && fields) {
|
|
62
73
|
const watchedValues = form.watch(fields);
|
|
63
|
-
const values = buildNestedValues(
|
|
74
|
+
const values = buildNestedValues(
|
|
75
|
+
fields,
|
|
76
|
+
watchedValues
|
|
77
|
+
);
|
|
64
78
|
await onLeave(values);
|
|
65
79
|
}
|
|
66
80
|
setActiveStep(step);
|
|
@@ -73,55 +87,66 @@ function Stepper({ form: formProps, stepValidationMode = "forward", children })
|
|
|
73
87
|
[activeStep]
|
|
74
88
|
);
|
|
75
89
|
const isLastStep = useMemo(
|
|
76
|
-
() => activeStep === -1 || activeStep ===
|
|
77
|
-
[activeStep,
|
|
90
|
+
() => activeStep === -1 || activeStep === stepOrder.length - 1,
|
|
91
|
+
[activeStep, stepOrder.length]
|
|
78
92
|
);
|
|
79
|
-
const next = useCallback(
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
93
|
+
const next = useCallback(
|
|
94
|
+
async (onLeave) => {
|
|
95
|
+
const callback = typeof onLeave === "function" ? onLeave : void 0;
|
|
96
|
+
if (activeStep === -1 || activeStep >= stepOrder.length - 1) return false;
|
|
97
|
+
if (fields && stepValidationMode !== "none") {
|
|
98
|
+
const isValid = await form.trigger(fields);
|
|
99
|
+
if (!isValid) {
|
|
100
|
+
setValidSteps((prev2) => prev2.filter((s) => s !== activeStep));
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
setValidSteps((prev2) => [.../* @__PURE__ */ new Set([...prev2, activeStep])]);
|
|
87
104
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
setActiveStep(activeStep + 1);
|
|
96
|
-
return true;
|
|
97
|
-
}, [steps.length, activeStep, fields, form, stepValidationMode]);
|
|
98
|
-
const prev = useCallback(async (onLeave) => {
|
|
99
|
-
const callback = typeof onLeave === "function" ? onLeave : void 0;
|
|
100
|
-
if (activeStep === -1 || activeStep <= 0) return false;
|
|
101
|
-
if (fields && stepValidationMode === "all") {
|
|
102
|
-
const isValid = await form.trigger(fields);
|
|
103
|
-
if (!isValid) {
|
|
104
|
-
setValidSteps((prev2) => prev2.filter((s) => s !== activeStep));
|
|
105
|
-
return false;
|
|
105
|
+
if (callback && fields) {
|
|
106
|
+
const watchedValues = form.watch(fields);
|
|
107
|
+
const values = buildNestedValues(
|
|
108
|
+
fields,
|
|
109
|
+
watchedValues
|
|
110
|
+
);
|
|
111
|
+
await callback(values);
|
|
106
112
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
113
|
+
setActiveStep(activeStep + 1);
|
|
114
|
+
return true;
|
|
115
|
+
},
|
|
116
|
+
[stepOrder.length, activeStep, fields, form, stepValidationMode]
|
|
117
|
+
);
|
|
118
|
+
const prev = useCallback(
|
|
119
|
+
async (onLeave) => {
|
|
120
|
+
const callback = typeof onLeave === "function" ? onLeave : void 0;
|
|
121
|
+
if (activeStep === -1 || activeStep <= 0) return false;
|
|
122
|
+
if (fields && stepValidationMode === "all") {
|
|
123
|
+
const isValid = await form.trigger(fields);
|
|
124
|
+
if (!isValid) {
|
|
125
|
+
setValidSteps((prev2) => prev2.filter((s) => s !== activeStep));
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
setValidSteps((prev2) => [.../* @__PURE__ */ new Set([...prev2, activeStep])]);
|
|
129
|
+
}
|
|
130
|
+
if (callback && fields) {
|
|
131
|
+
const watchedValues = form.watch(fields);
|
|
132
|
+
const values = buildNestedValues(
|
|
133
|
+
fields,
|
|
134
|
+
watchedValues
|
|
135
|
+
);
|
|
136
|
+
await callback(values);
|
|
137
|
+
}
|
|
138
|
+
setActiveStep(activeStep - 1);
|
|
139
|
+
return true;
|
|
140
|
+
},
|
|
141
|
+
[activeStep, fields, form, stepValidationMode]
|
|
142
|
+
);
|
|
117
143
|
const registerStep = useCallback(
|
|
118
|
-
(elements,
|
|
144
|
+
(elements, id) => {
|
|
119
145
|
setSteps((prevSteps) => {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
newSteps.
|
|
124
|
-
if (activeStep === -1 && newSteps.length > 0) {
|
|
146
|
+
stepRef.current = id;
|
|
147
|
+
const newSteps = { ...prevSteps };
|
|
148
|
+
newSteps[id] = elements;
|
|
149
|
+
if (activeStep === -1 && Object.keys(newSteps).length > 0) {
|
|
125
150
|
setActiveStep(0);
|
|
126
151
|
}
|
|
127
152
|
return newSteps;
|
|
@@ -129,17 +154,18 @@ function Stepper({ form: formProps, stepValidationMode = "forward", children })
|
|
|
129
154
|
},
|
|
130
155
|
[activeStep]
|
|
131
156
|
);
|
|
157
|
+
const registerStepOrder = useCallback(
|
|
158
|
+
(id) => {
|
|
159
|
+
setStepOrder((prevSteps) => {
|
|
160
|
+
return Array.from(/* @__PURE__ */ new Set([...prevSteps, id]));
|
|
161
|
+
});
|
|
162
|
+
},
|
|
163
|
+
[activeStep]
|
|
164
|
+
);
|
|
132
165
|
const rebuildSteps = useCallback(() => {
|
|
133
|
-
|
|
166
|
+
setStepOrder([]);
|
|
134
167
|
setRegistrationKey((prev2) => prev2 + 1);
|
|
135
168
|
}, []);
|
|
136
|
-
const changeStepAtIndex = useCallback((elements, index) => {
|
|
137
|
-
setSteps((prevSteps) => {
|
|
138
|
-
const newSteps = [...prevSteps];
|
|
139
|
-
newSteps[index] = elements;
|
|
140
|
-
return newSteps;
|
|
141
|
-
});
|
|
142
|
-
}, []);
|
|
143
169
|
const publicContextValue = useMemo(
|
|
144
170
|
() => ({
|
|
145
171
|
activeStep,
|
|
@@ -168,14 +194,21 @@ function Stepper({ form: formProps, stepValidationMode = "forward", children })
|
|
|
168
194
|
step: stepRef.current,
|
|
169
195
|
registrationKey,
|
|
170
196
|
rebuildSteps,
|
|
171
|
-
|
|
172
|
-
|
|
197
|
+
registerStepOrder,
|
|
198
|
+
registerStep
|
|
173
199
|
}),
|
|
174
|
-
[
|
|
200
|
+
[
|
|
201
|
+
registrationKey,
|
|
202
|
+
rebuildSteps,
|
|
203
|
+
registerStepOrder,
|
|
204
|
+
registerStep
|
|
205
|
+
]
|
|
175
206
|
);
|
|
176
207
|
const resolvedChildren = (
|
|
177
208
|
// eslint-disable-next-line react-hooks/refs
|
|
178
|
-
typeof children === "function" ? children(
|
|
209
|
+
typeof children === "function" ? children(
|
|
210
|
+
publicContextValue
|
|
211
|
+
) : children
|
|
179
212
|
);
|
|
180
213
|
return (
|
|
181
214
|
// eslint-disable-next-line react-hooks/refs
|
|
@@ -196,23 +229,23 @@ function Step({ children }) {
|
|
|
196
229
|
registerStep: registerStepFromParent,
|
|
197
230
|
step: stepFromParent,
|
|
198
231
|
rebuildSteps: rebuildStepsFromParent,
|
|
199
|
-
|
|
232
|
+
registerStepOrder,
|
|
200
233
|
registrationKey: registrationKeyFromParent
|
|
201
234
|
} = formContext;
|
|
202
235
|
const stepRef = useRef(void 0);
|
|
236
|
+
const [id] = useState(generateGUID());
|
|
203
237
|
const [steps, setSteps] = useState([]);
|
|
204
238
|
const [registrationKey, setRegistrationKey] = useState(0);
|
|
205
|
-
const changeStepAtIndex = useCallback((elements, _index) => {
|
|
206
|
-
setSteps(elements);
|
|
207
|
-
}, []);
|
|
208
239
|
useEffect(() => {
|
|
209
240
|
const stepList = steps.length ? steps : [""];
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
241
|
+
registerStepFromParent(stepList, id);
|
|
242
|
+
registerStepOrder(id);
|
|
243
|
+
}, [steps]);
|
|
244
|
+
useEffect(() => {
|
|
245
|
+
if (registrationKeyFromParent) {
|
|
246
|
+
registerStepOrder(id);
|
|
214
247
|
}
|
|
215
|
-
}, [registrationKeyFromParent
|
|
248
|
+
}, [registrationKeyFromParent]);
|
|
216
249
|
useEffect(() => {
|
|
217
250
|
if (stepFromParent !== void 0) {
|
|
218
251
|
rebuildStepsFromParent();
|
|
@@ -224,24 +257,13 @@ function Step({ children }) {
|
|
|
224
257
|
const registerField = useCallback(
|
|
225
258
|
(element) => {
|
|
226
259
|
setSteps((prevSteps) => {
|
|
227
|
-
return [...prevSteps, element];
|
|
228
|
-
});
|
|
229
|
-
},
|
|
230
|
-
[steps]
|
|
231
|
-
);
|
|
232
|
-
const registerStep = useCallback(
|
|
233
|
-
(elements, stepRef2, step) => {
|
|
234
|
-
setSteps((prevSteps) => {
|
|
235
|
-
const stepNumber = step != null ? step : prevSteps.length;
|
|
236
|
-
stepRef2.current = stepNumber;
|
|
237
|
-
const newSteps = [...prevSteps];
|
|
238
|
-
newSteps.splice(stepNumber, 0, ...elements);
|
|
239
|
-
return newSteps;
|
|
260
|
+
return Array.from(/* @__PURE__ */ new Set([...prevSteps, element]));
|
|
240
261
|
});
|
|
241
262
|
},
|
|
242
263
|
[steps]
|
|
243
264
|
);
|
|
244
265
|
const rebuildSteps = useCallback(() => {
|
|
266
|
+
stepRef.current = void 0;
|
|
245
267
|
setSteps([]);
|
|
246
268
|
setRegistrationKey((prev) => prev + 1);
|
|
247
269
|
}, []);
|
|
@@ -250,12 +272,10 @@ function Step({ children }) {
|
|
|
250
272
|
// eslint-disable-next-line react-hooks/refs
|
|
251
273
|
step: stepRef.current,
|
|
252
274
|
registrationKey,
|
|
253
|
-
changeStepAtIndex,
|
|
254
275
|
registerField,
|
|
255
|
-
registerStep,
|
|
256
276
|
rebuildSteps
|
|
257
277
|
}),
|
|
258
|
-
[registrationKey,
|
|
278
|
+
[registrationKey, registerField, rebuildSteps]
|
|
259
279
|
);
|
|
260
280
|
return /* @__PURE__ */ jsx(StepContext.Provider, { value: contextValue, children });
|
|
261
281
|
}
|
|
@@ -263,7 +283,7 @@ Step.displayName = "Step";
|
|
|
263
283
|
function Controller({ name, ...rest }) {
|
|
264
284
|
const stepContext = useStep();
|
|
265
285
|
useEffect(() => {
|
|
266
|
-
if (stepContext
|
|
286
|
+
if (stepContext) {
|
|
267
287
|
stepContext.registerField(name);
|
|
268
288
|
}
|
|
269
289
|
}, [stepContext == null ? void 0 : stepContext.registrationKey]);
|
|
@@ -281,7 +301,7 @@ Controller.displayName = "Controller";
|
|
|
281
301
|
function useController(props) {
|
|
282
302
|
const stepContext = useStep();
|
|
283
303
|
useEffect(() => {
|
|
284
|
-
if (stepContext
|
|
304
|
+
if (stepContext) {
|
|
285
305
|
stepContext.registerField(props.name);
|
|
286
306
|
}
|
|
287
307
|
}, [stepContext == null ? void 0 : stepContext.registrationKey]);
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/helper.ts","../src/stepper.tsx","../src/step.tsx","../src/controller.tsx","../src/use-controller.tsx"],"names":["prev","stepRef","createContext","useContext","useRef","useState","useCallback","useMemo","jsx","useEffect","RHFController","useRHFController"],"mappings":"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","file":"index.mjs","sourcesContent":["function 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\nexport { buildNestedValues }\n","import { createContext, useCallback, useContext, useMemo, useRef, useState } from 'react'\nimport { type FieldValues, Path, useFormContext, type UseFormReturn } from 'react-hook-form'\n\nimport { buildNestedValues } from './helper'\nimport { type StepValidationMode, type MaybePromise } from './types'\n\ntype StepperContextValue<TFieldValues extends FieldValues = FieldValues> = {\n activeStep: number\n jumpTo: (step: number, onLeave?: (values: Partial<TFieldValues>) => MaybePromise<void>) => Promise<boolean>\n fields: string[] | null\n validSteps: number[]\n isFirstStep: boolean\n isLastStep: boolean\n next: (onLeave?: ((values: Partial<TFieldValues>) => MaybePromise<void>) | unknown) => Promise<boolean>\n prev: (onLeave?: ((values: Partial<TFieldValues>) => MaybePromise<void>) | unknown) => Promise<boolean>\n}\n\ntype InternalStepperContextValue = {\n step?: number\n registrationKey: number\n rebuildSteps: () => void\n registerStep: (elements: string[], stepRef: React.RefObject<number | undefined>, step?: number) => void\n changeStepAtIndex: (elements: string[], index: number) => void\n}\n\nconst StepperContext = createContext<StepperContextValue | null>(null)\nconst InternalStepperContext = createContext<InternalStepperContextValue | null>(null)\n\n\nfunction useInternalStepperContext(): InternalStepperContextValue {\n const context = useContext(InternalStepperContext)\n if (!context) {\n throw new Error('useInternalStepperContext must be used within a <Stepper>')\n }\n return context\n}\n\ninterface StepperProps<TFieldValues extends FieldValues = FieldValues> {\n form?: UseFormReturn<TFieldValues>\n stepValidationMode?: StepValidationMode\n children: React.ReactNode | ((context: StepperContextValue<TFieldValues>) => React.ReactNode)\n}\n\nfunction Stepper<TFieldValues extends FieldValues = FieldValues>(\n { form:formProps, stepValidationMode = 'forward', children }: StepperProps<TFieldValues>,\n) {\n const formContext = useFormContext()\n\n const form = formProps ?? formContext as UseFormReturn<TFieldValues>\n const [steps, setSteps] = useState<string[][]>([])\n const [activeStep, setActiveStep] = useState(-1)\n const [validSteps, setValidSteps] = useState<number[]>([])\n const [registrationKey, setRegistrationKey] = useState(0)\n\n const stepRef = useRef<number | undefined>(undefined)\n\n const fields = useMemo<string[] | null>(() => {\n if (activeStep === -1 || !steps[activeStep]) return null\n return Array.from(new Set(steps[activeStep]))\n }, [steps, activeStep])\n\n const jumpTo = useCallback(\n async (step: number, onLeave?: (values: Partial<TFieldValues>) => MaybePromise<void>): Promise<boolean> => {\n if (activeStep !== -1 && fields && stepValidationMode !== 'none') {\n const isForward = step > activeStep\n const shouldValidate = stepValidationMode === 'all' || (stepValidationMode === 'forward' && isForward)\n if (shouldValidate) {\n const isValid = await form.trigger(fields as Path<TFieldValues>[])\n if (!isValid) {\n setValidSteps((prev) => prev.filter((s) => s !== activeStep))\n return false\n }\n setValidSteps((prev) => [...new Set([...prev, activeStep])])\n }\n }\n if (onLeave && fields) {\n const watchedValues = form.watch(fields as Path<TFieldValues>[])\n const values = buildNestedValues(fields, watchedValues) as Partial<TFieldValues>\n await onLeave(values)\n }\n setActiveStep(step)\n return true\n },\n [activeStep, fields, form, stepValidationMode],\n )\n\n const isFirstStep = useMemo(\n () => activeStep === -1 || activeStep === 0,\n [activeStep],\n )\n\n const isLastStep = useMemo(\n () => activeStep === -1 || activeStep === steps.length - 1,\n [activeStep, steps.length],\n )\n\n const next = useCallback(async (onLeave?: ((values: Partial<TFieldValues>) => MaybePromise<void>) | unknown): Promise<boolean> => {\n const callback = typeof onLeave === 'function' ? onLeave as (values: Partial<TFieldValues>) => MaybePromise<void> : undefined\n if (activeStep === -1 || activeStep >= steps.length - 1) return false\n if (fields && stepValidationMode !== 'none') {\n const isValid = await form.trigger(fields as Path<TFieldValues>[])\n if (!isValid) {\n setValidSteps((prev) => prev.filter((s) => s !== activeStep))\n return false\n }\n setValidSteps((prev) => [...new Set([...prev, activeStep])])\n }\n if (callback && fields) {\n const watchedValues = form.watch(fields as Path<TFieldValues>[])\n const values = buildNestedValues(fields, watchedValues) as Partial<TFieldValues>\n await callback(values)\n }\n setActiveStep(activeStep + 1)\n return true\n }, [steps.length, activeStep, fields, form, stepValidationMode])\n\n const prev = useCallback(async (onLeave?: ((values: Partial<TFieldValues>) => MaybePromise<void>) | unknown): Promise<boolean> => {\n const callback = typeof onLeave === 'function' ? onLeave as (values: Partial<TFieldValues>) => MaybePromise<void> : undefined\n if (activeStep === -1 || activeStep <= 0) return false\n if (fields && stepValidationMode === 'all') {\n const isValid = await form.trigger(fields as Path<TFieldValues>[])\n if (!isValid) {\n setValidSteps((prev) => prev.filter((s) => s !== activeStep))\n return false\n }\n setValidSteps((prev) => [...new Set([...prev, activeStep])])\n }\n if (callback && fields) {\n const watchedValues = form.watch(fields as Path<TFieldValues>[])\n const values = buildNestedValues(fields, watchedValues) as Partial<TFieldValues>\n await callback(values)\n }\n setActiveStep(activeStep - 1)\n return true\n }, [activeStep, fields, form, stepValidationMode])\n\n const registerStep = useCallback(\n (elements: string[], stepRef: React.RefObject<number | undefined>, step?: number): void => {\n setSteps((prevSteps) => {\n const stepNumber = step ?? prevSteps.length\n stepRef.current = stepNumber\n const newSteps = [...prevSteps]\n newSteps.splice(stepNumber, 0, elements)\n\n if (activeStep === -1 && newSteps.length > 0) {\n setActiveStep(0)\n }\n\n return newSteps\n })\n },\n [activeStep],\n )\n\n const rebuildSteps = useCallback(() => {\n setSteps([])\n setRegistrationKey((prev) => prev + 1)\n }, [])\n\n\n const changeStepAtIndex = useCallback((elements: string[], index: number): void => {\n setSteps((prevSteps) => {\n const newSteps = [...prevSteps]\n newSteps[index] = elements\n return newSteps\n })\n }, [])\n\n\n const publicContextValue = useMemo<StepperContextValue>(\n () => ({\n activeStep,\n jumpTo,\n fields,\n validSteps,\n isFirstStep,\n isLastStep,\n next,\n prev,\n }),\n [\n activeStep,\n jumpTo,\n fields,\n validSteps,\n isFirstStep,\n isLastStep,\n next,\n prev,\n ],\n )\n\n const internalContextValue = useMemo<InternalStepperContextValue>(\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 StepperContextValue<TFieldValues>) : children\n\n return (\n // eslint-disable-next-line react-hooks/refs\n <StepperContext.Provider value={publicContextValue}>\n <InternalStepperContext.Provider value={internalContextValue}>\n {resolvedChildren}\n </InternalStepperContext.Provider>\n </StepperContext.Provider>\n )\n}\n\nfunction useStepper<TFieldValues extends FieldValues = FieldValues>(): StepperContextValue<TFieldValues> {\n const context = useContext(StepperContext)\n return context as unknown as StepperContextValue<TFieldValues>\n}\n\nexport { Stepper, StepperContext, InternalStepperContext, useInternalStepperContext, useStepper }\nexport type { StepperProps, StepperContextValue, InternalStepperContextValue }\n","import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'\n\nimport { useInternalStepperContext } from './stepper'\n\ntype StepContextValue = {\n step?: number\n registrationKey: number\n registerField: (elements: string) => void\n registerStep: (elements: string[], stepRef: React.RefObject<number | undefined>, step?: number) => void\n rebuildSteps: () => void\n changeStepAtIndex: (elements: string[], 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 formContext = useInternalStepperContext()\n\n const {\n registerStep: registerStepFromParent,\n step: stepFromParent,\n rebuildSteps: rebuildStepsFromParent,\n changeStepAtIndex: changeStepAtIndexFromParent,\n registrationKey: registrationKeyFromParent,\n } = formContext\n\n\n const stepRef = useRef<number | undefined>(undefined)\n const [steps, setSteps] = useState<string[]>([])\n\n const [registrationKey, setRegistrationKey] = useState(0)\n\n const changeStepAtIndex = useCallback((elements: string[], _index: number): void => {\n setSteps(elements)\n }, [])\n\n useEffect(() => {\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])\n\n useEffect(() => {\n if (stepFromParent !== undefined) {\n rebuildStepsFromParent()\n }\n return () => {\n rebuildStepsFromParent()\n }\n }, [])\n\n const registerField = useCallback(\n (element: string): void => {\n setSteps((prevSteps) => {\n return [...prevSteps, element]\n })\n },\n [steps],\n )\n\n const registerStep = useCallback(\n (elements: string[], stepRef: React.RefObject<number | undefined>, step?: number): void => {\n setSteps((prevSteps) => {\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 { 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 { 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, ...rest }: ControllerProps<TFieldValues, TName>) {\n const stepContext = useStep()\n\n useEffect(() => {\n if (stepContext && stepContext?.registrationKey !== 0) {\n stepContext.registerField(name)\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} {...rest} />\n}\n\nController.displayName = 'Controller'\n\nexport { Controller }\nexport type { ControllerProps, ControllerRenderArgs }\n","import { useEffect } from 'react'\nimport {\n type Control,\n type FieldPath,\n type FieldValues,\n type UseControllerProps,\n type UseControllerReturn,\n useController as useRHFController,\n} from 'react-hook-form'\n\nimport { useStep } from './step'\n\nfunction useController<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>(props: UseControllerProps<TFieldValues, TName>): UseControllerReturn<TFieldValues, TName> {\n const stepContext = useStep()\n\n useEffect(() => {\n if (stepContext && stepContext?.registrationKey !== 0) {\n stepContext.registerField(props.name)\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 useRHFController({ ...props })\n}\n\nexport { useController }\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/helper.ts","../src/stepper.tsx","../src/step.tsx","../src/controller.tsx","../src/use-controller.tsx"],"names":["prev","createContext","useContext","useRef","useState","useCallback","useMemo","jsx","useEffect","RHFController","useRHFController"],"mappings":"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","file":"index.mjs","sourcesContent":["function buildNestedValues(\n fields: string[],\n values: unknown[],\n): 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 generateGUID() {\n function s4() {\n return Math.floor((1 + Math.random()) * 0x10000)\n .toString(16)\n .substring(1);\n }\n return (\n s4() +\n s4() +\n \"-\" +\n s4() +\n \"-\" +\n s4() +\n \"-\" +\n s4() +\n \"-\" +\n s4() +\n s4() +\n s4()\n );\n}\n\nexport { buildNestedValues, generateGUID };\n","import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n type FieldValues,\n Path,\n useFormContext,\n type UseFormReturn,\n} from \"react-hook-form\";\n\nimport { buildNestedValues, generateGUID } from \"./helper\";\nimport { type StepValidationMode, type MaybePromise } from \"./types\";\n\ntype StepperContextValue<TFieldValues extends FieldValues = FieldValues> = {\n activeStep: number;\n jumpTo: (\n step: number,\n onLeave?: (values: Partial<TFieldValues>) => MaybePromise<void>,\n ) => Promise<boolean>;\n fields: string[] | null;\n validSteps: number[];\n isFirstStep: boolean;\n isLastStep: boolean;\n next: (\n onLeave?: ((values: Partial<TFieldValues>) => MaybePromise<void>) | unknown,\n ) => Promise<boolean>;\n prev: (\n onLeave?: ((values: Partial<TFieldValues>) => MaybePromise<void>) | unknown,\n ) => Promise<boolean>;\n};\n\ntype InternalStepperContextValue = {\n step?: string;\n registrationKey: number;\n rebuildSteps: () => void;\n registerStepOrder: (id: string) => void;\n registerStep: (elements: string[], id: string) => void;\n};\n\nconst StepperContext = createContext<StepperContextValue | null>(null);\nconst InternalStepperContext =\n createContext<InternalStepperContextValue | null>(null);\n\nfunction useInternalStepperContext(): InternalStepperContextValue {\n const context = useContext(InternalStepperContext);\n if (!context) {\n throw new Error('<Step> must be used within a <Stepper>')\n }\n return context as unknown as InternalStepperContextValue;\n}\n\ninterface StepperProps<TFieldValues extends FieldValues = FieldValues> {\n form?: UseFormReturn<TFieldValues>;\n stepValidationMode?: StepValidationMode;\n children:\n | React.ReactNode\n | ((context: StepperContextValue<TFieldValues>) => React.ReactNode);\n}\n\nfunction Stepper<TFieldValues extends FieldValues = FieldValues>({\n form: formProps,\n stepValidationMode = \"forward\",\n children,\n}: StepperProps<TFieldValues>) {\n const formContext = useFormContext();\n\n const form = formProps ?? (formContext as UseFormReturn<TFieldValues>);\n const [steps, setSteps] = useState<Record<string, string[]>>({});\n const [stepOrder, setStepOrder] = useState<string[]>([]);\n const [activeStep, setActiveStep] = useState(-1);\n const [validSteps, setValidSteps] = useState<number[]>([]);\n const [registrationKey, setRegistrationKey] = useState(0);\n\n const stepRef = useRef<string | undefined>(undefined);\n\n const fields = useMemo<string[] | null>(() => {\n if (activeStep === -1 || !steps[stepOrder[activeStep]]) return null;\n return Array.from(new Set(steps[stepOrder[activeStep]]));\n }, [steps, stepOrder, activeStep]);\n\n const jumpTo = useCallback(\n async (\n step: number,\n onLeave?: (values: Partial<TFieldValues>) => MaybePromise<void>,\n ): Promise<boolean> => {\n if (activeStep !== -1 && fields && stepValidationMode !== \"none\") {\n const isForward = step > activeStep;\n const shouldValidate =\n stepValidationMode === \"all\" ||\n (stepValidationMode === \"forward\" && isForward);\n if (shouldValidate) {\n const isValid = await form.trigger(fields as Path<TFieldValues>[]);\n if (!isValid) {\n setValidSteps((prev) => prev.filter((s) => s !== activeStep));\n return false;\n }\n setValidSteps((prev) => [...new Set([...prev, activeStep])]);\n }\n }\n if (onLeave && fields) {\n const watchedValues = form.watch(fields as Path<TFieldValues>[]);\n const values = buildNestedValues(\n fields,\n watchedValues,\n ) as Partial<TFieldValues>;\n await onLeave(values);\n }\n setActiveStep(step);\n return true;\n },\n [activeStep, fields, form, stepValidationMode],\n );\n\n const isFirstStep = useMemo(\n () => activeStep === -1 || activeStep === 0,\n [activeStep],\n );\n\n const isLastStep = useMemo(\n () => activeStep === -1 || activeStep === stepOrder.length - 1,\n [activeStep, stepOrder.length],\n );\n\n const next = useCallback(\n async (\n onLeave?:\n | ((values: Partial<TFieldValues>) => MaybePromise<void>)\n | unknown,\n ): Promise<boolean> => {\n const callback =\n typeof onLeave === \"function\"\n ? (onLeave as (values: Partial<TFieldValues>) => MaybePromise<void>)\n : undefined;\n if (activeStep === -1 || activeStep >= stepOrder.length - 1) return false;\n if (fields && stepValidationMode !== \"none\") {\n const isValid = await form.trigger(fields as Path<TFieldValues>[]);\n if (!isValid) {\n setValidSteps((prev) => prev.filter((s) => s !== activeStep));\n return false;\n }\n setValidSteps((prev) => [...new Set([...prev, activeStep])]);\n }\n if (callback && fields) {\n const watchedValues = form.watch(fields as Path<TFieldValues>[]);\n const values = buildNestedValues(\n fields,\n watchedValues,\n ) as Partial<TFieldValues>;\n await callback(values);\n }\n setActiveStep(activeStep + 1);\n return true;\n },\n [stepOrder.length, activeStep, fields, form, stepValidationMode],\n );\n\n const prev = useCallback(\n async (\n onLeave?:\n | ((values: Partial<TFieldValues>) => MaybePromise<void>)\n | unknown,\n ): Promise<boolean> => {\n const callback =\n typeof onLeave === \"function\"\n ? (onLeave as (values: Partial<TFieldValues>) => MaybePromise<void>)\n : undefined;\n if (activeStep === -1 || activeStep <= 0) return false;\n if (fields && stepValidationMode === \"all\") {\n const isValid = await form.trigger(fields as Path<TFieldValues>[]);\n if (!isValid) {\n setValidSteps((prev) => prev.filter((s) => s !== activeStep));\n return false;\n }\n setValidSteps((prev) => [...new Set([...prev, activeStep])]);\n }\n if (callback && fields) {\n const watchedValues = form.watch(fields as Path<TFieldValues>[]);\n const values = buildNestedValues(\n fields,\n watchedValues,\n ) as Partial<TFieldValues>;\n await callback(values);\n }\n setActiveStep(activeStep - 1);\n return true;\n },\n [activeStep, fields, form, stepValidationMode],\n );\n\n const registerStep = useCallback(\n (elements: string[], id: string): void => {\n setSteps((prevSteps) => {\n stepRef.current = id;\n const newSteps = { ...prevSteps };\n newSteps[id] = elements;\n\n if (activeStep === -1 && Object.keys(newSteps).length > 0) {\n setActiveStep(0);\n }\n\n return newSteps;\n });\n },\n [activeStep],\n );\n\n const registerStepOrder = useCallback(\n (id: string): void => {\n setStepOrder((prevSteps) => {\n return Array.from(new Set([...prevSteps, id]));\n });\n },\n [activeStep],\n );\n\n const rebuildSteps = useCallback(() => {\n setStepOrder([]);\n setRegistrationKey((prev) => prev + 1);\n }, []);\n\n\n const publicContextValue = useMemo<StepperContextValue>(\n () => ({\n activeStep,\n jumpTo,\n fields,\n validSteps,\n isFirstStep,\n isLastStep,\n next,\n prev,\n }),\n [\n activeStep,\n jumpTo,\n fields,\n validSteps,\n isFirstStep,\n isLastStep,\n next,\n prev,\n ],\n );\n\n const internalContextValue = useMemo<InternalStepperContextValue>(\n () => ({\n // eslint-disable-next-line react-hooks/refs\n step: stepRef.current,\n registrationKey,\n rebuildSteps,\n registerStepOrder,\n registerStep,\n }),\n [\n registrationKey,\n rebuildSteps,\n registerStepOrder,\n registerStep,\n ],\n );\n\n const resolvedChildren =\n // eslint-disable-next-line react-hooks/refs\n typeof children === \"function\"\n ? children(\n publicContextValue as unknown as StepperContextValue<TFieldValues>,\n )\n : children;\n\n return (\n // eslint-disable-next-line react-hooks/refs\n <StepperContext.Provider value={publicContextValue}>\n <InternalStepperContext.Provider value={internalContextValue}>\n {resolvedChildren}\n </InternalStepperContext.Provider>\n </StepperContext.Provider>\n );\n}\n\nfunction useStepper<\n TFieldValues extends FieldValues = FieldValues,\n>(): StepperContextValue<TFieldValues> {\n const context = useContext(StepperContext);\n return context as unknown as StepperContextValue<TFieldValues>;\n}\n\nexport {\n Stepper,\n StepperContext,\n InternalStepperContext,\n useInternalStepperContext,\n useStepper,\n};\nexport type { StepperProps, StepperContextValue, InternalStepperContextValue };\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { useInternalStepperContext } from \"./stepper\";\nimport { generateGUID } from \"./helper\";\n\ntype StepContextValue = {\n step?: string;\n registrationKey: number;\n registerField: (elements: string) => void;\n rebuildSteps: () => 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 formContext = useInternalStepperContext();\n\n const {\n registerStep: registerStepFromParent,\n step: stepFromParent,\n rebuildSteps: rebuildStepsFromParent,\n registerStepOrder,\n registrationKey: registrationKeyFromParent,\n } = formContext;\n\n const stepRef = useRef<string | undefined>(undefined);\n\n const [id] = useState(generateGUID());\n const [steps, setSteps] = useState<string[]>([]);\n\n const [registrationKey, setRegistrationKey] = useState(0);\n\n useEffect(() => {\n const stepList = steps.length ? steps : [\"\"];\n registerStepFromParent(stepList, id);\n registerStepOrder(id);\n }, [steps]);\n\n useEffect(() => {\n if (registrationKeyFromParent) {\n registerStepOrder(id);\n }\n }, [registrationKeyFromParent]);\n\n useEffect(() => {\n if (stepFromParent !== undefined) {\n rebuildStepsFromParent();\n }\n return () => {\n rebuildStepsFromParent();\n };\n }, []);\n\n const registerField = useCallback(\n (element: string): void => {\n setSteps((prevSteps) => {\n return Array.from(new Set([...prevSteps, element]));\n });\n },\n [steps],\n );\n\n const rebuildSteps = useCallback(() => {\n stepRef.current = undefined;\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 registerField,\n rebuildSteps,\n }),\n [registrationKey, registerField, rebuildSteps],\n );\n\n // eslint-disable-next-line react-hooks/refs\n return (\n <StepContext.Provider value={contextValue}>{children}</StepContext.Provider>\n );\n}\n\nStep.displayName = \"Step\";\n\nexport { Step, useStep };\nexport type { StepContextValue };\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 { 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, ...rest }: ControllerProps<TFieldValues, TName>) {\n const stepContext = useStep();\n\n useEffect(() => {\n if (stepContext) {\n stepContext.registerField(name);\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} {...rest} />;\n}\n\nController.displayName = \"Controller\";\n\nexport { Controller };\nexport type { ControllerProps, ControllerRenderArgs };\n","import { useEffect } from \"react\";\nimport {\n type Control,\n type FieldPath,\n type FieldValues,\n type UseControllerProps,\n type UseControllerReturn,\n useController as useRHFController,\n} from \"react-hook-form\";\n\nimport { useStep } from \"./step\";\n\nfunction useController<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>(\n props: UseControllerProps<TFieldValues, TName>,\n): UseControllerReturn<TFieldValues, TName> {\n const stepContext = useStep();\n\n useEffect(() => {\n if (stepContext) {\n stepContext.registerField(props.name);\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 useRHFController({ ...props });\n}\n\nexport { useController };\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rhf-stepper",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "A multi-step form helper for react-hook-form",
|
|
3
|
+
"version": "1.0.2",
|
|
4
|
+
"description": "A headless multi-step form helper for react-hook-form",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
7
7
|
"types": "./dist/index.d.ts",
|