mirror of
https://github.com/zulip/zulip.git
synced 2025-11-06 15:03:34 +00:00
Really, the "correct" way to do this is to undo "scrolltheworld", and then just have a compose div that always lives underneath the message list div. (This will also allow us to deal much more reasonably with the whole "Is the composebox in focus" thing.) In the interest of prototyping something more rapidly, though, we adopt the somewhat more hackish approach, with the understanding that much of it will probably be simplified later. (imported from commit e2754be155c522b6dac28e7b84c62bd2030217c8)
99 lines
3.8 KiB
JavaScript
99 lines
3.8 KiB
JavaScript
var notifications_bar = (function () {
|
|
|
|
var exports = {};
|
|
|
|
var disabled = false; // true when the bar should be hidden (eg, it's blocking the composebox)
|
|
var displayed = false; // true when the bar is supposedly displayed (ignoring disabled-ness)
|
|
var on_custom = false; // true when the bar is showing a custom message
|
|
var custom_message = ""; // the current custom message being displayed, if any
|
|
var current_message = ""; // the current notification being displayed in the bar, if any
|
|
var timeoutID = null; // keeping track of the clear_custom_message timer, so we can cancel it
|
|
var bar_selector = "#notifications-bar"; // the selector jQuery can use to pick the notifications bar
|
|
var area_selector = "#notifications-area"; // the selector jQuery can use to pick the container
|
|
|
|
// Try to show msg (but this might fail if the bar is disabled)
|
|
function show(msg) {
|
|
if (disabled)
|
|
return; // we should never show the bar when disabled
|
|
|
|
if (displayed && msg !== current_message) {
|
|
// If the bar is already displayed and we're changing the text, show an animation
|
|
var changeText = function () {
|
|
// Custom effect to put change of text in the queue (after slideUp)
|
|
$(this).text(msg);
|
|
$(this).dequeue();
|
|
};
|
|
$(bar_selector).slideUp(50).queue(changeText).delay(100).slideDown(50);
|
|
} else if (!displayed) {
|
|
// If the bar wasn't already displayed, simply show it
|
|
$(bar_selector).text(msg).slideDown(50);
|
|
displayed = true; // we need to set this flag
|
|
}
|
|
// In the last case (the bar is already displayed and has the right text), do nothing
|
|
|
|
// We can't use $(bar_selector).text() to get the current notification
|
|
// because, in one of the cases above, the text isn't actually changed
|
|
// immediately. Instead, let's store the current notification in a global
|
|
// variable.
|
|
current_message = msg;
|
|
}
|
|
|
|
// Hide the notifications bar
|
|
function hide() {
|
|
if (!displayed)
|
|
return; // don't unnecessarily add to the element's fx queue
|
|
displayed = false;
|
|
current_message = "";
|
|
$(bar_selector).slideUp(50);
|
|
}
|
|
|
|
// If there's a custom message, or if the last message is off the bottom of the
|
|
// screen, then show the notifications bar.
|
|
exports.update = function () {
|
|
if (on_custom)
|
|
show(custom_message);
|
|
else if (rows.last_visible().offset() !== null // otherwise the next line will error
|
|
&& rows.last_visible().offset().top + rows.last_visible().height() > viewport.scrollTop() + viewport.height() - $("#compose").height()
|
|
&& unread_in_current_view() > 0)
|
|
show("More messages below");
|
|
else
|
|
hide();
|
|
};
|
|
|
|
// Clear the custom message and go back to the default (called by a timer)
|
|
function clear_custom_message() {
|
|
on_custom = false;
|
|
custom_message = "";
|
|
timeoutID = null;
|
|
exports.update();
|
|
}
|
|
|
|
// Show the message msg for duration milliseconds. If the notifications bar is
|
|
// hidden by the composebox, the timer still ticks. Also, if this method is
|
|
// called again, the new message will overwrite the old one.
|
|
exports.show_custom_message = function (msg, duration) {
|
|
if (timeoutID !== null)
|
|
window.clearTimeout(timeoutID); // clear any existing timers
|
|
on_custom = true;
|
|
custom_message = msg;
|
|
show(msg);
|
|
timeoutID = window.setTimeout(clear_custom_message, duration);
|
|
};
|
|
|
|
// We disable the notifications bar if it overlaps with the composebox
|
|
exports.maybe_disable = function() {
|
|
if ($("#compose").offset().left + $("#compose").width() > $(area_selector).offset().left) {
|
|
disabled = true;
|
|
hide();
|
|
}
|
|
};
|
|
|
|
// Un-disable the notifications bar, then call the update function to see if it should be displayed
|
|
exports.enable = function() {
|
|
disabled = false;
|
|
exports.update();
|
|
};
|
|
|
|
return exports;
|
|
}());
|