dynamic-modal 1.1.8 → 1.1.10

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.
Files changed (63) hide show
  1. package/README.md +0 -1
  2. package/dist/components/input-upload/input-upload.js +3 -3
  3. package/dist/components/make-button/make-button.js +19 -10
  4. package/dist/components/make-description/make-description.js +2 -2
  5. package/dist/components/make-input/make-input.js +57 -29
  6. package/dist/components/make-select/make-select.js +66 -29
  7. package/dist/components/make-textarea/make-textarea.js +57 -29
  8. package/dist/components/make-toggle/make-toggle.js +57 -29
  9. package/dist/components/make-upload/make-upload.js +72 -18
  10. package/dist/components/portal/portal.js +20 -10
  11. package/dist/context/component/component-state.d.ts +3 -3
  12. package/dist/context/component/component-state.js +20 -11
  13. package/dist/hooks/use-enable-if.d.ts +9 -0
  14. package/dist/hooks/use-enable-if.js +45 -0
  15. package/dist/hooks/use-live-data.d.ts +14 -0
  16. package/dist/hooks/use-live-data.js +42 -0
  17. package/dist/hooks/use-render-if.d.ts +12 -0
  18. package/dist/hooks/use-render-if.js +51 -0
  19. package/dist/interfaces/component-state.d.ts +8 -8
  20. package/dist/interfaces/modal.d.ts +4 -2
  21. package/dist/modal.js +70 -58
  22. package/dist/util/general/general.util.d.ts +3 -0
  23. package/dist/util/general/general.util.js +28 -0
  24. package/eslint.config.mjs +72 -14
  25. package/examples/live-data.ts +0 -1
  26. package/package.json +11 -9
  27. package/src/components/input-upload/input-upload.tsx +40 -28
  28. package/src/components/make-button/make-button.tsx +11 -13
  29. package/src/components/make-description/make-description.tsx +14 -8
  30. package/src/components/make-input/make-input.tsx +94 -47
  31. package/src/components/make-select/make-select.tsx +118 -48
  32. package/src/components/make-textarea/make-textarea.tsx +94 -47
  33. package/src/components/make-toggle/make-toggle.tsx +94 -47
  34. package/src/components/make-upload/make-upload.tsx +88 -36
  35. package/src/components/portal/portal.tsx +27 -25
  36. package/src/context/component/component-state.tsx +16 -9
  37. package/src/hooks/modal-handler.ts +17 -14
  38. package/src/hooks/use-enable-if.ts +64 -0
  39. package/src/hooks/use-live-data.ts +45 -0
  40. package/src/hooks/use-render-if.ts +59 -0
  41. package/src/interfaces/component-state.ts +38 -23
  42. package/src/interfaces/field.ts +33 -27
  43. package/src/interfaces/input-upload.ts +17 -15
  44. package/src/interfaces/make-button.ts +14 -13
  45. package/src/interfaces/make-description.ts +9 -8
  46. package/src/interfaces/make-field-group.ts +9 -8
  47. package/src/interfaces/make-input.ts +9 -8
  48. package/src/interfaces/make-select.ts +9 -9
  49. package/src/interfaces/make-textarea.ts +5 -5
  50. package/src/interfaces/make-toggle.ts +3 -3
  51. package/src/interfaces/make-upload.ts +8 -8
  52. package/src/interfaces/modal.ts +57 -39
  53. package/src/interfaces/option.ts +3 -3
  54. package/src/interfaces/portal.ts +5 -5
  55. package/src/modal.tsx +243 -147
  56. package/src/util/general/general.util.ts +27 -0
  57. package/tsconfig.json +1 -1
  58. package/dist/hooks/field-render.d.ts +0 -20
  59. package/dist/hooks/field-render.js +0 -94
  60. package/dist/tools/general.d.ts +0 -1
  61. package/dist/tools/general.js +0 -11
  62. package/src/hooks/field-render.ts +0 -120
  63. package/src/tools/general.ts +0 -8
package/src/modal.tsx CHANGED
@@ -1,30 +1,36 @@
1
- 'use client'
2
-
3
- import React, { useContext, useEffect, useState } from 'react'
4
- import { useForm } from 'react-hook-form'
5
- import { Portal } from './components/portal/portal'
6
- import MakeToggle from './components/make-toggle/make-toggle'
7
- import MakeInput from './components/make-input/make-input'
8
- import MakeSelect from './components/make-select/make-select'
9
- import MakeTextarea from './components/make-textarea/make-textarea'
10
- import { IModal, IModalField, IModalConfigProps, IFormField } from './interfaces/modal'
11
- import MakeDescription from './components/make-description/make-description'
12
- import { IFieldProps } from './interfaces/field'
13
- import MakeUpload from './components/make-upload/make-upload'
14
- import MakeButton from './components/make-button/make-button'
15
- import { IMakeInput } from './interfaces/make-input'
16
- import { IMakeSelect } from './interfaces/make-select'
17
- import { IMakeTextarea } from './interfaces/make-textarea'
18
- import { IMakeToggle } from './interfaces/make-toggle'
19
- import { IMakeDescription } from './interfaces/make-description'
20
- import { IMakeUpload } from './interfaces/make-upload'
21
- import { IMakeButton } from './interfaces/make-button'
22
- import { ComponentStateContext } from './context/component/component-state'
1
+ 'use client';
2
+
3
+ import React, { useContext, useEffect, useState } from 'react';
4
+ import { useForm } from 'react-hook-form';
5
+
6
+ import { Portal } from './components/portal/portal';
7
+ import MakeToggle from './components/make-toggle/make-toggle';
8
+ import MakeInput from './components/make-input/make-input';
9
+ import MakeSelect from './components/make-select/make-select';
10
+ import MakeTextarea from './components/make-textarea/make-textarea';
11
+ import {
12
+ IModal,
13
+ IModalField,
14
+ IModalConfigProps,
15
+ IFormField,
16
+ } from './interfaces/modal';
17
+ import MakeDescription from './components/make-description/make-description';
18
+ import { IFieldProps } from './interfaces/field';
19
+ import MakeUpload from './components/make-upload/make-upload';
20
+ import MakeButton from './components/make-button/make-button';
21
+ import { IMakeInput } from './interfaces/make-input';
22
+ import { IMakeSelect } from './interfaces/make-select';
23
+ import { IMakeTextarea } from './interfaces/make-textarea';
24
+ import { IMakeToggle } from './interfaces/make-toggle';
25
+ import { IMakeDescription } from './interfaces/make-description';
26
+ import { IMakeUpload } from './interfaces/make-upload';
27
+ import { IMakeButton } from './interfaces/make-button';
28
+ import { ComponentStateContext } from './context/component/component-state';
23
29
 
24
30
  export const Modal = ({ open, close, config }: IModal) => {
25
- const { ModalButtonAction, ModalButtonCancel } = useContext(ComponentStateContext)
26
- const [modalReady, setModalReady] = useState<IModalConfigProps | undefined>(undefined)
27
- const [defaultLoaded, setDefaultLoaded] = useState<boolean>(false)
31
+ const { ModalButtonAction, ModalButtonCancel } = useContext(ComponentStateContext);
32
+ const [modalReady, setModalReady] = useState<IModalConfigProps | undefined>(undefined);
33
+ const [defaultLoaded, setDefaultLoaded] = useState<boolean>(false);
28
34
 
29
35
  const {
30
36
  control,
@@ -34,163 +40,253 @@ export const Modal = ({ open, close, config }: IModal) => {
34
40
  setValue,
35
41
  watch,
36
42
  trigger,
37
- getFieldState
38
- } = useForm()
43
+ reset,
44
+ getFieldState,
45
+ } = useForm();
39
46
 
40
47
  const formValueHandler = (element: IFormField) => {
41
- if (['group', 'upload', 'text'].includes(element.elementType)) return
42
- if(!element.defaultValue && element.renderIf) {
43
- unregister(element.name)
44
- return
48
+ if (['group', 'upload', 'text'].includes(element.elementType)) return;
49
+ if (!element.defaultValue && element.renderIf) {
50
+ unregister(element.name);
51
+ return;
45
52
  }
46
-
47
- const defaultValue = element.defaultValue ?? ''
48
- const parsedValue: boolean | string | Array<string> | undefined = defaultValue === 'true' ? true : defaultValue === 'false' ? false : defaultValue
49
- setValue(element.name, parsedValue ?? '')
50
- }
53
+
54
+ const defaultValue = element.defaultValue ?? '';
55
+
56
+ const parsedValue: boolean | string | Array<string> | undefined =
57
+ defaultValue === 'true'
58
+ ? true
59
+ : defaultValue === 'false'
60
+ ? false
61
+ : defaultValue;
62
+
63
+ setValue(element.name, parsedValue ?? '');
64
+ };
51
65
 
52
66
  const autoLoadGroup = (groupFields: Array<IModalField>) => {
53
- groupFields.forEach(element => {
54
- formValueHandler(element as IFormField)
55
- })
56
- }
67
+ groupFields.forEach((element) => {
68
+ formValueHandler(element as IFormField);
69
+ });
70
+ };
57
71
 
58
72
  const autoLoadField = (modalFields: Array<IModalField>) => {
59
- if (defaultLoaded) return
73
+ if (defaultLoaded) return;
60
74
 
61
- modalFields.forEach(element => {
75
+ modalFields.forEach((element) => {
62
76
  if (element.elementType === 'group') {
63
- autoLoadGroup(element.groups)
64
- return
77
+ autoLoadGroup(element.groups);
78
+ return;
65
79
  }
66
- formValueHandler(element as IFormField)
67
- })
80
+ formValueHandler(element as IFormField);
81
+ });
68
82
 
69
- setDefaultLoaded(true)
70
- }
83
+ setDefaultLoaded(true);
84
+ };
71
85
 
72
-
73
86
  const getUseSubmit = (modalConfig: IModalConfigProps): boolean => {
74
- const useSubmit = modalConfig.useSubmit === undefined ? true : modalConfig.useSubmit === false ? false : true
87
+ const useSubmit =
88
+ modalConfig.useSubmit === undefined
89
+ ? true
90
+ : modalConfig.useSubmit === false
91
+ ? false
92
+ : true;
75
93
 
76
- return useSubmit
77
- }
94
+ return useSubmit;
95
+ };
78
96
 
79
- const getRender = ({ elementType, ...element }: IModalField, index: number, isEndOfRender: boolean = false) => {
80
- if (isEndOfRender && modalReady) setTimeout(() => autoLoadField(modalReady.fields), 200)
97
+ const getRender = (
98
+ { elementType, ...element }: IModalField,
99
+ index: number,
100
+ isEndOfRender: boolean = false,
101
+ ) => {
102
+ if (isEndOfRender && modalReady)
103
+ setTimeout(() => autoLoadField(modalReady.fields), 200);
81
104
 
82
105
  const props: IFieldProps = {
83
106
  control,
84
107
  watch,
85
108
  setValue,
86
- unregister
87
- }
88
-
89
- return elementType === 'input'
90
- ? <MakeInput {...props} key={`modal-input-${index}`} element={element as IMakeInput} />
91
- : elementType === 'select'
92
- ? <MakeSelect {...props} key={`modal-select-${index}`} element={element as IMakeSelect} />
93
- : elementType === 'textarea'
94
- ? <MakeTextarea {...props} key={`modal-textarea-${index}`} element={element as IMakeTextarea} />
95
- : elementType === 'toggle'
96
- ? <MakeToggle {...props} key={`modal-toggle-${index}`} element={element as IMakeToggle} />
97
- : elementType === 'text'
98
- ? <MakeDescription {...props} key={`modal-text-${index}`} element={element as IMakeDescription} />
99
- : elementType === 'upload'
100
- ? <MakeUpload {...props} key={`modal-upload-${index}`} element={element as IMakeUpload} />
101
- : elementType === 'button'
102
- ? <MakeButton {...props} key={`modal-button-${index}`} element={element as IMakeButton} />
103
- : null
104
- }
109
+ unregister,
110
+ };
105
111
 
112
+ return elementType === 'input' ? (
113
+ <MakeInput
114
+ {...props}
115
+ key={`modal-input-${index}`}
116
+ element={element as IMakeInput}
117
+ />
118
+ ) : elementType === 'select' ? (
119
+ <MakeSelect
120
+ {...props}
121
+ key={`modal-select-${index}`}
122
+ element={element as IMakeSelect}
123
+ />
124
+ ) : elementType === 'textarea' ? (
125
+ <MakeTextarea
126
+ {...props}
127
+ key={`modal-textarea-${index}`}
128
+ element={element as IMakeTextarea}
129
+ />
130
+ ) : elementType === 'toggle' ? (
131
+ <MakeToggle
132
+ {...props}
133
+ key={`modal-toggle-${index}`}
134
+ element={element as IMakeToggle}
135
+ />
136
+ ) : elementType === 'text' ? (
137
+ <MakeDescription
138
+ {...props}
139
+ key={`modal-text-${index}`}
140
+ element={element as IMakeDescription}
141
+ />
142
+ ) : elementType === 'upload' ? (
143
+ <MakeUpload
144
+ {...props}
145
+ key={`modal-upload-${index}`}
146
+ element={element as IMakeUpload}
147
+ />
148
+ ) : elementType === 'button' ? (
149
+ <MakeButton
150
+ {...props}
151
+ key={`modal-button-${index}`}
152
+ element={element as IMakeButton}
153
+ />
154
+ ) : null;
155
+ };
106
156
 
107
157
  const closeHandler = (): void => {
108
- if (modalReady?.onClose) modalReady.onClose()
109
-
158
+ if (modalReady?.onClose) modalReady.onClose();
159
+
110
160
  setTimeout(() => {
111
- const form = getValues()
112
- unregister(Object.keys(form))
113
- setModalReady(undefined)
114
- setDefaultLoaded(false)
115
- close()
116
- }, 200)
117
- }
161
+ setModalReady(undefined);
162
+ setDefaultLoaded(false);
163
+ reset()
164
+ close();
165
+ }, 200);
166
+ };
118
167
 
119
168
  const manualSubmit = async (): Promise<void> => {
120
- const form = getValues()
121
- const fields = Object.keys(form)
122
- await trigger(fields)
169
+ const form = getValues();
170
+ const fields = Object.keys(form);
171
+ await trigger(fields);
172
+
173
+ const validations: Array<boolean> = fields.map((field) => {
174
+ const { invalid } = getFieldState(field);
123
175
 
124
- const validations: Array<boolean> = fields.map(field => {
125
- const { invalid } = getFieldState(field)
176
+ return invalid;
177
+ });
126
178
 
127
- return invalid
128
- })
179
+ const result = validations.some((isInvalid) => isInvalid)
180
+ ? undefined
181
+ : form;
129
182
 
130
- const result = validations.some(isInvalid => isInvalid) ? undefined : form
183
+ if (!result) return;
131
184
 
132
- if(!result) return
133
-
134
- actionHandler({ ...(modalReady?.reservedData ?? {}), ...form })
135
- }
185
+ actionHandler({ ...(modalReady?.reservedData ?? {}), ...form });
186
+ };
136
187
 
137
- const actionHandler = (data: Record<string, string | number | object>): void => {
138
- modalReady?.out({ ...(modalReady?.reservedData ?? {}), ...data })
139
- closeHandler()
140
- }
188
+ const actionHandler = (
189
+ data: Record<string, string | number | object>,
190
+ ): void => {
191
+ modalReady?.out({ ...(modalReady?.reservedData ?? {}), ...data });
192
+ closeHandler();
193
+ };
141
194
 
142
195
  useEffect(() => {
143
- if (open && !modalReady) setModalReady(config)
144
- }, [config, modalReady, open])
196
+ if (open && !modalReady) setModalReady(config);
197
+ }, [config, modalReady, open]);
198
+
199
+ if(!modalReady) return null
145
200
 
146
201
  return (
147
- modalReady
148
- ? <Portal closeTime={200} portalOpen={open} portalTag={'#modal-portal'}>
149
- <div className='rounded bg-white relative w-auto h-auto min-h-[200px] min-w-[500px]' style={modalReady.style} >
150
- <form className='flex flex-col p-4 gap-4' autoComplete='off' onSubmit={handleSubmit(actionHandler)}>
151
- <h2 className='text-bold text-center border-b pb-4 font-semibold'>{modalReady.title}</h2>
152
- <div
153
- className='flex flex-col gap-4 py-4'
154
- style={{
155
- overflowY: modalReady.overFlowBody ? 'auto' : undefined,
156
- height: modalReady.overFlowBody,
157
- minHeight: modalReady.minHeightBody
158
- }}
159
- >
160
- {
161
- modalReady.fields.map((element, index) => {
162
- const isEndOfRender: boolean = index + 1 === modalReady.fields.length
163
-
164
- if (element.elementType === 'group') {
165
- return (
166
- <div key={`modal-group-${index}`} className='flex flex-col w-full gap-2'>
167
- { element.title && <h3 className='font-bold border-b-2 pb-2 mb-2'>{element.title}</h3> }
168
- <div key={`modal-group-${index}`} className='flex gap-4 w-full' style={element.style}>
169
- {
170
- element.groups
171
- .filter(sub => ['input', 'select', 'toggle', 'multiselect', 'upload', 'button', 'autocomplete'].includes(sub.elementType))
172
- .map((sub, subIndex) => getRender(sub, index + subIndex, isEndOfRender))
173
- }
174
- </div>
175
- </div>
176
- )
177
- } else { return getRender(element, index, isEndOfRender) }
178
- })
179
- }
180
- </div>
181
- <div className='flex gap-4 items-center justify-center border-t' style={modalReady?.actions.containerStyle}>
182
- {modalReady.actions.cancel && <ModalButtonCancel {...modalReady.actions.cancel} onClick={closeHandler} />}
183
- {
184
- getUseSubmit(modalReady) ?
185
- <ModalButtonAction {...modalReady.actions.action} type='submit' />:
186
- <ModalButtonAction {...modalReady.actions.action} onClick={manualSubmit} type='button' />
202
+ <Portal closeTime={200} portalOpen={open} portalTag={'#modal-portal'}>
203
+ <div
204
+ className="rounded bg-white relative w-auto h-auto min-h-[200px] min-w-[500px]"
205
+ style={modalReady.style}
206
+ >
207
+ <form
208
+ className="flex flex-col p-4 gap-4"
209
+ autoComplete="off"
210
+ onSubmit={handleSubmit(actionHandler)}
211
+ >
212
+ <h2 className="text-bold text-center border-b pb-4 font-semibold">
213
+ {modalReady.title}
214
+ </h2>
215
+ <div
216
+ className="flex flex-col gap-4 py-4"
217
+ style={{
218
+ overflowY: modalReady.overFlowBody ? 'auto' : undefined,
219
+ height: modalReady.overFlowBody,
220
+ minHeight: modalReady.minHeightBody,
221
+ }}
222
+ >
223
+ {modalReady.fields.map((element, index) => {
224
+ const isEndOfRender: boolean =
225
+ index + 1 === modalReady.fields.length;
226
+
227
+ if (element.elementType === 'group') {
228
+ return (
229
+ <div
230
+ key={`modal-group-${index}`}
231
+ className="flex flex-col w-full gap-2"
232
+ >
233
+ {element.title && (
234
+ <h3 className="font-bold border-b-2 pb-2 mb-2">
235
+ {element.title}
236
+ </h3>
237
+ )}
238
+ <div
239
+ key={`modal-group-${index}`}
240
+ className="flex gap-4 w-full"
241
+ style={element.style}
242
+ >
243
+ {element.groups
244
+ .filter((sub) =>
245
+ [
246
+ 'input',
247
+ 'select',
248
+ 'toggle',
249
+ 'multiselect',
250
+ 'upload',
251
+ 'button',
252
+ 'autocomplete',
253
+ ].includes(sub.elementType),
254
+ )
255
+ .map((sub, subIndex) =>
256
+ getRender(sub, index + subIndex, isEndOfRender),
257
+ )}
258
+ </div>
259
+ </div>
260
+ );
261
+ } else {
262
+ return getRender(element, index, isEndOfRender);
187
263
  }
188
- </div>
189
- </form>
190
- </div>
191
- </Portal>
192
- : null
264
+ })}
265
+ </div>
266
+ <div
267
+ className="flex gap-4 items-center justify-center border-t p-2"
268
+ style={modalReady?.actions.containerStyle}
269
+ >
270
+ {modalReady.actions.cancel && (
271
+ <ModalButtonCancel
272
+ {...modalReady.actions.cancel}
273
+ onClick={closeHandler}
274
+ />
275
+ )}
276
+ {getUseSubmit(modalReady) ? (
277
+ <ModalButtonAction {...modalReady.actions.action} type="submit" />
278
+ ) : (
279
+ <ModalButtonAction
280
+ {...modalReady.actions.action}
281
+ onClick={manualSubmit}
282
+ type="button"
283
+ />
284
+ )}
285
+ </div>
286
+ </form>
287
+ </div>
288
+ </Portal>
193
289
  )
194
- }
290
+ };
195
291
 
196
- export default Modal
292
+ export default Modal;
@@ -0,0 +1,27 @@
1
+ import { IOption } from '../../interfaces/option';
2
+
3
+ export const liveDataAction = async (
4
+ fieldData: string | number | Array<unknown>,
5
+ formData: Record<string, unknown>,
6
+ action: (data: string, ...args: any[]) => Promise<IOption[]>,
7
+ ) => {
8
+ if (typeof fieldData === 'string') {
9
+ const options = await action(fieldData, formData);
10
+ return options ?? [];
11
+ }
12
+
13
+ return [] as Array<IOption>;
14
+ };
15
+
16
+ export const liveDataHandler = async (
17
+ fieldData: string | number | Array<unknown>,
18
+ formData: Record<string, unknown>,
19
+ action: (data: string, ...args: any[]) => Promise<boolean>,
20
+ ) => {
21
+ if (typeof fieldData === 'string') {
22
+ const result = await action(fieldData, formData);
23
+ return result ?? false;
24
+ }
25
+
26
+ return false;
27
+ };
package/tsconfig.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "compilerOptions": {
3
- "target": "ES2016",
3
+ "target": "es2020",
4
4
  "module": "commonjs",
5
5
  "declaration": true,
6
6
  "outDir": "./dist",
@@ -1,20 +0,0 @@
1
- import { IField, IFieldProps } from '../interfaces/field';
2
- import { IOption } from '../interfaces/option';
3
- import { IModalLiveDataCondition } from '../interfaces/modal';
4
- export type IFormData = Record<string, unknown>;
5
- export interface IWatchEvent {
6
- name: string | undefined;
7
- type: string | undefined;
8
- }
9
- export interface IFieldRender {
10
- render: boolean | null;
11
- enable: boolean | null;
12
- checkField: (formData: IFormData, { name, type }: IWatchEvent) => void;
13
- liveData?: Array<IOption>;
14
- liveSearching?: boolean;
15
- }
16
- export interface IFieldRenderProps extends Pick<IFieldProps, 'setValue' | 'unregister'> {
17
- element: Partial<Pick<IField, 'enableIf' | 'renderIf' | 'name'>> & Partial<Record<'liveData', IModalLiveDataCondition>>;
18
- }
19
- export type ILiveHandlerProps = Pick<IField, 'enableIf' | 'renderIf'>;
20
- export declare const useFieldRender: ({ element, setValue, unregister }: IFieldRenderProps) => IFieldRender;
@@ -1,94 +0,0 @@
1
- "use strict";
2
- 'use client';
3
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
4
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
5
- return new (P || (P = Promise))(function (resolve, reject) {
6
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
7
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
8
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
9
- step((generator = generator.apply(thisArg, _arguments || [])).next());
10
- });
11
- };
12
- Object.defineProperty(exports, "__esModule", { value: true });
13
- exports.useFieldRender = void 0;
14
- const react_1 = require("react");
15
- const useFieldRender = ({ element, setValue, unregister }) => {
16
- const [render, setRender] = (0, react_1.useState)(null);
17
- const [enable, setEnable] = (0, react_1.useState)(null);
18
- const [liveSearching, setLiveSearching] = (0, react_1.useState)(false);
19
- const [liveData, setLiveData] = (0, react_1.useState)(undefined);
20
- const renderCondition = (0, react_1.useMemo)(() => {
21
- const isRender = element.renderIf !== undefined;
22
- if (render === null)
23
- setRender(!isRender);
24
- return isRender;
25
- }, [element.renderIf, render]);
26
- const enableCondition = (0, react_1.useMemo)(() => {
27
- const isEnable = element.enableIf !== undefined;
28
- if (enable === null)
29
- setEnable(!isEnable);
30
- return isEnable;
31
- }, [element.enableIf, enable]);
32
- const liveDataCondition = (0, react_1.useMemo)(() => {
33
- return element.liveData !== undefined;
34
- }, [element.liveData]);
35
- const renderConditionList = (0, react_1.useMemo)(() => {
36
- return renderCondition ? Object.keys(element.renderIf) : [];
37
- }, [element.renderIf, renderCondition]);
38
- const enableConditionList = (0, react_1.useMemo)(() => {
39
- return enableCondition ? Object.keys(element.enableIf) : [];
40
- }, [enableCondition, element.enableIf]);
41
- const liveDataAction = (0, react_1.useCallback)((field, formData) => __awaiter(void 0, void 0, void 0, function* () {
42
- var _a;
43
- if (typeof field === 'string' && ((_a = element.liveData) === null || _a === void 0 ? void 0 : _a.action)) {
44
- const options = element.liveData.action(field, formData);
45
- return options !== null && options !== void 0 ? options : [];
46
- }
47
- return [];
48
- }), [element.liveData]);
49
- const liveDataHandler = (0, react_1.useCallback)((targetHandler, field, formData) => __awaiter(void 0, void 0, void 0, function* () {
50
- var _a;
51
- if (typeof field === 'string' && ((_a = element[targetHandler]) === null || _a === void 0 ? void 0 : _a.action)) {
52
- const result = element[targetHandler].action(field, formData);
53
- return result !== null && result !== void 0 ? result : false;
54
- }
55
- return false;
56
- }), [element.liveData]);
57
- const checkField = (0, react_1.useCallback)((formData_1, _a) => __awaiter(void 0, [formData_1, _a], void 0, function* (formData, { name }) {
58
- var _b, _c, _d;
59
- const key = name !== null && name !== void 0 ? name : '';
60
- const targetField = formData[key];
61
- if (!targetField)
62
- return;
63
- if (renderCondition && ((_b = element.renderIf) === null || _b === void 0 ? void 0 : _b.condition.includes(key))) {
64
- const renderStatus = yield liveDataHandler('renderIf', targetField, formData);
65
- if (render !== renderStatus) {
66
- setRender(renderStatus);
67
- if (!renderStatus)
68
- unregister(element.name);
69
- }
70
- }
71
- else if (enableCondition && ((_c = element.enableIf) === null || _c === void 0 ? void 0 : _c.condition.includes(key))) {
72
- const enableStatus = yield liveDataHandler('enableIf', targetField, formData);
73
- if (enable !== enableStatus)
74
- setEnable(enableStatus);
75
- }
76
- if (liveDataCondition && ((_d = element.liveData) === null || _d === void 0 ? void 0 : _d.condition.includes(key))) {
77
- setLiveSearching(true);
78
- const options = yield liveDataAction(targetField, formData);
79
- if (liveData && JSON.stringify(liveData) !== JSON.stringify(options)) {
80
- setValue(element.name, options);
81
- }
82
- setLiveData(options);
83
- setLiveSearching(false);
84
- }
85
- }), [enable, enableCondition, enableConditionList, liveData, liveDataAction, liveDataCondition, render, renderCondition, renderConditionList]);
86
- return {
87
- render,
88
- enable,
89
- checkField,
90
- liveData,
91
- liveSearching
92
- };
93
- };
94
- exports.useFieldRender = useFieldRender;
@@ -1 +0,0 @@
1
- export declare const generateId: () => string;
@@ -1,11 +0,0 @@
1
- "use strict";
2
- 'use client';
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.generateId = void 0;
5
- const generateId = () => {
6
- return Math.random()
7
- .toString(36)
8
- .split('.')[1]
9
- .substring(0, 6);
10
- };
11
- exports.generateId = generateId;