/* * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ import { EuiButton, EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiTitle, } from '@elastic/eui'; import React, { useContext, useEffect, useState } from 'react'; import { RouteComponentProps } from 'react-router-dom'; import { SERVER_DELAY } from '../../../common'; import { ContentPanel } from '../../components/ContentPanel'; import { CoreServicesContext } from '../../components/coreServices'; import { ServicesContext } from '../../services'; import { BREADCRUMBS, ROUTES } from '../../utils/constants'; import { getErrorMessage } from '../../utils/helpers'; import { MainContext } from '../Main/Main'; import { CreateSESSenderForm } from './components/forms/CreateSESSenderForm'; import { createSesSenderConfigObject } from './utils/helper'; import { validateAwsRegion, validateEmail, validateRoleArn, validateSenderName, } from './utils/validationHelper'; interface CreateSESSenderProps extends RouteComponentProps<{ id?: string }> { edit?: boolean; } export function CreateSESSender(props: CreateSESSenderProps) { const coreContext = useContext(CoreServicesContext)!; const servicesContext = useContext(ServicesContext)!; const mainStateContext = useContext(MainContext)!; const [loading, setLoading] = useState(false); const [senderName, setSenderName] = useState(''); const [email, setEmail] = useState(''); const [roleArn, setRoleArn] = useState(''); const [awsRegion, setAwsRegion] = useState(''); const [inputErrors, setInputErrors] = useState<{ [key: string]: string[] }>({ senderName: [], email: [], roleArn: [], awsRegion: [], }); useEffect(() => { coreContext.chrome.setBreadcrumbs([ BREADCRUMBS.NOTIFICATIONS, BREADCRUMBS.EMAIL_SENDERS, props.edit ? BREADCRUMBS.EDIT_SES_SENDER : BREADCRUMBS.CREATE_SES_SENDER, ]); window.scrollTo(0, 0); if (props.edit) { getSESSender(); } }, []); const getSESSender = async () => { const id = props.match.params?.id; if (typeof id !== 'string') return; try { const response = await servicesContext.notificationService.getSESSender( id ); setSenderName(response.name); setEmail(response.ses_account.from_address); setRoleArn(response.ses_account.role_arn || ''); setAwsRegion(response.ses_account.region); } catch (error) { coreContext.notifications.toasts.addDanger( getErrorMessage(error, 'There was a problem loading sender.') ); } }; const isInputValid = (): boolean => { const errors: { [key: string]: string[] } = { senderName: validateSenderName(senderName), email: validateEmail(email), awsRegion: validateAwsRegion(awsRegion), roleArn: [], }; if (!mainStateContext.tooltipSupport) { errors.roleArn = validateRoleArn(roleArn); } setInputErrors(errors); return !Object.values(errors).reduce( (errorFlag, error) => errorFlag || error.length > 0, false ); }; return ( <>

{`${props.edit ? 'Edit' : 'Create'} SES sender`}

Cancel { if (!isInputValid()) { coreContext.notifications.toasts.addDanger( 'Some fields are invalid. Fix all highlighted error(s) before continuing.' ); return; } setLoading(true); const config = createSesSenderConfigObject( senderName, email, awsRegion, roleArn ); const request = props.edit ? servicesContext.notificationService.updateConfig( props.match.params.id!, config ) : servicesContext.notificationService.createConfig(config); await request .then((response) => { coreContext.notifications.toasts.addSuccess( `Sender ${senderName} successfully ${ props.edit ? 'updated' : 'created' }.` ); setTimeout( () => (location.hash = `#${ROUTES.EMAIL_SENDERS}`), SERVER_DELAY ); }) .catch((error) => { setLoading(false); coreContext.notifications.toasts.addError(error?.body || error, { title: `Failed to ${ props.edit ? 'update' : 'create' } sender.`, }); }); }} > {props.edit ? 'Save' : 'Create'} ); }