@@ -18,13 +18,14 @@ import {
18
18
Stack ,
19
19
useToast ,
20
20
} from "@chakra-ui/react" ;
21
+ import Ajv , { Schema } from "ajv" ;
21
22
import {
22
23
DNSProvider ,
23
24
DNSProvidersAcmesh ,
24
25
DNSProvidersAcmeshProperty ,
25
26
} from "api/npm" ;
26
27
import { PrettyButton } from "components" ;
27
- import { Formik , Form , Field } from "formik" ;
28
+ import { Formik , Form , Field , getIn } from "formik" ;
28
29
import { useSetDNSProvider , useDNSProvidersAcmesh } from "hooks" ;
29
30
import { intl } from "locale" ;
30
31
import { validateString } from "modules/Validations" ;
@@ -39,12 +40,8 @@ function DNSProviderCreateModal({
39
40
} : DNSProviderCreateModalProps ) {
40
41
const toast = useToast ( ) ;
41
42
const { mutate : setDNSProvider } = useSetDNSProvider ( ) ;
42
- const {
43
- isLoading : acmeshIsLoading ,
44
- // isError: acmeshIsError,
45
- // error: acmeshError,
46
- data : acmeshDataResp ,
47
- } = useDNSProvidersAcmesh ( ) ;
43
+ const { isLoading : acmeshIsLoading , data : acmeshDataResp } =
44
+ useDNSProvidersAcmesh ( ) ;
48
45
49
46
const [ acmeshData , setAcmeshData ] = useState ( [ ] as DNSProvidersAcmesh [ ] ) ;
50
47
const [ acmeshItem , setAcmeshItem ] = useState ( "" ) ;
@@ -58,13 +55,17 @@ function DNSProviderCreateModal({
58
55
onClose ( ) ;
59
56
} ;
60
57
58
+ const getAcmeshItem = ( name : string ) : DNSProvidersAcmesh | undefined => {
59
+ return acmeshData . find ( ( item ) => item . title === name ) ;
60
+ } ;
61
+
62
+ const fullItem = getAcmeshItem ( acmeshItem ) ;
63
+ const itemProperties = fullItem ?. properties ;
64
+
61
65
const onSubmit = async (
62
66
payload : DNSProvider ,
63
67
{ setErrors, setSubmitting } : any ,
64
68
) => {
65
- // TODO: filter out the meta object and only include items that apply to the acmesh provider selected
66
- console . log ( "PAYLOAD:" , payload ) ;
67
-
68
69
const showErr = ( msg : string ) => {
69
70
toast ( {
70
71
description : intl . formatMessage ( {
@@ -77,30 +78,42 @@ function DNSProviderCreateModal({
77
78
} ) ;
78
79
} ;
79
80
80
- setDNSProvider ( payload , {
81
- onError : ( err : any ) => {
82
- if ( err . message === "ca-bundle-does-not-exist" ) {
83
- setErrors ( {
84
- caBundle : intl . formatMessage ( {
85
- id : `error.${ err . message } ` ,
86
- } ) ,
87
- } ) ;
88
- } else {
89
- showErr ( err . message ) ;
90
- }
91
- } ,
92
- onSuccess : ( ) => onModalClose ( ) ,
93
- onSettled : ( ) => setSubmitting ( false ) ,
94
- } ) ;
95
- } ;
96
-
97
- const getAcmeshItem = ( name : string ) : DNSProvidersAcmesh | undefined => {
98
- return acmeshData . find ( ( item ) => item . title === name ) ;
81
+ const ajv = new Ajv ( { strictSchema : false } ) ;
82
+ try {
83
+ const valid = ajv . validate ( fullItem as Schema , payload . meta ) ;
84
+ if ( ! valid ) {
85
+ let errs : any = { } ;
86
+ ajv . errors ?. forEach ( ( e : any ) => {
87
+ errs [ "meta" ] = {
88
+ [ e . instancePath . substring ( 1 ) ] : e . message ,
89
+ } ;
90
+ } ) ;
91
+ setErrors ( errs ) ;
92
+ setSubmitting ( false ) ;
93
+ } else {
94
+ // Json schema is happy
95
+ setDNSProvider ( payload , {
96
+ onError : ( err : any ) => {
97
+ if ( err . message === "ca-bundle-does-not-exist" ) {
98
+ setErrors ( {
99
+ caBundle : intl . formatMessage ( {
100
+ id : `error.${ err . message } ` ,
101
+ } ) ,
102
+ } ) ;
103
+ } else {
104
+ showErr ( err . message ) ;
105
+ }
106
+ } ,
107
+ onSuccess : ( ) => onModalClose ( ) ,
108
+ onSettled : ( ) => setSubmitting ( false ) ,
109
+ } ) ;
110
+ }
111
+ } catch ( err : any ) {
112
+ showErr ( err ) ;
113
+ setSubmitting ( false ) ;
114
+ }
99
115
} ;
100
116
101
- const fullItem = getAcmeshItem ( acmeshItem ) ;
102
- const itemProperties = fullItem ?. properties ;
103
-
104
117
const renderInputType = (
105
118
field : any ,
106
119
fieldName : string ,
@@ -250,7 +263,8 @@ function DNSProviderCreateModal({
250
263
) !== - 1
251
264
}
252
265
isInvalid = {
253
- form . errors [ name ] && form . touched [ name ]
266
+ getIn ( form . errors , name ) &&
267
+ getIn ( form . touched , name )
254
268
} >
255
269
{ f . type !== "bool" ? (
256
270
< FormLabel htmlFor = { name } >
@@ -266,7 +280,7 @@ function DNSProviderCreateModal({
266
280
values . meta [ f . title ] ,
267
281
) }
268
282
< FormErrorMessage >
269
- { form . errors [ name ] }
283
+ { form . errors ?. meta ?. [ fieldName ] }
270
284
</ FormErrorMessage >
271
285
</ FormControl >
272
286
) }
0 commit comments