mirror of
https://github.com/zulip/zulip.git
synced 2025-11-05 06:23:38 +00:00
These engagement data will be useful both for making pretty graphs of how addicted our users are as well as for allowing us to check whether a new deployment is actually using the product or not. This measures "number of minutes during which each user had checked the app within the previous 15 minutes". It should correctly not count server-initiated reloads. It's possible that we should use something less aggressive than mousemove; I'm a little torn on that because you really can check the app for new messages without doing anything active. This is somewhat tested but there are a few outstanding issues: * Mobile apps don't report these data. It should be as easy as having them send in update_active_status queries with new_user_input=true. * The semantics of this should be better documented (e.g. the management script should print out the spec above)x. (imported from commit ec8b2dc96b180e1951df00490707ae916887178e)
174 lines
5.6 KiB
JavaScript
174 lines
5.6 KiB
JavaScript
var reload = (function () {
|
|
|
|
var exports = {};
|
|
|
|
var reload_in_progress = false;
|
|
var reload_pending = false;
|
|
|
|
exports.is_pending = function () {
|
|
return reload_pending;
|
|
};
|
|
|
|
exports.is_in_progress = function () {
|
|
return reload_in_progress;
|
|
};
|
|
|
|
function preserve_state(send_after_reload) {
|
|
if (send_after_reload === undefined) {
|
|
send_after_reload = 0;
|
|
}
|
|
var url = "#reload:send_after_reload=" + Number(send_after_reload);
|
|
url += "+csrf_token=" + encodeURIComponent(csrf_token);
|
|
|
|
if (compose.composing() === 'stream') {
|
|
url += "+msg_type=stream";
|
|
url += "+stream=" + encodeURIComponent(compose.stream_name());
|
|
url += "+subject=" + encodeURIComponent(compose.subject());
|
|
} else if (compose.composing() === 'private') {
|
|
url += "+msg_type=private";
|
|
url += "+recipient=" + encodeURIComponent(compose.recipient());
|
|
}
|
|
|
|
if (compose.composing()){
|
|
url += "+msg=" + encodeURIComponent(compose.message_content());
|
|
}
|
|
|
|
var pointer = current_msg_list.selected_id();
|
|
if (pointer !== -1) {
|
|
url += "+pointer=" + pointer;
|
|
}
|
|
|
|
var oldhash = window.location.hash;
|
|
if (oldhash.length !== 0 && oldhash[0] === '#') {
|
|
oldhash = oldhash.slice(1);
|
|
}
|
|
url += "+oldhash=" + encodeURIComponent(oldhash);
|
|
|
|
window.location.replace(url);
|
|
}
|
|
|
|
// Check if we're doing a compose-preserving reload. This must be
|
|
// done before the first call to get_updates
|
|
$(function () {
|
|
var location = window.location.toString();
|
|
var fragment = location.substring(location.indexOf('#') + 1);
|
|
if (fragment.search("reload:") !== 0) {
|
|
return;
|
|
}
|
|
fragment = fragment.replace(/^reload:/, "");
|
|
var keyvals = fragment.split("+");
|
|
var vars = {};
|
|
_.each(keyvals, function (str) {
|
|
var pair = str.split("=");
|
|
vars[pair[0]] = decodeURIComponent(pair[1]);
|
|
});
|
|
|
|
// Prevent random people on the Internet from constructing links
|
|
// that make you send a message.
|
|
if (vars.csrf_token !== csrf_token) {
|
|
return;
|
|
}
|
|
|
|
if (vars.msg !== undefined){
|
|
var send_now = parseInt(vars.send_after_reload, 10);
|
|
|
|
// TODO: preserve focus
|
|
compose.start(vars.msg_type, {stream: vars.stream || '',
|
|
subject: vars.subject || '',
|
|
private_message_recipient: vars.recipient || '',
|
|
content: vars.msg || ''});
|
|
if (send_now) {
|
|
compose.finish();
|
|
}
|
|
}
|
|
|
|
var pointer = parseInt(vars.pointer, 10);
|
|
|
|
if (pointer) {
|
|
page_params.orig_initial_pointer = page_params.initial_pointer;
|
|
page_params.initial_pointer = pointer;
|
|
}
|
|
|
|
activity.new_user_input = false;
|
|
hashchange.changehash(vars.oldhash);
|
|
});
|
|
|
|
function do_reload_app(send_after_reload, save_state, message) {
|
|
// TODO: we should completely disable the UI here
|
|
if (save_state) {
|
|
preserve_state(send_after_reload);
|
|
}
|
|
|
|
if (message === undefined) {
|
|
message = "Reloading";
|
|
}
|
|
// TODO: We need a better API for showing messages.
|
|
ui.report_message(message, $("#reloading-application"));
|
|
reload_in_progress = true;
|
|
window.location.reload(true);
|
|
}
|
|
|
|
exports.initiate = function (options) {
|
|
options = _.defaults({}, options, {
|
|
immediate: false,
|
|
save_state: true,
|
|
send_after_reload: false
|
|
});
|
|
|
|
if (options.immediate) {
|
|
do_reload_app(options.send_after_reload, options.save_state, options.message);
|
|
}
|
|
|
|
if (reload_pending) {
|
|
return;
|
|
}
|
|
reload_pending = true;
|
|
|
|
// If the user is composing a message, reload if they become idle
|
|
// while composing. If they finish or cancel the compose, wait
|
|
// until they're idle again
|
|
var idle_control;
|
|
var unconditional_timeout = 1000*60*30 + util.random_int(0, 1000*60*5);
|
|
var composing_timeout = 1000*60*5 + util.random_int(0, 1000*60);
|
|
var home_timeout = 1000*60 + util.random_int(0, 1000*60);
|
|
var compose_done_handler, compose_started_handler;
|
|
|
|
function reload_from_idle () {
|
|
do_reload_app(false, options.save_state, options.message);
|
|
}
|
|
|
|
// Make sure we always do a reload eventually
|
|
setTimeout(reload_from_idle, unconditional_timeout);
|
|
|
|
compose_done_handler = function () {
|
|
idle_control.cancel();
|
|
idle_control = $(document).idle({'idle': home_timeout,
|
|
'onIdle': reload_from_idle});
|
|
$(document).off('compose_canceled.zulip compose_finished.zulip',
|
|
compose_done_handler);
|
|
$(document).on('compose_started.zulip', compose_started_handler);
|
|
};
|
|
compose_started_handler = function () {
|
|
idle_control.cancel();
|
|
idle_control = $(document).idle({'idle': composing_timeout,
|
|
'onIdle': reload_from_idle});
|
|
$(document).off('compose_started.zulip', compose_started_handler);
|
|
$(document).on('compose_canceled.zulip compose_finished.zulip',
|
|
compose_done_handler);
|
|
};
|
|
|
|
if (compose.composing()) {
|
|
idle_control = $(document).idle({'idle': composing_timeout,
|
|
'onIdle': reload_from_idle});
|
|
$(document).on('compose_canceled.zulip compose_finished.zulip',
|
|
compose_done_handler);
|
|
} else {
|
|
idle_control = $(document).idle({'idle': home_timeout,
|
|
'onIdle': reload_from_idle});
|
|
$(document).on('compose_started.zulip', compose_started_handler);
|
|
}
|
|
};
|
|
|
|
return exports;
|
|
}());
|