/* eslint global-require: 0 */ import React from 'react'; import { localized, PropTypes, Actions, TaskQueue, GetMessageRFC2822Task, Thread, Message, } from 'mailspring-exports'; import { RetinaImg, ButtonDropdown, Menu } from 'mailspring-component-kit'; import { ipcRenderer, SaveDialogReturnValue } from 'electron'; import { dialog } from '@electron/remote'; interface MessageControlsProps { thread: Thread; message: Message; } export default class MessageControls extends React.Component { static displayName = 'MessageControls'; static propTypes = { thread: PropTypes.object.isRequired, message: PropTypes.object.isRequired, }; _items() { const reply = { name: localized('Reply'), image: 'ic-dropdown-reply.png', select: this._onReply, }; const replyAll = { name: localized('Reply All'), image: 'ic-dropdown-replyall.png', select: this._onReplyAll, }; const forward = { name: localized('Forward'), image: 'ic-dropdown-forward.png', select: this._onForward, }; const showOriginal = { name: localized('Show Original'), image: 'ic-dropdown-whitespace.png', select: this._onShowOriginal, }; const downloadEmail = { name: localized('Download email'), image: 'ic-dropdown-whitespace.png', // TODO: Image isn't working - in this folders assets folder though // image: 'mail-download-icon@2x.png', select: this._onDownloadEmail, }; if (!this.props.message.canReplyAll()) { return [reply, forward, showOriginal, downloadEmail]; } const defaultReplyType = AppEnv.config.get('core.sending.defaultReplyType'); return (defaultReplyType === 'reply-all' ? [replyAll, reply] : [reply, replyAll]).concat( forward, showOriginal, downloadEmail ); } _dropdownMenu(items) { const itemContent = item => (   {item.name}   ); return ( item.name} itemContent={itemContent} onSelect={item => item.select()} /> ); } _onReply = () => { const { thread, message } = this.props; Actions.composeReply({ thread, message, type: 'reply', behavior: 'prefer-existing-if-pristine', }); }; _onReplyAll = () => { const { thread, message } = this.props; Actions.composeReply({ thread, message, type: 'reply-all', behavior: 'prefer-existing-if-pristine', }); }; _onForward = () => { const { thread, message } = this.props; Actions.composeForward({ thread, message }); }; _onShowActionsMenu = () => { const SystemMenu = require('@electron/remote').Menu; const SystemMenuItem = require('@electron/remote').MenuItem; // Todo: refactor this so that message actions are provided // dynamically. Waiting to see if this will be used often. const menu = new SystemMenu(); menu.append(new SystemMenuItem({ label: localized('Log Data'), click: this._onLogData })); menu.append( new SystemMenuItem({ label: localized('Show Original'), click: this._onShowOriginal }) ); menu.append( new SystemMenuItem({ label: localized('Copy Debug Info to Clipboard'), click: this._onCopyToClipboard, }) ); menu.popup({}); }; _onShowOriginal = async () => { const { message } = this.props; const filepath = require('path').join( require('@electron/remote').app.getPath('temp'), message.id ); const task = new GetMessageRFC2822Task({ messageId: message.id, accountId: message.accountId, filepath, }); Actions.queueTask(task); await TaskQueue.waitForPerformRemote(task); const { BrowserWindow } = require('@electron/remote'); const win = new BrowserWindow({ width: 800, height: 600, title: `${message.subject} - RFC822`, webPreferences: { javascript: false, nodeIntegration: false, }, }); win.loadURL(`file://${filepath}`); }; _onDownloadEmail = async () => { const { message } = this.props; const filepath = await dialog.showSaveDialog({ filters: [{ name: 'Email', extensions: ['.eml'] }], defaultPath: `${message.subject} - ${new Date().toLocaleDateString( 'sv-SE' )} - ${message.id.substring(0, 10)}.eml`, }); if (!filepath.canceled && filepath.filePath) { Actions.queueTask( new GetMessageRFC2822Task({ messageId: message.id, accountId: message.accountId, filepath: filepath.filePath, }) ); } }; _onLogData = () => { console.log(this.props.message); (window as any).__message = this.props.message; (window as any).__thread = this.props.thread; console.log('Also now available in window.__message and window.__thread'); }; _onCopyToClipboard = () => { const { message, thread } = this.props; const clipboard = require('electron').clipboard; const data = ` AccountID: ${message.accountId} Message ID: ${message.id} Message Metadata: ${JSON.stringify(message.pluginMetadata, null, ' ')} Thread ID: ${thread.id} Thread Metadata: ${JSON.stringify(thread.pluginMetadata, null, ' ')} `; clipboard.writeText(data); }; render() { const items = this._items(); return (
e.stopPropagation()}> } primaryTitle={items[0].name} primaryClick={items[0].select} closeOnMenuClick menu={this._dropdownMenu(items.slice(1))} />
); } }