dynamic-modal 1.1.1 → 1.1.7

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 (52) hide show
  1. package/README-ES.md +217 -217
  2. package/README.md +216 -215
  3. package/dist/components/input-upload/input-upload.js +1 -1
  4. package/dist/components/make-button/make-button.js +7 -17
  5. package/dist/components/make-input/make-input.js +9 -19
  6. package/dist/components/make-select/make-select.js +9 -19
  7. package/dist/components/make-textarea/make-textarea.js +9 -19
  8. package/dist/components/make-toggle/make-toggle.js +9 -19
  9. package/dist/components/make-upload/make-upload.js +2 -2
  10. package/dist/components/portal/portal.js +7 -17
  11. package/dist/context/component/component-state.js +7 -17
  12. package/dist/hooks/field-render.js +1 -1
  13. package/dist/interfaces/field.d.ts +3 -2
  14. package/dist/interfaces/make-select.d.ts +2 -1
  15. package/dist/interfaces/modal.d.ts +2 -1
  16. package/dist/modal.js +38 -19
  17. package/eslint.config.mjs +14 -14
  18. package/examples/enable-if.ts +127 -127
  19. package/examples/live-data.ts +61 -61
  20. package/examples/render-if.ts +128 -128
  21. package/examples/simple.ts +74 -74
  22. package/index.ts +5 -5
  23. package/package.json +46 -47
  24. package/src/components/input-upload/input-upload.tsx +67 -67
  25. package/src/components/make-button/make-button.tsx +18 -18
  26. package/src/components/make-description/make-description.tsx +15 -15
  27. package/src/components/make-input/make-input.tsx +53 -53
  28. package/src/components/make-select/make-select.tsx +55 -55
  29. package/src/components/make-textarea/make-textarea.tsx +53 -53
  30. package/src/components/make-toggle/make-toggle.tsx +53 -53
  31. package/src/components/make-upload/make-upload.tsx +40 -40
  32. package/src/components/portal/portal.tsx +37 -37
  33. package/src/context/component/component-state.tsx +17 -17
  34. package/src/hooks/field-render.ts +109 -109
  35. package/src/hooks/modal-handler.ts +38 -38
  36. package/src/interfaces/component-state.ts +33 -33
  37. package/src/interfaces/field.ts +37 -36
  38. package/src/interfaces/input-upload.ts +21 -21
  39. package/src/interfaces/make-button.ts +19 -19
  40. package/src/interfaces/make-description.ts +14 -14
  41. package/src/interfaces/make-field-group.ts +14 -14
  42. package/src/interfaces/make-input.ts +14 -14
  43. package/src/interfaces/make-select.ts +15 -14
  44. package/src/interfaces/make-textarea.ts +11 -11
  45. package/src/interfaces/make-toggle.ts +9 -9
  46. package/src/interfaces/make-upload.ts +14 -14
  47. package/src/interfaces/modal.ts +47 -45
  48. package/src/interfaces/option.ts +3 -3
  49. package/src/interfaces/portal.ts +8 -8
  50. package/src/modal.tsx +196 -164
  51. package/src/tools/general.ts +8 -8
  52. package/tsconfig.json +13 -13
@@ -1,67 +1,67 @@
1
- 'use client'
2
-
3
- import React, { ChangeEvent, FC } from 'react'
4
- import { IFileResult, IInputUpload } from '../../interfaces/input-upload'
5
-
6
- const InputUpload: FC<IInputUpload> = ({ onChange, readAsArrayBuffer, ...props }: IInputUpload) => {
7
-
8
- const onChangeHandler = (event: ChangeEvent<HTMLInputElement>) => {
9
- if (props.read && event.target.files) {
10
- readFileBlob(event.target.files[0], false)
11
- .then((result) => onChange(result))
12
- .catch((err) => {
13
- console.error('file read error', err)
14
- onChange({name:'', size: 0, data: ''})
15
- })
16
- } else {
17
- onChange(event.target.files)
18
- }
19
- }
20
-
21
- const readFileBlob = (blob: File, image: boolean): Promise<IFileResult> => {
22
- return new Promise((resolve, reject) => {
23
- const fileReader = new FileReader()
24
- if(image) fileReader.readAsDataURL(blob)
25
- else if (readAsArrayBuffer) fileReader.readAsArrayBuffer(blob)
26
- else fileReader.readAsText(blob)
27
-
28
- fileReader.onload = () => {
29
- const fileResult: IFileResult = {
30
- name: blob.name,
31
- size: blob.size,
32
- data: fileReader.result as string
33
- }
34
-
35
- resolve(fileResult)
36
- }
37
- fileReader.onerror = (error) => {
38
- reject(error)
39
- }
40
- })
41
- }
42
-
43
- return (
44
- <div className='flex flex-col w-full gap-1 text-center'>
45
- {props.label && <label className="block mb-2 text-sm font-medium text-gray-900 dark:text-white" htmlFor={`file-input-${props.id}`}>{props.label}</label>}
46
- <input
47
- className="file:transition-all file:delay-150 block w-full text-sm text-slate-500
48
- file:mr-4 file:py-2 file:px-4 file:rounded-md
49
- file:border-0 file:text-sm file:font-semibold
50
- file:bg-gray-100 file:text-blue-600
51
- hover:file:bg-blue-700 hover:file:text-white cursor-pointer disabled:cursor-not-allowed"
52
- aria-describedby={`file-input-${props.id}-help`}
53
- id={`file-input-${props.id}`}
54
- type="file"
55
- onChange={onChangeHandler}
56
- {...props}
57
- />
58
- <p
59
- className="mt-1 text-sm text-gray-500 dark:text-gray-300 text-start"
60
- id={`file-input-${props.id}-help`}>
61
- {props.helpText?.toUpperCase()}
62
- </p>
63
- </div>
64
- )
65
- }
66
-
67
- export default InputUpload
1
+ 'use client'
2
+
3
+ import React, { ChangeEvent, FC } from 'react'
4
+ import { IFileResult, IInputUpload } from '../../interfaces/input-upload'
5
+
6
+ const InputUpload: FC<IInputUpload> = ({ onChange, readAsArrayBuffer, ...props }: IInputUpload) => {
7
+
8
+ const onChangeHandler = (event: ChangeEvent<HTMLInputElement>) => {
9
+ if (props.read && event.target.files) {
10
+ readFileBlob(event.target.files[0], false)
11
+ .then((result) => onChange(result))
12
+ .catch((err) => {
13
+ console.error('file read error', err)
14
+ onChange({name:'', size: 0, data: ''})
15
+ })
16
+ } else {
17
+ onChange(event.target.files)
18
+ }
19
+ }
20
+
21
+ const readFileBlob = (blob: File, image: boolean): Promise<IFileResult> => {
22
+ return new Promise((resolve, reject) => {
23
+ const fileReader = new FileReader()
24
+ if(image) fileReader.readAsDataURL(blob)
25
+ else if (readAsArrayBuffer) fileReader.readAsArrayBuffer(blob)
26
+ else fileReader.readAsText(blob)
27
+
28
+ fileReader.onload = () => {
29
+ const fileResult: IFileResult = {
30
+ name: blob.name,
31
+ size: blob.size,
32
+ data: fileReader.result as string
33
+ }
34
+
35
+ resolve(fileResult)
36
+ }
37
+ fileReader.onerror = (error) => {
38
+ reject(error)
39
+ }
40
+ })
41
+ }
42
+
43
+ return (
44
+ <div className='flex flex-col w-full gap-1 text-center'>
45
+ {props.label && <label className="block mb-2 text-sm font-medium text-gray-900 dark:text-white" htmlFor={`file-input-${props.id}`}>{props.label}</label>}
46
+ <input
47
+ className="file:transition-all file:delay-150 block w-full text-sm text-slate-500
48
+ file:mr-4 file:py-2 file:px-4 file:rounded-md
49
+ file:border-0 file:text-sm file:font-semibold
50
+ file:bg-gray-100 file:text-blue-600
51
+ hover:file:bg-blue-700 hover:file:text-white cursor-pointer disabled:cursor-not-allowed"
52
+ aria-describedby={`file-input-${props.id}-help`}
53
+ id={`file-input-${props.id}`}
54
+ type="file"
55
+ onChange={onChangeHandler}
56
+ {...props}
57
+ />
58
+ <p
59
+ className="mt-1 text-sm text-gray-500 dark:text-gray-300 text-start"
60
+ id={`file-input-${props.id}-help`}>
61
+ {props.helpText?.toUpperCase()}
62
+ </p>
63
+ </div>
64
+ )
65
+ }
66
+
67
+ export default InputUpload
@@ -1,18 +1,18 @@
1
- 'use client'
2
-
3
- import React, { FC, useContext, useMemo } from 'react'
4
- import { IMakeButtonProps } from '../../interfaces/make-button'
5
- import { ComponentStateContext } from '../../context/component/component-state'
6
- import { generateId } from '../../tools/general'
7
-
8
- const MakeButton: FC<IMakeButtonProps> = ({ element }) => {
9
- const { Button } = useContext(ComponentStateContext)
10
-
11
- const elementId = useMemo(() => element.id ?? generateId(), [])
12
-
13
- return (
14
- <Button {...element} id={elementId} />
15
- )
16
- }
17
-
18
- export default MakeButton
1
+ 'use client'
2
+
3
+ import React, { FC, useContext, useMemo } from 'react'
4
+ import { IMakeButtonProps } from '../../interfaces/make-button'
5
+ import { ComponentStateContext } from '../../context/component/component-state'
6
+ import { generateId } from '../../tools/general'
7
+
8
+ const MakeButton: FC<IMakeButtonProps> = ({ element }) => {
9
+ const { Button } = useContext(ComponentStateContext)
10
+
11
+ const elementId = useMemo(() => element.id ?? generateId(), [])
12
+
13
+ return (
14
+ <Button {...element} id={elementId} />
15
+ )
16
+ }
17
+
18
+ export default MakeButton
@@ -1,15 +1,15 @@
1
- 'use client'
2
-
3
- import React, { FC } from 'react'
4
- import { IMakeDescriptionProps } from '../../interfaces/make-description'
5
-
6
- const MakeDescription: FC<IMakeDescriptionProps> = ({ element: { text, Icon, containerStyle, textStyle } }) => {
7
- return (
8
- <div className='flex gap-4 w-full h-auto text-xs text-center p-2 border-1 rounded-md' style={containerStyle}>
9
- {Icon && <Icon />}
10
- <p style={textStyle}>{text}</p>
11
- </div>
12
- )
13
- }
14
-
15
- export default MakeDescription
1
+ 'use client'
2
+
3
+ import React, { FC } from 'react'
4
+ import { IMakeDescriptionProps } from '../../interfaces/make-description'
5
+
6
+ const MakeDescription: FC<IMakeDescriptionProps> = ({ element: { text, Icon, containerStyle, textStyle } }) => {
7
+ return (
8
+ <div className='flex gap-4 w-full h-auto text-xs text-center p-2 border-1 rounded-md' style={containerStyle}>
9
+ {Icon && <Icon />}
10
+ <p style={textStyle}>{text}</p>
11
+ </div>
12
+ )
13
+ }
14
+
15
+ export default MakeDescription
@@ -1,53 +1,53 @@
1
- 'use client'
2
-
3
- import React, { FC, useContext, useEffect, useMemo } from 'react'
4
- import { Controller } from 'react-hook-form'
5
- import { useFieldRender } from '../../hooks/field-render'
6
- import { IMakeInputProps } from '../../interfaces/make-input'
7
- import { ComponentStateContext } from '../../context/component/component-state'
8
- import { generateId } from '../../tools/general'
9
-
10
- const MakeInput: FC<IMakeInputProps> = ({ element: { validation: { required, ...validation }, ...element }, ...props }) => {
11
- const { Input } = useContext(ComponentStateContext)
12
- const { render, enable, checkField } = useFieldRender({ ...props, element })
13
-
14
- const elementId = useMemo(() => element.id ?? generateId(), [])
15
-
16
- useEffect(() => {
17
- const subscription = props.watch((value, { name, type }) => checkField(value, { name, type }))
18
- return () => subscription.unsubscribe()
19
- }, [checkField, props])
20
-
21
- return (
22
- render
23
- ? <Controller
24
- control={props.control}
25
- name={element.name}
26
- rules={{
27
- required: {
28
- value: required,
29
- message: validation.message ?? ''
30
- },
31
- pattern: validation.regex ? {
32
- value: validation.regex,
33
- message: validation.message ?? ''
34
- } : undefined,
35
- ...validation
36
- }}
37
- render={({ field: { onChange, value }, fieldState: { invalid, error } }) => (
38
- <Input
39
- {...element}
40
- id={elementId}
41
- onChange={onChange}
42
- value={value ?? ''}
43
- invalid={invalid}
44
- error={error}
45
- disabled={element.disabled ?? !enable}
46
- />
47
- )}
48
- />
49
- : null
50
- )
51
- }
52
-
53
- export default MakeInput
1
+ 'use client'
2
+
3
+ import React, { FC, useContext, useEffect, useMemo } from 'react'
4
+ import { Controller } from 'react-hook-form'
5
+ import { useFieldRender } from '../../hooks/field-render'
6
+ import { IMakeInputProps } from '../../interfaces/make-input'
7
+ import { ComponentStateContext } from '../../context/component/component-state'
8
+ import { generateId } from '../../tools/general'
9
+
10
+ const MakeInput: FC<IMakeInputProps> = ({ element: { validation: { required, ...validation }, enableIf, renderIf, ...element }, ...props }) => {
11
+ const { Input } = useContext(ComponentStateContext)
12
+ const { render, enable, checkField } = useFieldRender({ ...props, element: { enableIf, renderIf, ...element} })
13
+
14
+ const elementId = useMemo(() => element.id ?? generateId(), [])
15
+
16
+ useEffect(() => {
17
+ const subscription = props.watch((value, { name, type }) => checkField(value, { name, type }))
18
+ return () => subscription.unsubscribe()
19
+ }, [checkField, props])
20
+
21
+ return (
22
+ render
23
+ ? <Controller
24
+ control={props.control}
25
+ name={element.name}
26
+ rules={{
27
+ required: {
28
+ value: required,
29
+ message: validation.message ?? ''
30
+ },
31
+ pattern: validation.regex ? {
32
+ value: validation.regex,
33
+ message: validation.message ?? ''
34
+ } : undefined,
35
+ ...validation
36
+ }}
37
+ render={({ field: { onChange, value }, fieldState: { invalid, error } }) => (
38
+ <Input
39
+ {...element}
40
+ id={elementId}
41
+ onChange={onChange}
42
+ value={value ?? ''}
43
+ invalid={invalid}
44
+ error={error}
45
+ disabled={element.disabled ?? !enable}
46
+ />
47
+ )}
48
+ />
49
+ : null
50
+ )
51
+ }
52
+
53
+ export default MakeInput
@@ -1,55 +1,55 @@
1
- 'use client'
2
-
3
- import React, { FC, useContext, useEffect, useMemo } from 'react'
4
- import { Controller } from 'react-hook-form'
5
- import { useFieldRender } from '../../hooks/field-render'
6
- import { generateId } from '../../tools/general'
7
- import { IMakeSelectProps } from '../../interfaces/make-select'
8
- import { ComponentStateContext } from '../../context/component/component-state'
9
-
10
- const MakeSelect: FC<IMakeSelectProps> = ({ element: { validation: { required, ...validation }, ...element }, ...props }) => {
11
- const { Select } = useContext(ComponentStateContext)
12
- const { render, enable, checkField, liveData, liveSearching } = useFieldRender({ ...props, element })
13
-
14
- const elementId = useMemo(() => element.id ?? generateId(), [])
15
-
16
- useEffect(() => {
17
- const subscription = props.watch((value, { name, type }) => checkField(value, { name, type }))
18
- return () => subscription.unsubscribe()
19
- }, [checkField, props, props.watch])
20
-
21
- return (
22
- render
23
- ? <Controller
24
- control={props.control}
25
- name={element.name}
26
- rules={{
27
- required: {
28
- value: required,
29
- message: validation.message ?? ''
30
- },
31
- pattern: validation.regex ? {
32
- value: validation.regex,
33
- message: validation.message ?? ''
34
- } : undefined,
35
- ...validation
36
- }}
37
- render={({ field: { onChange, value }, fieldState: { invalid, error } }) => (
38
- <Select
39
- {...element}
40
- id={elementId}
41
- onChange={onChange}
42
- value={value}
43
- invalid={invalid}
44
- error={error}
45
- disabled={element.disabled ?? !enable}
46
- liveSearching={liveSearching}
47
- options={liveData || (element.options ?? [])}
48
- />
49
- )}
50
- />
51
- : <></>
52
- )
53
- }
54
-
55
- export default MakeSelect
1
+ 'use client'
2
+
3
+ import React, { FC, useContext, useEffect, useMemo } from 'react'
4
+ import { Controller } from 'react-hook-form'
5
+ import { useFieldRender } from '../../hooks/field-render'
6
+ import { generateId } from '../../tools/general'
7
+ import { IMakeSelectProps } from '../../interfaces/make-select'
8
+ import { ComponentStateContext } from '../../context/component/component-state'
9
+
10
+ const MakeSelect: FC<IMakeSelectProps> = ({ element: { validation: { required, ...validation }, enableIf, renderIf, ...element }, ...props }) => {
11
+ const { Select } = useContext(ComponentStateContext)
12
+ const { render, enable, checkField, liveData, liveSearching } = useFieldRender({ ...props, element: { renderIf, enableIf, ...element} })
13
+
14
+ const elementId = useMemo(() => element.id ?? generateId(), [])
15
+
16
+ useEffect(() => {
17
+ const subscription = props.watch((value, { name, type }) => checkField(value, { name, type }))
18
+ return () => subscription.unsubscribe()
19
+ }, [checkField, props, props.watch])
20
+
21
+ return (
22
+ render
23
+ ? <Controller
24
+ control={props.control}
25
+ name={element.name}
26
+ rules={{
27
+ required: {
28
+ value: required,
29
+ message: validation.message ?? ''
30
+ },
31
+ pattern: validation.regex ? {
32
+ value: validation.regex,
33
+ message: validation.message ?? ''
34
+ } : undefined,
35
+ ...validation
36
+ }}
37
+ render={({ field: { onChange, value }, fieldState: { invalid, error } }) => (
38
+ <Select
39
+ {...element}
40
+ id={elementId}
41
+ onChange={onChange}
42
+ value={value}
43
+ invalid={invalid}
44
+ error={error}
45
+ disabled={element.disabled ?? !enable}
46
+ liveSearching={liveSearching}
47
+ options={liveData || (element.options ?? [])}
48
+ />
49
+ )}
50
+ />
51
+ : <></>
52
+ )
53
+ }
54
+
55
+ export default MakeSelect
@@ -1,53 +1,53 @@
1
- 'use client'
2
-
3
- import React, { FC, useContext, useEffect, useMemo } from 'react'
4
- import { Controller } from 'react-hook-form'
5
- import { useFieldRender } from '../../hooks/field-render'
6
- import { generateId } from '../../tools/general'
7
- import { IMakeTextareaProps } from '../../interfaces/make-textarea'
8
- import { ComponentStateContext } from '../../context/component/component-state'
9
-
10
- const MakeTextarea: FC<IMakeTextareaProps> = ({ element: { validation: { required, ...validation }, ...element }, ...props }) => {
11
- const { Textarea } = useContext(ComponentStateContext)
12
- const { render, enable, checkField } = useFieldRender({ ...props, element })
13
-
14
- const elementId = useMemo(() => element.id ?? generateId(), [])
15
-
16
- useEffect(() => {
17
- const subscription = props.watch((value, { name, type }) => checkField(value, { name, type }))
18
- return () => subscription.unsubscribe()
19
- }, [checkField, props, props.watch])
20
-
21
- return (
22
- render
23
- ? <Controller
24
- name={element.name}
25
- control={props.control}
26
- rules={{
27
- required: {
28
- value: required,
29
- message: validation.message ?? ''
30
- },
31
- pattern: validation.regex ? {
32
- value: validation.regex,
33
- message: validation.message ?? ''
34
- } : undefined,
35
- ...validation
36
- }}
37
- render={({ field: { onChange, value }, fieldState: { invalid, error } }) => (
38
- <Textarea
39
- {...element}
40
- id={elementId}
41
- onChange={onChange}
42
- value={value ?? ''}
43
- invalid={invalid}
44
- error={error}
45
- disabled={element.disabled ?? !enable}
46
- />
47
- )}
48
- />
49
- : null
50
- )
51
- }
52
-
53
- export default MakeTextarea
1
+ 'use client'
2
+
3
+ import React, { FC, useContext, useEffect, useMemo } from 'react'
4
+ import { Controller } from 'react-hook-form'
5
+ import { useFieldRender } from '../../hooks/field-render'
6
+ import { generateId } from '../../tools/general'
7
+ import { IMakeTextareaProps } from '../../interfaces/make-textarea'
8
+ import { ComponentStateContext } from '../../context/component/component-state'
9
+
10
+ const MakeTextarea: FC<IMakeTextareaProps> = ({ element: { validation: { required, ...validation }, enableIf, renderIf, ...element }, ...props }) => {
11
+ const { Textarea } = useContext(ComponentStateContext)
12
+ const { render, enable, checkField } = useFieldRender({ ...props, element: { enableIf, renderIf, ...element } })
13
+
14
+ const elementId = useMemo(() => element.id ?? generateId(), [])
15
+
16
+ useEffect(() => {
17
+ const subscription = props.watch((value, { name, type }) => checkField(value, { name, type }))
18
+ return () => subscription.unsubscribe()
19
+ }, [checkField, props, props.watch])
20
+
21
+ return (
22
+ render
23
+ ? <Controller
24
+ name={element.name}
25
+ control={props.control}
26
+ rules={{
27
+ required: {
28
+ value: required,
29
+ message: validation.message ?? ''
30
+ },
31
+ pattern: validation.regex ? {
32
+ value: validation.regex,
33
+ message: validation.message ?? ''
34
+ } : undefined,
35
+ ...validation
36
+ }}
37
+ render={({ field: { onChange, value }, fieldState: { invalid, error } }) => (
38
+ <Textarea
39
+ {...element}
40
+ id={elementId}
41
+ onChange={onChange}
42
+ value={value ?? ''}
43
+ invalid={invalid}
44
+ error={error}
45
+ disabled={element.disabled ?? !enable}
46
+ />
47
+ )}
48
+ />
49
+ : null
50
+ )
51
+ }
52
+
53
+ export default MakeTextarea
@@ -1,53 +1,53 @@
1
- 'use client'
2
-
3
- import React, { FC, useContext, useEffect, useMemo } from 'react'
4
- import { Controller } from 'react-hook-form'
5
- import { useFieldRender } from '../../hooks/field-render'
6
- import { IMakeToggleProps } from '../../interfaces/make-toggle'
7
- import { generateId } from '../../tools/general'
8
- import { ComponentStateContext } from '../../context/component/component-state'
9
-
10
- const MakeToggle: FC<IMakeToggleProps> = ({ element: { validation: { required, ...validation }, ...element }, ...props }) => {
11
- const { Toggle } = useContext(ComponentStateContext)
12
- const { render, enable, checkField } = useFieldRender({ ...props, element })
13
-
14
- const elementId = useMemo(() => element.id ?? generateId(), [])
15
-
16
- useEffect(() => {
17
- const subscription = props.watch((value, { name, type }) => checkField(value, { name, type }))
18
- return () => subscription.unsubscribe()
19
- }, [checkField, props, props.watch])
20
-
21
- return (
22
- render
23
- ? <Controller
24
- control={props.control}
25
- name={element.name}
26
- rules={{
27
- required: {
28
- value: required,
29
- message: validation.message ?? ''
30
- },
31
- pattern: validation.regex ? {
32
- value: validation.regex,
33
- message: validation.message ?? ''
34
- } : undefined,
35
- ...validation
36
- }}
37
- render={({ field: { onChange, value }, fieldState: { invalid, error } }) => (
38
- <Toggle
39
- {...element}
40
- id={elementId}
41
- onChange={onChange}
42
- value={value ?? ''}
43
- invalid={invalid}
44
- error={error}
45
- disabled={element.disabled ?? !enable}
46
- />
47
- )}
48
- />
49
- : null
50
- )
51
- }
52
-
53
- export default MakeToggle
1
+ 'use client'
2
+
3
+ import React, { FC, useContext, useEffect, useMemo } from 'react'
4
+ import { Controller } from 'react-hook-form'
5
+ import { useFieldRender } from '../../hooks/field-render'
6
+ import { IMakeToggleProps } from '../../interfaces/make-toggle'
7
+ import { generateId } from '../../tools/general'
8
+ import { ComponentStateContext } from '../../context/component/component-state'
9
+
10
+ const MakeToggle: FC<IMakeToggleProps> = ({ element: { validation: { required, ...validation }, enableIf, renderIf, ...element }, ...props }) => {
11
+ const { Toggle } = useContext(ComponentStateContext)
12
+ const { render, enable, checkField } = useFieldRender({ ...props, element: { enableIf, renderIf, ...element } })
13
+
14
+ const elementId = useMemo(() => element.id ?? generateId(), [])
15
+
16
+ useEffect(() => {
17
+ const subscription = props.watch((value, { name, type }) => checkField(value, { name, type }))
18
+ return () => subscription.unsubscribe()
19
+ }, [checkField, props, props.watch])
20
+
21
+ return (
22
+ render
23
+ ? <Controller
24
+ control={props.control}
25
+ name={element.name}
26
+ rules={{
27
+ required: {
28
+ value: required,
29
+ message: validation.message ?? ''
30
+ },
31
+ pattern: validation.regex ? {
32
+ value: validation.regex,
33
+ message: validation.message ?? ''
34
+ } : undefined,
35
+ ...validation
36
+ }}
37
+ render={({ field: { onChange, value }, fieldState: { invalid, error } }) => (
38
+ <Toggle
39
+ {...element}
40
+ id={elementId}
41
+ onChange={onChange}
42
+ value={value ?? ''}
43
+ invalid={invalid}
44
+ error={error}
45
+ disabled={element.disabled ?? !enable}
46
+ />
47
+ )}
48
+ />
49
+ : null
50
+ )
51
+ }
52
+
53
+ export default MakeToggle