import React from 'react'; import PropTypes from 'prop-types'; import { Editor } from 'react-draft-wysiwyg'; import { convertFromRaw, EditorState, convertToRaw } from 'draft-js'; import draftToHtml from 'draftjs-to-html'; import Dropzone from 'react-dropzone'; import { withStyles } from '@material-ui/core/styles'; import TextField from '@material-ui/core/TextField'; import Attachment from '@material-ui/icons/Attachment'; import FileIcon from '@material-ui/icons/Description'; import ActionDelete from '@material-ui/icons/Delete'; import Send from '@material-ui/icons/Send'; import EditorStyle from 'ba-styles/TextEditor.scss'; import css from 'ba-styles/Form.scss'; import 'ba-styles/vendors/react-draft-wysiwyg/react-draft-wysiwyg.css'; import { Button, Grid, Typography, Snackbar, IconButton } from '@material-ui/core'; import isImage from '../Forms/helpers/helpers.js'; import styles from './email-jss'; const content = { blocks: [{ key: '637gr', text: 'Lorem ipsum dolor sit amet 😀', type: 'unstyled', depth: 0, inlineStyleRanges: [], entityRanges: [], data: {} }], entityMap: {} }; class ComposeEmailForm extends React.Component { constructor(props) { super(props); const contentBlock = convertFromRaw(content); if (contentBlock) { const editorState = EditorState.createWithContent(contentBlock); this.state = { openSnackBar: false, errorMessage: '', files: [], editorState, emailContent: draftToHtml(convertToRaw(editorState.getCurrentContent())), }; } this.onDrop = this.onDrop.bind(this); } onDrop(filesVal) { const { files } = this.state; let oldFiles = files; const filesLimit = 3; oldFiles = oldFiles.concat(filesVal); if (oldFiles.length > filesLimit) { console.log('Cannot upload more than ' + filesLimit + ' items.'); } else { this.setState({ files: oldFiles }); } } onEditorStateChange = editorState => { this.setState({ editorState, emailContent: draftToHtml(convertToRaw(editorState.getCurrentContent())) }); }; onDropRejected() { this.setState({ openSnackBar: true, errorMessage: 'File too big, max size is 3MB', }); } handleRequestCloseSnackBar = () => { this.setState({ openSnackBar: false, }); }; handleRemove(file, fileIndex) { const thisFiles = this.state.files; // This is to prevent memory leaks. window.URL.revokeObjectURL(file.preview); thisFiles.splice(fileIndex, 1); this.setState({ files: thisFiles }); } handleSend = (to, subject, emailContent, files) => { this.props.sendEmail(to, subject, emailContent, files); this.setState({ emailContent: '', files: [] }); }; render() { const { classes, closeForm, to, subject, validMail, inputChange } = this.props; const { editorState, emailContent, files, openSnackBar, errorMessage, } = this.state; let dropzoneRef; const deleteBtn = (file, index) => (
this.handleRemove(file, index)}>
); const previews = filesArray => filesArray.map((file, index) => { if (isImage(file)) { const base64Img = URL.createObjectURL(file); return (
preview
{deleteBtn(file, index)}
{file.name}
); } return (
{deleteBtn(file, index)}
{file.name}
); }); const fileSizeLimit = 3000000; return (
inputChange(event, 'to')} margin="normal" />
inputChange(event, 'subject')} margin="normal" />
{ dropzoneRef = node; }} > {({ getRootProps, getInputProps }) => (
)}
  (Max 3MB)
{previews(files)}
); } } ComposeEmailForm.propTypes = { classes: PropTypes.object.isRequired, to: PropTypes.string.isRequired, subject: PropTypes.string.isRequired, validMail: PropTypes.string.isRequired, sendEmail: PropTypes.func.isRequired, closeForm: PropTypes.func.isRequired, inputChange: PropTypes.func.isRequired, }; export default withStyles(styles)(ComposeEmailForm);