mirror of
https://github.com/zulip/zulip.git
synced 2025-11-07 07:23:22 +00:00
This is required to get historical messages that might be within the message ID range of your home view. I think we could avoid calling load_old_messages on every narrow by tracking when the user last subscribed to each stream, and if the user subscribed before the first message in the current home view message window (aka the messages used for the fast-path narrowing), don't call load_old_messages. This would happen almost every time. But it would require a schema change to do this. We also remove the load_more_messages call from hashchange.initialize. It is no longer required now that we're calling load_old_messages on each narrow anyway. (imported from commit 1c78c183e61392429592ae89d566315be7be8999)
130 lines
3.8 KiB
JavaScript
130 lines
3.8 KiB
JavaScript
var hashchange = (function () {
|
|
|
|
var exports = {};
|
|
|
|
var expected_hash;
|
|
var changing_hash = false;
|
|
|
|
// Some browsers zealously URI-decode the contents of
|
|
// window.location.hash. So we hide our URI-encoding
|
|
// by replacing % with . (like MediaWiki).
|
|
|
|
function encodeHashComponent(str) {
|
|
return encodeURIComponent(str)
|
|
.replace(/\./g, '%2E')
|
|
.replace(/%/g, '.');
|
|
}
|
|
|
|
function decodeHashComponent(str) {
|
|
return decodeURIComponent(str.replace(/\./g, '%'));
|
|
}
|
|
|
|
exports.changehash = function (newhash) {
|
|
if (changing_hash) {
|
|
return;
|
|
}
|
|
$(document).trigger($.Event('hashchange'));
|
|
expected_hash = newhash;
|
|
// Some browsers reset scrollTop when changing the hash to "",
|
|
// so we save and restore it.
|
|
// http://stackoverflow.com/questions/4715073/window-location-hash-prevent-scrolling-to-the-top
|
|
var scrolltop = viewport.scrollTop();
|
|
window.location.hash = newhash;
|
|
util.reset_favicon();
|
|
if (newhash === "" || newhash === "#") {
|
|
viewport.scrollTop(scrolltop);
|
|
}
|
|
};
|
|
|
|
exports.save_narrow = function (operators) {
|
|
if (changing_hash) {
|
|
return;
|
|
}
|
|
if (operators === undefined) {
|
|
exports.changehash('#');
|
|
} else {
|
|
var new_hash = '#narrow';
|
|
$.each(operators, function (idx, elem) {
|
|
new_hash += '/' + encodeHashComponent(elem[0])
|
|
+ '/' + encodeHashComponent(elem[1]);
|
|
});
|
|
exports.changehash(new_hash);
|
|
}
|
|
};
|
|
|
|
function parse_narrow(hash) {
|
|
var i, operators = [];
|
|
for (i=1; i<hash.length; i+=2) {
|
|
// We don't construct URLs with an odd number of components,
|
|
// but the user might write one.
|
|
var operator = decodeHashComponent(hash[i]);
|
|
var operand = decodeHashComponent(hash[i+1] || '');
|
|
operators.push([operator, operand]);
|
|
}
|
|
narrow.activate(operators, {
|
|
select_first_unread: true,
|
|
change_hash: false // already set
|
|
});
|
|
}
|
|
|
|
// Returns true if this function performed a narrow
|
|
function do_hashchange() {
|
|
// If window.location.hash changed because our app explicitly
|
|
// changed it, then we don't need to do anything.
|
|
// (This function only neds to jump into action if it changed
|
|
// because e.g. the back button was pressed by the user)
|
|
//
|
|
// The second case is for handling the fact that some browsers
|
|
// automatically convert '#' to '' when you change the hash to '#'.
|
|
if (window.location.hash === expected_hash ||
|
|
(expected_hash !== undefined &&
|
|
window.location.hash.replace(/^#/, '') === '' &&
|
|
expected_hash.replace(/^#/, '') === '')) {
|
|
return false;
|
|
}
|
|
|
|
// NB: In Firefox, window.location.hash is URI-decoded.
|
|
// Even if the URL bar says #%41%42%43%44, the value here will
|
|
// be #ABCD.
|
|
var hash = window.location.hash.split("/");
|
|
switch (hash[0]) {
|
|
case "#narrow":
|
|
ui.change_tab_to("#home");
|
|
parse_narrow(hash);
|
|
ui.update_floating_recipient_bar();
|
|
return true;
|
|
case "":
|
|
case "#":
|
|
ui.change_tab_to("#home");
|
|
narrow.deactivate();
|
|
ui.update_floating_recipient_bar();
|
|
break;
|
|
case "#subscriptions":
|
|
ui.change_tab_to("#subscriptions");
|
|
break;
|
|
case "#settings":
|
|
ui.change_tab_to("#settings");
|
|
break;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function hashchanged() {
|
|
changing_hash = true;
|
|
$(document).trigger($.Event('hashchange.zephyr'));
|
|
var ret = do_hashchange();
|
|
changing_hash = false;
|
|
return ret;
|
|
}
|
|
|
|
exports.initialize = function () {
|
|
// jQuery doesn't have a hashchange event, so we manually wrap
|
|
// our event handler
|
|
window.onhashchange = blueslip.wrap_function(hashchanged);
|
|
hashchanged();
|
|
};
|
|
|
|
return exports;
|
|
|
|
}());
|