diff --git a/js/controller.js b/js/controller.js index bdd9f00..b0c5b8c 100644 --- a/js/controller.js +++ b/js/controller.js @@ -216,6 +216,8 @@ pubsub.subscribe("MESSAGES_NEW", post => { } else { client.channelStore.increaseUnread(post); } + + client.channelStore.updateLastPostTime(post.channel_id, post["create_at"]); }); pubsub.subscribe("CHANNEL_READ", ({endpoint, channel_id}) => { diff --git a/js/pubsub.js b/js/pubsub.js index 1241fee..603acf3 100644 --- a/js/pubsub.js +++ b/js/pubsub.js @@ -6,6 +6,7 @@ const topics = [ "CHANNELS_RELOADED", // "CHANNEL_UPDATED", // {endpoint, channel} "CHANNEL_UNREAD_UPDATED", // {endpoint, channel_id, unread, mentions} + "CHANNEL_LAST_POST_TIME_UPDATED", // {endpoint, channel_id, time} "USERS_NEW", "USERS_CHANGED", "CHANNEL_MEMBERS_NEW", diff --git a/js/store.js b/js/store.js index 0a28b2e..49ef730 100644 --- a/js/store.js +++ b/js/store.js @@ -98,6 +98,18 @@ class ChannelStore { pubsub.publish("CHANNEL_UNREAD_UPDATED", {endpoint: this.client.endpoint, channel_id, unread, mentions}); } + + async updateLastPostTime(channel_id, time) { + if (this._promise === null) { + // Data does not exist yet and is not being requested + return; + } + await this._promise; + + this._channels[channel_id]["last_post_at"] = time; + + pubsub.publish("CHANNEL_LAST_POST_TIME_UPDATED", {endpoint: this.client.endpoint, channel_id, time}); + } } diff --git a/js/view/sidebar.js b/js/view/sidebar.js index fea0ccc..adb18b5 100644 --- a/js/view/sidebar.js +++ b/js/view/sidebar.js @@ -25,8 +25,11 @@ function populateChannelList() { let nodes = []; - for (let channel_id in channels) { - const channel = channels[channel_id]; + let sortedChannels = Object.values(channels).sort((a, b) => + b["last_post_at"] - a["last_post_at"] + ); + + for (const channel of sortedChannels) { const team = teams[channel["team_id"]]; const chanUnread = unread[channel.id].unread; @@ -53,7 +56,14 @@ function populateChannelList() { li.dataset["id"] = channel.id; li.dataset["server"] = client.endpoint; - if (chanUnread > 0) li.className = "unread"; + const curChan = currentChannel(); + if (curChan.endpoint === client.endpoint && curChan.channel_id === channel.id) { + li.className = "active"; + } + if (chanUnread > 0) { + li.className += " unread"; + } + nodes.push(li); } byId("channel_list").append(...nodes); @@ -92,3 +102,7 @@ pubsub.subscribe("CHANNEL_UNREAD_UPDATED", ({endpoint, channel_id, unread, menti pubsub.subscribe("CHANNELS_RELOADED", () => { populateChannelList(); }); + +pubsub.subscribe("CHANNEL_LAST_POST_TIME_UPDATED", () => { + populateChannelList(); +});