more bits of read receipt animation implemented
This commit is contained in:
parent
9a6624d1c7
commit
bc2c744bed
4 changed files with 132 additions and 7 deletions
|
@ -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}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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');
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue