2016-10-12 20:57:59 +02:00
|
|
|
var typing = (function () {
|
|
|
|
var exports = {};
|
|
|
|
|
2017-03-22 15:11:41 +01:00
|
|
|
// This module handles the outbound side of typing indicators.
|
|
|
|
// We detect changes in the compose box and notify the server
|
|
|
|
// when we are typing. For the inbound side see typing_events.js.
|
2017-09-25 20:33:29 +02:00
|
|
|
//
|
|
|
|
// See docs/typing-indicators.md for details on typing indicators.
|
2016-10-12 20:57:59 +02:00
|
|
|
|
|
|
|
function send_typing_notification_ajax(recipients, operation) {
|
|
|
|
channel.post({
|
|
|
|
url: '/json/typing',
|
|
|
|
data: {
|
|
|
|
to: recipients,
|
|
|
|
op: operation,
|
|
|
|
},
|
|
|
|
success: function () {},
|
|
|
|
error: function (xhr) {
|
|
|
|
blueslip.warn("Failed to send typing event: " + xhr.responseText);
|
|
|
|
},
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2017-03-22 00:41:09 +01:00
|
|
|
function get_recipient() {
|
2017-03-18 18:48:43 +01:00
|
|
|
var compose_recipient = compose_state.recipient();
|
2017-03-22 00:41:09 +01:00
|
|
|
if (compose_recipient === "") {
|
|
|
|
return undefined;
|
|
|
|
}
|
|
|
|
return compose_recipient;
|
|
|
|
}
|
2016-10-12 20:57:59 +02:00
|
|
|
|
2017-03-22 00:41:09 +01:00
|
|
|
function is_valid_conversation(recipient) {
|
|
|
|
// TODO: Check to make sure we're in a PM conversation
|
|
|
|
// with valid emails.
|
|
|
|
if (!recipient) {
|
|
|
|
return false;
|
2016-10-12 20:57:59 +02:00
|
|
|
}
|
2017-03-22 00:41:09 +01:00
|
|
|
|
|
|
|
var compose_empty = !compose_state.has_message_content();
|
|
|
|
if (compose_empty) {
|
|
|
|
return false;
|
2016-10-12 20:57:59 +02:00
|
|
|
}
|
2017-03-22 00:41:09 +01:00
|
|
|
|
2017-04-24 20:35:26 +02:00
|
|
|
if (compose_state.get_message_type() !== 'private') {
|
2017-03-22 14:06:40 +01:00
|
|
|
// We only use typing indicators in PMs for now.
|
|
|
|
// There was originally some support for having
|
|
|
|
// typing indicators related to stream conversations,
|
|
|
|
// but the initial rollout led to users being
|
|
|
|
// confused by them. We may revisit this.
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2017-03-22 14:31:44 +01:00
|
|
|
if (compose.get_invalid_recipient_emails().length > 0) {
|
|
|
|
// If we have invalid recipient emails, it's highly
|
|
|
|
// likely the user is either still deciding who to
|
|
|
|
// compose to, or is confused. Also, the server
|
|
|
|
// will just reject our requests.
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2017-03-22 00:41:09 +01:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
function get_current_time() {
|
|
|
|
return new Date();
|
2016-10-12 20:57:59 +02:00
|
|
|
}
|
|
|
|
|
2017-03-22 00:41:09 +01:00
|
|
|
function notify_server_start(recipients) {
|
|
|
|
send_typing_notification_ajax(recipients, "start");
|
|
|
|
}
|
|
|
|
|
|
|
|
function notify_server_stop(recipients) {
|
|
|
|
send_typing_notification_ajax(recipients, "stop");
|
|
|
|
}
|
|
|
|
|
|
|
|
var worker = {
|
|
|
|
get_recipient: get_recipient,
|
|
|
|
is_valid_conversation: is_valid_conversation,
|
|
|
|
get_current_time: get_current_time,
|
|
|
|
notify_server_start: notify_server_start,
|
|
|
|
notify_server_stop: notify_server_stop,
|
|
|
|
};
|
|
|
|
|
2016-10-12 20:57:59 +02:00
|
|
|
$(document).on('input', '#new_message_content', function () {
|
|
|
|
// If our previous state was no typing notification, send a
|
|
|
|
// start-typing notice immediately.
|
2017-03-22 00:41:09 +01:00
|
|
|
typing_status.handle_text_input(worker);
|
2016-10-12 20:57:59 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
// We send a stop-typing notification immediately when compose is
|
|
|
|
// closed/cancelled
|
|
|
|
$(document).on('compose_canceled.zulip compose_finished.zulip', function () {
|
2017-03-22 00:41:09 +01:00
|
|
|
typing_status.stop(worker);
|
2016-10-12 20:57:59 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
return exports;
|
|
|
|
}());
|
|
|
|
|
|
|
|
if (typeof module !== 'undefined') {
|
|
|
|
module.exports = typing;
|
|
|
|
}
|