import {format, isSameDay} from "date-fns"; import $ from "jquery"; import render_message_edit_history from "../templates/message_edit_history.hbs"; import render_message_history_modal from "../templates/message_history_modal.hbs"; import * as channel from "./channel"; import * as dialog_widget from "./dialog_widget"; import {$t, $t_html} from "./i18n"; import * as message_lists from "./message_lists"; import {page_params} from "./page_params"; import * as people from "./people"; import * as popovers from "./popovers"; import * as rendered_markdown from "./rendered_markdown"; import * as rows from "./rows"; import * as stream_data from "./stream_data"; import * as sub_store from "./sub_store"; import * as timerender from "./timerender"; import * as ui_report from "./ui_report"; export function fetch_and_render_message_history(message) { channel.get({ url: "/json/messages/" + message.id + "/history", data: {message_id: JSON.stringify(message.id)}, success(data) { const content_edit_history = []; let prev_time = null; let prev_stream_item = null; for (const [index, msg] of data.message_history.entries()) { // Format times and dates nicely for display const time = new Date(msg.timestamp * 1000); const item = { timestamp: timerender.stringify_time(time), display_date: format(time, "MMMM d, yyyy"), show_date_row: prev_time === null || !isSameDay(time, prev_time), }; if (!msg.user_id) { continue; } const person = people.get_by_user_id(msg.user_id); const full_name = person.full_name; if (index === 0) { item.edited_by_notice = $t( {defaultMessage: "Posted by {full_name}"}, {full_name}, ); item.body_to_render = msg.rendered_content; } else if (msg.prev_topic && msg.prev_content) { item.edited_by_notice = $t( {defaultMessage: "Edited by {full_name}"}, {full_name}, ); item.body_to_render = msg.content_html_diff; item.topic_edited = true; item.prev_topic = msg.prev_topic; item.new_topic = msg.topic; } else if (msg.prev_topic && msg.prev_stream) { const sub = sub_store.get(msg.prev_stream); item.edited_by_notice = $t( {defaultMessage: "Moved by {full_name}"}, {full_name}, ); item.topic_edited = true; item.prev_topic = msg.prev_topic; item.new_topic = msg.topic; item.stream_changed = true; if (!sub) { item.prev_stream = $t({defaultMessage: "Unknown stream"}); } else { item.prev_stream = stream_data.maybe_get_stream_name(msg.prev_stream); } if (prev_stream_item !== null) { prev_stream_item.new_stream = stream_data.maybe_get_stream_name( msg.prev_stream, ); } prev_stream_item = item; } else if (msg.prev_topic) { item.edited_by_notice = $t( {defaultMessage: "Moved by {full_name}"}, {full_name}, ); item.topic_edited = true; item.prev_topic = msg.prev_topic; item.new_topic = msg.topic; } else if (msg.prev_stream) { const sub = sub_store.get(msg.prev_stream); item.edited_by_notice = $t( {defaultMessage: "Moved by {full_name}"}, {full_name}, ); item.stream_changed = true; if (!sub) { item.prev_stream = $t({defaultMessage: "Unknown stream"}); } else { item.prev_stream = stream_data.maybe_get_stream_name(msg.prev_stream); } if (prev_stream_item !== null) { prev_stream_item.new_stream = stream_data.maybe_get_stream_name( msg.prev_stream, ); } prev_stream_item = item; } else { // just a content edit item.edited_by_notice = $t( {defaultMessage: "Edited by {full_name}"}, {full_name}, ); item.body_to_render = msg.content_html_diff; } content_edit_history.push(item); prev_time = time; } if (prev_stream_item !== null) { prev_stream_item.new_stream = stream_data.maybe_get_stream_name(message.stream_id); } $("#message-history").attr("data-message-id", message.id); $("#message-history").html( render_message_edit_history({ edited_messages: content_edit_history, }), ); // Pass the history through rendered_markdown.js // to update dynamic_elements in the content. $("#message-history") .find(".rendered_markdown") .each(function () { rendered_markdown.update_elements($(this)); }); }, error(xhr) { ui_report.error( $t_html({defaultMessage: "Error fetching message edit history"}), xhr, $("#dialog_error"), ); }, }); } export function show_history(message) { const rendered_message_history = render_message_history_modal(); dialog_widget.launch({ html_heading: $t_html({defaultMessage: "Message edit history"}), html_body: rendered_message_history, html_submit_button: $t_html({defaultMessage: "Close"}), id: "message-edit-history", on_click: () => {}, close_on_submit: true, focus_submit_on_open: true, single_footer_button: true, post_render: () => { fetch_and_render_message_history(message); }, }); } export function initialize() { $("body").on("mouseenter", ".message_edit_notice", (e) => { if (page_params.realm_allow_edit_history) { $(e.currentTarget).addClass("message_edit_notice_hover"); } }); $("body").on("mouseleave", ".message_edit_notice", (e) => { if (page_params.realm_allow_edit_history) { $(e.currentTarget).removeClass("message_edit_notice_hover"); } }); $("body").on("click", ".message_edit_notice", (e) => { popovers.hide_all(); const message_id = rows.id($(e.currentTarget).closest(".message_row")); const $row = message_lists.current.get_row(message_id); const message = message_lists.current.get(rows.id($row)); if (page_params.realm_allow_edit_history) { show_history(message); $("#message-history-cancel").trigger("focus"); } e.stopPropagation(); e.preventDefault(); }); }