mirror of https://github.com/vector-im/riot-web
Rewire the Sticker button to be an Emoji Picker
parent
f30e919f9e
commit
833dcbac64
|
@ -22,10 +22,10 @@ import MatrixClientPeg from '../../../MatrixClientPeg';
|
||||||
import sdk from '../../../index';
|
import sdk from '../../../index';
|
||||||
import dis from '../../../dispatcher';
|
import dis from '../../../dispatcher';
|
||||||
import RoomViewStore from '../../../stores/RoomViewStore';
|
import RoomViewStore from '../../../stores/RoomViewStore';
|
||||||
import Stickerpicker from './Stickerpicker';
|
|
||||||
import { makeRoomPermalink } from '../../../utils/permalinks/Permalinks';
|
import { makeRoomPermalink } from '../../../utils/permalinks/Permalinks';
|
||||||
import ContentMessages from '../../../ContentMessages';
|
import ContentMessages from '../../../ContentMessages';
|
||||||
import E2EIcon from './E2EIcon';
|
import E2EIcon from './E2EIcon';
|
||||||
|
import {aboveLeftOf, ContextMenu, ContextMenuButton, useContextMenu} from "../../structures/ContextMenu";
|
||||||
|
|
||||||
function ComposerAvatar(props) {
|
function ComposerAvatar(props) {
|
||||||
const MemberStatusMessageAvatar = sdk.getComponent('avatars.MemberStatusMessageAvatar');
|
const MemberStatusMessageAvatar = sdk.getComponent('avatars.MemberStatusMessageAvatar');
|
||||||
|
@ -102,6 +102,32 @@ HangupButton.propTypes = {
|
||||||
roomId: PropTypes.string.isRequired,
|
roomId: PropTypes.string.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const EmojiButton = ({addEmoji}) => {
|
||||||
|
const [menuDisplayed, button, openMenu, closeMenu] = useContextMenu();
|
||||||
|
|
||||||
|
let contextMenu;
|
||||||
|
if (menuDisplayed) {
|
||||||
|
const buttonRect = button.current.getBoundingClientRect();
|
||||||
|
const EmojiPicker = sdk.getComponent('emojipicker.EmojiPicker');
|
||||||
|
contextMenu = <ContextMenu {...aboveLeftOf(buttonRect)} onFinished={closeMenu} catchTab={false}>
|
||||||
|
<EmojiPicker onChoose={addEmoji} showQuickReactions={true} />
|
||||||
|
</ContextMenu>;
|
||||||
|
}
|
||||||
|
|
||||||
|
return <React.Fragment>
|
||||||
|
<ContextMenuButton className="mx_MessageComposer_button mx_MessageComposer_stickers"
|
||||||
|
onClick={openMenu}
|
||||||
|
isExpanded={menuDisplayed}
|
||||||
|
label={_t('Upload file')}
|
||||||
|
inputRef={button}
|
||||||
|
>
|
||||||
|
|
||||||
|
</ContextMenuButton>
|
||||||
|
|
||||||
|
{ contextMenu }
|
||||||
|
</React.Fragment>;
|
||||||
|
};
|
||||||
|
|
||||||
class UploadButton extends React.Component {
|
class UploadButton extends React.Component {
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
roomId: PropTypes.string.isRequired,
|
roomId: PropTypes.string.isRequired,
|
||||||
|
@ -298,6 +324,13 @@ export default class MessageComposer extends React.Component {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
addEmoji(emoji) {
|
||||||
|
dis.dispatch({
|
||||||
|
action: "insert_emoji",
|
||||||
|
emoji,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const controls = [
|
const controls = [
|
||||||
this.state.me ? <ComposerAvatar key="controls_avatar" me={this.state.me} /> : null,
|
this.state.me ? <ComposerAvatar key="controls_avatar" me={this.state.me} /> : null,
|
||||||
|
@ -321,7 +354,7 @@ export default class MessageComposer extends React.Component {
|
||||||
room={this.props.room}
|
room={this.props.room}
|
||||||
placeholder={this.renderPlaceholderText()}
|
placeholder={this.renderPlaceholderText()}
|
||||||
permalinkCreator={this.props.permalinkCreator} />,
|
permalinkCreator={this.props.permalinkCreator} />,
|
||||||
<Stickerpicker key='stickerpicker_controls_button' room={this.props.room} />,
|
<EmojiButton key='stickerpicker_controls_button' addEmoji={this.addEmoji} />,
|
||||||
<UploadButton key="controls_upload" roomId={this.props.room.roomId} />,
|
<UploadButton key="controls_upload" roomId={this.props.room.roomId} />,
|
||||||
callInProgress ? <HangupButton key="controls_hangup" roomId={this.props.room.roomId} /> : null,
|
callInProgress ? <HangupButton key="controls_hangup" roomId={this.props.room.roomId} /> : null,
|
||||||
callInProgress ? null : <CallButton key="controls_call" roomId={this.props.room.roomId} />,
|
callInProgress ? null : <CallButton key="controls_call" roomId={this.props.room.roomId} />,
|
||||||
|
|
|
@ -317,6 +317,9 @@ export default class SendMessageComposer extends React.Component {
|
||||||
case 'quote':
|
case 'quote':
|
||||||
this._insertQuotedMessage(payload.event);
|
this._insertQuotedMessage(payload.event);
|
||||||
break;
|
break;
|
||||||
|
case 'insert_emoji':
|
||||||
|
this._insertEmoji(payload.emoji);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -353,6 +356,17 @@ export default class SendMessageComposer extends React.Component {
|
||||||
this._editorRef && this._editorRef.focus();
|
this._editorRef && this._editorRef.focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_insertEmoji = (emoji) => {
|
||||||
|
const {model} = this;
|
||||||
|
const {partCreator} = model;
|
||||||
|
const caret = this._editorRef.getCaret();
|
||||||
|
const position = model.positionForOffset(caret.offset, caret.atNodeEnd);
|
||||||
|
model.transform(() => {
|
||||||
|
const addedLen = model.insert([partCreator.plain(emoji)], position);
|
||||||
|
return model.positionForOffset(caret.offset + addedLen, true);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
_onPaste = (event) => {
|
_onPaste = (event) => {
|
||||||
const {clipboardData} = event;
|
const {clipboardData} = event;
|
||||||
if (clipboardData.files.length) {
|
if (clipboardData.files.length) {
|
||||||
|
|
|
@ -36,6 +36,7 @@ const STICKERPICKER_Z_INDEX = 3500;
|
||||||
// Key to store the widget's AppTile under in PersistedElement
|
// Key to store the widget's AppTile under in PersistedElement
|
||||||
const PERSISTED_ELEMENT_KEY = "stickerPicker";
|
const PERSISTED_ELEMENT_KEY = "stickerPicker";
|
||||||
|
|
||||||
|
// TODO figure out where to expose it now that the EmojiPicker has taken its place
|
||||||
export default class Stickerpicker extends React.Component {
|
export default class Stickerpicker extends React.Component {
|
||||||
static currentWidget;
|
static currentWidget;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue