Add extra add reactions button to encourage more diverse reactions to content

This commit is contained in:
Michael Telatynski 2021-05-13 10:56:51 +01:00
parent 3af0138e9d
commit b5fa4d88bf
3 changed files with 59 additions and 2 deletions

View file

@ -17,6 +17,26 @@ limitations under the License.
.mx_ReactionsRow { .mx_ReactionsRow {
margin: 6px 0; margin: 6px 0;
color: $primary-fg-color; color: $primary-fg-color;
.mx_ReactionsRow_addReactionButton {
position: relative;
display: inline-block;
width: 16px;
height: 16px;
vertical-align: sub;
&::before {
content: '';
position: absolute;
height: 100%;
width: 100%;
mask-size: cover;
mask-repeat: no-repeat;
mask-position: center;
background-color: $tertiary-fg-color;
mask-image: url('$(res)/img/element-icons/room/message-bar/emoji.svg');
}
}
} }
.mx_ReactionsRow_showAll { .mx_ReactionsRow_showAll {

View file

@ -16,16 +16,44 @@ limitations under the License.
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { EventType } from "matrix-js-sdk/src/@types/event";
import * as sdk from '../../../index'; import * as sdk from '../../../index';
import { _t } from '../../../languageHandler'; import { _t } from '../../../languageHandler';
import { isContentActionable } from '../../../utils/EventUtils'; import { isContentActionable } from '../../../utils/EventUtils';
import {MatrixClientPeg} from '../../../MatrixClientPeg'; import {MatrixClientPeg} from '../../../MatrixClientPeg';
import {replaceableComponent} from "../../../utils/replaceableComponent"; import {replaceableComponent} from "../../../utils/replaceableComponent";
import {ContextMenuTooltipButton} from "../../../accessibility/context_menu/ContextMenuTooltipButton";
import {aboveLeftOf, ContextMenu, useContextMenu} from "../../structures/ContextMenu";
// The maximum number of reactions to initially show on a message. // The maximum number of reactions to initially show on a message.
const MAX_ITEMS_WHEN_LIMITED = 8; const MAX_ITEMS_WHEN_LIMITED = 8;
const ReactButton = ({ mxEvent, reactions }) => {
const [menuDisplayed, button, openMenu, closeMenu] = useContextMenu();
let contextMenu;
if (menuDisplayed) {
const buttonRect = button.current.getBoundingClientRect();
const ReactionPicker = sdk.getComponent('emojipicker.ReactionPicker');
contextMenu = <ContextMenu {...aboveLeftOf(buttonRect)} onFinished={closeMenu} managed={false}>
<ReactionPicker mxEvent={mxEvent} reactions={reactions} onFinished={closeMenu} />
</ContextMenu>;
}
return <React.Fragment>
<ContextMenuTooltipButton
className="mx_ReactionsRow_addReactionButton"
title={_t("Add reaction")}
onClick={openMenu}
isExpanded={menuDisplayed}
inputRef={button}
/>
{ contextMenu }
</React.Fragment>;
};
@replaceableComponent("views.messages.ReactionsRow") @replaceableComponent("views.messages.ReactionsRow")
export default class ReactionsRow extends React.PureComponent { export default class ReactionsRow extends React.PureComponent {
static propTypes = { static propTypes = {
@ -151,12 +179,20 @@ export default class ReactionsRow extends React.PureComponent {
</a>; </a>;
} }
const cli = MatrixClientPeg.get();
let addReactionButton;
if (cli.getRoom(mxEvent.getRoomId()).currentState.maySendEvent(EventType.Reaction, cli.getUserId())) {
addReactionButton = <ReactButton mxEvent={mxEvent} reactions={reactions} />;
}
return <div return <div
className="mx_ReactionsRow" className="mx_ReactionsRow"
role="toolbar" role="toolbar"
aria-label={_t("Reactions")} aria-label={_t("Reactions")}
> >
{ items } { items }
{ addReactionButton }
{ showAllButton } { showAllButton }
</div>; </div>;
} }

View file

@ -1864,6 +1864,7 @@
"You sent a verification request": "You sent a verification request", "You sent a verification request": "You sent a verification request",
"Error decrypting video": "Error decrypting video", "Error decrypting video": "Error decrypting video",
"Error processing voice message": "Error processing voice message", "Error processing voice message": "Error processing voice message",
"Add reaction": "Add reaction",
"Show all": "Show all", "Show all": "Show all",
"Reactions": "Reactions", "Reactions": "Reactions",
"<reactors/><reactedWith> reacted with %(content)s</reactedWith>": "<reactors/><reactedWith> reacted with %(content)s</reactedWith>", "<reactors/><reactedWith> reacted with %(content)s</reactedWith>": "<reactors/><reactedWith> reacted with %(content)s</reactedWith>",