diff --git a/src/components/structures/TimelinePanel.js b/src/components/structures/TimelinePanel.js index 296565488c..3aec582f89 100644 --- a/src/components/structures/TimelinePanel.js +++ b/src/components/structures/TimelinePanel.js @@ -523,9 +523,7 @@ var TimelinePanel = React.createClass({ this.props.timelineSet.room.setUnreadNotificationCount('highlight', 0); dis.dispatch({ action: 'on_room_read', - payload: { - room: this.props.timelineSet.room - } + room: this.props.timelineSet.room, }); } } diff --git a/src/components/views/rooms/RoomList.js b/src/components/views/rooms/RoomList.js index 3ea80837d6..739c288598 100644 --- a/src/components/views/rooms/RoomList.js +++ b/src/components/views/rooms/RoomList.js @@ -21,7 +21,6 @@ var GeminiScrollbar = require('react-gemini-scrollbar'); var MatrixClientPeg = require("../../../MatrixClientPeg"); var CallHandler = require('../../../CallHandler'); var RoomListSorter = require("../../../RoomListSorter"); -var Unread = require('../../../Unread'); var dis = require("../../../dispatcher"); var sdk = require('../../../index'); var rate_limited_func = require('../../../ratelimitedfunc'); @@ -38,7 +37,7 @@ module.exports = React.createClass({ propTypes: { ConferenceHandler: React.PropTypes.any, collapsed: React.PropTypes.bool.isRequired, - currentRoom: React.PropTypes.string, + selectedRoom: React.PropTypes.string, searchFilter: React.PropTypes.string, }, @@ -57,17 +56,16 @@ module.exports = React.createClass({ cli.on("Room.timeline", this.onRoomTimeline); cli.on("Room.name", this.onRoomName); cli.on("Room.tags", this.onRoomTags); - cli.on("Room.receipt", this.onRoomReceipt); // cli.on("RoomState.events", this.onRoomStateEvents); cli.on("RoomMember.name", this.onRoomMemberName); cli.on("accountData", this.onAccountData); - var s = this.getRoomLists(); - this.setState(s); - // lookup for which lists a given roomId is currently in. this.listsForRoomId = {}; + var s = this.getRoomLists(); + this.setState(s); + // order of the sublists this.listOrder = []; }, @@ -78,6 +76,21 @@ module.exports = React.createClass({ this._updateStickyHeaders(true); }, + componentWillReceiveProps: function(nextProps) { + // short-circuit react when the room changes + // to avoid rerendering all the sublists everywhere + if (nextProps.selectedRoom !== this.props.selectedRoom) { + if (this.props.selectedRoom) { + constantTimeDispatcher.dispatch( + "RoomTile.select", this.props.selectedRoom, {} + ); + } + constantTimeDispatcher.dispatch( + "RoomTile.select", nextProps.selectedRoom, { selected: true } + ); + } + }, + componentDidUpdate: function() { // Reinitialise the stickyHeaders when the component is updated this._updateStickyHeaders(true); @@ -111,6 +124,17 @@ module.exports = React.createClass({ constantTimeDispatcher.dispatch( "RoomTile.refresh", payload.room.roomId, {} ); + + // also have to poke the right list(s) + var lists = this.listsForRoomId[payload.room.roomId]; + if (lists) { + lists.forEach(list=>{ + constantTimeDispatcher.dispatch( + "RoomSubList.refreshHeader", list, { room: payload.room } + ); + }); + } + break; } }, @@ -123,7 +147,6 @@ module.exports = React.createClass({ MatrixClientPeg.get().removeListener("Room.timeline", this.onRoomTimeline); MatrixClientPeg.get().removeListener("Room.name", this.onRoomName); MatrixClientPeg.get().removeListener("Room.tags", this.onRoomTags); - MatrixClientPeg.get().removeListener("Room.receipt", this.onRoomReceipt); // MatrixClientPeg.get().removeListener("RoomState.events", this.onRoomStateEvents); MatrixClientPeg.get().removeListener("RoomMember.name", this.onRoomMemberName); MatrixClientPeg.get().removeListener("accountData", this.onAccountData); @@ -556,7 +579,6 @@ module.exports = React.createClass({ label="Invites" editable={ false } order="recent" - selectedRoom={ self.props.selectedRoom } incomingCall={ self.state.incomingCall } collapsed={ self.props.collapsed } searchFilter={ self.props.searchFilter } @@ -570,7 +592,6 @@ module.exports = React.createClass({ verb="favourite" editable={ true } order="manual" - selectedRoom={ self.props.selectedRoom } incomingCall={ self.state.incomingCall } collapsed={ self.props.collapsed } searchFilter={ self.props.searchFilter } @@ -584,7 +605,6 @@ module.exports = React.createClass({ verb="tag direct chat" editable={ true } order="recent" - selectedRoom={ self.props.selectedRoom } incomingCall={ self.state.incomingCall } collapsed={ self.props.collapsed } alwaysShowHeader={ true } @@ -598,7 +618,6 @@ module.exports = React.createClass({ editable={ true } verb="restore" order="recent" - selectedRoom={ self.props.selectedRoom } incomingCall={ self.state.incomingCall } collapsed={ self.props.collapsed } searchFilter={ self.props.searchFilter } @@ -615,7 +634,6 @@ module.exports = React.createClass({ verb={ "tag as " + tagName } editable={ true } order="manual" - selectedRoom={ self.props.selectedRoom } incomingCall={ self.state.incomingCall } collapsed={ self.props.collapsed } searchFilter={ self.props.searchFilter } @@ -632,7 +650,6 @@ module.exports = React.createClass({ verb="demote" editable={ true } order="recent" - selectedRoom={ self.props.selectedRoom } incomingCall={ self.state.incomingCall } collapsed={ self.props.collapsed } searchFilter={ self.props.searchFilter } @@ -644,7 +661,6 @@ module.exports = React.createClass({ label="Historical" editable={ false } order="recent" - selectedRoom={ self.props.selectedRoom } collapsed={ self.props.collapsed } alwaysShowHeader={ true } startAsHidden={ true } diff --git a/src/components/views/rooms/RoomTile.js b/src/components/views/rooms/RoomTile.js index fc91d10d76..db997fff3e 100644 --- a/src/components/views/rooms/RoomTile.js +++ b/src/components/views/rooms/RoomTile.js @@ -28,6 +28,7 @@ var FormattingUtils = require('../../../utils/FormattingUtils'); import AccessibleButton from '../elements/AccessibleButton'; var UserSettingsStore = require('../../../UserSettingsStore'); var constantTimeDispatcher = require('../../../ConstantTimeDispatcher'); +var Unread = require('../../../Unread'); module.exports = React.createClass({ displayName: 'RoomTile', @@ -41,9 +42,6 @@ module.exports = React.createClass({ room: React.PropTypes.object.isRequired, collapsed: React.PropTypes.bool.isRequired, - selected: React.PropTypes.bool.isRequired, - unread: React.PropTypes.bool.isRequired, - highlight: React.PropTypes.bool.isRequired, isInvite: React.PropTypes.bool.isRequired, incomingCall: React.PropTypes.object, }, @@ -91,19 +89,30 @@ module.exports = React.createClass({ componentWillMount: function() { constantTimeDispatcher.register("RoomTile.refresh", this.props.room.roomId, this.onRefresh); + constantTimeDispatcher.register("RoomTile.select", this.props.room.roomId, this.onSelect); MatrixClientPeg.get().on("accountData", this.onAccountData); }, componentWillUnmount: function() { constantTimeDispatcher.unregister("RoomTile.refresh", this.props.room.roomId, this.onRefresh); + constantTimeDispatcher.unregister("RoomTile.select", this.props.room.roomId, this.onSelect); var cli = MatrixClientPeg.get(); if (cli) { MatrixClientPeg.get().removeListener("accountData", this.onAccountData); } }, - onRefresh: function() { - this.forceUpdate(); + onRefresh: function(params) { + this.setState({ + unread: Unread.doesRoomHaveUnreadMessages(this.props.room), + highlight: this.props.room.getUnreadNotificationCount('highlight') > 0 || this.props.label === 'Invites', + }); + }, + + onSelect: function(params) { + this.setState({ + selected: params.selected, + }); }, onClick: function() { @@ -183,13 +192,13 @@ module.exports = React.createClass({ // var highlightCount = this.props.room.getUnreadNotificationCount("highlight"); const notifBadges = notificationCount > 0 && this._shouldShowNotifBadge(); - const mentionBadges = this.props.highlight && this._shouldShowMentionBadge(); + const mentionBadges = this.state.highlight && this._shouldShowMentionBadge(); const badges = notifBadges || mentionBadges; var classes = classNames({ 'mx_RoomTile': true, - 'mx_RoomTile_selected': this.props.selected, - 'mx_RoomTile_unread': this.props.unread, + 'mx_RoomTile_selected': this.state.selected, + 'mx_RoomTile_unread': this.state.unread, 'mx_RoomTile_unreadNotify': notifBadges, 'mx_RoomTile_highlight': mentionBadges, 'mx_RoomTile_invited': (me && me.membership == 'invite'), @@ -235,7 +244,7 @@ module.exports = React.createClass({ 'mx_RoomTile_badgeShown': badges || this.state.badgeHover || this.state.menuDisplayed, }); - if (this.props.selected) { + if (this.state.selected) { let nameSelected = {name}; label =
{ nameSelected }
;