Merge pull request #422 from matrix-org/wmwragg/chat-message-presentation

Wmwragg/chat message presentation
This commit is contained in:
Matthew Hodgson 2016-08-23 12:20:03 +01:00 committed by GitHub
commit 1a2475ebba
3 changed files with 38 additions and 15 deletions

View file

@ -42,6 +42,11 @@ module.exports = {
return days[date.getDay()] + ", " + months[date.getMonth()] + " " + date.getDate() + " " + date.getFullYear() + " " + pad(date.getHours()) + ':' + pad(date.getMinutes()); return days[date.getDay()] + ", " + months[date.getMonth()] + " " + date.getDate() + " " + date.getFullYear() + " " + pad(date.getHours()) + ':' + pad(date.getMinutes());
} }
*/ */
},
formatTime: function(date) {
//return pad(date.getHours()) + ':' + pad(date.getMinutes());
return ('00' + date.getHours()).slice(-2) + ':' + ('00' + date.getMinutes()).slice(-2);
} }
} }

View file

@ -337,6 +337,18 @@ module.exports = React.createClass({
continuation = true; continuation = true;
} }
// Work out if this is still a continuation, as we are now showing commands
// and /me messages with their own little avatar. The case of a change of
// event type (commands) is handled above, but we need to handle the /me
// messages seperately as they have a msgtype of 'm.emote' but are classed
// as normal messages
if (prevEvent !== null && prevEvent.sender && mxEv.sender
&& mxEv.sender.userId === prevEvent.sender.userId
&& mxEv.getType() == prevEvent.getType()
&& prevEvent.getContent().msgtype === 'm.emote') {
continuation = false;
}
// local echoes have a fake date, which could even be yesterday. Treat them // local echoes have a fake date, which could even be yesterday. Treat them
// as 'today' for the date separators. // as 'today' for the date separators.
var ts1 = mxEv.getTs(); var ts1 = mxEv.getTs();

View file

@ -320,7 +320,6 @@ module.exports = React.createClass({
left -= 15; left -= 15;
} }
} }
var editButton;
var remText; var remText;
if (!this.state.allReadAvatars) { if (!this.state.allReadAvatars) {
var remainder = receipts.length - MAX_READ_AVATARS; var remainder = receipts.length - MAX_READ_AVATARS;
@ -331,15 +330,9 @@ module.exports = React.createClass({
</span>; </span>;
left -= 15; left -= 15;
} }
editButton = (
<input style={{ left: left }}
type="image" src="img/edit.png" alt="Options" title="Options" width="14" height="14"
className="mx_EventTile_editButton" onClick={this.onEditClicked} />
);
} }
return <span className="mx_EventTile_readAvatars"> return <span className="mx_EventTile_readAvatars">
{ editButton }
{ remText } { remText }
{ avatars } { avatars }
</span>; </span>;
@ -369,6 +362,11 @@ module.exports = React.createClass({
var content = this.props.mxEvent.getContent(); var content = this.props.mxEvent.getContent();
var msgtype = content.msgtype; var msgtype = content.msgtype;
var eventType = this.props.mxEvent.getType();
// Info messages are basically information about commands processed on a
// room, or emote messages
var isInfoMessage = (msgtype === 'm.emote' || eventType !== 'm.room.message');
var EventTileType = sdk.getComponent(eventTileTypes[this.props.mxEvent.getType()]); var EventTileType = sdk.getComponent(eventTileTypes[this.props.mxEvent.getType()]);
// This shouldn't happen: the caller should check we support this type // This shouldn't happen: the caller should check we support this type
@ -379,6 +377,7 @@ module.exports = React.createClass({
var classes = classNames({ var classes = classNames({
mx_EventTile: true, mx_EventTile: true,
mx_EventTile_info: isInfoMessage,
mx_EventTile_sending: ['sending', 'queued'].indexOf( mx_EventTile_sending: ['sending', 'queued'].indexOf(
this.props.eventSendStatus this.props.eventSendStatus
) !== -1, ) !== -1,
@ -404,12 +403,11 @@ module.exports = React.createClass({
var readAvatars = this.getReadAvatars(); var readAvatars = this.getReadAvatars();
var avatar, sender; var avatar, sender;
if (!this.props.continuation) { if (!this.props.continuation && !isInfoMessage) {
if (this.props.mxEvent.sender) { if (this.props.mxEvent.sender) {
avatar = ( avatar = (
<div className="mx_EventTile_avatar"> <div className="mx_EventTile_avatar">
<MemberAvatar member={this.props.mxEvent.sender} width={24} height={24} <MemberAvatar member={this.props.mxEvent.sender} width={30} height={30} onClick={ this.onMemberAvatarClick } />
onClick={ this.onMemberAvatarClick } />
</div> </div>
); );
} }
@ -417,19 +415,27 @@ module.exports = React.createClass({
sender = <SenderProfile onClick={ this.onSenderProfileClick } mxEvent={this.props.mxEvent} aux={aux} />; sender = <SenderProfile onClick={ this.onSenderProfileClick } mxEvent={this.props.mxEvent} aux={aux} />;
} }
} }
var editButton = (
<img className="mx_EventTile_editButton" src="img/icon_context_message.svg" width="19" height="19" alt="Options" title="Options" onClick={this.onEditClicked} />
);
return ( return (
<div className={classes}> <div className={classes}>
<div className="mx_EventTile_msgOption"> <div className="mx_EventTile_msgOption">
{ timestamp }
{ readAvatars } { readAvatars }
</div> </div>
{ avatar } { avatar }
{ sender } { sender }
<div className="mx_EventTile_line"> <div className="mx_EventTile_line">
<EventTileType ref="tile" mxEvent={this.props.mxEvent} highlights={this.props.highlights} { timestamp }
<EventTileType ref="tile"
mxEvent={this.props.mxEvent}
highlights={this.props.highlights}
highlightLink={this.props.highlightLink} highlightLink={this.props.highlightLink}
showUrlPreview={this.props.showUrlPreview} showUrlPreview={this.props.showUrlPreview}
onWidgetLoad={this.props.onWidgetLoad} /> onWidgetLoad={this.props.onWidgetLoad} />
{ editButton }
</div> </div>
</div> </div>
); );