From ea37c75596f4cc6842ff01fdd576d185fbdd2e96 Mon Sep 17 00:00:00 2001 From: Ben Gotow Date: Wed, 19 Feb 2020 23:25:02 -0600 Subject: [PATCH] Add plaintext mail display and composition via new setting / Alt key #52 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Most draft features are disabled in plaintext mode because I don’t think it’s worth trying to make them work unless this gains traction. Mostly doing this so we can add GPG / PGP / Keybase in the future. --- .../lib/signature-composer-dropdown.tsx | 3 + .../lib/signature-composer-extension.ts | 8 +- .../styles/composer-signature.less | 18 ++- .../lib/template-picker.tsx | 10 +- .../styles/message-templates.less | 2 +- .../composer/lib/composer-view.tsx | 83 ++++++---- .../composer/styles/composer.less | 17 ++ .../lib/link-tracking-button.tsx | 4 + .../lib/link-tracking-composer-extension.ts | 9 +- .../message-list/lib/email-frame.tsx | 43 +++-- .../message-list/lib/message-item-body.tsx | 44 ++--- .../message-list/lib/message-list.tsx | 53 ++++-- .../onboarding/styles/onboarding-reset.less | 4 +- .../lib/open-tracking-button.tsx | 3 + .../lib/open-tracking-composer-extension.ts | 6 +- .../lib/tabs/preferences-general.tsx | 23 +-- .../lib/tabs/preferences-keymaps.tsx | 2 +- .../preferences/styles/preferences.less | 18 ++- .../print/static/print-styles.css | 6 +- .../translation/lib/composer-button.tsx | 3 + app/keymaps/templates/Apple Mail.json | 4 +- app/keymaps/templates/Gmail.json | 4 +- app/keymaps/templates/Inbox by Gmail.json | 6 +- app/keymaps/templates/Outlook.json | 4 +- .../composer-editor/base-block-plugins.tsx | 9 +- .../composer-editor-plaintext.tsx | 152 ++++++++++++++++++ .../composer-editor/composer-editor.tsx | 87 +++++----- .../components/composer-editor/conversion.tsx | 25 ++- .../components/composer-editor/plaintext.ts | 112 +++++++++++++ app/src/config-schema.ts | 9 ++ app/src/extensions/composer-extension.ts | 2 +- app/src/flux/models/message.ts | 7 + app/src/flux/models/utils.ts | 5 +- app/src/flux/stores/draft-factory.ts | 79 ++++++--- app/src/flux/stores/message-body-processor.ts | 19 ++- app/src/flux/tasks/send-draft-task.ts | 50 ++++-- app/src/global/mailspring-component-kit.d.ts | 1 + app/src/global/mailspring-component-kit.js | 1 + app/src/keymap-manager.ts | 16 ++ app/src/sheet-toolbar.tsx | 14 +- app/static/style/base/ui-variables.less | 2 +- app/static/style/email-frame.less | 6 + mailsync | 2 +- package-lock.json | 59 ++++--- package.json | 2 +- 45 files changed, 781 insertions(+), 255 deletions(-) create mode 100644 app/src/components/composer-editor/composer-editor-plaintext.tsx create mode 100644 app/src/components/composer-editor/plaintext.ts diff --git a/app/internal_packages/composer-signature/lib/signature-composer-dropdown.tsx b/app/internal_packages/composer-signature/lib/signature-composer-dropdown.tsx index 358bf6194..1fc3dafdf 100644 --- a/app/internal_packages/composer-signature/lib/signature-composer-dropdown.tsx +++ b/app/internal_packages/composer-signature/lib/signature-composer-dropdown.tsx @@ -130,6 +130,9 @@ export default class SignatureComposerDropdown extends React.Component< } render() { + if (this.props.draft.plaintext) { + return ; + } return (
{ - const signatureObj = - draft.from && draft.from[0] ? SignatureStore.signatureForEmail(draft.from[0].email) : null; + if (draft.plaintext) { + return; + } + + const from = draft.from && draft.from[0]; + const signatureObj = from ? SignatureStore.signatureForEmail(from.email) : null; if (!signatureObj) { return; } diff --git a/app/internal_packages/composer-signature/styles/composer-signature.less b/app/internal_packages/composer-signature/styles/composer-signature.less index f11528717..8f9e36fbe 100644 --- a/app/internal_packages/composer-signature/styles/composer-signature.less +++ b/app/internal_packages/composer-signature/styles/composer-signature.less @@ -67,7 +67,7 @@ overflow: hidden; min-height: 200px; width: 100%; - + &.empty { opacity: 0.5; pointer-events: none; @@ -91,12 +91,12 @@ .section-header { margin-top: 10px; &:first-child { - margin-top:0; + margin-top: 0; } } textarea.raw-html { - font-family: monospace; + font-family: @font-family-monospace; font-size: 0.9em; width: 100%; height: 240px; @@ -129,10 +129,13 @@ justify-content: center; white-space: initial; flex-shrink: 0; - top: 0; left: 0; right: 0; bottom: 0; + top: 0; + left: 0; + right: 0; + bottom: 0; position: absolute; display: flex; - + .preview { pointer-events: none; transform: scale(0.25); @@ -162,7 +165,7 @@ flex-direction: row; flex-wrap: wrap; padding: @padding-base-horizontal 0; - + .field.photo-picker { display: block; width: 100%; @@ -178,7 +181,8 @@ display: flex; align-items: center; justify-content: center; - &:hover, &.dropping { + &:hover, + &.dropping { border: 1px solid @accent-primary-dark; } } diff --git a/app/internal_packages/composer-templates/lib/template-picker.tsx b/app/internal_packages/composer-templates/lib/template-picker.tsx index 872189844..345edbc49 100644 --- a/app/internal_packages/composer-templates/lib/template-picker.tsx +++ b/app/internal_packages/composer-templates/lib/template-picker.tsx @@ -1,7 +1,7 @@ /* eslint jsx-a11y/tabindex-no-positive: 0 */ import React from 'react'; import ReactDOM from 'react-dom'; -import { localized, PropTypes, Actions } from 'mailspring-exports'; +import { localized, PropTypes, Actions, Message } from 'mailspring-exports'; import { Menu, RetinaImg } from 'mailspring-component-kit'; import TemplateStore from './template-store'; @@ -101,7 +101,10 @@ class TemplatePopover extends React.Component<{ headerMessageId: string }> { } } -class TemplatePicker extends React.Component<{ headerMessageId: string }> { +class TemplatePicker extends React.Component<{ + headerMessageId: string; + draft: Message; +}> { static displayName = 'TemplatePicker'; static propTypes = { @@ -117,6 +120,9 @@ class TemplatePicker extends React.Component<{ headerMessageId: string }> { }; render() { + if (this.props.draft.plaintext) { + return ; + } return (