/* * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ import { EuiButton, EuiComboBox, EuiComboBoxOptionOption, EuiFlexGroup, EuiFlexItem, EuiFormRow, EuiRadioGroup, EuiSpacer, SortDirection, } from '@elastic/eui'; import React, { useCallback, useContext, useEffect, useState } from 'react'; import { SenderType } from '../../../../models/interfaces'; import { CoreServicesContext } from '../../../components/coreServices'; import { ModalConsumer } from '../../../components/Modal'; import { ServicesContext } from '../../../services'; import { getErrorMessage } from '../../../utils/helpers'; import { onComboBoxCreateOption } from '../../Emails/utils/helper'; import { MainContext } from '../../Main/Main'; import { CreateChannelContext } from '../CreateChannel'; import { validateEmailSender, validateRecipients, } from '../utils/validationHelper'; import { CreateRecipientGroupModal } from './modals/CreateRecipientGroupModal'; import { CreateSenderModal } from './modals/CreateSenderModal'; import { CreateSESSenderModal } from './modals/CreateSESSenderModal'; interface EmailSettingsProps { senderType: SenderType; setSenderType: (senderType: SenderType) => void; selectedSmtpSenderOptions: Array>; setSelectedSmtpSenderOptions: ( options: Array> ) => void; selectedSesSenderOptions: Array>; setSelectedSesSenderOptions: ( options: Array> ) => void; selectedRecipientGroupOptions: Array>; setSelectedRecipientGroupOptions: ( options: Array> ) => void; } export function EmailSettings(props: EmailSettingsProps) { const context = useContext(CreateChannelContext)!; const coreContext = useContext(CoreServicesContext)!; const servicesContext = useContext(ServicesContext)!; const mainStateContext = useContext(MainContext)!; const [smtpAvailable, setSmtpAvailable] = useState(true); useEffect(() => { if (!mainStateContext.availableConfigTypes.includes('smtp_account')) { setSmtpAvailable(false); props.setSenderType('ses_account'); } }, []); const [sesSenderOptions, setSesSenderOptions] = useState< Array> >([]); const [smtpSenderOptions, setSmtpSenderOptions] = useState< Array> >([]); const [recipientGroupOptions, setRecipientGroupOptions] = useState< Array> >([]); const getQueryObject = (config_type: string, query?: string) => ({ from_index: 0, max_items: 10000, config_type, sort_field: 'name', sort_order: SortDirection.ASC, ...(query ? { query } : {}), }); const refreshSenders = useCallback(async (query?: string) => { try { const smtpSenders = await servicesContext.notificationService.getSenders( getQueryObject('smtp_account', query) ); setSmtpSenderOptions( smtpSenders.items.map((sender) => ({ label: sender.name, value: sender.config_id, })) ); const sesSenders = await servicesContext.notificationService.getSenders( getQueryObject('ses_account', query) ); setSesSenderOptions( sesSenders.items.map((sender) => ({ label: sender.name, value: sender.config_id, })) ); } catch (error) { coreContext.notifications.toasts.addDanger( getErrorMessage(error, 'There was a problem loading senders.') ); } }, []); const refreshRecipientGroups = useCallback(async (query?: string) => { try { const recipientGroups = await servicesContext.notificationService.getRecipientGroups( getQueryObject('email_group', query) ); setRecipientGroupOptions( recipientGroups.items.map((recipientGroup) => ({ label: recipientGroup.name, value: recipientGroup.config_id, })) ); } catch (error) { coreContext.notifications.toasts.addDanger( getErrorMessage(error, 'There was a problem loading recipient groups.') ); } }, []); useEffect(() => { refreshSenders(); refreshRecipientGroups(); }, []); return ( <> {smtpAvailable && ( props.setSenderType(id as SenderType)} name="sender type radio group" /> )} {props.senderType === 'ses_account' ? ( <> 0} > 0} onBlur={() => { context.setInputErrors({ ...context.inputErrors, sesSender: validateEmailSender( props.selectedSesSenderOptions ), }); }} /> {({ onShow }) => ( onShow(CreateSESSenderModal, { addSenderOptionAndSelect: ( newOption: EuiComboBoxOptionOption ) => { setSesSenderOptions([ ...sesSenderOptions, newOption, ]); props.setSelectedSesSenderOptions([newOption]); context.setInputErrors({ ...context.inputErrors, sesSender: validateEmailSender([newOption]), }); }, }) } > Create SES sender )} ) : ( <> 0} > 0} onBlur={() => { context.setInputErrors({ ...context.inputErrors, smtpSender: validateEmailSender( props.selectedSmtpSenderOptions ), }); }} /> {({ onShow }) => ( onShow(CreateSenderModal, { addSenderOptionAndSelect: ( newOption: EuiComboBoxOptionOption ) => { setSmtpSenderOptions([ ...smtpSenderOptions, newOption, ]); props.setSelectedSmtpSenderOptions([newOption]); context.setInputErrors({ ...context.inputErrors, smtpSender: validateEmailSender([newOption]), }); }, }) } > Create SMTP sender )} )} 0} > onComboBoxCreateOption( searchValue, flattenedOptions, recipientGroupOptions, setRecipientGroupOptions, props.selectedRecipientGroupOptions, props.setSelectedRecipientGroupOptions, (options) => context.setInputErrors({ ...context.inputErrors, recipients: validateRecipients(options), }) ) } customOptionText={'Add {searchValue} as a default recipient'} isClearable={true} isInvalid={context.inputErrors.recipients.length > 0} onBlur={() => { context.setInputErrors({ ...context.inputErrors, recipients: validateRecipients( props.selectedRecipientGroupOptions ), }); }} /> {({ onShow }) => ( onShow(CreateRecipientGroupModal, { addRecipientGroupOptionAndSelect: ( newOption: EuiComboBoxOptionOption ) => { setRecipientGroupOptions([ ...recipientGroupOptions, newOption, ]); props.setSelectedRecipientGroupOptions([ ...props.selectedRecipientGroupOptions, newOption, ]); context.setInputErrors({ ...context.inputErrors, recipients: validateRecipients([newOption]), }); }, }) } > Create recipient group )} ); }