import autosize from "autosize"; import $ from "jquery"; import * as blueslip from "./blueslip"; import * as compose_state from "./compose_state"; import * as condense from "./condense"; import * as message_lists from "./message_lists"; import * as message_viewport from "./message_viewport"; import * as navbar_alerts from "./navbar_alerts"; import * as navigate from "./navigate"; import * as popovers from "./popovers"; import * as util from "./util"; function get_new_heights() { const res = {}; const viewport_height = message_viewport.height(); const top_navbar_height = $("#top_navbar").safeOuterHeight(true); const right_sidebar_shortcuts_height = $(".right-sidebar-shortcuts").safeOuterHeight(true) || 0; res.bottom_whitespace_height = viewport_height * 0.4; res.main_div_min_height = viewport_height - top_navbar_height; res.stream_filters_max_height = viewport_height - Number.parseInt($("#left-sidebar").css("marginTop"), 10) - Number.parseInt($(".narrows_panel").css("marginTop"), 10) - Number.parseInt($(".narrows_panel").css("marginBottom"), 10) - $("#global_filters").safeOuterHeight(true) - $("#private_messages_sticky_header").safeOuterHeight(true); // Don't let us crush the stream sidebar completely out of view res.stream_filters_max_height = Math.max(80, res.stream_filters_max_height); // RIGHT SIDEBAR const usable_height = viewport_height - Number.parseInt($("#right-sidebar").css("marginTop"), 10) - $("#userlist-header").safeOuterHeight(true) - $("#user_search_section").safeOuterHeight(true) - right_sidebar_shortcuts_height; res.buddy_list_wrapper_max_height = Math.max(80, usable_height); return res; } export function watch_manual_resize(element) { const box = document.querySelector(element); if (!box) { blueslip.error("Bad selector in watch_manual_resize: " + element); return undefined; } const meta = { box, height: null, mousedown: false, }; const box_handler = function () { meta.mousedown = true; meta.height = meta.box.clientHeight; }; meta.box.addEventListener("mousedown", box_handler); // If the user resizes the textarea manually, we use the // callback to stop autosize from adjusting the height. // It will be re-enabled when this component is next opened. const body_handler = function () { if (meta.mousedown === true) { meta.mousedown = false; if (meta.height !== meta.box.clientHeight) { meta.height = meta.box.clientHeight; autosize.destroy($(element)).height(meta.height + "px"); } } }; document.body.addEventListener("mouseup", body_handler); return [box_handler, body_handler]; } export function reset_compose_message_max_height(bottom_whitespace_height) { // If the compose-box is open, we set the `max-height` property of // `compose-textarea` and `preview-textarea`, so that the // compose-box's maximum extent does not overlap the last message // in the current stream. We also leave a tiny bit of space after // the last message of the current stream. // Compute bottom_whitespace_height if not provided by caller. if (bottom_whitespace_height === undefined) { const h = get_new_heights(); bottom_whitespace_height = h.bottom_whitespace_height; } const compose_height = $("#compose").get(0).getBoundingClientRect().height; const compose_textarea_height = Math.max( $("#compose-textarea").get(0).getBoundingClientRect().height, $("#preview_message_area").get(0).getBoundingClientRect().height, ); const compose_non_textarea_height = compose_height - compose_textarea_height; // We ensure that the last message is not overlapped by compose box. $("#compose-textarea").css( "max-height", // Because