more bits of read receipt animation implemented

This commit is contained in:
David Baker 2015-11-13 11:42:51 +00:00
parent 9a6624d1c7
commit bc2c744bed
4 changed files with 132 additions and 7 deletions

View file

@ -49,7 +49,7 @@ module.exports = React.createClass({
initial = this.props.member.name[1].toUpperCase();
return (
<span className="mx_MemberAvatar" style={this.props.style}>
<span className="mx_MemberAvatar" {...this.props}>
<span className="mx_MemberAvatar_initial"
style={{ fontSize: (this.props.width * 0.75) + "px",
width: this.props.width + "px",
@ -63,7 +63,7 @@ module.exports = React.createClass({
<img className="mx_MemberAvatar mx_MemberAvatar_image" src={this.state.imageUrl}
onError={this.onError}
width={this.props.width} height={this.props.height}
style={this.props.style}
{...this.props}
/>
);
}

View file

@ -17,6 +17,7 @@ limitations under the License.
'use strict';
var React = require('react');
var ReactDom = require('react-dom');
var classNames = require("classnames");
var sdk = require('matrix-react-sdk')
@ -27,6 +28,8 @@ var ContextualMenu = require('../../../../ContextualMenu');
var TextForEvent = require('matrix-react-sdk/lib/TextForEvent');
var Velociraptor = require('../../../../Velociraptor');
var eventTileTypes = {
'm.room.message': 'molecules.MessageTile',
'm.room.member' : 'molecules.EventAsTextTile',
@ -58,6 +61,10 @@ module.exports = React.createClass({
return {menu: false};
},
componentDidUpdate: function() {
this.readAvatarRect = ReactDom.findDOMNode(this.readAvatarNode).getBoundingClientRect();
},
onEditClicked: function(e) {
var MessageContextMenu = sdk.getComponent('molecules.MessageContextMenu');
var buttonRect = e.target.getBoundingClientRect()
@ -93,13 +100,42 @@ module.exports = React.createClass({
var left = 0;
var transitionOpts = {
duration: 1000,
easing: 'linear'
};
for (var i = 0; i < receipts.length; ++i) {
var member = room.getMember(receipts[i].userId);
// Using react refs here would mean both getting Velociraptor to expose
// them and making them scoped to the whole RoomView. Not impossible, but
// getElementById seems simpler at least for a first cut.
var oldAvatarDomNode = document.getElementById('mx_readAvatar'+member.userId);
var startStyle = { left: left+'px' };
var enterTransitions = [];
var enterTransitionOpts = [];
if (oldAvatarDomNode && this.readAvatarRect) {
var oldRect = oldAvatarDomNode.getBoundingClientRect();
startStyle.top = oldRect.top - this.readAvatarRect.top;
if (oldAvatarDomNode.style.left !== '0px') {
startStyle.left = oldAvatarDomNode.style.left;
enterTransitions.push({ left: left+'px' });
enterTransitionOpts.push(transitionOpts);
}
enterTransitions.push({ top: '0px' });
enterTransitionOpts.push(transitionOpts);
}
// add to the start so the most recent is on the end (ie. ends up rightmost)
avatars.unshift(
<MemberAvatar key={member.userId} member={member}
width={14} height={14} resizeMethod="crop"
style={ {left: left} }
style={startStyle}
enterTransition={enterTransitions}
enterTransitionOpts={enterTransitionOpts}
id={'mx_readAvatar'+member.userId}
/>
);
left -= 15;
@ -113,12 +149,18 @@ module.exports = React.createClass({
remText = <span className="mx_EventTile_readAvatarRemainder" style={ {left: left} }>+{ remainder }</span>;
}
return <span className="mx_EventTile_readAvatars">
return <span className="mx_EventTile_readAvatars" ref={this.collectReadAvatarNode}>
{remText}
{avatars}
<Velociraptor transition={transitionOpts}>
{avatars}
</Velociraptor>
</span>;
},
collectReadAvatarNode: function(node) {
this.readAvatarNode = node;
},
render: function() {
var MessageTimestamp = sdk.getComponent('atoms.MessageTimestamp');
var SenderProfile = sdk.getComponent('molecules.SenderProfile');