react-form-manage 1.0.8-beta.14 → 1.0.8-beta.16

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.
@@ -295,6 +295,14 @@ function useFormItemControl({ formName, form, name, initialValue, formItemId, ru
295
295
  onReset
296
296
  });
297
297
  }
298
+ return () => {
299
+ if (listener) {
300
+ setCleanUpStack({
301
+ name: listener.name,
302
+ itemKey: listener.formItemId
303
+ });
304
+ }
305
+ };
298
306
  }, []);
299
307
  useEffect(() => {
300
308
  if (listener) {
@@ -317,13 +325,6 @@ function useFormItemControl({ formName, form, name, initialValue, formItemId, ru
317
325
  onChange(getNewDataFromCache);
318
326
  }
319
327
  }, [name, formName || (form == null ? void 0 : form.formName) || (contextForm == null ? void 0 : contextForm.formName)]);
320
- useEffect(() => {
321
- return () => {
322
- setCleanUpStack({
323
- itemKey: formItemId
324
- });
325
- };
326
- }, []);
327
328
  useEffect(() => {
328
329
  }, [submitState]);
329
330
  return {
@@ -22,9 +22,6 @@ declare namespace Form {
22
22
  var useSubmitDataWatch: typeof import("./Form").useSubmitDataWatch;
23
23
  var useFormStateWatch: <T = any>(formNameOrFormInstance?: string | PublicFormInstance<T>) => any;
24
24
  var useFormItemStateWatch: <T = any>(nameOrFormItemId: string, formNameOrFormInstance?: string | PublicFormInstance<T>) => UseFormItemStateWatchReturn;
25
- var useWatchFormListeners: <T = any>(formNameOrFormInstance?: string | PublicFormInstance<T>) => {
26
- listeners: import("../stores/formStore").ListenerItem[];
27
- };
28
25
  }
29
26
  export default Form;
30
27
  export declare function useFormContext(): any;
@@ -37,6 +34,3 @@ export declare function useSubmitDataWatch<T = any>({ formNameOrFormInstance, tr
37
34
  }): T | undefined;
38
35
  export declare const useFormStateWatch: <T = any>(formNameOrFormInstance?: string | PublicFormInstance<T>) => any;
39
36
  export declare const useFormItemStateWatch: <T = any>(nameOrFormItemId: string, formNameOrFormInstance?: string | PublicFormInstance<T>) => UseFormItemStateWatchReturn;
40
- export declare const useWatchFormListeners: <T = any>(formNameOrFormInstance?: string | PublicFormInstance<T>) => {
41
- listeners: import("../stores/formStore").ListenerItem[];
42
- };
@@ -311,22 +311,11 @@ const useFormItemStateWatch = (nameOrFormItemId, formNameOrFormInstance) => {
311
311
  errors: (listener == null ? void 0 : listener.internalErrors) || []
312
312
  };
313
313
  };
314
- const useWatchFormListeners = (formNameOrFormInstance) => {
315
- const [formInstance] = useForm(formNameOrFormInstance);
316
- const listeners = useFormStore(useShallow((state) => {
317
- const allListeners = state.listeners;
318
- return {
319
- listeners: allListeners.filter((l) => !isNil(formNameOrFormInstance) ? true : l.formName === (formInstance == null ? void 0 : formInstance.formName))
320
- };
321
- }));
322
- return listeners;
323
- };
324
314
  Form.useForm = useForm;
325
315
  Form.useWatch = useWatch;
326
316
  Form.useSubmitDataWatch = useSubmitDataWatch;
327
317
  Form.useFormStateWatch = useFormStateWatch;
328
318
  Form.useFormItemStateWatch = useFormItemStateWatch;
329
- Form.useWatchFormListeners = useWatchFormListeners;
330
319
  export {
331
320
  FormContext,
332
321
  Form as default,
@@ -335,6 +324,5 @@ export {
335
324
  useFormItemStateWatch,
336
325
  useFormStateWatch,
337
326
  useSubmitDataWatch,
338
- useWatch,
339
- useWatchFormListeners
327
+ useWatch
340
328
  };
@@ -237,17 +237,19 @@ const createListenersSlice = (storeSet, storeGet, api) => ({
237
237
  }
238
238
  return;
239
239
  }
240
- storeListeners.push({
241
- name,
242
- formName,
243
- isTouched: Boolean(isTouched),
244
- isDirty: Boolean(isDirty),
245
- formItemId,
246
- internalErrors,
247
- onChange,
248
- onReset,
249
- isInitied: Boolean(isInitied)
250
- });
240
+ if (name && formName) {
241
+ storeListeners.push({
242
+ name,
243
+ formName,
244
+ isTouched: Boolean(isTouched),
245
+ isDirty: Boolean(isDirty),
246
+ formItemId,
247
+ internalErrors,
248
+ onChange,
249
+ onReset,
250
+ isInitied: Boolean(isInitied)
251
+ });
252
+ }
251
253
  }));
252
254
  },
253
255
  revokeListener(formItemId, onAfterRevoke) {
@@ -0,0 +1,3 @@
1
+ type Props = {};
2
+ declare function TestListener({}: Props): import("react/jsx-runtime").JSX.Element;
3
+ export default TestListener;
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cloneDeep } from "lodash";
3
+ import { useEffect } from "react";
4
+ import { useShallow } from "zustand/react/shallow";
5
+ import { useFormStore } from "../stores/formStore";
6
+ function TestListener({}) {
7
+ const { listeners } = useFormStore(useShallow((state) => ({
8
+ listeners: state.listeners
9
+ })));
10
+ useEffect(() => {
11
+ }, [listeners]);
12
+ return _jsx("div", { children: "TestListener" });
13
+ }
14
+ var stdin_default = TestListener;
15
+ export {
16
+ stdin_default as default
17
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-form-manage",
3
- "version": "1.0.8-beta.14",
3
+ "version": "1.0.8-beta.16",
4
4
  "description": "Lightweight React form management with list and listener support.",
5
5
  "license": "MIT",
6
6
  "type": "module",
package/src/App.tsx CHANGED
@@ -1,4 +1,4 @@
1
- import { Checkbox, Dialog, DialogContent, TextField } from "@mui/material";
1
+ import { Checkbox } from "@mui/material";
2
2
  import { Button, Input } from "antd";
3
3
  import { motion } from "framer-motion";
4
4
  import { useEffect } from "react";
@@ -8,7 +8,6 @@ import InputWrapper from "./components/Form/InputWrapper";
8
8
  import Form, { useForm } from "./providers/Form";
9
9
 
10
10
  import { Form as AntdForm } from "antd";
11
- import { useToggle } from "minh-custom-hooks-release";
12
11
 
13
12
  function TestFormWatch() {
14
13
  const watchValue = Form.useWatch("numericCode");
@@ -16,37 +15,9 @@ function TestFormWatch() {
16
15
  return <div>TestFormWatch</div>;
17
16
  }
18
17
 
19
- function TestMuiDialog({
20
- open,
21
- onClose,
22
- }: {
23
- open: boolean;
24
- onClose: () => void;
25
- }) {
26
- return (
27
- <Dialog open={open} onClose={onClose}>
28
- <DialogContent>
29
- {" "}
30
- <Form
31
- onFinish={(values) => {
32
- console.log("Mui Dialog Form Values: ", values);
33
- }}
34
- formName="ADD_FORM"
35
- >
36
- <FormItem name="oooo">
37
- <TextField />
38
- </FormItem>
39
-
40
- <Button htmlType="submit">Submit</Button>
41
- </Form>
42
- </DialogContent>
43
- </Dialog>
44
- );
45
- }
46
-
47
18
  const App = () => {
48
19
  const [form] = useForm("form1");
49
- const { state: open, toggle } = useToggle(false);
20
+
50
21
  const watchCheckBox = Form.useWatch("checkControlledAfterInit", "form1");
51
22
 
52
23
  useEffect(() => {
@@ -209,9 +180,6 @@ const App = () => {
209
180
  Reset
210
181
  </Button>
211
182
  </Form>
212
-
213
- <Button onClick={toggle}>Toggle Dialog</Button>
214
- <TestMuiDialog onClose={toggle} open={open} />
215
183
  </div>
216
184
  );
217
185
  };
@@ -64,7 +64,6 @@ export default function FormItem({
64
64
  // controlAfterInit,
65
65
  // });
66
66
  // }, [isInitied]);
67
-
68
67
  return (
69
68
  <Fragment
70
69
  key={`control-after-init-${Boolean(controlAfterInit && isInitied) ? "1" : "0"}-${formItemId}`}
@@ -561,6 +561,15 @@ export default function useFormItemControl<T = any>({
561
561
  });
562
562
  }
563
563
 
564
+ return () => {
565
+ if (listener) {
566
+ setCleanUpStack({
567
+ name: listener.name,
568
+ itemKey: listener.formItemId,
569
+ });
570
+ }
571
+ };
572
+
564
573
  // return () => {
565
574
  // console.log("Revoke listener", listener);
566
575
 
@@ -596,14 +605,6 @@ export default function useFormItemControl<T = any>({
596
605
  }
597
606
  }, [name, formName || form?.formName || contextForm?.formName]);
598
607
 
599
- useEffect(() => {
600
- return () => {
601
- setCleanUpStack({
602
- itemKey: formItemId,
603
- });
604
- };
605
- }, []);
606
-
607
608
  useEffect(() => {
608
609
  console.log("Submit state changed in useFormItemControl: ", submitState);
609
610
  }, [submitState]);
package/src/index.ts CHANGED
@@ -18,12 +18,11 @@ import InputWrapper, { type InputWrapperProps } from "./components/Form/InputWra
18
18
 
19
19
  import useFormItemControl from "./hooks/useFormItemControl";
20
20
  import useFormListControl from "./hooks/useFormListControl";
21
-
22
- import {
23
- useFormStore,
24
- type FormInstance,
25
- type ListenerItem,
26
- type CleanUpItem
21
+ import {
22
+ useFormStore,
23
+ type FormInstance,
24
+ type ListenerItem,
25
+ type CleanUpItem,
27
26
  } from "./stores/formStore";
28
27
 
29
28
  export {
@@ -509,30 +509,8 @@ export const useFormItemStateWatch = <T = any,>(
509
509
  };
510
510
  };
511
511
 
512
- export const useWatchFormListeners = <T = any,>(
513
- formNameOrFormInstance?: string | PublicFormInstance<T>,
514
- ) => {
515
- const [formInstance] = useForm<T>(formNameOrFormInstance as any);
516
-
517
- const listeners = useFormStore(
518
- useShallow((state) => {
519
- const allListeners = state.listeners;
520
- return {
521
- listeners: allListeners.filter((l) =>
522
- !isNil(formNameOrFormInstance)
523
- ? true
524
- : l.formName === formInstance?.formName,
525
- ),
526
- };
527
- }),
528
- );
529
-
530
- return listeners;
531
- };
532
-
533
512
  Form.useForm = useForm;
534
513
  Form.useWatch = useWatch;
535
514
  Form.useSubmitDataWatch = useSubmitDataWatch;
536
515
  Form.useFormStateWatch = useFormStateWatch;
537
516
  Form.useFormItemStateWatch = useFormItemStateWatch;
538
- Form.useWatchFormListeners = useWatchFormListeners;
@@ -51,8 +51,6 @@ interface FormStoreState {
51
51
  // methods (loose typed for incremental migration)
52
52
  [key: string]: any;
53
53
  }
54
-
55
- // Combined store containing all form-related state
56
54
  // Form Store Slice
57
55
  const createFormStoreSlice = (storeSet: any, storeGet: any, api: any) => ({
58
56
  forms: {},
@@ -61,310 +59,310 @@ const createFormStoreSlice = (storeSet: any, storeGet: any, api: any) => ({
61
59
  cacheData: {},
62
60
  formInstances: [],
63
61
  submitHistory: {},
64
- setData(formName, name, value) {
65
- return storeSet(
66
- produce<any>((state: any) => {
67
- const oldValues = state.forms;
68
- set(oldValues, `${formName}.${name}`, value);
69
- }),
70
- );
71
- },
72
-
73
- getCacheData(formName) {
74
- return get(storeGet(), `cacheData.${formName}`);
75
- },
76
-
77
- setCacheData(formName, name, value) {
78
- return storeSet(
79
- produce<any>((state: any) => {
80
- const oldValues = state.cacheData;
81
- set(oldValues, `${formName}.${name}`, value);
82
- }),
83
- );
84
- },
85
-
86
- clearCacheData(formName) {
87
- return storeSet(
88
- produce<any>((state: any) => {
89
- const oldValues = state.cacheData;
90
-
91
- if (formName) {
92
- set(oldValues, formName, {});
93
- } else {
94
- set(oldValues, "", {});
95
- }
96
- }),
97
- );
98
- },
62
+ setData(formName, name, value) {
63
+ return storeSet(
64
+ produce<any>((state: any) => {
65
+ const oldValues = state.forms;
66
+ set(oldValues, `${formName}.${name}`, value);
67
+ }),
68
+ );
69
+ },
70
+
71
+ getCacheData(formName) {
72
+ return get(storeGet(), `cacheData.${formName}`);
73
+ },
74
+
75
+ setCacheData(formName, name, value) {
76
+ return storeSet(
77
+ produce<any>((state: any) => {
78
+ const oldValues = state.cacheData;
79
+ set(oldValues, `${formName}.${name}`, value);
80
+ }),
81
+ );
82
+ },
83
+
84
+ clearCacheData(formName) {
85
+ return storeSet(
86
+ produce<any>((state: any) => {
87
+ const oldValues = state.cacheData;
99
88
 
100
- getFormItemValue(formName, name) {
101
- return get(storeGet().forms?.[formName], name);
102
- },
89
+ if (formName) {
90
+ set(oldValues, formName, {});
91
+ } else {
92
+ set(oldValues, "", {});
93
+ }
94
+ }),
95
+ );
96
+ },
103
97
 
104
- getFormValues(formName) {
105
- return storeGet().forms?.[formName];
106
- },
98
+ getFormItemValue(formName, name) {
99
+ return get(storeGet().forms?.[formName], name);
100
+ },
107
101
 
108
- clearFormValues(formName) {
109
- return storeSet(
110
- produce<any>((state: any) => {
111
- const oldValues = state.forms;
102
+ getFormValues(formName) {
103
+ return storeGet().forms?.[formName];
104
+ },
112
105
 
113
- // console.log("Clear form values", formName);
106
+ clearFormValues(formName) {
107
+ return storeSet(
108
+ produce<any>((state: any) => {
109
+ const oldValues = state.forms;
110
+
111
+ // console.log("Clear form values", formName);
112
+
113
+ unset(oldValues, formName);
114
+
115
+ // console.log(JSON.parse(JSON.stringify(oldValues)));
116
+ }),
117
+ );
118
+ },
119
+
120
+ clearFormInitialValues(formName) {
121
+ return storeSet(
122
+ produce<any>((state: any) => {
123
+ const oldValues = state.initialValues;
114
124
 
115
- unset(oldValues, formName);
125
+ // console.log("Clear form initial values", formName);
116
126
 
117
- // console.log(JSON.parse(JSON.stringify(oldValues)));
118
- }),
119
- );
120
- },
127
+ unset(oldValues, formName);
121
128
 
122
- clearFormInitialValues(formName) {
123
- return storeSet(
124
- produce<any>((state: any) => {
125
- const oldValues = state.initialValues;
129
+ // console.log(JSON.parse(JSON.stringify(oldValues)));
130
+ }),
131
+ );
132
+ },
126
133
 
127
- // console.log("Clear form initial values", formName);
134
+ clearObjKeyItem(formName, name) {
135
+ return storeSet(
136
+ produce<any>((state: any) => {
137
+ const oldValues = state.forms;
128
138
 
129
- unset(oldValues, formName);
139
+ // console.log("Clear item value", formName, name);
130
140
 
131
- // console.log(JSON.parse(JSON.stringify(oldValues)));
132
- }),
133
- );
134
- },
141
+ unset(oldValues, `${formName}.${name}`);
135
142
 
136
- clearObjKeyItem(formName, name) {
137
- return storeSet(
138
- produce<any>((state: any) => {
139
- const oldValues = state.forms;
143
+ // console.log(JSON.parse(JSON.stringify(oldValues)));
144
+ }),
145
+ );
146
+ },
147
+ clearArrItem(formName, name) {
148
+ return storeSet(
149
+ produce<any>((state: any) => {
150
+ const oldValues = state.forms;
140
151
 
141
- // console.log("Clear item value", formName, name);
152
+ console.log("Clear item array value", formName, name);
142
153
 
143
- unset(oldValues, `${formName}.${name}`);
154
+ const arrPath = name.split(".").slice(0, -1).join(".");
144
155
 
145
- // console.log(JSON.parse(JSON.stringify(oldValues)));
146
- }),
147
- );
148
- },
149
- clearArrItem(formName, name) {
150
- return storeSet(
151
- produce<any>((state: any) => {
152
- const oldValues = state.forms;
156
+ const elPath = Number(name.split(".").slice(-1).join(""));
153
157
 
154
- console.log("Clear item array value", formName, name);
158
+ const getArrItem = get(oldValues, `${formName}.${arrPath}`);
155
159
 
156
- const arrPath = name.split(".").slice(0, -1).join(".");
160
+ if (isNumber(elPath)) {
161
+ getArrItem.splice(elPath, 1);
162
+ }
157
163
 
158
- const elPath = Number(name.split(".").slice(-1).join(""));
164
+ // console.log(JSON.parse(JSON.stringify(oldValues)));
165
+ }),
166
+ );
167
+ },
159
168
 
160
- const getArrItem = get(oldValues, `${formName}.${arrPath}`);
169
+ setFormState({ formName, isInitied, submitState }) {
170
+ return storeSet(
171
+ produce<any>((state: any) => {
172
+ const oldValues = state.formStates;
173
+ const getFormState = get(storeGet().formStates, formName);
161
174
 
162
- if (isNumber(elPath)) {
163
- getArrItem.splice(elPath, 1);
175
+ if (isNil(getFormState)) {
176
+ set(oldValues, formName, { isInitied, submitState });
177
+ } else {
178
+ if (!isNil(isInitied)) {
179
+ set(oldValues, `${formName}.isInitied`, isInitied);
164
180
  }
165
181
 
166
- // console.log(JSON.parse(JSON.stringify(oldValues)));
167
- }),
168
- );
169
- },
170
-
171
- setFormState({ formName, isInitied, submitState }) {
172
- return storeSet(
173
- produce<any>((state: any) => {
174
- const oldValues = state.formStates;
175
- const getFormState = get(storeGet().formStates, formName);
176
-
177
- if (isNil(getFormState)) {
178
- set(oldValues, formName, { isInitied, submitState });
179
- } else {
180
- if (!isNil(isInitied)) {
181
- set(oldValues, `${formName}.isInitied`, isInitied);
182
- }
183
-
184
- if (!isNil(submitState)) {
185
- set(oldValues, `${formName}.submitState`, submitState);
186
- }
182
+ if (!isNil(submitState)) {
183
+ set(oldValues, `${formName}.submitState`, submitState);
187
184
  }
188
- }),
189
- );
190
- },
185
+ }
186
+ }),
187
+ );
188
+ },
191
189
 
192
- clearFormState(formName) {
193
- return storeSet(
194
- produce<any>((state: any) => {
195
- const oldValues = state.formStates;
190
+ clearFormState(formName) {
191
+ return storeSet(
192
+ produce<any>((state: any) => {
193
+ const oldValues = state.formStates;
196
194
 
197
- // console.log("Clear form state", formName);
195
+ // console.log("Clear form state", formName);
198
196
 
199
- unset(oldValues, formName);
197
+ unset(oldValues, formName);
200
198
 
201
- // console.log(JSON.parse(JSON.stringify(oldValues)));
202
- }),
203
- );
204
- },
199
+ // console.log(JSON.parse(JSON.stringify(oldValues)));
200
+ }),
201
+ );
202
+ },
205
203
 
206
- getFormState(formName) {
207
- return get(storeGet(), `formStates.${formName}`);
208
- },
204
+ getFormState(formName) {
205
+ return get(storeGet(), `formStates.${formName}`);
206
+ },
209
207
 
210
- setFormInitData(formName, initValues) {
211
- return storeSet(
212
- produce<any>((state: any) => {
213
- const oldValues = state.initialValues;
214
- const listInitPath = getAllNoneObjStringPath(initValues);
208
+ setFormInitData(formName, initValues) {
209
+ return storeSet(
210
+ produce<any>((state: any) => {
211
+ const oldValues = state.initialValues;
212
+ const listInitPath = getAllNoneObjStringPath(initValues);
215
213
 
216
- // console.log({ listInitPath, initValues });
214
+ // console.log({ listInitPath, initValues });
217
215
 
218
- listInitPath.forEach((k) => {
219
- if (get(initValues, k)) {
220
- // console.log("init form data values: ", k, get(initValues, k));
221
- set(oldValues, `${formName}.${k}`, get(initValues, k));
222
- }
223
- });
224
- }),
225
- );
226
- },
227
-
228
- getInitData(formName, name) {
229
- return get(storeGet().initialValues, `${formName}.${name}`);
230
- },
231
-
232
- setInitData(formName, name, value) {
233
- return storeSet(
234
- produce<any>((state: any) => {
235
- const oldValues = state.initialValues;
236
- console.log("Inner init: ", `${formName}.${name}`, value);
237
- set(oldValues, `${formName}.${name}`, value);
238
- }),
239
- );
240
- },
241
-
242
- setFormInstance({
243
- formName,
244
- resetFields,
245
- submit,
246
- submitAsync,
247
- setFieldValue,
248
- setFieldValues,
249
- getFieldValue,
250
- getFieldValues,
251
- getFieldErrors,
252
- setFieldFocus,
253
- }) {
254
- return storeSet(
255
- produce<any>((state: any) => {
256
- const storeListeners = state.formInstances;
257
- const findListenerIndex = storeListeners.findIndex(
258
- (l) => l.formName === formName,
259
- );
260
- if (findListenerIndex > -1) {
261
- if (!isNil(resetFields)) {
262
- storeListeners[findListenerIndex].resetFields = resetFields;
263
- }
264
- if (!isNil(submit)) {
265
- storeListeners[findListenerIndex].submit = submit;
266
- }
267
- if (!isNil(setFieldFocus)) {
268
- storeListeners[findListenerIndex].setFieldFocus = setFieldFocus;
269
- }
270
- if (!isNil(submitAsync)) {
271
- storeListeners[findListenerIndex].submitAsync = submitAsync;
272
- }
273
-
274
- if (!isNil(setFieldValue)) {
275
- storeListeners[findListenerIndex].setFieldValue = setFieldValue;
276
- }
277
-
278
- if (!isNil(setFieldValues)) {
279
- storeListeners[findListenerIndex].setFieldValues = setFieldValues;
280
- }
281
-
282
- if (!isNil(getFieldValue)) {
283
- storeListeners[findListenerIndex].getFieldValue = getFieldValue;
284
- }
285
-
286
- if (!isNil(getFieldValues)) {
287
- storeListeners[findListenerIndex].getFieldValues = getFieldValues;
288
- }
289
-
290
- if (!isNil(getFieldErrors)) {
291
- storeListeners[findListenerIndex].getFieldErrors = getFieldErrors;
292
- }
293
-
294
- return;
216
+ listInitPath.forEach((k) => {
217
+ if (get(initValues, k)) {
218
+ // console.log("init form data values: ", k, get(initValues, k));
219
+ set(oldValues, `${formName}.${k}`, get(initValues, k));
220
+ }
221
+ });
222
+ }),
223
+ );
224
+ },
225
+
226
+ getInitData(formName, name) {
227
+ return get(storeGet().initialValues, `${formName}.${name}`);
228
+ },
229
+
230
+ setInitData(formName, name, value) {
231
+ return storeSet(
232
+ produce<any>((state: any) => {
233
+ const oldValues = state.initialValues;
234
+ console.log("Inner init: ", `${formName}.${name}`, value);
235
+ set(oldValues, `${formName}.${name}`, value);
236
+ }),
237
+ );
238
+ },
239
+
240
+ setFormInstance({
241
+ formName,
242
+ resetFields,
243
+ submit,
244
+ submitAsync,
245
+ setFieldValue,
246
+ setFieldValues,
247
+ getFieldValue,
248
+ getFieldValues,
249
+ getFieldErrors,
250
+ setFieldFocus,
251
+ }) {
252
+ return storeSet(
253
+ produce<any>((state: any) => {
254
+ const storeListeners = state.formInstances;
255
+ const findListenerIndex = storeListeners.findIndex(
256
+ (l) => l.formName === formName,
257
+ );
258
+ if (findListenerIndex > -1) {
259
+ if (!isNil(resetFields)) {
260
+ storeListeners[findListenerIndex].resetFields = resetFields;
261
+ }
262
+ if (!isNil(submit)) {
263
+ storeListeners[findListenerIndex].submit = submit;
264
+ }
265
+ if (!isNil(setFieldFocus)) {
266
+ storeListeners[findListenerIndex].setFieldFocus = setFieldFocus;
267
+ }
268
+ if (!isNil(submitAsync)) {
269
+ storeListeners[findListenerIndex].submitAsync = submitAsync;
295
270
  }
296
- storeListeners.push({
297
- formName,
298
- resetFields,
299
- submit,
300
- submitAsync,
301
- setFieldValue,
302
- setFieldValues,
303
- getFieldValue,
304
- getFieldValues,
305
- getFieldErrors,
306
- setFieldFocus,
307
- });
308
- }),
309
- );
310
- },
311
- revokeFormInstance({ formName }) {
312
- return storeSet(
313
- produce<any>((state: any) => {
314
- const instances = state.formInstances;
315
-
316
- const findInstanceIndex = instances.findIndex(
317
- (l) => l.formName == formName,
318
- );
319
271
 
320
- // console.log("Find item for revoke: ", findListenerIndex, formItemId);
272
+ if (!isNil(setFieldValue)) {
273
+ storeListeners[findListenerIndex].setFieldValue = setFieldValue;
274
+ }
321
275
 
322
- if (findInstanceIndex > -1) {
323
- // const listenersInfo = cloneDeep(instances[findInstanceIndex]);
276
+ if (!isNil(setFieldValues)) {
277
+ storeListeners[findListenerIndex].setFieldValues = setFieldValues;
278
+ }
324
279
 
325
- instances.splice(findInstanceIndex, 1);
280
+ if (!isNil(getFieldValue)) {
281
+ storeListeners[findListenerIndex].getFieldValue = getFieldValue;
282
+ }
326
283
 
327
- // onAfterRevoke(
328
- // listenersInfo,
329
- // instances.filter(
330
- // (l) =>
331
- // l.name === listenersInfo.name &&
332
- // l.formName === listenersInfo.formName &&
333
- // l.formItemId !== listenersInfo.formItemId
334
- // )
335
- // );
284
+ if (!isNil(getFieldValues)) {
285
+ storeListeners[findListenerIndex].getFieldValues = getFieldValues;
336
286
  }
337
- }),
338
- );
339
- },
340
-
341
- getCurrentSubmit(formName) {
342
- return last(get(storeGet().submitHistory, formName)) || null;
343
- },
344
- getSubmitHistory(formName) {
345
- return get(storeGet().submitHistory, formName);
346
- },
347
- setSubmitHistory(formName, submitData) {
348
- return storeSet(
349
- produce<any>((state: any) => {
350
- const oldValues = get(state.submitHistory, formName);
351
- if (oldValues) {
352
- oldValues.push(submitData);
353
- oldValues.splice(0, oldValues.length - 3);
354
- } else {
355
- set(state.submitHistory, formName, [submitData]);
287
+
288
+ if (!isNil(getFieldErrors)) {
289
+ storeListeners[findListenerIndex].getFieldErrors = getFieldErrors;
356
290
  }
357
- console.log("Submit history: ", formName);
358
- }),
359
- );
360
- },
291
+
292
+ return;
293
+ }
294
+ storeListeners.push({
295
+ formName,
296
+ resetFields,
297
+ submit,
298
+ submitAsync,
299
+ setFieldValue,
300
+ setFieldValues,
301
+ getFieldValue,
302
+ getFieldValues,
303
+ getFieldErrors,
304
+ setFieldFocus,
305
+ });
306
+ }),
307
+ );
308
+ },
309
+ revokeFormInstance({ formName }) {
310
+ return storeSet(
311
+ produce<any>((state: any) => {
312
+ const instances = state.formInstances;
313
+
314
+ const findInstanceIndex = instances.findIndex(
315
+ (l) => l.formName == formName,
316
+ );
317
+
318
+ // console.log("Find item for revoke: ", findListenerIndex, formItemId);
319
+
320
+ if (findInstanceIndex > -1) {
321
+ // const listenersInfo = cloneDeep(instances[findInstanceIndex]);
322
+
323
+ instances.splice(findInstanceIndex, 1);
324
+
325
+ // onAfterRevoke(
326
+ // listenersInfo,
327
+ // instances.filter(
328
+ // (l) =>
329
+ // l.name === listenersInfo.name &&
330
+ // l.formName === listenersInfo.formName &&
331
+ // l.formItemId !== listenersInfo.formItemId
332
+ // )
333
+ // );
334
+ }
335
+ }),
336
+ );
337
+ },
338
+
339
+ getCurrentSubmit(formName) {
340
+ return last(get(storeGet().submitHistory, formName)) || null;
341
+ },
342
+ getSubmitHistory(formName) {
343
+ return get(storeGet().submitHistory, formName);
344
+ },
345
+ setSubmitHistory(formName, submitData) {
346
+ return storeSet(
347
+ produce<any>((state: any) => {
348
+ const oldValues = get(state.submitHistory, formName);
349
+ if (oldValues) {
350
+ oldValues.push(submitData);
351
+ oldValues.splice(0, oldValues.length - 3);
352
+ } else {
353
+ set(state.submitHistory, formName, [submitData]);
354
+ }
355
+ console.log("Submit history: ", formName);
356
+ }),
357
+ );
358
+ },
361
359
  });
362
360
 
363
361
  // Listeners Slice
364
362
  const createListenersSlice = (storeSet: any, storeGet: any, api: any) => ({
365
363
  listeners: [],
366
- getListener(formItemId: string) {
367
- return storeGet().listeners.find((l: any) => l.formItemId === formItemId);
364
+ getListener(formItemId) {
365
+ return storeGet().listeners.find((l) => l.formItemId === formItemId);
368
366
  },
369
367
  getListeners() {
370
368
  return storeGet().listeners;
@@ -381,7 +379,7 @@ const createListenersSlice = (storeSet: any, storeGet: any, api: any) => ({
381
379
  onFocus,
382
380
  emitFocus,
383
381
  isInitied,
384
- }: any) {
382
+ }) {
385
383
  return storeSet(
386
384
  produce<any>((state: any) => {
387
385
  const storeListeners = state.listeners;
@@ -424,21 +422,23 @@ const createListenersSlice = (storeSet: any, storeGet: any, api: any) => ({
424
422
 
425
423
  return;
426
424
  }
427
- storeListeners.push({
428
- name,
429
- formName,
430
- isTouched: Boolean(isTouched),
431
- isDirty: Boolean(isDirty),
432
- formItemId,
433
- internalErrors,
434
- onChange,
435
- onReset,
436
- isInitied: Boolean(isInitied),
437
- });
425
+ if (name && formName) {
426
+ storeListeners.push({
427
+ name,
428
+ formName,
429
+ isTouched: Boolean(isTouched),
430
+ isDirty: Boolean(isDirty),
431
+ formItemId,
432
+ internalErrors,
433
+ onChange,
434
+ onReset,
435
+ isInitied: Boolean(isInitied),
436
+ });
437
+ }
438
438
  }),
439
439
  );
440
440
  },
441
- revokeListener(formItemId: string, onAfterRevoke: any) {
441
+ revokeListener(formItemId, onAfterRevoke) {
442
442
  return storeSet(
443
443
  produce<any>((state: any) => {
444
444
  const storeListeners = state.listeners;
@@ -447,6 +447,8 @@ const createListenersSlice = (storeSet: any, storeGet: any, api: any) => ({
447
447
  (l: any) => l.formItemId == formItemId,
448
448
  );
449
449
 
450
+ // console.log("Find item for revoke: ", findListenerIndex, formItemId);
451
+
450
452
  if (findListenerIndex > -1) {
451
453
  const listenersInfo = cloneDeep(storeListeners[findListenerIndex]);
452
454
 
@@ -470,7 +472,7 @@ const createListenersSlice = (storeSet: any, storeGet: any, api: any) => ({
470
472
  // CleanUp Slice
471
473
  const createCleanUpSlice = (storeSet: any, storeGet: any, api: any) => ({
472
474
  cleanUpStack: [],
473
- setCleanUpStack({ name, type, itemKey, formName }: any) {
475
+ setCleanUpStack({ name, type, itemKey, formName }) {
474
476
  return storeSet(
475
477
  produce<any>((state: any) => {
476
478
  const oldValues = state.cleanUpStack;
@@ -0,0 +1,21 @@
1
+ import { cloneDeep } from "lodash";
2
+ import { useEffect } from "react";
3
+ import { useShallow } from "zustand/react/shallow";
4
+ import { useFormStore } from "../stores/formStore";
5
+
6
+ type Props = {};
7
+
8
+ function TestListener({}: Props) {
9
+ const { listeners } = useFormStore(
10
+ useShallow((state) => ({
11
+ listeners: state.listeners,
12
+ })),
13
+ );
14
+
15
+ useEffect(() => {
16
+ console.log("Listeners updated: ", cloneDeep(listeners));
17
+ }, [listeners]);
18
+ return <div>TestListener</div>;
19
+ }
20
+
21
+ export default TestListener;