import React, { useEffect, useState } from 'react'; import { Button, Center, Flex, Input, InputGroup, MenuItem, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalOverlay, Select, Text, useDisclosure, useToast, Alert, AlertIcon, Collapse, Box, TableContainer, Table, Thead, Tr, Th, Tbody, Td, Code, } from '@chakra-ui/react'; import { FaPlus, FaAngleDown, FaAngleUp } from 'react-icons/fa'; import { useClient } from 'urql'; import { Editor } from 'react-draft-wysiwyg'; import { EditorState, convertToRaw, Modifier } from 'draft-js'; import draftToHtml from 'draftjs-to-html'; import { stateFromHTML } from 'draft-js-import-html'; import { UpdateModalViews, EmailTemplateInputDataFields, emailTemplateEventNames, emailTemplateVariables, } from '../constants'; import { capitalizeFirstLetter } from '../utils'; import { AddEmailTemplate, EditEmailTemplate } from '../graphql/mutation'; interface selectedEmailTemplateDataTypes { [EmailTemplateInputDataFields.ID]: string; [EmailTemplateInputDataFields.EVENT_NAME]: string; [EmailTemplateInputDataFields.SUBJECT]: string; [EmailTemplateInputDataFields.CREATED_AT]: number; [EmailTemplateInputDataFields.TEMPLATE]: string; } interface UpdateEmailTemplateInputPropTypes { view: UpdateModalViews; selectedTemplate?: selectedEmailTemplateDataTypes; fetchEmailTemplatesData: Function; } interface templateVariableDataTypes { text: string; value: string; description: string; } interface emailTemplateDataType { [EmailTemplateInputDataFields.EVENT_NAME]: string; [EmailTemplateInputDataFields.SUBJECT]: string; } interface validatorDataType { [EmailTemplateInputDataFields.SUBJECT]: boolean; } const initTemplateData: emailTemplateDataType = { [EmailTemplateInputDataFields.EVENT_NAME]: emailTemplateEventNames.Signup, [EmailTemplateInputDataFields.SUBJECT]: '', }; const initTemplateValidatorData: validatorDataType = { [EmailTemplateInputDataFields.SUBJECT]: true, }; const UpdateEmailTemplate = ({ view, selectedTemplate, fetchEmailTemplatesData, }: UpdateEmailTemplateInputPropTypes) => { const client = useClient(); const toast = useToast(); const { isOpen, onOpen, onClose } = useDisclosure(); const [loading, setLoading] = useState(false); const [editorState, setEditorState] = React.useState( EditorState.createEmpty() ); const [templateVariables, setTemplateVariables] = useState< templateVariableDataTypes[] >([]); const [templateData, setTemplateData] = useState({ ...initTemplateData, }); const [validator, setValidator] = useState({ ...initTemplateValidatorData, }); const onEditorStateChange = (editorState: EditorState) => { setEditorState(editorState); }; const [isDynamicVariableInfoOpen, setIsDynamicVariableInfoOpen] = useState(false); const inputChangehandler = (inputType: string, value: any) => { if (inputType !== EmailTemplateInputDataFields.EVENT_NAME) { setValidator({ ...validator, [inputType]: value?.trim().length, }); } setTemplateData({ ...templateData, [inputType]: value }); }; const validateData = () => { const rawData: string = draftToHtml( convertToRaw(editorState.getCurrentContent()) ).trim(); return ( !loading && rawData && rawData !== '

' && rawData !== '

' && templateData[EmailTemplateInputDataFields.EVENT_NAME].length > 0 && templateData[EmailTemplateInputDataFields.SUBJECT].length > 0 && validator[EmailTemplateInputDataFields.SUBJECT] ); }; const saveData = async () => { if (!validateData()) return; setLoading(true); const params = { [EmailTemplateInputDataFields.EVENT_NAME]: templateData[EmailTemplateInputDataFields.EVENT_NAME], [EmailTemplateInputDataFields.SUBJECT]: templateData[EmailTemplateInputDataFields.SUBJECT], [EmailTemplateInputDataFields.TEMPLATE]: draftToHtml( convertToRaw(editorState.getCurrentContent()) ).trim(), }; let res: any = {}; if ( view === UpdateModalViews.Edit && selectedTemplate?.[EmailTemplateInputDataFields.ID] ) { res = await client .mutation(EditEmailTemplate, { params: { ...params, id: selectedTemplate[EmailTemplateInputDataFields.ID], }, }) .toPromise(); } else { res = await client.mutation(AddEmailTemplate, { params }).toPromise(); } setLoading(false); if (res.error) { toast({ title: capitalizeFirstLetter(res.error.message), isClosable: true, status: 'error', position: 'bottom-right', }); } else if ( res.data?._add_email_template || res.data?._update_email_template ) { toast({ title: capitalizeFirstLetter( res.data?._add_email_template?.message || res.data?._update_email_template?.message ), isClosable: true, status: 'success', position: 'bottom-right', }); setTemplateData({ ...initTemplateData, }); setValidator({ ...initTemplateValidatorData }); fetchEmailTemplatesData(); } view === UpdateModalViews.ADD && onClose(); }; const resetData = () => { if (selectedTemplate) { setTemplateData(selectedTemplate); setEditorState( EditorState.createWithContent(stateFromHTML(selectedTemplate.template)) ); } else { setTemplateData({ ...initTemplateData }); setEditorState(EditorState.createEmpty()); } }; useEffect(() => { if ( isOpen && view === UpdateModalViews.Edit && selectedTemplate && Object.keys(selectedTemplate || {}).length ) { const { id, created_at, template, ...rest } = selectedTemplate; setTemplateData(rest); setEditorState(EditorState.createWithContent(stateFromHTML(template))); } }, [isOpen]); useEffect(() => { const updatedTemplateVariables = Object.entries( emailTemplateVariables ).reduce((acc, [key, val]): any => { if ( (templateData[EmailTemplateInputDataFields.EVENT_NAME] !== emailTemplateEventNames['Verify Otp'] && val === emailTemplateVariables.otp) || (templateData[EmailTemplateInputDataFields.EVENT_NAME] === emailTemplateEventNames['Verify Otp'] && val === emailTemplateVariables.verification_url) ) { return acc; } return [ ...acc, { text: key, value: val.value, description: val.description, }, ]; }, []); setTemplateVariables(updatedTemplateVariables); }, [templateData[EmailTemplateInputDataFields.EVENT_NAME]]); return ( <> {view === UpdateModalViews.ADD ? ( ) : ( Edit )} { resetData(); onClose(); }} size="3xl" > {view === UpdateModalViews.ADD ? 'Add New Email Template' : 'Edit Email Template'} setIsDynamicVariableInfoOpen(!isDynamicVariableInfoOpen) } borderRadius="5" marginY={5} cursor="pointer" fontSize="sm" > Note: You can add set of dynamic variables to subject and email body. Click here to see the set of dynamic variables. {isDynamicVariableInfoOpen ? : } {templateVariables.map((i) => ( ))}
Variable Description
{`{{${i.text}}}`} {i.description}
Event Name Subject inputChangehandler( EmailTemplateInputDataFields.SUBJECT, e.currentTarget.value ) } /> Template Body {`To select dynamic variables open curly braces "{"`} Note: In order to use dynamic variables with link and images you can put them as part of URL in editor section.
); }; export default UpdateEmailTemplate;