Merge pull request #3152 from matrix-org/jryans/reactions-show-all
Limit reactions row on initial displaypull/21833/head
commit
33425240f6
|
@ -18,3 +18,17 @@ limitations under the License.
|
||||||
margin: 6px 0;
|
margin: 6px 0;
|
||||||
color: $primary-fg-color;
|
color: $primary-fg-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.mx_ReactionsRow_showAll {
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: 10px;
|
||||||
|
font-weight: 600;
|
||||||
|
margin-left: 6px;
|
||||||
|
vertical-align: top;
|
||||||
|
|
||||||
|
&:hover,
|
||||||
|
&:link,
|
||||||
|
&:visited {
|
||||||
|
color: $accent-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -18,10 +18,14 @@ import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
import sdk from '../../../index';
|
import sdk from '../../../index';
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
import { isContentActionable } from '../../../utils/EventUtils';
|
import { isContentActionable } from '../../../utils/EventUtils';
|
||||||
import { isSingleEmoji } from '../../../HtmlUtils';
|
import { isSingleEmoji } from '../../../HtmlUtils';
|
||||||
import MatrixClientPeg from '../../../MatrixClientPeg';
|
import MatrixClientPeg from '../../../MatrixClientPeg';
|
||||||
|
|
||||||
|
// The maximum number of reactions to initially show on a message.
|
||||||
|
const MAX_ITEMS_WHEN_LIMITED = 8;
|
||||||
|
|
||||||
export default class ReactionsRow extends React.PureComponent {
|
export default class ReactionsRow extends React.PureComponent {
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
// The event we're displaying reactions for
|
// The event we're displaying reactions for
|
||||||
|
@ -41,6 +45,7 @@ export default class ReactionsRow extends React.PureComponent {
|
||||||
|
|
||||||
this.state = {
|
this.state = {
|
||||||
myReactions: this.getMyReactions(),
|
myReactions: this.getMyReactions(),
|
||||||
|
showAll: false,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,16 +99,22 @@ export default class ReactionsRow extends React.PureComponent {
|
||||||
return [...myReactions.values()];
|
return [...myReactions.values()];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onShowAllClick = () => {
|
||||||
|
this.setState({
|
||||||
|
showAll: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { mxEvent, reactions } = this.props;
|
const { mxEvent, reactions } = this.props;
|
||||||
const { myReactions } = this.state;
|
const { myReactions, showAll } = this.state;
|
||||||
|
|
||||||
if (!reactions || !isContentActionable(mxEvent)) {
|
if (!reactions || !isContentActionable(mxEvent)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ReactionsRowButton = sdk.getComponent('messages.ReactionsRowButton');
|
const ReactionsRowButton = sdk.getComponent('messages.ReactionsRowButton');
|
||||||
const items = reactions.getSortedAnnotationsByKey().map(([content, events]) => {
|
let items = reactions.getSortedAnnotationsByKey().map(([content, events]) => {
|
||||||
if (!isSingleEmoji(content)) {
|
if (!isSingleEmoji(content)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -125,10 +136,26 @@ export default class ReactionsRow extends React.PureComponent {
|
||||||
reactionEvents={events}
|
reactionEvents={events}
|
||||||
myReactionEvent={myReactionEvent}
|
myReactionEvent={myReactionEvent}
|
||||||
/>;
|
/>;
|
||||||
});
|
}).filter(item => !!item);
|
||||||
|
|
||||||
|
// Show the first MAX_ITEMS if there are MAX_ITEMS + 1 or more items.
|
||||||
|
// The "+ 1" ensure that the "show all" reveals something that takes up
|
||||||
|
// more space than the button itself.
|
||||||
|
let showAllButton;
|
||||||
|
if ((items.length > MAX_ITEMS_WHEN_LIMITED + 1) && !showAll) {
|
||||||
|
items = items.slice(0, MAX_ITEMS_WHEN_LIMITED);
|
||||||
|
showAllButton = <a
|
||||||
|
className="mx_ReactionsRow_showAll"
|
||||||
|
href="#"
|
||||||
|
onClick={this.onShowAllClick}
|
||||||
|
>
|
||||||
|
{_t("Show all")}
|
||||||
|
</a>;
|
||||||
|
}
|
||||||
|
|
||||||
return <div className="mx_ReactionsRow">
|
return <div className="mx_ReactionsRow">
|
||||||
{items}
|
{items}
|
||||||
|
{showAllButton}
|
||||||
</div>;
|
</div>;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -942,6 +942,7 @@
|
||||||
"Party Popper": "Party Popper",
|
"Party Popper": "Party Popper",
|
||||||
"Confused": "Confused",
|
"Confused": "Confused",
|
||||||
"Eyes": "Eyes",
|
"Eyes": "Eyes",
|
||||||
|
"Show all": "Show all",
|
||||||
"<reactors/><reactedWith>reacted with %(shortName)s</reactedWith>": "<reactors/><reactedWith>reacted with %(shortName)s</reactedWith>",
|
"<reactors/><reactedWith>reacted with %(shortName)s</reactedWith>": "<reactors/><reactedWith>reacted with %(shortName)s</reactedWith>",
|
||||||
"%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s changed the avatar for %(roomName)s",
|
"%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s changed the avatar for %(roomName)s",
|
||||||
"%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removed the room avatar.",
|
"%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removed the room avatar.",
|
||||||
|
|
Loading…
Reference in New Issue