@strapi/email 5.37.1 → 5.38.1

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 (76) hide show
  1. package/dist/admin/constants.js.map +1 -1
  2. package/dist/admin/constants.mjs.map +1 -1
  3. package/dist/admin/index.js +1 -1
  4. package/dist/admin/index.js.map +1 -1
  5. package/dist/admin/index.mjs.map +1 -1
  6. package/dist/admin/pages/Settings.js +399 -47
  7. package/dist/admin/pages/Settings.js.map +1 -1
  8. package/dist/admin/pages/Settings.mjs +402 -50
  9. package/dist/admin/pages/Settings.mjs.map +1 -1
  10. package/dist/admin/shared/email-address-parser.js +245 -0
  11. package/dist/admin/shared/email-address-parser.js.map +1 -0
  12. package/dist/admin/shared/email-address-parser.mjs +243 -0
  13. package/dist/admin/shared/email-address-parser.mjs.map +1 -0
  14. package/dist/admin/translations/de.json.js +18 -2
  15. package/dist/admin/translations/de.json.js.map +1 -1
  16. package/dist/admin/translations/de.json.mjs +18 -2
  17. package/dist/admin/translations/de.json.mjs.map +1 -1
  18. package/dist/admin/translations/en.json.js +23 -1
  19. package/dist/admin/translations/en.json.js.map +1 -1
  20. package/dist/admin/translations/en.json.mjs +23 -1
  21. package/dist/admin/translations/en.json.mjs.map +1 -1
  22. package/dist/admin/translations/es.json.js +6 -1
  23. package/dist/admin/translations/es.json.js.map +1 -1
  24. package/dist/admin/translations/es.json.mjs +3 -1
  25. package/dist/admin/translations/es.json.mjs.map +1 -1
  26. package/dist/admin/utils/getYupInnerErrors.js.map +1 -1
  27. package/dist/admin/utils/getYupInnerErrors.mjs.map +1 -1
  28. package/dist/admin/utils/prefixPluginTranslations.js.map +1 -1
  29. package/dist/admin/utils/prefixPluginTranslations.mjs.map +1 -1
  30. package/dist/admin/utils/schema.js.map +1 -1
  31. package/dist/admin/utils/schema.mjs.map +1 -1
  32. package/dist/server/bootstrap.js.map +1 -1
  33. package/dist/server/bootstrap.mjs.map +1 -1
  34. package/dist/server/config.js.map +1 -1
  35. package/dist/server/config.mjs.map +1 -1
  36. package/dist/server/controllers/email.js +33 -1
  37. package/dist/server/controllers/email.js.map +1 -1
  38. package/dist/server/controllers/email.mjs +33 -1
  39. package/dist/server/controllers/email.mjs.map +1 -1
  40. package/dist/server/controllers/index.js.map +1 -1
  41. package/dist/server/controllers/index.mjs.map +1 -1
  42. package/dist/server/index.js +8 -8
  43. package/dist/server/index.js.map +1 -1
  44. package/dist/server/index.mjs.map +1 -1
  45. package/dist/server/middlewares/index.js.map +1 -1
  46. package/dist/server/middlewares/index.mjs.map +1 -1
  47. package/dist/server/middlewares/rateLimit.js.map +1 -1
  48. package/dist/server/middlewares/rateLimit.mjs.map +1 -1
  49. package/dist/server/routes/admin.js +18 -0
  50. package/dist/server/routes/admin.js.map +1 -1
  51. package/dist/server/routes/admin.mjs +18 -0
  52. package/dist/server/routes/admin.mjs.map +1 -1
  53. package/dist/server/routes/content-api.js.map +1 -1
  54. package/dist/server/routes/content-api.mjs.map +1 -1
  55. package/dist/server/routes/index.js.map +1 -1
  56. package/dist/server/routes/index.mjs.map +1 -1
  57. package/dist/server/routes/validation/email.js.map +1 -1
  58. package/dist/server/routes/validation/email.mjs.map +1 -1
  59. package/dist/server/services/email.js.map +1 -1
  60. package/dist/server/services/email.mjs +1 -1
  61. package/dist/server/services/email.mjs.map +1 -1
  62. package/dist/server/services/index.js.map +1 -1
  63. package/dist/server/services/index.mjs.map +1 -1
  64. package/dist/server/src/bootstrap.d.ts.map +1 -1
  65. package/dist/server/src/controllers/email.d.ts +1 -0
  66. package/dist/server/src/controllers/email.d.ts.map +1 -1
  67. package/dist/server/src/controllers/index.d.ts +1 -0
  68. package/dist/server/src/controllers/index.d.ts.map +1 -1
  69. package/dist/server/src/index.d.ts +1 -0
  70. package/dist/server/src/index.d.ts.map +1 -1
  71. package/dist/server/src/routes/admin.d.ts.map +1 -1
  72. package/dist/shared/email-address-parser.d.ts +81 -0
  73. package/dist/shared/email-address-parser.d.ts.map +1 -0
  74. package/dist/shared/types.d.ts +17 -0
  75. package/dist/shared/types.d.ts.map +1 -1
  76. package/package.json +14 -9
@@ -1,12 +1,13 @@
1
- import { jsx, jsxs } from 'react/jsx-runtime';
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
3
  import { Page, useNotification, useFetchClient, Layouts } from '@strapi/admin/strapi-admin';
4
- import { Flex, Box, Typography, Grid, Field, TextInput, SingleSelect, SingleSelectOption, Button } from '@strapi/design-system';
5
- import { Mail } from '@strapi/icons';
4
+ import { Flex, Box, Typography, Grid, Field, TextInput, SingleSelect, SingleSelectOption, Button, Badge } from '@strapi/design-system';
5
+ import { Check, Cross, Mail } from '@strapi/icons';
6
6
  import { useIntl } from 'react-intl';
7
7
  import { useQuery, useMutation } from 'react-query';
8
8
  import { styled } from 'styled-components';
9
9
  import { ValidationError } from 'yup';
10
+ import { parseEmailAddress } from '../shared/email-address-parser.mjs';
10
11
  import { PERMISSIONS } from '../constants.mjs';
11
12
  import { getYupInnerErrors } from '../utils/getYupInnerErrors.mjs';
12
13
  import { schema } from '../utils/schema.mjs';
@@ -14,6 +15,190 @@ import { schema } from '../utils/schema.mjs';
14
15
  const DocumentationLink = styled.a`
15
16
  color: ${({ theme })=>theme.colors.primary600};
16
17
  `;
18
+ const FEATURE_LABELS = {
19
+ dkim: {
20
+ id: 'email.Settings.capabilities.feature.dkim',
21
+ defaultMessage: 'DKIM'
22
+ },
23
+ pool: {
24
+ id: 'email.Settings.capabilities.feature.pool',
25
+ defaultMessage: 'Connection pool'
26
+ },
27
+ rateLimiting: {
28
+ id: 'email.Settings.capabilities.feature.rateLimiting',
29
+ defaultMessage: 'Rate limiting'
30
+ },
31
+ oauth2: {
32
+ id: 'email.Settings.capabilities.feature.oauth2',
33
+ defaultMessage: 'OAuth2'
34
+ },
35
+ requireTLS: {
36
+ id: 'email.Settings.capabilities.feature.requireTLS',
37
+ defaultMessage: 'Require TLS'
38
+ }
39
+ };
40
+ const CapabilitiesSection = ({ capabilities, isIdle, formatMessage })=>{
41
+ const transport = capabilities.transport;
42
+ const auth = capabilities.auth;
43
+ const features = capabilities.features ?? [];
44
+ const encryptionLabel = transport?.secure === true ? 'TLS' : transport?.port === 587 ? 'STARTTLS' : transport?.port === 465 ? 'TLS' : 'None';
45
+ return /*#__PURE__*/ jsxs(Flex, {
46
+ direction: "column",
47
+ alignItems: "stretch",
48
+ gap: 4,
49
+ children: [
50
+ /*#__PURE__*/ jsxs(Flex, {
51
+ direction: "column",
52
+ alignItems: "stretch",
53
+ gap: 1,
54
+ children: [
55
+ /*#__PURE__*/ jsx(Typography, {
56
+ variant: "delta",
57
+ tag: "h2",
58
+ children: formatMessage({
59
+ id: 'email.Settings.capabilities.title',
60
+ defaultMessage: 'Provider capabilities'
61
+ })
62
+ }),
63
+ /*#__PURE__*/ jsx(Typography, {
64
+ children: formatMessage({
65
+ id: 'email.Settings.capabilities.subtitle',
66
+ defaultMessage: 'Current SMTP configuration and enabled features'
67
+ })
68
+ })
69
+ ]
70
+ }),
71
+ /*#__PURE__*/ jsxs(Grid.Root, {
72
+ gap: 5,
73
+ children: [
74
+ transport && (transport.host || transport.port) && /*#__PURE__*/ jsx(Grid.Item, {
75
+ col: 6,
76
+ xs: 12,
77
+ direction: "column",
78
+ alignItems: "stretch",
79
+ children: /*#__PURE__*/ jsxs(Field.Root, {
80
+ name: "smtp-server",
81
+ children: [
82
+ /*#__PURE__*/ jsx(Field.Label, {
83
+ children: formatMessage({
84
+ id: 'email.Settings.capabilities.label.smtpServer',
85
+ defaultMessage: 'SMTP server'
86
+ })
87
+ }),
88
+ /*#__PURE__*/ jsx(TextInput, {
89
+ disabled: true,
90
+ readOnly: true,
91
+ value: transport.host && transport.port ? `${transport.host}:${transport.port}` : transport.host || String(transport.port)
92
+ })
93
+ ]
94
+ })
95
+ }),
96
+ transport && /*#__PURE__*/ jsx(Grid.Item, {
97
+ col: 6,
98
+ xs: 12,
99
+ direction: "column",
100
+ alignItems: "stretch",
101
+ children: /*#__PURE__*/ jsxs(Field.Root, {
102
+ name: "encryption",
103
+ children: [
104
+ /*#__PURE__*/ jsx(Field.Label, {
105
+ children: formatMessage({
106
+ id: 'email.Settings.capabilities.label.encryption',
107
+ defaultMessage: 'Encryption'
108
+ })
109
+ }),
110
+ /*#__PURE__*/ jsx(TextInput, {
111
+ disabled: true,
112
+ readOnly: true,
113
+ value: encryptionLabel
114
+ })
115
+ ]
116
+ })
117
+ }),
118
+ auth && (auth.type || auth.user) && /*#__PURE__*/ jsx(Grid.Item, {
119
+ col: 6,
120
+ xs: 12,
121
+ direction: "column",
122
+ alignItems: "stretch",
123
+ children: /*#__PURE__*/ jsxs(Field.Root, {
124
+ name: "auth-type",
125
+ children: [
126
+ /*#__PURE__*/ jsx(Field.Label, {
127
+ children: formatMessage({
128
+ id: 'email.Settings.capabilities.label.authType',
129
+ defaultMessage: 'Authentication'
130
+ })
131
+ }),
132
+ /*#__PURE__*/ jsx(TextInput, {
133
+ disabled: true,
134
+ readOnly: true,
135
+ value: auth.type ? auth.user ? `${auth.type} (${auth.user})` : auth.type : auth.user || 'None'
136
+ })
137
+ ]
138
+ })
139
+ }),
140
+ transport?.pool && isIdle !== undefined && /*#__PURE__*/ jsx(Grid.Item, {
141
+ col: 6,
142
+ xs: 12,
143
+ direction: "column",
144
+ alignItems: "stretch",
145
+ children: /*#__PURE__*/ jsxs(Field.Root, {
146
+ name: "pool-status",
147
+ children: [
148
+ /*#__PURE__*/ jsx(Field.Label, {
149
+ children: formatMessage({
150
+ id: 'email.Settings.capabilities.label.poolStatus',
151
+ defaultMessage: 'Pool status'
152
+ })
153
+ }),
154
+ /*#__PURE__*/ jsx(Badge, {
155
+ backgroundColor: isIdle ? 'success100' : 'primary100',
156
+ textColor: isIdle ? 'success700' : 'primary700',
157
+ children: isIdle ? formatMessage({
158
+ id: 'email.Settings.capabilities.poolStatus.idle',
159
+ defaultMessage: 'Idle'
160
+ }) : formatMessage({
161
+ id: 'email.Settings.capabilities.poolStatus.active',
162
+ defaultMessage: 'Active'
163
+ })
164
+ })
165
+ ]
166
+ })
167
+ }),
168
+ features.length > 0 && /*#__PURE__*/ jsx(Grid.Item, {
169
+ col: 12,
170
+ xs: 12,
171
+ direction: "column",
172
+ alignItems: "stretch",
173
+ children: /*#__PURE__*/ jsxs(Field.Root, {
174
+ name: "features",
175
+ children: [
176
+ /*#__PURE__*/ jsx(Field.Label, {
177
+ children: formatMessage({
178
+ id: 'email.Settings.capabilities.label.features',
179
+ defaultMessage: 'Enabled features'
180
+ })
181
+ }),
182
+ /*#__PURE__*/ jsx(Flex, {
183
+ gap: 2,
184
+ wrap: "wrap",
185
+ children: features.map((f)=>/*#__PURE__*/ jsx(Badge, {
186
+ backgroundColor: "neutral100",
187
+ textColor: "neutral700",
188
+ children: formatMessage(FEATURE_LABELS[f] ?? {
189
+ id: `email.Settings.capabilities.feature.${f}`,
190
+ defaultMessage: f
191
+ })
192
+ }, f))
193
+ })
194
+ ]
195
+ })
196
+ })
197
+ ]
198
+ })
199
+ ]
200
+ });
201
+ };
17
202
  const ProtectedSettingsPage = ()=>/*#__PURE__*/ jsx(Page.Protect, {
18
203
  permissions: PERMISSIONS.settings,
19
204
  children: /*#__PURE__*/ jsx(SettingsPage, {})
@@ -32,8 +217,13 @@ const SettingsPage = ()=>{
32
217
  'settings'
33
218
  ], async ()=>{
34
219
  const res = await get('/email/settings');
35
- const { data: { config } } = res;
36
- return config;
220
+ const { data: { config, supportsVerify, capabilities, isIdle } } = res;
221
+ return {
222
+ ...config,
223
+ supportsVerify,
224
+ capabilities,
225
+ isIdle
226
+ };
37
227
  });
38
228
  const mutation = useMutation(async (body)=>{
39
229
  await post('/email/test', body);
@@ -62,6 +252,35 @@ const SettingsPage = ()=>{
62
252
  },
63
253
  retry: false
64
254
  });
255
+ const [connectionStatus, setConnectionStatus] = React.useState('idle');
256
+ const verifyMutation = useMutation(async ()=>{
257
+ await post('/email/verify', {});
258
+ }, {
259
+ onMutate () {
260
+ setConnectionStatus('loading');
261
+ },
262
+ onError () {
263
+ setConnectionStatus('error');
264
+ toggleNotification({
265
+ type: 'danger',
266
+ message: formatMessage({
267
+ id: 'email.Settings.email.plugin.notification.verify.error',
268
+ defaultMessage: 'Connection verification failed'
269
+ })
270
+ });
271
+ },
272
+ onSuccess () {
273
+ setConnectionStatus('success');
274
+ toggleNotification({
275
+ type: 'success',
276
+ message: formatMessage({
277
+ id: 'email.Settings.email.plugin.notification.verify.success',
278
+ defaultMessage: 'Connection verified successfully'
279
+ })
280
+ });
281
+ },
282
+ retry: false
283
+ });
65
284
  React.useEffect(()=>{
66
285
  schema.validate({
67
286
  email: testAddress
@@ -176,81 +395,200 @@ const SettingsPage = ()=>{
176
395
  /*#__PURE__*/ jsxs(Grid.Root, {
177
396
  gap: 5,
178
397
  children: [
179
- /*#__PURE__*/ jsx(Grid.Item, {
180
- col: 6,
181
- xs: 12,
182
- direction: "column",
183
- alignItems: "stretch",
184
- children: /*#__PURE__*/ jsxs(Field.Root, {
185
- name: "shipper-email",
398
+ (()=>{
399
+ const parsedFrom = parseEmailAddress(data.settings.defaultFrom);
400
+ const parsedReplyTo = parseEmailAddress(data.settings.defaultReplyTo);
401
+ return /*#__PURE__*/ jsxs(Fragment, {
186
402
  children: [
187
- /*#__PURE__*/ jsx(Field.Label, {
188
- children: formatMessage({
189
- id: 'email.Settings.email.plugin.label.defaultFrom',
190
- defaultMessage: 'Default sender email'
403
+ parsedFrom.name && /*#__PURE__*/ jsx(Grid.Item, {
404
+ col: 6,
405
+ xs: 12,
406
+ direction: "column",
407
+ alignItems: "stretch",
408
+ children: /*#__PURE__*/ jsxs(Field.Root, {
409
+ name: "sender-name",
410
+ children: [
411
+ /*#__PURE__*/ jsx(Field.Label, {
412
+ children: formatMessage({
413
+ id: 'email.Settings.email.plugin.label.senderName',
414
+ defaultMessage: 'Default sender name'
415
+ })
416
+ }),
417
+ /*#__PURE__*/ jsx(TextInput, {
418
+ disabled: true,
419
+ readOnly: true,
420
+ value: parsedFrom.name
421
+ })
422
+ ]
191
423
  })
192
424
  }),
193
- /*#__PURE__*/ jsx(TextInput, {
194
- placeholder: formatMessage({
195
- id: 'email.Settings.email.plugin.placeholder.defaultFrom',
196
- defaultMessage: "ex: Strapi No-Reply '<'no-reply@strapi.io'>'"
197
- }),
198
- disabled: true,
199
- readOnly: true,
200
- value: data.settings.defaultFrom,
201
- type: "email"
425
+ /*#__PURE__*/ jsx(Grid.Item, {
426
+ col: 6,
427
+ xs: 12,
428
+ direction: "column",
429
+ alignItems: "stretch",
430
+ children: /*#__PURE__*/ jsxs(Field.Root, {
431
+ name: "sender-email",
432
+ children: [
433
+ /*#__PURE__*/ jsx(Field.Label, {
434
+ children: formatMessage({
435
+ id: 'email.Settings.email.plugin.label.defaultFrom',
436
+ defaultMessage: 'Default sender email'
437
+ })
438
+ }),
439
+ /*#__PURE__*/ jsx(TextInput, {
440
+ placeholder: formatMessage({
441
+ id: 'email.Settings.email.plugin.placeholder.defaultFrom',
442
+ defaultMessage: 'ex: no-reply@strapi.io'
443
+ }),
444
+ disabled: true,
445
+ readOnly: true,
446
+ value: parsedFrom.email,
447
+ type: "email"
448
+ })
449
+ ]
450
+ })
451
+ }),
452
+ parsedReplyTo.name && /*#__PURE__*/ jsx(Grid.Item, {
453
+ col: 6,
454
+ xs: 12,
455
+ direction: "column",
456
+ alignItems: "stretch",
457
+ children: /*#__PURE__*/ jsxs(Field.Root, {
458
+ name: "reply-to-name",
459
+ children: [
460
+ /*#__PURE__*/ jsx(Field.Label, {
461
+ children: formatMessage({
462
+ id: 'email.Settings.email.plugin.label.replyToName',
463
+ defaultMessage: 'Default reply-to name'
464
+ })
465
+ }),
466
+ /*#__PURE__*/ jsx(TextInput, {
467
+ disabled: true,
468
+ readOnly: true,
469
+ value: parsedReplyTo.name
470
+ })
471
+ ]
472
+ })
473
+ }),
474
+ /*#__PURE__*/ jsx(Grid.Item, {
475
+ col: 6,
476
+ xs: 12,
477
+ direction: "column",
478
+ alignItems: "stretch",
479
+ children: /*#__PURE__*/ jsxs(Field.Root, {
480
+ name: "reply-to-email",
481
+ children: [
482
+ /*#__PURE__*/ jsx(Field.Label, {
483
+ children: formatMessage({
484
+ id: 'email.Settings.email.plugin.label.defaultReplyTo',
485
+ defaultMessage: 'Default response email'
486
+ })
487
+ }),
488
+ /*#__PURE__*/ jsx(TextInput, {
489
+ placeholder: formatMessage({
490
+ id: 'email.Settings.email.plugin.placeholder.defaultReplyTo',
491
+ defaultMessage: 'ex: support@strapi.io'
492
+ }),
493
+ disabled: true,
494
+ readOnly: true,
495
+ value: parsedReplyTo.email,
496
+ type: "email"
497
+ })
498
+ ]
499
+ })
202
500
  })
203
501
  ]
204
- })
205
- }),
502
+ });
503
+ })(),
206
504
  /*#__PURE__*/ jsx(Grid.Item, {
207
505
  col: 6,
208
506
  xs: 12,
209
507
  direction: "column",
210
508
  alignItems: "stretch",
211
509
  children: /*#__PURE__*/ jsxs(Field.Root, {
212
- name: "response-email",
510
+ name: "email-provider",
213
511
  children: [
214
512
  /*#__PURE__*/ jsx(Field.Label, {
215
513
  children: formatMessage({
216
- id: 'email.Settings.email.plugin.label.defaultReplyTo',
217
- defaultMessage: 'Default response email'
514
+ id: 'email.Settings.email.plugin.label.provider',
515
+ defaultMessage: 'Email provider'
218
516
  })
219
517
  }),
220
- /*#__PURE__*/ jsx(TextInput, {
221
- placeholder: formatMessage({
222
- id: 'email.Settings.email.plugin.placeholder.defaultReplyTo',
223
- defaultMessage: `ex: Strapi '<'example@strapi.io'>'`
224
- }),
518
+ /*#__PURE__*/ jsx(SingleSelect, {
225
519
  disabled: true,
226
- readOnly: true,
227
- value: data.settings.defaultReplyTo,
228
- type: "email"
520
+ value: data.provider,
521
+ children: /*#__PURE__*/ jsx(SingleSelectOption, {
522
+ value: data.provider,
523
+ children: data.provider
524
+ })
229
525
  })
230
526
  ]
231
527
  })
232
528
  }),
233
- /*#__PURE__*/ jsx(Grid.Item, {
529
+ data.supportsVerify && /*#__PURE__*/ jsx(Grid.Item, {
234
530
  col: 6,
235
531
  xs: 12,
236
532
  direction: "column",
237
- alignItems: "stretch",
533
+ alignItems: "start",
238
534
  children: /*#__PURE__*/ jsxs(Field.Root, {
239
- name: "email-provider",
535
+ name: "verify-connection",
240
536
  children: [
241
537
  /*#__PURE__*/ jsx(Field.Label, {
242
538
  children: formatMessage({
243
- id: 'email.Settings.email.plugin.label.provider',
244
- defaultMessage: 'Email provider'
539
+ id: 'email.Settings.email.plugin.label.verifyConnection',
540
+ defaultMessage: 'Connection status'
245
541
  })
246
542
  }),
247
- /*#__PURE__*/ jsx(SingleSelect, {
248
- disabled: true,
249
- value: data.provider,
250
- children: /*#__PURE__*/ jsx(SingleSelectOption, {
251
- value: data.provider,
252
- children: data.provider
253
- })
543
+ /*#__PURE__*/ jsxs(Flex, {
544
+ gap: 2,
545
+ alignItems: "center",
546
+ children: [
547
+ /*#__PURE__*/ jsx(Button, {
548
+ variant: "secondary",
549
+ loading: verifyMutation.isLoading,
550
+ onClick: ()=>verifyMutation.mutate(),
551
+ type: "button",
552
+ children: formatMessage({
553
+ id: 'email.Settings.email.plugin.button.verify',
554
+ defaultMessage: 'Test connection'
555
+ })
556
+ }),
557
+ connectionStatus === 'success' && /*#__PURE__*/ jsx(Badge, {
558
+ backgroundColor: "success100",
559
+ textColor: "success700",
560
+ children: /*#__PURE__*/ jsxs(Flex, {
561
+ gap: 1,
562
+ children: [
563
+ /*#__PURE__*/ jsx(Check, {
564
+ width: "1.2rem",
565
+ height: "1.2rem"
566
+ }),
567
+ formatMessage({
568
+ id: 'email.Settings.email.plugin.status.connected',
569
+ defaultMessage: 'Connected'
570
+ })
571
+ ]
572
+ })
573
+ }),
574
+ connectionStatus === 'error' && /*#__PURE__*/ jsx(Badge, {
575
+ backgroundColor: "danger100",
576
+ textColor: "danger700",
577
+ children: /*#__PURE__*/ jsxs(Flex, {
578
+ gap: 1,
579
+ children: [
580
+ /*#__PURE__*/ jsx(Cross, {
581
+ width: "1.2rem",
582
+ height: "1.2rem"
583
+ }),
584
+ formatMessage({
585
+ id: 'email.Settings.email.plugin.status.error',
586
+ defaultMessage: 'Error'
587
+ })
588
+ ]
589
+ })
590
+ })
591
+ ]
254
592
  })
255
593
  ]
256
594
  })
@@ -260,6 +598,20 @@ const SettingsPage = ()=>{
260
598
  ]
261
599
  })
262
600
  }),
601
+ data.capabilities && (data.capabilities.transport || data.capabilities.auth || data.capabilities.features && data.capabilities.features.length > 0) && /*#__PURE__*/ jsx(Box, {
602
+ background: "neutral0",
603
+ hasRadius: true,
604
+ shadow: "filterShadow",
605
+ paddingTop: 6,
606
+ paddingBottom: 6,
607
+ paddingLeft: 7,
608
+ paddingRight: 7,
609
+ children: /*#__PURE__*/ jsx(CapabilitiesSection, {
610
+ capabilities: data.capabilities,
611
+ isIdle: data.isIdle,
612
+ formatMessage: formatMessage
613
+ })
614
+ }),
263
615
  /*#__PURE__*/ jsxs(Flex, {
264
616
  alignItems: "stretch",
265
617
  background: "neutral0",