Merge pull request #5624 from SimonBrandner/show-room-name

Display room name in pills instead of address
This commit is contained in:
J. Ryan Stinnett 2021-03-08 16:27:43 +00:00 committed by GitHub
commit b12cf7912a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 49 additions and 9 deletions

View file

@ -26,6 +26,7 @@ import FlairStore from "../../../stores/FlairStore";
import {getPrimaryPermalinkEntity, parseAppLocalLink} from "../../../utils/permalinks/Permalinks"; import {getPrimaryPermalinkEntity, parseAppLocalLink} from "../../../utils/permalinks/Permalinks";
import MatrixClientContext from "../../../contexts/MatrixClientContext"; import MatrixClientContext from "../../../contexts/MatrixClientContext";
import {Action} from "../../../dispatcher/actions"; import {Action} from "../../../dispatcher/actions";
import Tooltip from './Tooltip';
class Pill extends React.Component { class Pill extends React.Component {
static roomNotifPos(text) { static roomNotifPos(text) {
@ -68,6 +69,8 @@ class Pill extends React.Component {
group: null, group: null,
// The room related to the room pill // The room related to the room pill
room: null, room: null,
// Is the user hovering the pill
hover: false,
}; };
// TODO: [REACT-WARNING] Replace with appropriate lifecycle event // TODO: [REACT-WARNING] Replace with appropriate lifecycle event
@ -154,6 +157,18 @@ class Pill extends React.Component {
this._unmounted = true; this._unmounted = true;
} }
onMouseOver = () => {
this.setState({
hover: true,
});
};
onMouseLeave = () => {
this.setState({
hover: false,
});
};
doProfileLookup(userId, member) { doProfileLookup(userId, member) {
MatrixClientPeg.get().getProfileInfo(userId).then((resp) => { MatrixClientPeg.get().getProfileInfo(userId).then((resp) => {
if (this._unmounted) { if (this._unmounted) {
@ -226,7 +241,7 @@ class Pill extends React.Component {
case Pill.TYPE_ROOM_MENTION: { case Pill.TYPE_ROOM_MENTION: {
const room = this.state.room; const room = this.state.room;
if (room) { if (room) {
linkText = resource; linkText = room.name || resource;
if (this.props.shouldShowPillAvatar) { if (this.props.shouldShowPillAvatar) {
avatar = <RoomAvatar room={room} width={16} height={16} aria-hidden="true" />; avatar = <RoomAvatar room={room} width={16} height={16} aria-hidden="true" />;
} }
@ -256,15 +271,36 @@ class Pill extends React.Component {
}); });
if (this.state.pillType) { if (this.state.pillType) {
const {yOffset} = this.props;
let tip;
if (this.state.hover && resource) {
tip = <Tooltip label={resource} yOffset={yOffset} />;
}
return <MatrixClientContext.Provider value={this._matrixClient}> return <MatrixClientContext.Provider value={this._matrixClient}>
{ this.props.inMessage ? { this.props.inMessage ?
<a className={classes} href={href} onClick={onClick} title={resource} data-offset-key={this.props.offsetKey}> <a
className={classes}
href={href}
onClick={onClick}
data-offset-key={this.props.offsetKey}
onMouseOver={this.onMouseOver}
onMouseLeave={this.onMouseLeave}
>
{ avatar } { avatar }
{ linkText } { linkText }
{ tip }
</a> : </a> :
<span className={classes} title={resource} data-offset-key={this.props.offsetKey}> <span
className={classes}
data-offset-key={this.props.offsetKey}
onMouseOver={this.onMouseOver}
onMouseLeave={this.onMouseLeave}
>
{ avatar } { avatar }
{ linkText } { linkText }
{ tip }
</span> } </span> }
</MatrixClientContext.Provider>; </MatrixClientContext.Provider>;
} else { } else {

View file

@ -329,8 +329,8 @@ class NewlinePart extends BasePart implements IBasePart {
} }
class RoomPillPart extends PillPart { class RoomPillPart extends PillPart {
constructor(displayAlias, private room: Room) { constructor(resourceId: string, label: string, private room: Room) {
super(displayAlias, displayAlias); super(resourceId, label);
} }
setAvatar(node: HTMLElement) { setAvatar(node: HTMLElement) {
@ -357,6 +357,10 @@ class RoomPillPart extends PillPart {
} }
class AtRoomPillPart extends RoomPillPart { class AtRoomPillPart extends RoomPillPart {
constructor(text: string, room: Room) {
super(text, text, room);
}
get type(): IPillPart["type"] { get type(): IPillPart["type"] {
return Type.AtRoomPill; return Type.AtRoomPill;
} }
@ -521,7 +525,7 @@ export class PartCreator {
r.getAltAliases().includes(alias); r.getAltAliases().includes(alias);
}); });
} }
return new RoomPillPart(alias, room); return new RoomPillPart(alias, room ? room.name : alias, room);
} }
atRoomPill(text: string) { atRoomPill(text: string) {

View file

@ -208,7 +208,7 @@ describe("<TextualBody />", () => {
const content = wrapper.find(".mx_EventTile_body"); const content = wrapper.find(".mx_EventTile_body");
expect(content.html()).toBe('<span class="mx_EventTile_body markdown-body" dir="auto">' + expect(content.html()).toBe('<span class="mx_EventTile_body markdown-body" dir="auto">' +
'Hey <span>' + 'Hey <span>' +
'<a class="mx_Pill mx_UserPill" title="@user:server">' + '<a class="mx_Pill mx_UserPill">' +
'<img class="mx_BaseAvatar mx_BaseAvatar_image" src="mxc://avatar.url/image.png" ' + '<img class="mx_BaseAvatar mx_BaseAvatar_image" src="mxc://avatar.url/image.png" ' +
'style="width: 16px; height: 16px;" title="@member:domain.bla" alt="" aria-hidden="true">Member</a>' + 'style="width: 16px; height: 16px;" title="@member:domain.bla" alt="" aria-hidden="true">Member</a>' +
'</span></span>'); '</span></span>');
@ -267,8 +267,8 @@ describe("<TextualBody />", () => {
expect(content.html()).toBe( expect(content.html()).toBe(
'<span class="mx_EventTile_body markdown-body" dir="auto">' + '<span class="mx_EventTile_body markdown-body" dir="auto">' +
'A <span><a class="mx_Pill mx_RoomPill" href="#/room/!ZxbRYPQXDXKGmDnJNg:example.com' + 'A <span><a class="mx_Pill mx_RoomPill" href="#/room/!ZxbRYPQXDXKGmDnJNg:example.com' +
'?via=example.com&amp;via=bob.com" ' + '?via=example.com&amp;via=bob.com"' +
'title="!ZxbRYPQXDXKGmDnJNg:example.com"><img class="mx_BaseAvatar mx_BaseAvatar_image" ' + '><img class="mx_BaseAvatar mx_BaseAvatar_image" ' +
'src="mxc://avatar.url/room.png" ' + 'src="mxc://avatar.url/room.png" ' +
'style="width: 16px; height: 16px;" alt="" aria-hidden="true">' + 'style="width: 16px; height: 16px;" alt="" aria-hidden="true">' +
'!ZxbRYPQXDXKGmDnJNg:example.com</a></span> with vias</span>', '!ZxbRYPQXDXKGmDnJNg:example.com</a></span> with vias</span>',