From 4fea0b452e773631864f557cff910e880eb459c4 Mon Sep 17 00:00:00 2001 From: hmhealey Date: Thu, 6 Aug 2015 14:03:45 -0400 Subject: Refactored sidebar in preparation for adding unread indicators --- web/react/components/sidebar.jsx | 145 ++++++++++++++++++--------------------- 1 file changed, 67 insertions(+), 78 deletions(-) (limited to 'web/react/components') diff --git a/web/react/components/sidebar.jsx b/web/react/components/sidebar.jsx index 1d39f5f67..0358032ab 100644 --- a/web/react/components/sidebar.jsx +++ b/web/react/components/sidebar.jsx @@ -56,7 +56,6 @@ function getStateFromStores() { var channelMember = members[channel.id]; var msgCount = channel.total_msg_count - channelMember.msg_count; if (msgCount > 0) { - channel.unread = msgCount; showDirectChannels.push(channel); } else if (currentId === channel.id) { showDirectChannels.push(channel); @@ -70,6 +69,7 @@ function getStateFromStores() { tempChannel.display_name = utils.getDisplayName(teammate); tempChannel.status = UserStore.getStatus(teammate.id); tempChannel.last_post_at = 0; + tempChannel.total_msg_count = 0; readDirectChannels.push(tempChannel); } } @@ -240,98 +240,94 @@ module.exports = React.createClass({ }, render: function() { var members = this.state.members; - var newsActive = window.location.pathname === '/' ? 'active' : ''; + var activeId = this.state.active_id; var badgesActive = false; - var self = this; - var channelItems = this.state.channels.map(function(channel) { - if (channel.type != 'O') { - return ''; - } + function createChannelElement(channel) { var channelMember = members[channel.id]; - var active = channel.id === self.state.active_id ? 'active' : ''; + var active = channel.id === activeId ? 'active' : ''; - var msgCount = channel.total_msg_count - channelMember.msg_count; - var titleClass = ''; - if (msgCount > 0 && channelMember.notify_level !== 'quiet') { - titleClass = 'unread-title'; + var unread = false; + if (channelMember) { + var msgCount = channel.total_msg_count - channelMember.msg_count; + unread = (msgCount > 0 && channelMember.notify_level !== 'quiet') || channelMember.mention_count > 0; } - var badge = ''; - if (channelMember.mention_count > 0) { - badge = {channelMember.mention_count}; - badgesActive = true; + var titleClass = ''; + if (unread) { titleClass = 'unread-title'; } - return ( -
  • {badge}{channel.display_name}
  • - ); - }); - - var privateChannelItems = this.state.channels.map(function(channel) { - if (channel.type !== 'P') { - return ''; + var badge = null; + if (channelMember) { + if (channel.type === 'D') { + // direct message channels show badges for any number of unread posts + var msgCount = channel.total_msg_count - channelMember.msg_count; + if (msgCount > 0) { + badge = {msgCount}; + badgesActive = true; + } + } else if (channelMember.mention_count > 0) { + // public and private channels only show badges for mentions + badge = {channelMember.mention_count}; + badgesActive = true; + } } - var channelMember = members[channel.id]; - var active = channel.id === self.state.active_id ? 'active' : ''; - - var msgCount = channel.total_msg_count - channelMember.msg_count; - var titleClass = '' - if (msgCount > 0 && channelMember.notify_level !== 'quiet') { - titleClass = 'unread-title' + // set up status icon for direct message channels + var status = null; + if (channel.type === 'D') { + var statusIcon = ''; + if (channel.status === 'online') { + statusIcon = Constants.ONLINE_ICON_SVG; + } else if (channel.status === 'away') { + statusIcon = Constants.ONLINE_ICON_SVG; + } else { + statusIcon = Constants.OFFLINE_ICON_SVG; + } + status = ; } - var badge = ''; - if (channelMember.mention_count > 0) { - badge = {channelMember.mention_count}; - badgesActive = true; - titleClass = 'unread-title'; + // set up click handler to switch channels (or create a new channel for non-existant ones) + var clickHandler = null; + var href; + if (!channel.fake) { + clickHandler = function(e) { + e.preventDefault(); + utils.switchChannel(channel); + }; + href = '#'; + } else { + href = TeamStore.getCurrentTeamUrl() + '/channels/' + channel.name; } return ( -
  • {badge}{channel.display_name}
  • +
  • + + {status} + {badge} + {channel.display_name} + +
  • ); - }); - - var directMessageItems = this.state.showDirectChannels.map(function(channel) { - var badge = ''; - var titleClass = ''; + }; - var statusIcon = ''; - if (channel.status === 'online') { - statusIcon = Constants.ONLINE_ICON_SVG; - } else if (channel.status === 'away') { - statusIcon = Constants.ONLINE_ICON_SVG; - } else { - statusIcon = Constants.OFFLINE_ICON_SVG; + // create elements for all 3 types of channels + var channelItems = this.state.channels.filter( + function(channel) { + return channel.type === 'O'; } + ).map(createChannelElement); - if (!channel.fake) { - var active = channel.id === self.state.active_id ? 'active' : ''; - - if (channel.unread) { - badge = {channel.unread}; - badgesActive = true; - titleClass = 'unread-title'; - } - - function handleClick(e) { - e.preventDefault(); - utils.switchChannel(channel, channel.teammate_username); - } - - return ( -
  • {badge}{channel.display_name}
  • - ); - } else { - return ( -
  • {badge}{channel.display_name}
  • - ); + var privateChannelItems = this.state.channels.filter( + function(channel) { + return channel.type === 'P'; } - }); + ).map(createChannelElement); + + var directMessageItems = this.state.showDirectChannels.map(createChannelElement); + // update the favicon to show if there are any notifications var link = document.createElement('link'); link.type = 'image/x-icon'; link.rel = 'shortcut icon'; @@ -348,13 +344,6 @@ module.exports = React.createClass({ } head.appendChild(link); - if (channelItems.length == 0) { -
  • Loading...
  • - } - - if (privateChannelItems.length == 0) { -
  • Loading...
  • - } return (
    -- cgit v1.2.3-1-g7c22