mirror of https://github.com/vector-im/riot-web
Merge pull request #6374 from matrix-org/copy-room
Add "Copy Link" to room context menupull/21833/head
commit
b55f69a74c
|
@ -193,6 +193,10 @@ limitations under the License.
|
||||||
mask-image: url('$(res)/img/element-icons/settings.svg');
|
mask-image: url('$(res)/img/element-icons/settings.svg');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.mx_RoomTile_iconCopyLink::before {
|
||||||
|
mask-image: url('$(res)/img/element-icons/link.svg');
|
||||||
|
}
|
||||||
|
|
||||||
.mx_RoomTile_iconInvite::before {
|
.mx_RoomTile_iconInvite::before {
|
||||||
mask-image: url('$(res)/img/element-icons/room/invite.svg');
|
mask-image: url('$(res)/img/element-icons/room/invite.svg');
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 link", "", ErrorDialog, {
|
||||||
|
title: _t("Unable to copy room link"),
|
||||||
|
description: _t("Unable to copy a link to the room to the clipboard."),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
||||||
|
|
|
@ -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();
|
||||||
|
@ -517,6 +528,11 @@ export default class RoomTile extends React.PureComponent<IProps, IState> {
|
||||||
iconClassName="mx_RoomTile_iconInvite"
|
iconClassName="mx_RoomTile_iconInvite"
|
||||||
/>
|
/>
|
||||||
) : null}
|
) : null}
|
||||||
|
<IconizedContextMenuOption
|
||||||
|
onClick={this.onCopyRoomClick}
|
||||||
|
label={_t("Copy Link")}
|
||||||
|
iconClassName="mx_RoomTile_iconCopyLink"
|
||||||
|
/>
|
||||||
<IconizedContextMenuOption
|
<IconizedContextMenuOption
|
||||||
onClick={this.onOpenRoomSettings}
|
onClick={this.onOpenRoomSettings}
|
||||||
label={_t("Settings")}
|
label={_t("Settings")}
|
||||||
|
|
|
@ -1667,6 +1667,7 @@
|
||||||
"Favourite": "Favourite",
|
"Favourite": "Favourite",
|
||||||
"Low Priority": "Low Priority",
|
"Low Priority": "Low Priority",
|
||||||
"Invite People": "Invite People",
|
"Invite People": "Invite People",
|
||||||
|
"Copy Link": "Copy Link",
|
||||||
"Leave Room": "Leave Room",
|
"Leave Room": "Leave Room",
|
||||||
"Room options": "Room options",
|
"Room options": "Room options",
|
||||||
"%(count)s unread messages including mentions.|other": "%(count)s unread messages including mentions.",
|
"%(count)s unread messages including mentions.|other": "%(count)s unread messages including mentions.",
|
||||||
|
@ -2674,6 +2675,8 @@
|
||||||
"Are you sure you want to leave the space '%(spaceName)s'?": "Are you sure you want to leave the space '%(spaceName)s'?",
|
"Are you sure you want to leave the space '%(spaceName)s'?": "Are you sure you want to leave the space '%(spaceName)s'?",
|
||||||
"Are you sure you want to leave the room '%(roomName)s'?": "Are you sure you want to leave the room '%(roomName)s'?",
|
"Are you sure you want to leave the room '%(roomName)s'?": "Are you sure you want to leave the room '%(roomName)s'?",
|
||||||
"Failed to forget room %(errCode)s": "Failed to forget room %(errCode)s",
|
"Failed to forget room %(errCode)s": "Failed to forget room %(errCode)s",
|
||||||
|
"Unable to copy room link": "Unable to copy room link",
|
||||||
|
"Unable to copy a link to the room to the clipboard.": "Unable to copy a link to the room to the clipboard.",
|
||||||
"Signed Out": "Signed Out",
|
"Signed Out": "Signed Out",
|
||||||
"For security, this session has been signed out. Please sign in again.": "For security, this session has been signed out. Please sign in again.",
|
"For security, this session has been signed out. Please sign in again.": "For security, this session has been signed out. Please sign in again.",
|
||||||
"Terms and Conditions": "Terms and Conditions",
|
"Terms and Conditions": "Terms and Conditions",
|
||||||
|
|
Loading…
Reference in New Issue