diff --git a/src/components/structures/GroupView.js b/src/components/structures/GroupView.js index 0f10ba60e2..0a7674f4d8 100644 --- a/src/components/structures/GroupView.js +++ b/src/components/structures/GroupView.js @@ -18,10 +18,67 @@ import React from 'react'; import PropTypes from 'prop-types'; import MatrixClientPeg from '../../MatrixClientPeg'; import sdk from '../../index'; +import dis from '../../dispatcher'; import { sanitizedHtmlNode } from '../../HtmlUtils'; import { _t } from '../../languageHandler'; +import AccessibleButton from '../views/elements/AccessibleButton'; +function categoryRoomListNode(rooms, categoryId, category) { + const roomNodes = rooms.map((r) => { + return ; + }); + let catHeader = null; + if (category && category.profile) catHeader =
{category.profile.name}
+ return
+ {catHeader} + {roomNodes} +
; +} + +const FeaturedRoom = React.createClass({ + displayName: 'FeaturedRoom', + + props: { + summaryInfo: PropTypes.object.isRequired, + }, + + onClick: function(e) { + e.preventDefault(); + + dis.dispatch({ + action: 'view_room', + room_alias: this.props.summaryInfo.profile.canonical_alias, + room_id: this.props.summaryInfo.room_id, + }); + }, + + render: function() { + const RoomAvatar = sdk.getComponent("avatars.RoomAvatar"); + + const oobData = { + roomId: this.props.summaryInfo.room_id, + avatarUrl: this.props.summaryInfo.profile.avatar_url, + name: this.props.summaryInfo.profile.name, + }; + let permalink = null; + if (this.props.summaryInfo.profile && this.props.summaryInfo.profile.canonical_alias) { + permalink = 'https://matrix.to/#/' + this.props.summaryInfo.profile.canonical_alias; + } + let roomNameNode = null; + if (permalink) { + roomNameNode = {this.props.summaryInfo.profile.name}; + } else { + roomNameNode = {this.props.summaryInfo.profile.name}; + } + + return + +
{roomNameNode}
+
; + } +}); + export default React.createClass({ displayName: 'GroupView', @@ -33,6 +90,7 @@ export default React.createClass({ return { summary: null, error: null, + editing: false, }; }, @@ -64,12 +122,19 @@ export default React.createClass({ }); }, + _onSettingsClick: function() { + this.setState({editing: true}); + }, + render: function() { const GroupAvatar = sdk.getComponent("avatars.GroupAvatar"); const Loader = sdk.getComponent("elements.Spinner"); + const TintableSvg = sdk.getComponent("elements.TintableSvg"); if (this.state.summary === null && this.state.error === null) { return ; + } else if (this.state.editing) { + return
; } else if (this.state.summary) { const summary = this.state.summary; let description = null; @@ -77,6 +142,50 @@ export default React.createClass({ description = sanitizedHtmlNode(summary.profile.long_description); } + let featuredRooms = null; + if (summary.rooms_section.rooms.length > 0) { + let defaultCategoryRooms = []; + let categoryRooms = {}; + summary.rooms_section.rooms.forEach((r) => { + if (r.category_id === null) { + defaultCategoryRooms.push(r); + } else { + let list = categoryRooms[r.category_id]; + if (list === undefined) { + list = []; + categoryRooms[r.category_id] = list; + } + list.push(r); + } + }); + /*[defaultCategoryRooms, ...Object.values(categoryRooms)].forEach((roomList) => { + roomList.sort((r1, r2) => { + return r1.order - r2.order; + }); + });*/ + + let defaultCategoryNode = null; + if (defaultCategoryRooms.length > 0) { + defaultCategoryNode = categoryRoomListNode(defaultCategoryRooms); + } + const categoryRoomNodes = Object.keys(categoryRooms).map((catId) => { + const cat = summary.rooms_section.categories[catId]; + return categoryRoomListNode(categoryRooms[catId], catId, cat); + }); + + featuredRooms =
+
+ {_t('Featured Rooms:')} +
+ {defaultCategoryNode} + {categoryRoomNodes} +
; + } + const roomBody =
+
{description}
+ {featuredRooms} +
; + let nameNode; if (summary.profile.name) { nameNode =
@@ -108,9 +217,12 @@ export default React.createClass({ {summary.profile.short_description}
+ + + - {description} + {roomBody} ); } else if (this.state.error) { diff --git a/src/components/views/avatars/RoomAvatar.js b/src/components/views/avatars/RoomAvatar.js index 8041fd5cd7..728d71a6a9 100644 --- a/src/components/views/avatars/RoomAvatar.js +++ b/src/components/views/avatars/RoomAvatar.js @@ -126,9 +126,16 @@ module.exports = React.createClass({ }, getFallbackAvatar: function(props) { - if (!this.props.room) return null; + let roomId = null; + if (props.oobData && props.oobData.roomId) { + roomId = this.props.oobData.roomId; + } else if (props.room) { + roomId = props.room.roomId; + } else { + return null; + } - return Avatar.defaultAvatarUrlForString(props.room.roomId); + return Avatar.defaultAvatarUrlForString(roomId); }, render: function() { diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 2b0f15703c..f187a6f034 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -946,5 +946,6 @@ "You are a member of these groups": "You are a member of these groups", "Create a group to represent your community! Define a set of rooms and your own custom homepage to mark out your space in the Matrix universe.": "Create a group to represent your community! Define a set of rooms and your own custom homepage to mark out your space in the Matrix universe.", "Join an existing group": "Join an existing group", - "To join an exisitng group you'll have to know its group identifier; this will look something like +example:matrix.org.": "To join an exisitng group you'll have to know its group identifier; this will look something like +example:matrix.org." + "To join an exisitng group you'll have to know its group identifier; this will look something like +example:matrix.org.": "To join an exisitng group you'll have to know its group identifier; this will look something like +example:matrix.org.", + "Featured Rooms:": "Featured Rooms:" }