Files
zulip/static/js/server_events_dispatch.js
Steve Howell 241f095213 Extract unread_ops.process_read_messages_event().
The new method borrows some code from the event loop
and unread_ops.mark_messages_as_read, and it is now
flexible about message_ids being marked as unread
even when there is no corresponding message in the
message store.  For that scenario we still want to
update our data structures, which wasn't happening
before this change.  (Generally, this was a non-issue
up until now, but it will become a bigger issue when
we start loading unread message ids from the server.)
2017-08-04 13:31:26 -07:00

354 lines
14 KiB
JavaScript

var server_events_dispatch = (function () {
var exports = {};
exports.dispatch_normal_event = function dispatch_normal_event(event) {
var noop = function () {};
switch (event.type) {
case 'alert_words':
alert_words.words = event.alert_words;
alert_words_ui.render_alert_words_ui();
break;
case 'default_streams':
page_params.realm_default_streams = event.default_streams;
settings_streams.update_default_streams_table();
break;
case 'hotspots':
hotspots.load_new(event.hotspots);
page_params.hotspots = page_params.hotspots ?
page_params.hotspots.concat(event.hotspots) :
event.hotspots;
break;
case 'muted_topics':
muting_ui.handle_updates(event.muted_topics);
break;
case 'presence':
activity.set_user_status(event.email, event.presence, event.server_timestamp);
break;
case 'restart':
var reload_options = {save_pointer: true,
save_narrow: true,
save_compose: true,
message: "The application has been updated; reloading!",
};
if (event.immediate) {
reload_options.immediate = true;
}
reload.initiate(reload_options);
break;
case 'reaction':
if (event.op === 'add') {
reactions.add_reaction(event);
} else if (event.op === 'remove') {
reactions.remove_reaction(event);
}
break;
case 'realm':
var realm_settings = {
add_emoji_by_admins_only: settings_emoji.update_custom_emoji_ui,
allow_edit_history: noop,
create_stream_by_admins_only: noop,
default_language: settings_org.reset_realm_default_language,
description: settings_org.update_realm_description,
email_changes_disabled: settings_org.toggle_email_change_display,
inline_image_preview: noop,
inline_url_embed_preview: noop,
invite_by_admins_only: noop,
invite_required: noop,
mandatory_topics: noop,
message_retention_days: settings_org.update_message_retention_days,
name: notifications.redraw_title,
name_changes_disabled: settings_org.toggle_name_change_display,
notifications_stream_id: noop,
restricted_to_domain: noop,
waiting_period_threshold: noop,
};
if (event.op === 'update' && _.has(realm_settings, event.property)) {
page_params['realm_' + event.property] = event.value;
realm_settings[event.property]();
if (event.property === 'create_stream_by_admins_only') {
if (!page_params.is_admin) {
page_params.can_create_streams = (!page_params.
realm_create_stream_by_admins_only);
}
} else if (event.property === 'notifications_stream_id') {
settings_org.render_notifications_stream_ui(
page_params.realm_notifications_stream_id);
}
} else if (event.op === 'update_dict' && event.property === 'default') {
_.each(event.data, function (value, key) {
page_params['realm_' + key] = value;
});
if (event.data.authentication_methods !== undefined) {
settings_org.populate_auth_methods(event.data.authentication_methods);
}
} else if (event.op === 'update_dict' && event.property === 'icon') {
page_params.realm_icon_url = event.data.icon_url;
page_params.realm_icon_source = event.data.icon_source;
realm_icon.rerender();
}
break;
case 'realm_bot':
if (event.op === 'add') {
bot_data.add(event.bot);
settings_users.update_user_data(event.bot.user_id, event.bot);
} else if (event.op === 'remove') {
bot_data.deactivate(event.bot.email);
event.bot.is_active = false;
settings_users.update_user_data(event.bot.user_id, event.bot);
} else if (event.op === 'update') {
if (_.has(event.bot, 'owner_id')) {
event.bot.owner = people.get_person_from_user_id(event.bot.owner_id).email;
}
bot_data.update(event.bot.email, event.bot);
settings_users.update_user_data(event.bot.user_id, event.bot);
}
break;
case 'realm_emoji':
// Update `page_params.realm_emoji` so that settings page
// can display it properly when reopened without refresh.
page_params.realm_emoji = event.realm_emoji;
emoji.update_emojis(event.realm_emoji);
settings_emoji.populate_emoji(event.realm_emoji);
break;
case 'realm_filters':
page_params.realm_filters = event.realm_filters;
markdown.set_realm_filters(page_params.realm_filters);
settings_filters.populate_filters(page_params.realm_filters);
break;
case 'realm_domains':
var i;
if (event.op === 'add') {
page_params.realm_domains.push(event.realm_domain);
} else if (event.op === 'change') {
for (i = 0; i < page_params.realm_domains.length; i += 1) {
if (page_params.realm_domains[i].domain === event.realm_domain.domain) {
page_params.realm_domains[i].allow_subdomains =
event.realm_domain.allow_subdomains;
break;
}
}
} else if (event.op === 'remove') {
for (i = 0; i < page_params.realm_domains.length; i += 1) {
if (page_params.realm_domains[i].domain === event.domain) {
page_params.realm_domains.splice(i, 1);
break;
}
}
}
settings_org.populate_realm_domains(page_params.realm_domains);
break;
case 'realm_user':
if (event.op === 'add') {
people.add_in_realm(event.person);
} else if (event.op === 'remove') {
people.deactivate(event.person);
} else if (event.op === 'update') {
user_events.update_person(event.person);
}
break;
case 'stream':
if (event.op === 'update') {
// Legacy: Stream properties are still managed by subs.js on the client side.
stream_events.update_property(
event.stream_id,
event.property,
event.value
);
settings_streams.update_default_streams_table();
} else if (event.op === 'create') {
stream_data.create_streams(event.streams);
} else if (event.op === 'delete') {
_.each(event.streams, function (stream) {
if (stream_data.is_subscribed(stream.name)) {
stream_list.remove_sidebar_row(stream.stream_id);
}
subs.remove_stream(stream.stream_id);
stream_data.delete_sub(stream.stream_id);
settings_streams.remove_default_stream(stream.stream_id);
stream_data.remove_default_stream(stream.stream_id);
if (page_params.realm_notifications_stream_id === stream.stream_id) {
page_params.realm_notifications_stream_id = -1;
settings_org.render_notifications_stream_ui(
page_params.realm_notifications_stream_id);
}
});
}
break;
case 'subscription':
var person;
var email;
if (event.op === 'add') {
_.each(event.subscriptions, function (rec) {
var sub = stream_data.get_sub_by_id(rec.stream_id);
if (sub) {
stream_events.mark_subscribed(sub, rec.subscribers);
} else {
blueslip.error('Subscribing to unknown stream' + rec.stream_id);
}
});
} else if (event.op === 'peer_add') {
// TODO: remove email shim here and fix called functions
// to use user_ids
person = people.get_person_from_user_id(event.user_id);
email = person.email;
_.each(event.subscriptions, function (sub) {
if (stream_data.add_subscriber(sub, event.user_id)) {
$(document).trigger(
'peer_subscribe.zulip',
{stream_name: sub, user_email: email});
} else {
blueslip.warn('Cannot process peer_add event');
}
});
} else if (event.op === 'peer_remove') {
// TODO: remove email shim here and fix called functions
// to use user_ids
person = people.get_person_from_user_id(event.user_id);
email = person.email;
_.each(event.subscriptions, function (sub) {
if (stream_data.remove_subscriber(sub, event.user_id)) {
$(document).trigger(
'peer_unsubscribe.zulip',
{stream_name: sub, user_email: email});
} else {
blueslip.warn('Cannot process peer_remove event.');
}
});
} else if (event.op === 'remove') {
_.each(event.subscriptions, function (rec) {
var sub = stream_data.get_sub_by_id(rec.stream_id);
stream_events.mark_unsubscribed(sub);
});
} else if (event.op === 'update') {
stream_events.update_property(
event.stream_id,
event.property,
event.value
);
}
break;
case 'typing':
if (event.sender.user_id === page_params.user_id) {
// typing notifications are sent to the user who is typing
// as well as recipients; we ignore such self-generated events.
return;
}
if (event.op === 'start') {
typing_events.display_notification(event);
} else if (event.op === 'stop') {
typing_events.hide_notification(event);
}
break;
case 'update_display_settings':
var user_display_settings = [
'default_language',
'emoji_alt_code',
'emojiset',
'high_contrast_mode',
'left_side_userlist',
'timezone',
'twenty_four_hour_time',
];
if (_.contains(user_display_settings, event.setting_name)) {
page_params[event.setting_name] = event.setting;
}
if (event.setting_name === 'twenty_four_hour_time') {
// Rerender the whole message list UI
home_msg_list.rerender();
if (current_msg_list === message_list.narrowed) {
message_list.narrowed.rerender();
}
}
if (event.setting_name === 'high_contrast_mode') {
$("body").toggleClass("high-contrast");
}
if (event.setting_name === 'emoji_alt_code') {
// Rerender the whole message list UI
home_msg_list.rerender();
if (current_msg_list === message_list.narrowed) {
message_list.narrowed.rerender();
}
}
if (event.setting_name === 'left_side_userlist') {
// TODO: Make this change the view immediately rather
// than requiring a reload or page resize.
}
if (event.setting_name === 'default_language') {
// TODO: Make this change the view immediately rather
// than requiring a reload or page resize.
}
if (event.setting_name === 'emojiset') {
var sprite = new Image();
sprite.onload = function () {
$("#emoji-spritesheet").attr('href', "/static/generated/emoji/" + page_params.emojiset + "_sprite.css");
if ($("#display-settings-status").length) {
loading.destroy_indicator($("#emojiset_spinner"));
$("#emojiset_select").val(page_params.emojiset);
ui_report.success(i18n.t("Emojiset changed successfully!!"),
$('#display-settings-status').expectOne());
}
};
sprite.src = "/static/generated/emoji/sheet_" + page_params.emojiset + "_32.png";
}
if ($("#settings.tab-pane.active").length) {
settings_display.update_page();
}
break;
case 'update_global_notifications':
notifications.handle_global_notification_updates(event.notification_name,
event.setting);
if ($("#settings.tab-pane.active").length) {
settings_notifications.update_page();
}
break;
case 'update_message_flags':
var new_value = event.operation === "add";
switch (event.flag) {
case 'starred':
_.each(event.messages, function (message_id) {
ui.update_starred(message_id, new_value);
});
break;
case 'read':
unread_ops.process_read_messages_event(event.messages);
break;
}
break;
case 'delete_message':
var msg_id = event.message_id;
ui.remove_message(msg_id);
break;
}
};
return exports;
}());
if (typeof module !== 'undefined') {
module.exports = server_events_dispatch;
}