{"version":3,"file":"Settings-kOsgEBAi.mjs","sources":["../../admin/src/utils/schema.ts","../../admin/src/pages/Settings.tsx"],"sourcesContent":["import { translatedErrors } from '@strapi/helper-plugin';\nimport * as yup from 'yup';\n\nexport const schema = yup.object().shape({\n  email: yup.string().email(translatedErrors.email).required(translatedErrors.required),\n});\n","import * as React from 'react';\n\nimport {\n  Box,\n  Button,\n  ContentLayout,\n  Flex,\n  Grid,\n  GridItem,\n  HeaderLayout,\n  Main,\n  Option,\n  Select,\n  TextInput,\n  Typography,\n} from '@strapi/design-system';\nimport {\n  CheckPagePermissions,\n  getYupInnerErrors,\n  LoadingIndicatorPage,\n  SettingsPageTitle,\n  useFetchClient,\n  useFocusWhenNavigate,\n  useNotification,\n  useOverlayBlocker,\n} from '@strapi/helper-plugin';\nimport { Envelop } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useQuery, useMutation } from 'react-query';\nimport styled from 'styled-components';\nimport { ValidationError } from 'yup';\n\nimport { PERMISSIONS } from '../constants';\nimport { schema } from '../utils/schema';\n\nimport type { EmailSettings } from '../../../shared/types';\n\nconst DocumentationLink = styled.a`\n  color: ${({ theme }) => theme.colors.primary600};\n`;\n\ninterface MutationBody {\n  to: string;\n}\n\nexport const ProtectedSettingsPage = () => (\n  <CheckPagePermissions permissions={PERMISSIONS.settings}>\n    <SettingsPage />\n  </CheckPagePermissions>\n);\n\nconst SettingsPage = () => {\n  const toggleNotification = useNotification();\n  const { formatMessage } = useIntl();\n  const { lockApp, unlockApp } = useOverlayBlocker();\n  const { get, post } = useFetchClient();\n\n  const [testAddress, setTestAddress] = React.useState('');\n  const [isTestAddressValid, setIsTestAddressValid] = React.useState(false);\n\n  // TODO: I'm not sure how to type this. I think it should be Record<string, TranslationMessage> but that type is defined in the helper-plugin\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const [formErrors, setFormErrors] = React.useState<Record<string, any>>({});\n\n  const { data, isLoading } = useQuery(['email', 'settings'], async () => {\n    const res = await get<EmailSettings>('/email/settings');\n    const {\n      data: { config },\n    } = res;\n\n    return config;\n  });\n\n  const mutation = useMutation<void, Error, MutationBody>(\n    async (body) => {\n      await post('/email/test', body);\n    },\n    {\n      onError() {\n        toggleNotification!({\n          type: 'warning',\n          message: formatMessage(\n            {\n              id: 'email.Settings.email.plugin.notification.test.error',\n              defaultMessage: 'Failed to send a test mail to {to}',\n            },\n            { to: testAddress }\n          ),\n        });\n      },\n      onSuccess() {\n        toggleNotification!({\n          type: 'success',\n          message: formatMessage(\n            {\n              id: 'email.Settings.email.plugin.notification.test.success',\n              defaultMessage: 'Email test succeeded, check the {to} mailbox',\n            },\n            { to: testAddress }\n          ),\n        });\n      },\n      retry: false,\n    }\n  );\n\n  useFocusWhenNavigate();\n\n  React.useEffect(() => {\n    schema\n      .validate({ email: testAddress }, { abortEarly: false })\n      .then(() => setIsTestAddressValid(true))\n      .catch(() => setIsTestAddressValid(false));\n  }, [testAddress]);\n\n  const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n    setTestAddress(() => event.target.value);\n  };\n\n  const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n    event.preventDefault();\n\n    try {\n      await schema.validate({ email: testAddress }, { abortEarly: false });\n    } catch (error) {\n      if (error instanceof ValidationError) {\n        setFormErrors(getYupInnerErrors(error));\n      }\n    }\n\n    lockApp!();\n\n    mutation.mutate({ to: testAddress });\n\n    unlockApp!();\n  };\n\n  return (\n    <Main labelledBy=\"title\" aria-busy={isLoading || mutation.isLoading}>\n      <SettingsPageTitle\n        name={formatMessage({\n          id: 'email.Settings.email.plugin.title',\n          defaultMessage: 'Configuration',\n        })}\n      />\n\n      <HeaderLayout\n        id=\"title\"\n        title={formatMessage({\n          id: 'email.Settings.email.plugin.title',\n          defaultMessage: 'Configuration',\n        })}\n        subtitle={formatMessage({\n          id: 'email.Settings.email.plugin.subTitle',\n          defaultMessage: 'Test the settings for the Email plugin',\n        })}\n      />\n\n      <ContentLayout>\n        {isLoading ? (\n          <LoadingIndicatorPage />\n        ) : (\n          data && (\n            <form onSubmit={handleSubmit}>\n              <Flex direction=\"column\" alignItems=\"stretch\" gap={7}>\n                <Box\n                  background=\"neutral0\"\n                  hasRadius\n                  shadow=\"filterShadow\"\n                  paddingTop={6}\n                  paddingBottom={6}\n                  paddingLeft={7}\n                  paddingRight={7}\n                >\n                  <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n                    <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n                      <Typography variant=\"delta\" as=\"h2\">\n                        {formatMessage({\n                          id: 'email.Settings.email.plugin.title.config',\n                          defaultMessage: 'Configuration',\n                        })}\n                      </Typography>\n                      <Typography>\n                        {formatMessage(\n                          {\n                            id: 'email.Settings.email.plugin.text.configuration',\n                            defaultMessage:\n                              'The plugin is configured through the {file} file, checkout this {link} for the documentation.',\n                          },\n                          {\n                            file: './config/plugins.js',\n                            link: (\n                              <DocumentationLink\n                                href=\"https://docs.strapi.io/developer-docs/latest/plugins/email.html\"\n                                target=\"_blank\"\n                                rel=\"noopener noreferrer\"\n                              >\n                                {formatMessage({\n                                  id: 'email.link',\n                                  defaultMessage: 'Link',\n                                })}\n                              </DocumentationLink>\n                            ),\n                          }\n                        )}\n                      </Typography>\n                    </Flex>\n\n                    <Grid gap={5}>\n                      <GridItem col={6} s={12}>\n                        <TextInput\n                          name=\"shipper-email\"\n                          label={formatMessage({\n                            id: 'email.Settings.email.plugin.label.defaultFrom',\n                            defaultMessage: 'Default sender email',\n                          })}\n                          placeholder={formatMessage({\n                            id: 'email.Settings.email.plugin.placeholder.defaultFrom',\n                            defaultMessage: \"ex: Strapi No-Reply '<'no-reply@strapi.io'>'\",\n                          })}\n                          disabled\n                          value={data.settings.defaultFrom}\n                        />\n                      </GridItem>\n\n                      <GridItem col={6} s={12}>\n                        <TextInput\n                          name=\"response-email\"\n                          label={formatMessage({\n                            id: 'email.Settings.email.plugin.label.defaultReplyTo',\n                            defaultMessage: 'Default response email',\n                          })}\n                          placeholder={formatMessage({\n                            id: 'email.Settings.email.plugin.placeholder.defaultReplyTo',\n                            defaultMessage: `ex: Strapi '<'example@strapi.io'>'`,\n                          })}\n                          disabled\n                          value={data.settings.defaultReplyTo}\n                        />\n                      </GridItem>\n\n                      <GridItem col={6} s={12}>\n                        <Select\n                          name=\"email-provider\"\n                          label={formatMessage({\n                            id: 'email.Settings.email.plugin.label.provider',\n                            defaultMessage: 'Email provider',\n                          })}\n                          disabled\n                          value={data.provider}\n                        >\n                          <Option value={data.provider}>{data.provider}</Option>\n                        </Select>\n                      </GridItem>\n                    </Grid>\n                  </Flex>\n                </Box>\n\n                <Flex\n                  alignItems=\"stretch\"\n                  background=\"neutral0\"\n                  direction=\"column\"\n                  gap={4}\n                  hasRadius\n                  shadow=\"filterShadow\"\n                  paddingTop={6}\n                  paddingBottom={6}\n                  paddingLeft={7}\n                  paddingRight={7}\n                >\n                  <Typography variant=\"delta\" as=\"h2\">\n                    {formatMessage({\n                      id: 'email.Settings.email.plugin.title.test',\n                      defaultMessage: 'Test email delivery',\n                    })}\n                  </Typography>\n\n                  <Grid gap={5}>\n                    <GridItem col={6} s={12}>\n                      <TextInput\n                        id=\"test-address-input\"\n                        name=\"test-address\"\n                        onChange={handleChange}\n                        label={formatMessage({\n                          id: 'email.Settings.email.plugin.label.testAddress',\n                          defaultMessage: 'Recipient email',\n                        })}\n                        value={testAddress}\n                        error={\n                          formErrors.email?.id &&\n                          formatMessage({\n                            id: `email.${formErrors.email?.id}`,\n                            defaultMessage: 'This is an invalid email',\n                          })\n                        }\n                        placeholder={formatMessage({\n                          id: 'email.Settings.email.plugin.placeholder.testAddress',\n                          defaultMessage: 'ex: developer@example.com',\n                        })}\n                      />\n                    </GridItem>\n                    <GridItem col={7} s={12}>\n                      <Button\n                        loading={mutation.isLoading}\n                        disabled={!isTestAddressValid}\n                        type=\"submit\"\n                        startIcon={<Envelop />}\n                      >\n                        {formatMessage({\n                          id: 'email.Settings.email.plugin.button.test-email',\n                          defaultMessage: 'Send test email',\n                        })}\n                      </Button>\n                    </GridItem>\n                  </Grid>\n                </Flex>\n              </Flex>\n            </form>\n          )\n        )}\n      </ContentLayout>\n    </Main>\n  );\n};\n"],"names":[],"mappings":";;;;;;;;;;;AAGO,MAAM,SAAS,IAAI,OAAO,EAAE,MAAM;AAAA,EACvC,OAAO,IAAI,OAAA,EAAS,MAAM,iBAAiB,KAAK,EAAE,SAAS,iBAAiB,QAAQ;AACtF,CAAC;ACgCD,MAAM,oBAAoB,OAAO;AAAA,WACtB,CAAC,EAAE,MAAA,MAAY,MAAM,OAAO,UAAU;AAAA;AAOpC,MAAA,wBAAwB,MAClC,oBAAA,sBAAA,EAAqB,aAAa,YAAY,UAC7C,UAAC,oBAAA,cAAA,CAAA,CAAa,EAChB,CAAA;AAGF,MAAM,eAAe,MAAM;AACzB,QAAM,qBAAqB;AACrB,QAAA,EAAE,kBAAkB;AAC1B,QAAM,EAAE,SAAS,UAAU,IAAI,kBAAkB;AACjD,QAAM,EAAE,KAAK,KAAK,IAAI,eAAe;AAErC,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAAS,EAAE;AACvD,QAAM,CAAC,oBAAoB,qBAAqB,IAAI,MAAM,SAAS,KAAK;AAIxE,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAA8B,CAAA,CAAE;AAEpE,QAAA,EAAE,MAAM,UAAU,IAAI,SAAS,CAAC,SAAS,UAAU,GAAG,YAAY;AAChE,UAAA,MAAM,MAAM,IAAmB,iBAAiB;AAChD,UAAA;AAAA,MACJ,MAAM,EAAE,OAAO;AAAA,IACb,IAAA;AAEG,WAAA;AAAA,EAAA,CACR;AAED,QAAM,WAAW;AAAA,IACf,OAAO,SAAS;AACR,YAAA,KAAK,eAAe,IAAI;AAAA,IAChC;AAAA,IACA;AAAA,MACE,UAAU;AACY,2BAAA;AAAA,UAClB,MAAM;AAAA,UACN,SAAS;AAAA,YACP;AAAA,cACE,IAAI;AAAA,cACJ,gBAAgB;AAAA,YAClB;AAAA,YACA,EAAE,IAAI,YAAY;AAAA,UACpB;AAAA,QAAA,CACD;AAAA,MACH;AAAA,MACA,YAAY;AACU,2BAAA;AAAA,UAClB,MAAM;AAAA,UACN,SAAS;AAAA,YACP;AAAA,cACE,IAAI;AAAA,cACJ,gBAAgB;AAAA,YAClB;AAAA,YACA,EAAE,IAAI,YAAY;AAAA,UACpB;AAAA,QAAA,CACD;AAAA,MACH;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EAAA;AAGmB;AAErB,QAAM,UAAU,MAAM;AAEjB,WAAA,SAAS,EAAE,OAAO,YAAA,GAAe,EAAE,YAAY,OAAO,EACtD,KAAK,MAAM,sBAAsB,IAAI,CAAC,EACtC,MAAM,MAAM,sBAAsB,KAAK,CAAC;AAAA,EAAA,GAC1C,CAAC,WAAW,CAAC;AAEV,QAAA,eAAe,CAAC,UAA+C;AACpD,mBAAA,MAAM,MAAM,OAAO,KAAK;AAAA,EAAA;AAGnC,QAAA,eAAe,OAAO,UAA4C;AACtE,UAAM,eAAe;AAEjB,QAAA;AACI,YAAA,OAAO,SAAS,EAAE,OAAO,eAAe,EAAE,YAAY,MAAA,CAAO;AAAA,aAC5D,OAAO;AACd,UAAI,iBAAiB,iBAAiB;AACtB,sBAAA,kBAAkB,KAAK,CAAC;AAAA,MACxC;AAAA,IACF;AAES;AAET,aAAS,OAAO,EAAE,IAAI,YAAa,CAAA;AAExB;EAAA;AAGb,8BACG,MAAK,EAAA,YAAW,SAAQ,aAAW,aAAa,SAAS,WACxD,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAM,cAAc;AAAA,UAClB,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAAA,CACjB;AAAA,MAAA;AAAA,IACH;AAAA,IAEA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,IAAG;AAAA,QACH,OAAO,cAAc;AAAA,UACnB,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAAA,CACjB;AAAA,QACD,UAAU,cAAc;AAAA,UACtB,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAAA,CACjB;AAAA,MAAA;AAAA,IACH;AAAA,wBAEC,eACE,EAAA,UAAA,gCACE,sBAAqB,EAAA,IAEtB,QACG,oBAAA,QAAA,EAAK,UAAU,cACd,+BAAC,MAAK,EAAA,WAAU,UAAS,YAAW,WAAU,KAAK,GACjD,UAAA;AAAA,MAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,YAAW;AAAA,UACX,WAAS;AAAA,UACT,QAAO;AAAA,UACP,YAAY;AAAA,UACZ,eAAe;AAAA,UACf,aAAa;AAAA,UACb,cAAc;AAAA,UAEd,+BAAC,MAAK,EAAA,WAAU,UAAS,YAAW,WAAU,KAAK,GACjD,UAAA;AAAA,YAAA,qBAAC,QAAK,WAAU,UAAS,YAAW,WAAU,KAAK,GACjD,UAAA;AAAA,cAAA,oBAAC,YAAW,EAAA,SAAQ,SAAQ,IAAG,MAC5B,UAAc,cAAA;AAAA,gBACb,IAAI;AAAA,gBACJ,gBAAgB;AAAA,cACjB,CAAA,GACH;AAAA,kCACC,YACE,EAAA,UAAA;AAAA,gBACC;AAAA,kBACE,IAAI;AAAA,kBACJ,gBACE;AAAA,gBACJ;AAAA,gBACA;AAAA,kBACE,MAAM;AAAA,kBACN,MACE;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,QAAO;AAAA,sBACP,KAAI;AAAA,sBAEH,UAAc,cAAA;AAAA,wBACb,IAAI;AAAA,wBACJ,gBAAgB;AAAA,sBAAA,CACjB;AAAA,oBAAA;AAAA,kBACH;AAAA,gBAEJ;AAAA,cAAA,GAEJ;AAAA,YAAA,GACF;AAAA,YAEA,qBAAC,MAAK,EAAA,KAAK,GACT,UAAA;AAAA,cAAA,oBAAC,UAAS,EAAA,KAAK,GAAG,GAAG,IACnB,UAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,OAAO,cAAc;AAAA,oBACnB,IAAI;AAAA,oBACJ,gBAAgB;AAAA,kBAAA,CACjB;AAAA,kBACD,aAAa,cAAc;AAAA,oBACzB,IAAI;AAAA,oBACJ,gBAAgB;AAAA,kBAAA,CACjB;AAAA,kBACD,UAAQ;AAAA,kBACR,OAAO,KAAK,SAAS;AAAA,gBAAA;AAAA,cAAA,GAEzB;AAAA,cAEC,oBAAA,UAAA,EAAS,KAAK,GAAG,GAAG,IACnB,UAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,OAAO,cAAc;AAAA,oBACnB,IAAI;AAAA,oBACJ,gBAAgB;AAAA,kBAAA,CACjB;AAAA,kBACD,aAAa,cAAc;AAAA,oBACzB,IAAI;AAAA,oBACJ,gBAAgB;AAAA,kBAAA,CACjB;AAAA,kBACD,UAAQ;AAAA,kBACR,OAAO,KAAK,SAAS;AAAA,gBAAA;AAAA,cAAA,GAEzB;AAAA,cAEC,oBAAA,UAAA,EAAS,KAAK,GAAG,GAAG,IACnB,UAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,OAAO,cAAc;AAAA,oBACnB,IAAI;AAAA,oBACJ,gBAAgB;AAAA,kBAAA,CACjB;AAAA,kBACD,UAAQ;AAAA,kBACR,OAAO,KAAK;AAAA,kBAEZ,8BAAC,QAAO,EAAA,OAAO,KAAK,UAAW,eAAK,UAAS;AAAA,gBAAA;AAAA,cAAA,GAEjD;AAAA,YAAA,GACF;AAAA,UAAA,GACF;AAAA,QAAA;AAAA,MACF;AAAA,MAEA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,YAAW;AAAA,UACX,YAAW;AAAA,UACX,WAAU;AAAA,UACV,KAAK;AAAA,UACL,WAAS;AAAA,UACT,QAAO;AAAA,UACP,YAAY;AAAA,UACZ,eAAe;AAAA,UACf,aAAa;AAAA,UACb,cAAc;AAAA,UAEd,UAAA;AAAA,YAAA,oBAAC,YAAW,EAAA,SAAQ,SAAQ,IAAG,MAC5B,UAAc,cAAA;AAAA,cACb,IAAI;AAAA,cACJ,gBAAgB;AAAA,YACjB,CAAA,GACH;AAAA,YAEA,qBAAC,MAAK,EAAA,KAAK,GACT,UAAA;AAAA,cAAA,oBAAC,UAAS,EAAA,KAAK,GAAG,GAAG,IACnB,UAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,IAAG;AAAA,kBACH,MAAK;AAAA,kBACL,UAAU;AAAA,kBACV,OAAO,cAAc;AAAA,oBACnB,IAAI;AAAA,oBACJ,gBAAgB;AAAA,kBAAA,CACjB;AAAA,kBACD,OAAO;AAAA,kBACP,OACE,WAAW,OAAO,MAClB,cAAc;AAAA,oBACZ,IAAI,SAAS,WAAW,OAAO,EAAE;AAAA,oBACjC,gBAAgB;AAAA,kBAAA,CACjB;AAAA,kBAEH,aAAa,cAAc;AAAA,oBACzB,IAAI;AAAA,oBACJ,gBAAgB;AAAA,kBAAA,CACjB;AAAA,gBAAA;AAAA,cAAA,GAEL;AAAA,cACC,oBAAA,UAAA,EAAS,KAAK,GAAG,GAAG,IACnB,UAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,SAAS,SAAS;AAAA,kBAClB,UAAU,CAAC;AAAA,kBACX,MAAK;AAAA,kBACL,+BAAY,SAAQ,EAAA;AAAA,kBAEnB,UAAc,cAAA;AAAA,oBACb,IAAI;AAAA,oBACJ,gBAAgB;AAAA,kBAAA,CACjB;AAAA,gBAAA;AAAA,cAAA,GAEL;AAAA,YAAA,GACF;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA,EACF,CAAA,EACF,CAAA,GAGN;AAAA,EACF,EAAA,CAAA;AAEJ;"}