diff --git a/internal_packages/message-list/lib/message-controls.cjsx b/internal_packages/message-list/lib/message-controls.cjsx index 12381635e..9882b02a7 100644 --- a/internal_packages/message-list/lib/message-controls.cjsx +++ b/internal_packages/message-list/lib/message-controls.cjsx @@ -13,13 +13,13 @@ class MessageControls extends React.Component render: =>
-
- -
} primaryClick={@_onReply} menu={@_dropdownMenu()}/> +
+ +
_dropdownMenu: -> diff --git a/internal_packages/message-list/lib/message-item-container.cjsx b/internal_packages/message-list/lib/message-item-container.cjsx index 2872b2a72..8fa9ae9a5 100644 --- a/internal_packages/message-list/lib/message-item-container.cjsx +++ b/internal_packages/message-list/lib/message-item-container.cjsx @@ -2,9 +2,9 @@ React = require 'react' classNames = require 'classnames' MessageItem = require './message-item' -PendingMessageItem = require './pending-message-item' -{DraftStore, +{Utils, + DraftStore, MessageStore} = require 'nylas-exports' {InjectedComponent} = require 'nylas-component-kit' @@ -35,6 +35,10 @@ class MessageItemContainer extends React.Component if @props.message?.draft @unlisten = DraftStore.listen @_onSendingStateChanged + shouldComponentUpdate: (nextProps, nextState) => + not Utils.isEqualReact(nextProps, @props) or + not Utils.isEqualReact(nextState, @state) + componentWillUnmount: => @unlisten() if @unlisten @@ -43,19 +47,20 @@ class MessageItemContainer extends React.Component render: => if @props.message.draft if @state.isSending - @_renderMessage(PendingMessageItem) + @_renderMessage(pending: true) else @_renderComposer() else - @_renderMessage(MessageItem) + @_renderMessage(pending: false) - _renderMessage: (component) => - + _renderMessage: ({pending}) => + _renderComposer: => props = diff --git a/internal_packages/message-list/lib/message-item.cjsx b/internal_packages/message-list/lib/message-item.cjsx index b91f06012..b76aecda2 100644 --- a/internal_packages/message-list/lib/message-item.cjsx +++ b/internal_packages/message-list/lib/message-item.cjsx @@ -90,7 +90,11 @@ class MessageItem extends React.Component _renderHeader: => -
+ classes = classNames + "message-header": true + "pending": @props.pending + +
{@_renderHeaderSideItems()} @@ -171,11 +175,19 @@ class MessageItem extends React.Component 'no-quoted-text': not QuotedHTMLParser.hasQuotedHTML(@props.message.body) 'show-quoted-text': @state.showQuotedText - # This is used by subclasses of MessageItem. - # See {PendingMessageItem} - _renderHeaderSideItems: -> [] + _renderHeaderSideItems: -> + styles = + position: "absolute" + marginTop: -2 + +
+ +
_renderHeaderDetailToggle: => + return null if @props.pending if @state.detailedHeaders
@_onRemoveLabel(label) }/> - _renderReplyArea: => -
+ _renderReplyArea: ({noTransition}={}) => + if @_hasReplyArea() + styles = + "height": 63 + "borderTop": "1px dashed #ddd" + else + styles = + "height": 0 + "border": 0 + unless noTransition + styles["transition"] = "height 150ms" + +
Write a reply… @@ -306,8 +317,7 @@ class MessageList extends React.Component onRequestScrollTo={@_onChildScrollRequest} /> ) - if @_hasReplyArea() - elements.push @_renderReplyArea() + elements.push @_renderReplyArea(noTransition: _.last(messages)?.draft) return elements diff --git a/internal_packages/message-list/stylesheets/message-list.less b/internal_packages/message-list/stylesheets/message-list.less index a1168db26..8ac5155f3 100644 --- a/internal_packages/message-list/stylesheets/message-list.less +++ b/internal_packages/message-list/stylesheets/message-list.less @@ -257,6 +257,23 @@ padding-bottom: @spacing-standard; padding-top: 19px; + &.pending { + .message-actions-wrap { + width: 0; + opacity: 0; + } + .pending-spinner { + opacity: 1; + } + } + + .pending-spinner { + transition: opacity 100ms; + transition-delay: 50ms, 0ms; + transition-timing-function: ease-in; + opacity: 0; + } + .header-row { margin-top: 0.5em; color: @text-color-very-subtle; @@ -273,11 +290,22 @@ } .message-actions-wrap { + transition: opacity 100ms, width 150ms; + transition-delay: 50ms, 0ms; + transition-timing-function: ease-in-out; + width: 98px; + height: 32px; + opacity: 1; text-align: right; + + .button-dropdown { + width: 76px; + } } .message-actions-ellipsis { - display: inline-block; + display: block; + float: left; } .message-actions { @@ -365,6 +393,8 @@ } .footer-reply-area-wrap { + overflow: hidden; + width: calc(~"100% - 12px"); max-width: @message-max-width; margin: -3px auto @spacing-double auto; @@ -415,8 +445,16 @@ /////////////////////////////// // message-participants.cjsx // /////////////////////////////// +.pending { + .message-participants { + padding-left: 34px; + } +} .message-participants { + transition: padding-left 150ms; + transition-timing-function: ease-in-out; + &.collapsed:hover {cursor: default;} .from-contact {