Make the category functions React components

pull/21833/head
David Baker 2017-07-11 14:28:44 +01:00
parent 222ca054c5
commit 8690ed2181
1 changed files with 74 additions and 41 deletions

View File

@ -23,33 +23,54 @@ import { sanitizedHtmlNode } from '../../HtmlUtils';
import { _t } from '../../languageHandler'; import { _t } from '../../languageHandler';
import AccessibleButton from '../views/elements/AccessibleButton'; import AccessibleButton from '../views/elements/AccessibleButton';
const RoomSummaryType = PropTypes.shape({
room_id: PropTypes.string.isRequired,
profile: PropTypes.shape({
name: PropTypes.string,
avatar_url: PropTypes.string,
canonical_alias: PropTypes.string,
}).isRequired
});
function categoryRoomListNode(rooms, categoryId, category) { const UserSummaryType = PropTypes.shape({
const roomNodes = rooms.map((r) => { summaryInfo: PropTypes.shape({
return <FeaturedRoom key={r.room_id} summaryInfo={r} />; user_id: PropTypes.string.isRequired,
}); }).isRequired,
let catHeader = null; });
if (category && category.profile) {
catHeader = <div className="mx_GroupView_featuredThings_category">{category.profile.name}</div>; const CategoryRoomList = React.createClass({
} displayName: 'CategoryRoomList',
return <div key={categoryId}>
{catHeader} props: {
{roomNodes} rooms: PropTypes.arrayOf(RoomSummaryType).isRequired,
</div>; categoryId: PropTypes.string,
} category: PropTypes.shape({
profile: PropTypes.shape({
name: PropTypes.string,
}).isRequired,
}),
},
render: function() {
const roomNodes = this.props.rooms.map((r) => {
return <FeaturedRoom key={r.room_id} summaryInfo={r} />;
});
let catHeader = null;
if (this.props.category && this.props.category.profile) {
catHeader = <div className="mx_GroupView_featuredThings_category">{this.props.category.profile.name}</div>;
}
return <div key={this.props.categoryId}>
{catHeader}
{roomNodes}
</div>;
},
});
const FeaturedRoom = React.createClass({ const FeaturedRoom = React.createClass({
displayName: 'FeaturedRoom', displayName: 'FeaturedRoom',
props: { props: {
summaryInfo: PropTypes.shape({ summaryInfo: RoomSummaryType.isRequired,
room_id: PropTypes.string.isRequired,
profile: PropTypes.shape({
name: PropTypes.string,
avatar_url: PropTypes.string,
canonical_alias: PropTypes.string,
}).isRequired,
}).isRequired,
}, },
onClick: function(e) { onClick: function(e) {
@ -89,27 +110,39 @@ const FeaturedRoom = React.createClass({
}, },
}); });
function roleUserListNode(users, roleId, role) { const RoleUserList = React.createClass({
const userNodes = users.map((u) => { displayName: 'RoleUserList',
return <FeaturedUser key={u.user_id} summaryInfo={u} />;
}); props: {
let roleHeader = null; users: PropTypes.arrayOf(UserSummaryType).isRequired,
if (role && role.profile) { roleId: PropTypes.string,
roleHeader = <div className="mx_GroupView_featuredThings_category">{role.profile.name}</div>; role: PropTypes.shape({
} profile: PropTypes.shape({
return <div key={roleId}> name: PropTypes.string,
{roleHeader} }).isRequired,
{userNodes} }),
</div>; },
}
render: function() {
const userNodes = this.props.users.map((u) => {
return <FeaturedUser key={u.user_id} summaryInfo={u} />;
});
let roleHeader = null;
if (this.props.role && this.props.role.profile) {
roleHeader = <div className="mx_GroupView_featuredThings_category">{this.props.role.profile.name}</div>;
}
return <div key={this.props.roleId}>
{roleHeader}
{userNodes}
</div>;
},
});
const FeaturedUser = React.createClass({ const FeaturedUser = React.createClass({
displayName: 'FeaturedUser', displayName: 'FeaturedUser',
props: { props: {
summaryInfo: PropTypes.shape({ summaryInfo: UserSummaryType.isRequired,
user_id: PropTypes.string.isRequired,
}).isRequired,
}, },
onClick: function(e) { onClick: function(e) {
@ -206,11 +239,11 @@ export default React.createClass({
let defaultCategoryNode = null; let defaultCategoryNode = null;
if (defaultCategoryRooms.length > 0) { if (defaultCategoryRooms.length > 0) {
defaultCategoryNode = categoryRoomListNode(defaultCategoryRooms); defaultCategoryNode = <CategoryRoomList rooms={defaultCategoryRooms} />;
} }
const categoryRoomNodes = Object.keys(categoryRooms).map((catId) => { const categoryRoomNodes = Object.keys(categoryRooms).map((catId) => {
const cat = summary.rooms_section.categories[catId]; const cat = summary.rooms_section.categories[catId];
return categoryRoomListNode(categoryRooms[catId], catId, cat); return <CategoryRoomList rooms={categoryRooms[catId]} categoryId={catId} category={cat} />;
}); });
return <div className="mx_GroupView_featuredThings"> return <div className="mx_GroupView_featuredThings">
@ -244,11 +277,11 @@ export default React.createClass({
let noRoleNode = null; let noRoleNode = null;
if (noRoleUsers.length > 0) { if (noRoleUsers.length > 0) {
noRoleNode = roleUserListNode(noRoleUsers); noRoleNode = <RoleUserList users={noRoleUsers} />;
} }
const roleUserNodes = Object.keys(roleUsers).map((roleId) => { const roleUserNodes = Object.keys(roleUsers).map((roleId) => {
const role = summary.users_section.roles[roleId]; const role = summary.users_section.roles[roleId];
return roleUserListNode(roleUsers[roleId], roleId, role); return <RoleUserList users={roleUsers[roleId]} roleId={roleId} role={role} />;
}); });
return <div className="mx_GroupView_featuredThings"> return <div className="mx_GroupView_featuredThings">