diff --git a/src/components/structures/RoomDirectory.js b/src/components/structures/RoomDirectory.js
index 13ae83b067..55078e68be 100644
--- a/src/components/structures/RoomDirectory.js
+++ b/src/components/structures/RoomDirectory.js
@@ -321,7 +321,7 @@ module.exports = createReactClass({
}
},
- onJoinClick: function(alias) {
+ onJoinFromSearchClick: function(alias) {
// If we don't have a particular instance id selected, just show that rooms alias
if (!this.state.instanceId) {
// If the user specified an alias without a domain, add on whichever server is selected
@@ -363,6 +363,34 @@ module.exports = createReactClass({
}
},
+ onPreviewClick: function(room) {
+ this.props.onFinished();
+ dis.dispatch({
+ action: 'view_room',
+ room_id: room.room_id,
+ should_peek: true,
+ });
+ },
+
+ onViewClick: function(room) {
+ this.props.onFinished();
+ dis.dispatch({
+ action: 'view_room',
+ room_id: room.room_id,
+ should_peek: false,
+ });
+ },
+
+ onJoinClick: function(room) {
+ this.props.onFinished();
+ MatrixClientPeg.get().joinRoom(room.room_id);
+ dis.dispatch({
+ action: 'view_room',
+ room_id: room.room_id,
+ joining: true,
+ });
+ },
+
showRoomAlias: function(alias, autoJoin=false) {
this.showRoom(null, alias, autoJoin);
},
@@ -407,74 +435,69 @@ module.exports = createReactClass({
dis.dispatch(payload);
},
- getRows: function() {
+ getRow(room) {
+ const client = MatrixClientPeg.get();
+ const clientRoom = client.getRoom(room.room_id);
+ const hasJoinedRoom = clientRoom && clientRoom.getMyMembership() === "join";
+ const isGuest = client.isGuest();
const BaseAvatar = sdk.getComponent('avatars.BaseAvatar');
+ const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
+ let previewButton;
+ let joinOrViewButton;
- if (!this.state.publicRooms) return [];
-
- const rooms = this.state.publicRooms;
- const rows = [];
- const self = this;
- let guestRead; let guestJoin; let perms;
- for (let i = 0; i < rooms.length; i++) {
- guestRead = null;
- guestJoin = null;
-
- if (rooms[i].world_readable) {
- guestRead = (
-
{ _t('World readable') }
- );
- }
- if (rooms[i].guest_can_join) {
- guestJoin = (
- { _t('Guests can join') }
- );
- }
-
- perms = null;
- if (guestRead || guestJoin) {
- perms = {guestRead}{guestJoin}
;
- }
-
- let name = rooms[i].name || get_display_alias_for_room(rooms[i]) || _t('Unnamed room');
- if (name.length > MAX_NAME_LENGTH) {
- name = `${name.substring(0, MAX_NAME_LENGTH)}...`;
- }
-
- let topic = rooms[i].topic || '';
- if (topic.length > MAX_TOPIC_LENGTH) {
- topic = `${topic.substring(0, MAX_TOPIC_LENGTH)}...`;
- }
- topic = linkifyAndSanitizeHtml(topic);
-
- rows.push(
- {ev.preventDefault();}}
- >
-
-
- |
-
- { name }
- { perms }
-
- { get_display_alias_for_room(rooms[i]) }
- |
-
- { rooms[i].num_joined_members }
- |
-
,
+ if (room.world_readable && !hasJoinedRoom) {
+ previewButton = (
+ this.onPreviewClick(room)}>{_t("Preview")}
);
}
- return rows;
+ if (hasJoinedRoom) {
+ joinOrViewButton = (
+ this.onViewClick(room)}>{_t("View")}
+ );
+ } else if (!isGuest || room.guest_can_join) {
+ joinOrViewButton = (
+ this.onJoinClick(room)}>{_t("Join")}
+ );
+ }
+
+ let name = room.name || get_display_alias_for_room(room) || _t('Unnamed room');
+ if (name.length > MAX_NAME_LENGTH) {
+ name = `${name.substring(0, MAX_NAME_LENGTH)}...`;
+ }
+
+ let topic = room.topic || '';
+ if (topic.length > MAX_TOPIC_LENGTH) {
+ topic = `${topic.substring(0, MAX_TOPIC_LENGTH)}...`;
+ }
+ topic = linkifyAndSanitizeHtml(topic);
+
+ return (
+ this.onRoomClicked(room)}
+ // cancel onMouseDown otherwise shift-clicking highlights text
+ onMouseDown={(ev) => {ev.preventDefault();}}
+ >
+
+
+ |
+
+ { name }
+
+ { get_display_alias_for_room(room) }
+ |
+
+ { room.num_joined_members }
+ |
+ {previewButton} |
+ {joinOrViewButton} |
+
+ );
},
collectScrollPanel: function(element) {
@@ -528,7 +551,7 @@ module.exports = createReactClass({
} else if (this.state.protocolsLoading || this.state.loading) {
content = ;
} else {
- const rows = this.getRows();
+ const rows = (this.state.publicRooms || []).map(room => this.getRow(room));
// we still show the scrollpanel, at least for now, because
// otherwise we don't fetch more because we don't get a fill
// request from the scrollpanel because there isn't one
@@ -538,7 +561,7 @@ module.exports = createReactClass({
} else {
scrollpanel_content =
- { this.getRows() }
+ { rows }
;
}
@@ -590,7 +613,7 @@ module.exports = createReactClass({
listHeader =
diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json
index c7ce3cd19b..ebbe055694 100644
--- a/src/i18n/strings/en_EN.json
+++ b/src/i18n/strings/en_EN.json
@@ -1598,6 +1598,8 @@
"Couldn't find a matching Matrix room": "Couldn't find a matching Matrix room",
"Fetching third party location failed": "Fetching third party location failed",
"Unable to look up room ID from server": "Unable to look up room ID from server",
+ "Preview": "Preview",
+ "View": "View",
"Search for a room": "Search for a room",
"Search for a room like #example": "Search for a room like #example",
"Message not sent due to unknown devices being present": "Message not sent due to unknown devices being present",