mirror of
https://github.com/zulip/zulip.git
synced 2025-11-04 14:03:30 +00:00
Ever since we started bundling the app with webpack, there’s been less and less overlap between our ‘static’ directory (files belonging to the frontend app) and Django’s interpretation of the ‘static’ directory (files served directly to the web). Split the app out to its own ‘web’ directory outside of ‘static’, and remove all the custom collectstatic --ignore rules. This makes it much clearer what’s actually being served to the web, and what’s being bundled by webpack. It also shrinks the release tarball by 3%. Signed-off-by: Anders Kaseorg <anders@zulip.com>
88 lines
2.5 KiB
JavaScript
88 lines
2.5 KiB
JavaScript
import $ from "jquery";
|
|
|
|
import * as typing_status from "../shared/src/typing_status";
|
|
|
|
import * as blueslip from "./blueslip";
|
|
import * as channel from "./channel";
|
|
import * as compose_pm_pill from "./compose_pm_pill";
|
|
import * as compose_state from "./compose_state";
|
|
import * as people from "./people";
|
|
import {user_settings} from "./user_settings";
|
|
|
|
// 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_array, operation) {
|
|
channel.post({
|
|
url: "/json/typing",
|
|
data: {
|
|
to: JSON.stringify(user_ids_array),
|
|
op: operation,
|
|
},
|
|
success() {},
|
|
error(xhr) {
|
|
blueslip.warn("Failed to send typing event: " + xhr.responseText);
|
|
},
|
|
});
|
|
}
|
|
|
|
function get_user_ids_array() {
|
|
const user_ids_string = compose_pm_pill.get_user_ids_string();
|
|
if (user_ids_string === "") {
|
|
return null;
|
|
}
|
|
|
|
return people.user_ids_string_to_ids_array(user_ids_string);
|
|
}
|
|
|
|
function is_valid_conversation() {
|
|
const compose_empty = !compose_state.has_message_content();
|
|
if (compose_empty) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
function get_current_time() {
|
|
return Date.now();
|
|
}
|
|
|
|
function notify_server_start(user_ids_array) {
|
|
if (user_settings.send_private_typing_notifications) {
|
|
send_typing_notification_ajax(user_ids_array, "start");
|
|
}
|
|
}
|
|
|
|
function notify_server_stop(user_ids_array) {
|
|
if (user_settings.send_private_typing_notifications) {
|
|
send_typing_notification_ajax(user_ids_array, "stop");
|
|
}
|
|
}
|
|
|
|
export const get_recipient = get_user_ids_array;
|
|
|
|
export function initialize() {
|
|
const worker = {
|
|
get_current_time,
|
|
notify_server_start,
|
|
notify_server_stop,
|
|
};
|
|
|
|
$(document).on("input", "#compose-textarea", () => {
|
|
// If our previous state was no typing notification, send a
|
|
// start-typing notice immediately.
|
|
const new_recipient = is_valid_conversation() ? get_recipient() : null;
|
|
typing_status.update(worker, new_recipient);
|
|
});
|
|
|
|
// We send a stop-typing notification immediately when compose is
|
|
// closed/cancelled
|
|
$(document).on("compose_canceled.zulip compose_finished.zulip", () => {
|
|
typing_status.update(worker, null);
|
|
});
|
|
}
|