Implement new narrow mode UI

This commit is contained in:
Germain Souquet 2021-09-03 12:03:19 +01:00
parent 6d80976eae
commit 997f43cb82
3 changed files with 40 additions and 21 deletions

View file

@ -238,11 +238,11 @@ limitations under the License.
} }
.mx_MessageComposer_buttonMenu::before { .mx_MessageComposer_buttonMenu::before {
mask-image: url('$(res)/img/feather-customised/chevron-down.svg'); mask-image: url('$(res)/img/image-view/more.svg');
} }
.mx_MessageComposer_closeButtonMenu::before { .mx_MessageComposer_closeButtonMenu::before {
transform: rotate(180deg); transform: rotate(90deg);
transform-origin: center; transform-origin: center;
} }
@ -365,3 +365,8 @@ limitations under the License.
margin-right: 0; margin-right: 0;
} }
} }
.mx_MessageComposer_Menu .mx_CallContextMenu_item {
display: flex;
align-items: center;
}

View file

@ -33,6 +33,7 @@ import {
ContextMenuTooltipButton, ContextMenuTooltipButton,
useContextMenu, useContextMenu,
MenuItem, MenuItem,
ChevronFace,
} from "../../structures/ContextMenu"; } from "../../structures/ContextMenu";
import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; import AccessibleTooltipButton from "../elements/AccessibleTooltipButton";
import ReplyPreview from "./ReplyPreview"; import ReplyPreview from "./ReplyPreview";
@ -416,25 +417,32 @@ export default class MessageComposer extends React.Component<IProps, IState> {
}; };
private renderButtons(menuPosition): JSX.Element | JSX.Element[] { private renderButtons(menuPosition): JSX.Element | JSX.Element[] {
const buttons = []; const buttons = new Map<string, JSX.Element>();
if (!this.state.haveRecording) { if (!this.state.haveRecording) {
buttons.push( buttons.set(
_t("Send File"),
<UploadButton key="controls_upload" roomId={this.props.room.roomId} />, <UploadButton key="controls_upload" roomId={this.props.room.roomId} />,
);
buttons.set(
_t("Show Emojis"),
<EmojiButton key="emoji_button" addEmoji={this.addEmoji} menuPosition={menuPosition} />, <EmojiButton key="emoji_button" addEmoji={this.addEmoji} menuPosition={menuPosition} />,
); );
} }
if (this.shouldShowStickerPicker()) { if (this.shouldShowStickerPicker()) {
buttons.push(<AccessibleTooltipButton buttons.set(
id='stickersButton' _t("Show Stickers"),
key="controls_stickers" <AccessibleTooltipButton
className="mx_MessageComposer_button mx_MessageComposer_stickers" id='stickersButton'
onClick={() => this.showStickers(!this.state.showStickers)} key="controls_stickers"
title={this.state.showStickers ? _t("Hide Stickers") : _t("Show Stickers")} className="mx_MessageComposer_button mx_MessageComposer_stickers"
/>); onClick={() => this.showStickers(!this.state.showStickers)}
title={this.state.showStickers ? _t("Hide Stickers") : _t("Show Stickers")}
/>,
);
} }
if (!this.state.haveRecording && !this.state.narrowMode) { if (!this.state.haveRecording && !this.state.narrowMode) {
buttons.push( buttons.set(
_t("Send voice message"),
<AccessibleTooltipButton <AccessibleTooltipButton
className="mx_MessageComposer_button mx_MessageComposer_voiceMessage" className="mx_MessageComposer_button mx_MessageComposer_voiceMessage"
onClick={() => this.voiceRecordingButton?.onRecordStartEndClick()} onClick={() => this.voiceRecordingButton?.onRecordStartEndClick()}
@ -444,7 +452,7 @@ export default class MessageComposer extends React.Component<IProps, IState> {
} }
if (!this.state.narrowMode) { if (!this.state.narrowMode) {
return buttons; return Array.from(buttons.values());
} else { } else {
const classnames = classNames({ const classnames = classNames({
mx_MessageComposer_button: true, mx_MessageComposer_button: true,
@ -457,19 +465,23 @@ export default class MessageComposer extends React.Component<IProps, IState> {
<AccessibleTooltipButton <AccessibleTooltipButton
className={classnames} className={classnames}
onClick={this.toggleButtonMenu} onClick={this.toggleButtonMenu}
title={_t("view more options")} title={_t("Composer menu")}
tooltip={false}
/> />
{ this.state.isMenuOpen && ( { this.state.isMenuOpen && (
<ContextMenu <ContextMenu
onFinished={this.toggleButtonMenu} onFinished={this.toggleButtonMenu}
{...menuPosition} {...menuPosition}
menuPaddingRight={10} menuPaddingRight={10}
menuPaddingTop={16} menuPaddingTop={5}
menuWidth={50} menuPaddingBottom={5}
menuWidth={150}
wrapperClassName="mx_MessageComposer_Menu"
> >
{ buttons.slice(1).map((button, index) => ( { Array.from(buttons).slice(1).map(([label, button]) => (
<MenuItem className="mx_CallContextMenu_item" key={index} onClick={this.toggleButtonMenu}> <MenuItem className="mx_CallContextMenu_item" key={label} onClick={this.toggleButtonMenu}>
{ button } { button }
{ label }
</MenuItem> </MenuItem>
)) } )) }
</ContextMenu> </ContextMenu>
@ -568,7 +580,7 @@ export default class MessageComposer extends React.Component<IProps, IState> {
}); });
return ( return (
<div className={classes}> <div className={classes} ref={this.ref}>
{ recordingTooltip } { recordingTooltip }
<div className="mx_MessageComposer_wrapper"> <div className="mx_MessageComposer_wrapper">
{ this.props.showReplyPreview && ( { this.props.showReplyPreview && (

View file

@ -1558,8 +1558,10 @@
"Send a reply…": "Send a reply…", "Send a reply…": "Send a reply…",
"Send an encrypted message…": "Send an encrypted message…", "Send an encrypted message…": "Send an encrypted message…",
"Send a message…": "Send a message…", "Send a message…": "Send a message…",
"Hide Stickers": "Hide Stickers", "Send File": "Send File",
"Show Emojis": "Show Emojis",
"Show Stickers": "Show Stickers", "Show Stickers": "Show Stickers",
"Hide Stickers": "Hide Stickers",
"Send voice message": "Send voice message", "Send voice message": "Send voice message",
"view more options": "view more options", "view more options": "view more options",
"The conversation continues here.": "The conversation continues here.", "The conversation continues here.": "The conversation continues here.",