Add "Copy" to room context menu.

This menu item creates a matrix.to link for the room and copies it to the clipboard.
This commit is contained in:
James Salter 2021-07-14 14:58:18 +01:00
parent 1b39dbdb53
commit 8bf5e61acc
2 changed files with 32 additions and 0 deletions

View file

@ -105,6 +105,8 @@ import VerificationRequestToast from '../views/toasts/VerificationRequestToast';
import PerformanceMonitor, { PerformanceEntryNames } from "../../performance"; import PerformanceMonitor, { PerformanceEntryNames } from "../../performance";
import UIStore, { UI_EVENTS } from "../../stores/UIStore"; import UIStore, { UI_EVENTS } from "../../stores/UIStore";
import SoftLogout from './auth/SoftLogout'; import SoftLogout from './auth/SoftLogout';
import { makeRoomPermalink } from "../../utils/permalinks/Permalinks";
import { copyPlaintext } from "../../utils/strings";
/** constants for MatrixChat.state.view */ /** constants for MatrixChat.state.view */
export enum Views { export enum Views {
@ -627,6 +629,9 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> {
case 'forget_room': case 'forget_room':
this.forgetRoom(payload.room_id); this.forgetRoom(payload.room_id);
break; break;
case 'copy_room':
this.copyRoom(payload.room_id);
break;
case 'reject_invite': case 'reject_invite':
Modal.createTrackedDialog('Reject invitation', '', QuestionDialog, { Modal.createTrackedDialog('Reject invitation', '', QuestionDialog, {
title: _t('Reject invitation'), title: _t('Reject invitation'),
@ -1193,6 +1198,17 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> {
}); });
} }
private async copyRoom(roomId: string) {
const roomLink = makeRoomPermalink(roomId);
const success = await copyPlaintext(roomLink);
if (!success) {
Modal.createTrackedDialog("Unable to copy room", "", ErrorDialog, {
title: _t("Unable to copy room"),
description: _t("Unable to copy room"),
});
}
}
/** /**
* Starts a chat with the welcome user, if the user doesn't already have one * Starts a chat with the welcome user, if the user doesn't already have one
* @returns {string} The room ID of the new room, or null if no room was created * @returns {string} The room ID of the new room, or null if no room was created

View file

@ -358,6 +358,17 @@ export default class RoomTile extends React.PureComponent<IProps, IState> {
this.setState({ generalMenuPosition: null }); // hide the menu this.setState({ generalMenuPosition: null }); // hide the menu
}; };
private onCopyRoomClick = (ev: ButtonEvent) => {
ev.preventDefault();
ev.stopPropagation();
dis.dispatch({
action: 'copy_room',
room_id: this.props.room.roomId,
});
this.setState({ generalMenuPosition: null }); // hide the menu
};
private onInviteClick = (ev: ButtonEvent) => { private onInviteClick = (ev: ButtonEvent) => {
ev.preventDefault(); ev.preventDefault();
ev.stopPropagation(); ev.stopPropagation();
@ -522,6 +533,11 @@ export default class RoomTile extends React.PureComponent<IProps, IState> {
label={_t("Settings")} label={_t("Settings")}
iconClassName="mx_RoomTile_iconSettings" iconClassName="mx_RoomTile_iconSettings"
/> />
<IconizedContextMenuOption
onClick={this.onCopyRoomClick}
label={_t("Copy")}
iconClassName="mx_RoomTile_iconSettings"
/>
</IconizedContextMenuOptionList> </IconizedContextMenuOptionList>
<IconizedContextMenuOptionList red> <IconizedContextMenuOptionList red>
<IconizedContextMenuOption <IconizedContextMenuOption