React = require 'react' {remote} = require 'electron' {Actions, NylasAPI, AccountStore} = require 'nylas-exports' {RetinaImg, ButtonDropdown, Menu} = require 'nylas-component-kit' class MessageControls extends React.Component @displayName: "MessageControls" @propTypes: thread: React.PropTypes.object.isRequired message: React.PropTypes.object.isRequired constructor: (@props) -> render: => items = @_items()
} primaryTitle={items[0].name} primaryClick={items[0].select} closeOnMenuClick={true} menu={@_dropdownMenu(items[1..-1])}/>
_items: -> reply = name: 'Reply', image: 'ic-dropdown-reply.png' select: @_onReply replyAll = name: 'Reply All', image: 'ic-dropdown-replyall.png' select: @_onReplyAll forward = name: 'Forward', image: 'ic-dropdown-forward.png' select: @_onForward if @props.message.canReplyAll() defaultReplyType = NylasEnv.config.get('core.sending.defaultReplyType') if defaultReplyType is 'reply-all' return [replyAll, reply, forward] else return [reply, replyAll, forward] else return [reply, forward] _account: => AccountStore.accountForId(@props.message.accountId) _dropdownMenu: (items) -> itemContent = (item) ->   {item.name} item.name } itemContent={itemContent} onSelect={ (item) => item.select() } /> _onReply: => {thread, message} = @props Actions.composeReply({thread, message, type: 'reply', behavior: 'prefer-existing-if-pristine'}) _onReplyAll: => {thread, message} = @props Actions.composeReply({thread, message, type: 'reply-all', behavior: 'prefer-existing-if-pristine'}) _onForward: => Actions.composeForward(thread: @props.thread, message: @props.message) _onShowActionsMenu: => SystemMenu = remote.require('menu') SystemMenuItem = remote.require('menu-item') # Todo: refactor this so that message actions are provided # dynamically. Waiting to see if this will be used often. menu = new SystemMenu() menu.append(new SystemMenuItem({ label: 'Log Data', click: => @_onLogData()})) menu.append(new SystemMenuItem({ label: 'Show Original', click: => @_onShowOriginal()})) menu.append(new SystemMenuItem({ label: 'Copy Debug Info to Clipboard', click: => @_onCopyToClipboard()})) menu.append(new SystemMenuItem({ type: 'separator'})) menu.append(new SystemMenuItem({ label: 'Report Issue: Quoted Text', click: => @_onReport('Quoted Text')})) menu.append(new SystemMenuItem({ label: 'Report Issue: Rendering', click: => @_onReport('Rendering')})) menu.popup(remote.getCurrentWindow()) _onReport: (issueType) => {Contact, Message, DatabaseStore, AccountStore} = require 'nylas-exports' draft = new Message from: [@_account().me()] to: [new Contact(name: "Nylas Team", email: "n1-support@nylas.com")] date: (new Date) draft: true subject: "Feedback - Message Display Issue (#{issueType})" accountId: @_account().id body: @props.message.body DatabaseStore.inTransaction (t) => t.persistModel(draft) .then => Actions.sendDraft(draft.clientId) dialog = remote.require('dialog') dialog.showMessageBox remote.getCurrentWindow(), { type: 'warning' buttons: ['OK'], message: "Thank you." detail: "The contents of this message have been sent to the N1 team and will be added to a test suite." } _onShowOriginal: => fs = require 'fs' path = require 'path' BrowserWindow = remote.require('browser-window') app = remote.require('app') tmpfile = path.join(app.getPath('temp'), @props.message.id) NylasAPI.makeRequest headers: Accept: 'message/rfc822' path: "/messages/#{@props.message.id}" accountId: @props.message.accountId json:false success: (body) => fs.writeFile tmpfile, body, => window = new BrowserWindow(width: 800, height: 600, title: "#{@props.message.subject} - RFC822") window.loadURL('file://'+tmpfile) _onLogData: => console.log @props.message window.__message = @props.message window.__thread = @props.thread console.log "Also now available in window.__message and window.__thread" _onCopyToClipboard: => clipboard = require('electron').clipboard data = "AccountID: #{@props.message.accountId}\n"+ "Message ID: #{@props.message.serverId}\n"+ "Message Metadata: #{JSON.stringify(@props.message.pluginMetadata, null, ' ')}\n"+ "Thread ID: #{@props.thread.serverId}\n"+ "Thread Metadata: #{JSON.stringify(@props.thread.pluginMetadata, null, ' ')}\n" clipboard.writeText(data) module.exports = MessageControls