diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss
index 5841cf2853..028d9a7556 100644
--- a/res/css/views/rooms/_EventTile.scss
+++ b/res/css/views/rooms/_EventTile.scss
@@ -213,23 +213,36 @@ $left-gutter: 64px;
color: $accent-fg-color;
}
-.mx_EventTile_encrypting {
- color: $event-encrypting-color !important;
-}
-
-.mx_EventTile_sending {
- color: $event-sending-color;
-}
-
-.mx_EventTile_sending .mx_UserPill,
-.mx_EventTile_sending .mx_RoomPill {
- opacity: 0.5;
-}
-
.mx_EventTile_notSent {
color: $event-notsent-color;
}
+.mx_EventTile_receiptSent,
+.mx_EventTile_receiptSending {
+ // We don't use `position: relative` on the element because then it won't line
+ // up with the other read receipts
+
+ &::before {
+ background-color: $tertiary-fg-color;
+ mask-repeat: no-repeat;
+ mask-position: center;
+ mask-size: 14px;
+ width: 14px;
+ height: 14px;
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ }
+}
+.mx_EventTile_receiptSent::before {
+ mask-image: url('$(res)/img/element-icons/circle-sent.svg');
+}
+.mx_EventTile_receiptSending::before {
+ mask-image: url('$(res)/img/element-icons/circle-sending.svg');
+}
+
.mx_EventTile_contextual {
opacity: 0.4;
}
diff --git a/res/img/element-icons/circle-sending.svg b/res/img/element-icons/circle-sending.svg
new file mode 100644
index 0000000000..2d15a0f716
--- /dev/null
+++ b/res/img/element-icons/circle-sending.svg
@@ -0,0 +1,3 @@
+
diff --git a/res/img/element-icons/circle-sent.svg b/res/img/element-icons/circle-sent.svg
new file mode 100644
index 0000000000..04a00ceff7
--- /dev/null
+++ b/res/img/element-icons/circle-sent.svg
@@ -0,0 +1,4 @@
+
diff --git a/res/themes/dark/css/_dark.scss b/res/themes/dark/css/_dark.scss
index a878aa3cdd..344f012d45 100644
--- a/res/themes/dark/css/_dark.scss
+++ b/res/themes/dark/css/_dark.scss
@@ -137,9 +137,6 @@ $panel-divider-color: transparent;
$widget-menu-bar-bg-color: $header-panel-bg-color;
$widget-body-bg-color: rgba(141, 151, 165, 0.2);
-// event tile lifecycle
-$event-sending-color: $text-secondary-color;
-
// event redaction
$event-redacted-fg-color: #606060;
$event-redacted-border-color: #000000;
diff --git a/res/themes/legacy-dark/css/_legacy-dark.scss b/res/themes/legacy-dark/css/_legacy-dark.scss
index 3e3c299af9..ca3ead9ea8 100644
--- a/res/themes/legacy-dark/css/_legacy-dark.scss
+++ b/res/themes/legacy-dark/css/_legacy-dark.scss
@@ -132,9 +132,6 @@ $panel-divider-color: $header-panel-border-color;
$widget-menu-bar-bg-color: $header-panel-bg-color;
$widget-body-bg-color: #1A1D23;
-// event tile lifecycle
-$event-sending-color: $text-secondary-color;
-
// event redaction
$event-redacted-fg-color: #606060;
$event-redacted-border-color: #000000;
diff --git a/res/themes/legacy-light/css/_legacy-light.scss b/res/themes/legacy-light/css/_legacy-light.scss
index a740ba155c..fa44c128d0 100644
--- a/res/themes/legacy-light/css/_legacy-light.scss
+++ b/res/themes/legacy-light/css/_legacy-light.scss
@@ -222,8 +222,6 @@ $widget-body-bg-color: #fff;
$yellow-background: #fff8e3;
// event tile lifecycle
-$event-encrypting-color: #abddbc;
-$event-sending-color: #ddd;
$event-notsent-color: #f44;
$event-highlight-fg-color: $warning-color;
diff --git a/res/themes/light/css/_light.scss b/res/themes/light/css/_light.scss
index 1c89d83c01..ca52d0dcfa 100644
--- a/res/themes/light/css/_light.scss
+++ b/res/themes/light/css/_light.scss
@@ -222,8 +222,6 @@ $widget-body-bg-color: #FFF;
$yellow-background: #fff8e3;
// event tile lifecycle
-$event-encrypting-color: #abddbc;
-$event-sending-color: #ddd;
$event-notsent-color: #f44;
$event-highlight-fg-color: $warning-color;
diff --git a/src/components/views/messages/EditHistoryMessage.js b/src/components/views/messages/EditHistoryMessage.js
index df27773a40..6c420a16fc 100644
--- a/src/components/views/messages/EditHistoryMessage.js
+++ b/src/components/views/messages/EditHistoryMessage.js
@@ -158,6 +158,7 @@ export default class EditHistoryMessage extends React.PureComponent {
const isSending = (['sending', 'queued', 'encrypting'].indexOf(this.state.sendStatus) !== -1);
const classes = classNames({
"mx_EventTile": true,
+ // Note: we keep these sending state classes for tests, not for our styles
"mx_EventTile_sending": isSending,
"mx_EventTile_notSent": this.state.sendStatus === 'not_sent',
});
diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js
index 87fb190678..9110316850 100644
--- a/src/components/views/rooms/EventTile.js
+++ b/src/components/views/rooms/EventTile.js
@@ -454,8 +454,26 @@ export default class EventTile extends React.Component {
};
getReadAvatars() {
- // return early if there are no read receipts
+ // return early if there are no read receipts, with our message state if applicable
if (!this.props.readReceipts || this.props.readReceipts.length === 0) {
+ const room = this.context.getRoom(this.props.mxEvent.getRoomId());
+ const myUserId = MatrixClientPeg.get().getUserId();
+ if (this.props.mxEvent.getSender() === myUserId && room) {
+ // We only search for the most recent 50 events because surely someone will have
+ // sent *something* in that time, even if it is a membership event or something.
+ const readUsers = room.getUsersWhoHaveRead(this.props.mxEvent, 50);
+ const hasBeenRead = readUsers.length === 0 || readUsers.some(u => u !== myUserId);
+ console.log(room.getUsersReadUpTo(this.props.mxEvent));
+ let receipt = null;
+ if (!this.props.eventSendStatus || this.props.eventSendStatus === 'sent') {
+ if (!hasBeenRead) {
+ receipt = ;
+ }
+ } else {
+ receipt = ;
+ }
+ return {receipt};
+ }
return ();
}
@@ -692,6 +710,7 @@ export default class EventTile extends React.Component {
mx_EventTile_isEditing: isEditing,
mx_EventTile_info: isInfoMessage,
mx_EventTile_12hr: this.props.isTwelveHour,
+ // Note: we keep these sending state classes for tests, not for our styles
mx_EventTile_encrypting: this.props.eventSendStatus === 'encrypting',
mx_EventTile_sending: !isEditing && isSending,
mx_EventTile_notSent: this.props.eventSendStatus === 'not_sent',