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 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 = 'all' | 'forward' | 'none';
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 = 'all' | 'forward' | 'none';
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("useInternalStepperContext must be used within a <Stepper>");
39
+ throw new Error("<Step> must be used within a <Stepper>");
34
40
  }
35
41
  return context;
36
42
  }
37
- function Stepper({ form: formProps, stepValidationMode = "forward", children }) {
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(fields, watchedValues);
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 === steps.length - 1,
79
- [activeStep, steps.length]
92
+ () => activeStep === -1 || activeStep === stepOrder.length - 1,
93
+ [activeStep, stepOrder.length]
80
94
  );
81
- const next = react.useCallback(async (onLeave) => {
82
- const callback = typeof onLeave === "function" ? onLeave : void 0;
83
- if (activeStep === -1 || activeStep >= steps.length - 1) return false;
84
- if (fields && stepValidationMode !== "none") {
85
- const isValid = await form.trigger(fields);
86
- if (!isValid) {
87
- setValidSteps((prev2) => prev2.filter((s) => s !== activeStep));
88
- return false;
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
- setValidSteps((prev2) => [.../* @__PURE__ */ new Set([...prev2, activeStep])]);
91
- }
92
- if (callback && fields) {
93
- const watchedValues = form.watch(fields);
94
- const values = buildNestedValues(fields, watchedValues);
95
- await callback(values);
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
- setValidSteps((prev2) => [.../* @__PURE__ */ new Set([...prev2, activeStep])]);
110
- }
111
- if (callback && fields) {
112
- const watchedValues = form.watch(fields);
113
- const values = buildNestedValues(fields, watchedValues);
114
- await callback(values);
115
- }
116
- setActiveStep(activeStep - 1);
117
- return true;
118
- }, [activeStep, fields, form, stepValidationMode]);
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, stepRef2, step) => {
146
+ (elements, id) => {
121
147
  setSteps((prevSteps) => {
122
- const stepNumber = step != null ? step : prevSteps.length;
123
- stepRef2.current = stepNumber;
124
- const newSteps = [...prevSteps];
125
- newSteps.splice(stepNumber, 0, elements);
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
- setSteps([]);
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
- registerStep,
174
- changeStepAtIndex
199
+ registerStepOrder,
200
+ registerStep
175
201
  }),
176
- [registrationKey, rebuildSteps, registerStep, changeStepAtIndex]
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(publicContextValue) : 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
- changeStepAtIndex: changeStepAtIndexFromParent,
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
- if (stepRef.current !== void 0) {
213
- changeStepAtIndexFromParent(stepList, stepRef.current);
214
- } else {
215
- registerStepFromParent(stepList, stepRef);
243
+ registerStepFromParent(stepList, id);
244
+ registerStepOrder(id);
245
+ }, [steps]);
246
+ react.useEffect(() => {
247
+ if (registrationKeyFromParent) {
248
+ registerStepOrder(id);
216
249
  }
217
- }, [registrationKeyFromParent, steps]);
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, changeStepAtIndex, registerField, registerStep, rebuildSteps]
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 && (stepContext == null ? void 0 : stepContext.registrationKey) !== 0) {
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 && (stepContext == null ? void 0 : stepContext.registrationKey) !== 0) {
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("useInternalStepperContext must be used within a <Stepper>");
37
+ throw new Error("<Step> must be used within a <Stepper>");
32
38
  }
33
39
  return context;
34
40
  }
35
- function Stepper({ form: formProps, stepValidationMode = "forward", children }) {
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(fields, watchedValues);
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 === steps.length - 1,
77
- [activeStep, steps.length]
90
+ () => activeStep === -1 || activeStep === stepOrder.length - 1,
91
+ [activeStep, stepOrder.length]
78
92
  );
79
- const next = useCallback(async (onLeave) => {
80
- const callback = typeof onLeave === "function" ? onLeave : void 0;
81
- if (activeStep === -1 || activeStep >= steps.length - 1) return false;
82
- if (fields && stepValidationMode !== "none") {
83
- const isValid = await form.trigger(fields);
84
- if (!isValid) {
85
- setValidSteps((prev2) => prev2.filter((s) => s !== activeStep));
86
- return false;
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
- setValidSteps((prev2) => [.../* @__PURE__ */ new Set([...prev2, activeStep])]);
89
- }
90
- if (callback && fields) {
91
- const watchedValues = form.watch(fields);
92
- const values = buildNestedValues(fields, watchedValues);
93
- await callback(values);
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
- setValidSteps((prev2) => [.../* @__PURE__ */ new Set([...prev2, activeStep])]);
108
- }
109
- if (callback && fields) {
110
- const watchedValues = form.watch(fields);
111
- const values = buildNestedValues(fields, watchedValues);
112
- await callback(values);
113
- }
114
- setActiveStep(activeStep - 1);
115
- return true;
116
- }, [activeStep, fields, form, stepValidationMode]);
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, stepRef2, step) => {
144
+ (elements, id) => {
119
145
  setSteps((prevSteps) => {
120
- const stepNumber = step != null ? step : prevSteps.length;
121
- stepRef2.current = stepNumber;
122
- const newSteps = [...prevSteps];
123
- newSteps.splice(stepNumber, 0, elements);
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
- setSteps([]);
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
- registerStep,
172
- changeStepAtIndex
197
+ registerStepOrder,
198
+ registerStep
173
199
  }),
174
- [registrationKey, rebuildSteps, registerStep, changeStepAtIndex]
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(publicContextValue) : 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
- changeStepAtIndex: changeStepAtIndexFromParent,
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
- if (stepRef.current !== void 0) {
211
- changeStepAtIndexFromParent(stepList, stepRef.current);
212
- } else {
213
- registerStepFromParent(stepList, stepRef);
241
+ registerStepFromParent(stepList, id);
242
+ registerStepOrder(id);
243
+ }, [steps]);
244
+ useEffect(() => {
245
+ if (registrationKeyFromParent) {
246
+ registerStepOrder(id);
214
247
  }
215
- }, [registrationKeyFromParent, steps]);
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, changeStepAtIndex, registerField, registerStep, rebuildSteps]
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 && (stepContext == null ? void 0 : stepContext.registrationKey) !== 0) {
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 && (stepContext == null ? void 0 : stepContext.registrationKey) !== 0) {
304
+ if (stepContext) {
285
305
  stepContext.registerField(props.name);
286
306
  }
287
307
  }, [stepContext == null ? void 0 : stepContext.registrationKey]);
@@ -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.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",