mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	We now ask compose_pm_pill to give us a list of user ids that we are PM'ing to, and we only convert user ids to emails right before we put requests on the wire. We also let the "pill system" tell us whether we have unconverted data. It also sets up for an upcoming server change where we can just send user ids to the server. This change should be transparent to the majority of users. For Zephyr users we are slightly less aggressive about sending typing indicators, since we now require valid user ids.
		
			
				
	
	
		
			103 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
var typing = (function () {
 | 
						|
var exports = {};
 | 
						|
 | 
						|
// 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.
 | 
						|
//
 | 
						|
// See docs/subsystems/typing-indicators.md for details on typing indicators.
 | 
						|
 | 
						|
function send_typing_notification_ajax(user_ids_string, operation) {
 | 
						|
    var typing_to = people.user_ids_string_to_emails_string(user_ids_string);
 | 
						|
    channel.post({
 | 
						|
        url: '/json/typing',
 | 
						|
        data: {
 | 
						|
            to: typing_to,
 | 
						|
            op: operation,
 | 
						|
        },
 | 
						|
        success: function () {},
 | 
						|
        error: function (xhr) {
 | 
						|
            blueslip.warn("Failed to send typing event: " + xhr.responseText);
 | 
						|
        },
 | 
						|
    });
 | 
						|
}
 | 
						|
 | 
						|
function get_user_ids_string() {
 | 
						|
    var user_ids_string = compose_pm_pill.get_user_ids_string();
 | 
						|
 | 
						|
    if (user_ids_string === "") {
 | 
						|
        return;
 | 
						|
    }
 | 
						|
    return user_ids_string;
 | 
						|
}
 | 
						|
 | 
						|
function is_valid_conversation(user_ids_string) {
 | 
						|
    // TODO: Check to make sure we're in a PM conversation
 | 
						|
    //       with valid emails.
 | 
						|
    if (!user_ids_string) {
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
 | 
						|
    if (compose_pm_pill.has_unconverted_data()) {
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
 | 
						|
    var compose_empty = !compose_state.has_message_content();
 | 
						|
    if (compose_empty) {
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
 | 
						|
    if (compose_state.get_message_type() !== 'private') {
 | 
						|
        // 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;
 | 
						|
    }
 | 
						|
 | 
						|
    return true;
 | 
						|
}
 | 
						|
 | 
						|
function get_current_time() {
 | 
						|
    return new Date();
 | 
						|
}
 | 
						|
 | 
						|
function notify_server_start(user_ids_string) {
 | 
						|
    send_typing_notification_ajax(user_ids_string, "start");
 | 
						|
}
 | 
						|
 | 
						|
function notify_server_stop(user_ids_string) {
 | 
						|
    send_typing_notification_ajax(user_ids_string, "stop");
 | 
						|
}
 | 
						|
 | 
						|
exports.initialize = function () {
 | 
						|
    var worker = {
 | 
						|
        get_recipient: get_user_ids_string,
 | 
						|
        is_valid_conversation: is_valid_conversation,
 | 
						|
        get_current_time: get_current_time,
 | 
						|
        notify_server_start: notify_server_start,
 | 
						|
        notify_server_stop: notify_server_stop,
 | 
						|
    };
 | 
						|
 | 
						|
    $(document).on('input', '#compose-textarea', function () {
 | 
						|
        // If our previous state was no typing notification, send a
 | 
						|
        // start-typing notice immediately.
 | 
						|
        typing_status.handle_text_input(worker);
 | 
						|
    });
 | 
						|
 | 
						|
    // We send a stop-typing notification immediately when compose is
 | 
						|
    // closed/cancelled
 | 
						|
    $(document).on('compose_canceled.zulip compose_finished.zulip', function () {
 | 
						|
        typing_status.stop(worker);
 | 
						|
    });
 | 
						|
};
 | 
						|
 | 
						|
return exports;
 | 
						|
}());
 | 
						|
 | 
						|
if (typeof module !== 'undefined') {
 | 
						|
    module.exports = typing;
 | 
						|
}
 | 
						|
window.typing = typing;
 |