mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	Move more unread logic out of stream_list.js.
There are two split-outs code of the code here:
    - Animation stuff is in unread_ui.js.
    - PM unread counts get handled by pm_list.js.
			
			
This commit is contained in:
		@@ -24,12 +24,41 @@ function get_filter_li() {
 | 
			
		||||
    return iterate_to_find("#global_filters > li", "private");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function update_count_in_dom(count_span, value_span, count) {
 | 
			
		||||
    if (count === 0) {
 | 
			
		||||
        count_span.hide();
 | 
			
		||||
        value_span.text('');
 | 
			
		||||
    } else {
 | 
			
		||||
        count_span.show();
 | 
			
		||||
        value_span.text(count);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function set_count(type, name, count) {
 | 
			
		||||
    var count_span = get_filter_li(type, name).find('.count');
 | 
			
		||||
    var value_span = count_span.find('.value');
 | 
			
		||||
    update_count_in_dom(count_span, value_span, count);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
exports.get_private_message_filter_li = function (conversation) {
 | 
			
		||||
    var pm_li = get_filter_li();
 | 
			
		||||
    return iterate_to_find(".expanded_private_messages li.expanded_private_message",
 | 
			
		||||
        conversation, pm_li);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function set_pm_conversation_count (conversation, count) {
 | 
			
		||||
    var pm_li = pm_list.get_private_message_filter_li(conversation);
 | 
			
		||||
    var count_span = pm_li.find('.private_message_count');
 | 
			
		||||
    var value_span = count_span.find('.value');
 | 
			
		||||
 | 
			
		||||
    if (count_span.length === 0 || value_span.length === 0) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    count_span.removeClass("zero_count");
 | 
			
		||||
    update_count_in_dom(count_span, value_span, count);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function remove_expanded_private_messages() {
 | 
			
		||||
    popovers.hide_topic_sidebar_popover();
 | 
			
		||||
    $("ul.expanded_private_messages").remove();
 | 
			
		||||
@@ -140,6 +169,21 @@ exports.expand = function (op_pm) {
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
exports.update_dom_with_unread_counts = function (counts) {
 | 
			
		||||
    set_count("global", "private", counts.private_message_count);
 | 
			
		||||
    counts.pm_count.each(function (count, person) {
 | 
			
		||||
        set_pm_conversation_count(person, count);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    unread_ui.set_count_toggle_button($("#userlist-toggle-unreadcount"),
 | 
			
		||||
                                      counts.private_message_count);
 | 
			
		||||
 | 
			
		||||
    unread_ui.animate_private_message_changes(get_filter_li(),
 | 
			
		||||
                                              counts.private_message_count);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
return exports;
 | 
			
		||||
}());
 | 
			
		||||
 
 | 
			
		||||
@@ -3,8 +3,6 @@ var stream_list = (function () {
 | 
			
		||||
var exports = {};
 | 
			
		||||
 | 
			
		||||
var zoomed_stream = '';
 | 
			
		||||
var last_private_message_count = 0;
 | 
			
		||||
var last_mention_count = 0;
 | 
			
		||||
var previous_sort_order;
 | 
			
		||||
var previous_unpinned_order;
 | 
			
		||||
 | 
			
		||||
@@ -318,34 +316,6 @@ function set_count(type, name, count) {
 | 
			
		||||
    update_count_in_dom(count_span, value_span, count);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function set_count_toggle_button(elem, count) {
 | 
			
		||||
    if (count === 0) {
 | 
			
		||||
        if (elem.is(':animated')) {
 | 
			
		||||
            return elem.stop(true, true).hide();
 | 
			
		||||
        }
 | 
			
		||||
        return elem.hide(500);
 | 
			
		||||
    } else if ((count > 0) && (count < 1000)) {
 | 
			
		||||
        elem.show(500);
 | 
			
		||||
        return elem.text(count);
 | 
			
		||||
    } else {
 | 
			
		||||
        elem.show(500);
 | 
			
		||||
        return elem.text("1k+");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
exports.set_pm_conversation_count = function (conversation, count) {
 | 
			
		||||
    var pm_li = pm_list.get_private_message_filter_li(conversation);
 | 
			
		||||
    var count_span = pm_li.find('.private_message_count');
 | 
			
		||||
    var value_span = count_span.find('.value');
 | 
			
		||||
 | 
			
		||||
    if (count_span.length === 0 || value_span.length === 0) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    count_span.removeClass("zero_count");
 | 
			
		||||
    update_count_in_dom(count_span, value_span, count);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function rebuild_recent_topics(stream) {
 | 
			
		||||
    // TODO: Call rebuild_recent_topics less, not on every new
 | 
			
		||||
    // message.
 | 
			
		||||
@@ -368,38 +338,13 @@ exports.update_streams_sidebar = function () {
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function do_new_messages_animation(message_type) {
 | 
			
		||||
    var li = get_filter_li("global", message_type);
 | 
			
		||||
    li.addClass("new_messages");
 | 
			
		||||
    function mid_animation() {
 | 
			
		||||
        li.removeClass("new_messages");
 | 
			
		||||
        li.addClass("new_messages_fadeout");
 | 
			
		||||
    }
 | 
			
		||||
    function end_animation() {
 | 
			
		||||
        li.removeClass("new_messages_fadeout");
 | 
			
		||||
    }
 | 
			
		||||
    setTimeout(mid_animation, 3000);
 | 
			
		||||
    setTimeout(end_animation, 6000);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function animate_private_message_changes(new_private_message_count) {
 | 
			
		||||
    if (new_private_message_count > last_private_message_count) {
 | 
			
		||||
        do_new_messages_animation('private');
 | 
			
		||||
    }
 | 
			
		||||
    last_private_message_count = new_private_message_count;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function animate_mention_changes(new_mention_count) {
 | 
			
		||||
    if (new_mention_count > last_mention_count) {
 | 
			
		||||
        do_new_messages_animation('mentioned');
 | 
			
		||||
    }
 | 
			
		||||
    last_mention_count = new_mention_count;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
exports.update_dom_with_unread_counts = function (counts) {
 | 
			
		||||
    // counts is just a data object that gets calculated elsewhere
 | 
			
		||||
    // Our job is to update some DOM elements.
 | 
			
		||||
    // We currently handle these message categories:
 | 
			
		||||
    //    home, starred, mentioned, streams, and topics
 | 
			
		||||
    //
 | 
			
		||||
    // Note that similar methods elsewhere in the code update
 | 
			
		||||
    // the "Private Message" section in the upper left corner
 | 
			
		||||
    // and the buddy lists in the right sidebar.
 | 
			
		||||
 | 
			
		||||
    // counts.stream_count maps streams to counts
 | 
			
		||||
    counts.stream_count.each(function (count, stream) {
 | 
			
		||||
@@ -413,20 +358,15 @@ exports.update_dom_with_unread_counts = function (counts) {
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    counts.pm_count.each(function (count, person) {
 | 
			
		||||
        exports.set_pm_conversation_count(person, count);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // integer counts
 | 
			
		||||
    set_count("global", "private", counts.private_message_count);
 | 
			
		||||
    set_count("global", "mentioned", counts.mentioned_message_count);
 | 
			
		||||
    set_count("global", "home", counts.home_unread_messages);
 | 
			
		||||
 | 
			
		||||
    set_count_toggle_button($("#streamlist-toggle-unreadcount"), counts.home_unread_messages);
 | 
			
		||||
    set_count_toggle_button($("#userlist-toggle-unreadcount"), counts.private_message_count);
 | 
			
		||||
    unread_ui.set_count_toggle_button($("#streamlist-toggle-unreadcount"),
 | 
			
		||||
                                      counts.home_unread_messages);
 | 
			
		||||
 | 
			
		||||
    animate_private_message_changes(counts.private_message_count);
 | 
			
		||||
    animate_mention_changes(counts.mentioned_message_count);
 | 
			
		||||
    unread_ui.animate_mention_changes(get_filter_li('global', 'mentioned'),
 | 
			
		||||
                                      counts.mentioned_message_count);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
exports.rename_stream = function (sub, new_name) {
 | 
			
		||||
 
 | 
			
		||||
@@ -188,6 +188,7 @@ exports.update_unread_counts = function () {
 | 
			
		||||
    // avoid excessive calls to this.
 | 
			
		||||
    activity.update_dom_with_unread_counts(res);
 | 
			
		||||
    stream_list.update_dom_with_unread_counts(res);
 | 
			
		||||
    pm_list.update_dom_with_unread_counts(res);
 | 
			
		||||
    notifications.update_title_count(res.home_unread_messages);
 | 
			
		||||
    notifications.update_pm_count(res.private_message_count);
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										55
									
								
								static/js/unread_ui.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								static/js/unread_ui.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
			
		||||
var unread_ui = (function () {
 | 
			
		||||
 | 
			
		||||
var exports = {};
 | 
			
		||||
 | 
			
		||||
var last_private_message_count = 0;
 | 
			
		||||
var last_mention_count = 0;
 | 
			
		||||
 | 
			
		||||
function do_new_messages_animation(li) {
 | 
			
		||||
    li.addClass("new_messages");
 | 
			
		||||
    function mid_animation() {
 | 
			
		||||
        li.removeClass("new_messages");
 | 
			
		||||
        li.addClass("new_messages_fadeout");
 | 
			
		||||
    }
 | 
			
		||||
    function end_animation() {
 | 
			
		||||
        li.removeClass("new_messages_fadeout");
 | 
			
		||||
    }
 | 
			
		||||
    setTimeout(mid_animation, 3000);
 | 
			
		||||
    setTimeout(end_animation, 6000);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
exports.animate_private_message_changes = function (li, new_private_message_count) {
 | 
			
		||||
    if (new_private_message_count > last_private_message_count) {
 | 
			
		||||
        do_new_messages_animation(li);
 | 
			
		||||
    }
 | 
			
		||||
    last_private_message_count = new_private_message_count;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
exports.animate_mention_changes = function (li, new_mention_count) {
 | 
			
		||||
    if (new_mention_count > last_mention_count) {
 | 
			
		||||
        do_new_messages_animation(li);
 | 
			
		||||
    }
 | 
			
		||||
    last_mention_count = new_mention_count;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
exports.set_count_toggle_button = function (elem, count) {
 | 
			
		||||
    if (count === 0) {
 | 
			
		||||
        if (elem.is(':animated')) {
 | 
			
		||||
            return elem.stop(true, true).hide();
 | 
			
		||||
        }
 | 
			
		||||
        return elem.hide(500);
 | 
			
		||||
    } else if ((count > 0) && (count < 1000)) {
 | 
			
		||||
        elem.show(500);
 | 
			
		||||
        return elem.text(count);
 | 
			
		||||
    } else {
 | 
			
		||||
        elem.show(500);
 | 
			
		||||
        return elem.text("1k+");
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
return exports;
 | 
			
		||||
}());
 | 
			
		||||
if (typeof module !== 'undefined') {
 | 
			
		||||
    module.exports = unread_ui;
 | 
			
		||||
}
 | 
			
		||||
@@ -29,7 +29,7 @@ var globals =
 | 
			
		||||
    + ' avatar feature_flags search_suggestion referral stream_color Dict'
 | 
			
		||||
    + ' Filter summary admin stream_data muting WinChan muting_ui Socket channel gear_menu'
 | 
			
		||||
    + ' message_flags bot_data loading favicon resize scroll_bar condense floating_recipient_bar'
 | 
			
		||||
    + ' copy_and_paste click_handlers topic_list pm_list'
 | 
			
		||||
    + ' copy_and_paste click_handlers topic_list pm_list unread_ui'
 | 
			
		||||
 | 
			
		||||
    // colorspace.js
 | 
			
		||||
    + ' colorspace'
 | 
			
		||||
 
 | 
			
		||||
@@ -765,6 +765,7 @@ JS_SPECS = {
 | 
			
		||||
            'js/localstorage.js',
 | 
			
		||||
            'js/channel.js',
 | 
			
		||||
            'js/setup.js',
 | 
			
		||||
            'js/unread_ui.js',
 | 
			
		||||
            'js/muting.js',
 | 
			
		||||
            'js/muting_ui.js',
 | 
			
		||||
            'js/viewport.js',
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user