@@ -33,7 +33,7 @@ const API_KEY_JSON_PLACEHOLDER = `{
33
33
"type": "service_account",
34
34
"project_id": "fleet-in-your-calendar",
35
35
"private_key_id": "<private key id>",
36
- "private_key": "-----BEGIN PRIVATE KEY-----\ n<private key>\n-----END PRIVATE KEY-----\n",
36
+ "private_key": "-----BEGIN PRIVATE KEY----\\ n<private key>\\ n-----END PRIVATE KEY-----\ \n",
37
37
"client_email": "fleet-calendar-events@fleet-in-your-calendar.iam.gserviceaccount.com",
38
38
"client_id": "<client id>",
39
39
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
@@ -58,6 +58,16 @@ interface ICalendarsFormData {
58
58
apiKeyJson ?: string ;
59
59
}
60
60
61
+ // Used to surface error.message in UI of unknown error type
62
+ type ErrorWithMessage = {
63
+ message : string ;
64
+ [ key : string ] : unknown ;
65
+ } ;
66
+
67
+ const isErrorWithMessage = ( error : unknown ) : error is ErrorWithMessage => {
68
+ return ( error as ErrorWithMessage ) . message !== undefined ;
69
+ } ;
70
+
61
71
const baseClass = "calendars-integration" ;
62
72
63
73
const Calendars = ( ) : JSX . Element => {
@@ -103,7 +113,18 @@ const Calendars = (): JSX.Element => {
103
113
errors . apiKeyJson = "API key JSON must be present" ;
104
114
}
105
115
if ( ! curFormData . domain && ! ! curFormData . apiKeyJson ) {
106
- errors . apiKeyJson = "Domain must be present" ;
116
+ errors . domain = "Domain must be present" ;
117
+ }
118
+ if ( curFormData . apiKeyJson ) {
119
+ try {
120
+ JSON . parse ( curFormData . apiKeyJson ) ;
121
+ } catch ( e : unknown ) {
122
+ if ( isErrorWithMessage ( e ) ) {
123
+ errors . apiKeyJson = e . message . toString ( ) ;
124
+ } else {
125
+ throw e ;
126
+ }
127
+ }
107
128
}
108
129
return errors ;
109
130
} ;
@@ -277,6 +298,7 @@ const Calendars = (): JSX.Element => {
277
298
placeholder = { API_KEY_JSON_PLACEHOLDER }
278
299
ignore1password
279
300
inputClassName = { `${ baseClass } __api-key-json` }
301
+ error = { formErrors . apiKeyJson }
280
302
/>
281
303
< InputField
282
304
label = "Primary domain"
@@ -301,12 +323,13 @@ const Calendars = (): JSX.Element => {
301
323
/>
302
324
</ >
303
325
}
326
+ error = { formErrors . domain }
304
327
/>
305
328
< Button
306
329
type = "submit"
307
330
variant = "brand"
308
331
disabled = { Object . keys ( formErrors ) . length > 0 }
309
- className = "save-loading button-wrap "
332
+ className = "save-loading"
310
333
isLoading = { isUpdatingSettings }
311
334
>
312
335
Save
@@ -378,6 +401,10 @@ const Calendars = (): JSX.Element => {
378
401
</ li >
379
402
</ ul >
380
403
</ p >
404
+ < p >
405
+ You're ready to automatically schedule calendar events for end
406
+ users.
407
+ </ p >
381
408
</ div >
382
409
</ >
383
410
) ;
0 commit comments