2017-03-22 15:11:41 +01:00
|
|
|
var typing_events = (function () {
|
|
|
|
var exports = {};
|
|
|
|
|
2017-11-08 17:55:36 +01:00
|
|
|
// See docs/subsystems/typing-indicators.md for details on typing indicators.
|
2017-09-25 20:33:29 +02:00
|
|
|
|
2017-03-22 15:11:41 +01:00
|
|
|
// This code handles the inbound side of typing notifications.
|
|
|
|
// When another user is typing, we process the events here.
|
|
|
|
//
|
|
|
|
// We also handle the local event of re-narrowing.
|
|
|
|
// (For the outbound code, see typing.js.)
|
|
|
|
|
|
|
|
// How long before we assume a client has gone away
|
|
|
|
// and expire its typing status
|
|
|
|
var TYPING_STARTED_EXPIRY_PERIOD = 15000; // 15s
|
|
|
|
|
|
|
|
// Note!: There are also timing constants in typing_status.js
|
|
|
|
// that make typing indicators work.
|
|
|
|
|
|
|
|
function get_users_typing_for_narrow() {
|
2017-04-25 15:25:31 +02:00
|
|
|
if (!narrow_state.narrowed_to_pms()) {
|
2017-03-22 15:11:41 +01:00
|
|
|
// Narrow is neither pm-with nor is: private
|
|
|
|
return [];
|
|
|
|
}
|
2017-04-25 15:25:31 +02:00
|
|
|
|
|
|
|
var first_term = narrow_state.operators()[0];
|
|
|
|
if (first_term.operator === 'pm-with') {
|
2017-03-22 15:11:41 +01:00
|
|
|
// Get list of users typing in this conversation
|
2017-04-25 15:25:31 +02:00
|
|
|
var narrow_emails_string = first_term.operand;
|
2017-03-22 15:11:41 +01:00
|
|
|
// TODO: Create people.emails_strings_to_user_ids.
|
2018-05-30 13:05:27 +02:00
|
|
|
var narrow_user_ids_string = people.reply_to_to_user_ids_string(narrow_emails_string);
|
2017-06-15 17:32:13 +02:00
|
|
|
if (!narrow_user_ids_string) {
|
|
|
|
return [];
|
|
|
|
}
|
2017-03-22 15:11:41 +01:00
|
|
|
var narrow_user_ids = narrow_user_ids_string.split(',').map(function (user_id_string) {
|
|
|
|
return parseInt(user_id_string, 10);
|
|
|
|
});
|
|
|
|
var group = narrow_user_ids.concat([page_params.user_id]);
|
|
|
|
return typing_data.get_group_typists(group);
|
|
|
|
}
|
|
|
|
// Get all users typing (in all private conversations with current user)
|
|
|
|
return typing_data.get_all_typists();
|
|
|
|
}
|
|
|
|
|
|
|
|
function render_notifications_for_narrow() {
|
|
|
|
var user_ids = get_users_typing_for_narrow();
|
|
|
|
var users_typing = user_ids.map(people.get_person_from_user_id);
|
|
|
|
if (users_typing.length === 0) {
|
|
|
|
$('#typing_notifications').hide();
|
|
|
|
} else {
|
|
|
|
$('#typing_notifications').html(templates.render('typing_notifications', {users: users_typing}));
|
|
|
|
$('#typing_notifications').show();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
exports.hide_notification = function (event) {
|
|
|
|
var recipients = event.recipients.map(function (user) {
|
|
|
|
return user.user_id;
|
|
|
|
});
|
|
|
|
recipients.sort();
|
|
|
|
|
2017-03-22 16:20:16 +01:00
|
|
|
typing_data.clear_inbound_timer(recipients);
|
2017-03-22 15:11:41 +01:00
|
|
|
|
|
|
|
var removed = typing_data.remove_typist(recipients, event.sender.user_id);
|
|
|
|
|
|
|
|
if (removed) {
|
|
|
|
render_notifications_for_narrow();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
exports.display_notification = function (event) {
|
|
|
|
var recipients = event.recipients.map(function (user) {
|
|
|
|
return user.user_id;
|
|
|
|
});
|
|
|
|
recipients.sort();
|
|
|
|
|
|
|
|
var sender_id = event.sender.user_id;
|
|
|
|
event.sender.name = people.get_person_from_user_id(sender_id).full_name;
|
|
|
|
|
|
|
|
typing_data.add_typist(recipients, sender_id);
|
|
|
|
|
|
|
|
render_notifications_for_narrow();
|
2017-03-22 16:20:16 +01:00
|
|
|
|
|
|
|
typing_data.kickstart_inbound_timer(
|
|
|
|
recipients,
|
|
|
|
TYPING_STARTED_EXPIRY_PERIOD,
|
|
|
|
function () {
|
|
|
|
exports.hide_notification(event);
|
|
|
|
}
|
|
|
|
);
|
2017-03-22 15:11:41 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
$(document).on('narrow_activated.zulip', render_notifications_for_narrow);
|
|
|
|
$(document).on('narrow_deactivated.zulip', render_notifications_for_narrow);
|
|
|
|
|
|
|
|
|
|
|
|
return exports;
|
|
|
|
}());
|
|
|
|
|
|
|
|
if (typeof module !== 'undefined') {
|
|
|
|
module.exports = typing_events;
|
|
|
|
}
|