message_header: Improve loading indicator on resolve/unresolve button.

This commit improves the loading indicator on the resolve/unresolve
button via the `show_button_loading_indicator` method from
`web/src/buttons.ts` module.
This commit is contained in:
Sayam Samal
2025-06-03 03:17:36 +05:30
committed by Tim Abbott
parent e091e19031
commit 2e070272cb
4 changed files with 21 additions and 22 deletions

View File

@@ -20,6 +20,7 @@ import {detached_uploads_api_response_schema} from "./attachments.ts";
import * as attachments_ui from "./attachments_ui.ts"; import * as attachments_ui from "./attachments_ui.ts";
import * as blueslip from "./blueslip.ts"; import * as blueslip from "./blueslip.ts";
import type {Typeahead} from "./bootstrap_typeahead.ts"; import type {Typeahead} from "./bootstrap_typeahead.ts";
import * as buttons from "./buttons.ts";
import * as channel from "./channel.ts"; import * as channel from "./channel.ts";
import * as compose_actions from "./compose_actions.ts"; import * as compose_actions from "./compose_actions.ts";
import * as compose_banner from "./compose_banner.ts"; import * as compose_banner from "./compose_banner.ts";
@@ -785,11 +786,14 @@ export function start($row: JQuery, edit_box_open_callback?: () => void): void {
} }
function show_toggle_resolve_topic_spinner($row: JQuery): void { function show_toggle_resolve_topic_spinner($row: JQuery): void {
const $spinner = $row.find(".toggle_resolve_topic_spinner"); const $button = $row.find(".on_hover_topic_resolve, .on_hover_topic_unresolve").expectOne();
loading.make_indicator($spinner); $button.addClass("loading-resolve-topic-state");
$spinner.css({width: "1em"}); // While we call the show_button_loading_indicator method to
$row.find(".on_hover_topic_resolve, .on_hover_topic_unresolve").hide(); // show the spinner, we don't need to call the corresponding
$row.find(".toggle_resolve_topic_spinner").show(); // hide_button_loading_indicator method later in the code
// for a successful resolve/unresolve request, as that results
// in a rerender of the message feed which replaces the button.
buttons.show_button_loading_indicator($button);
} }
function get_resolve_topic_time_limit_error_string( function get_resolve_topic_time_limit_error_string(
@@ -954,18 +958,7 @@ function do_toggle_resolve_topic(
void channel.patch({ void channel.patch({
url: "/json/messages/" + message_id, url: "/json/messages/" + message_id,
data: request, data: request,
success() {
if ($row) {
const $spinner = $row.find(".toggle_resolve_topic_spinner");
loading.destroy_indicator($spinner);
}
},
error(xhr) { error(xhr) {
if ($row) {
const $spinner = $row.find(".toggle_resolve_topic_spinner");
loading.destroy_indicator($spinner);
}
if (xhr.responseJSON) { if (xhr.responseJSON) {
const {code} = z.object({code: z.string()}).parse(xhr.responseJSON); const {code} = z.object({code: z.string()}).parse(xhr.responseJSON);
if (code === "MOVE_MESSAGES_TIME_LIMIT_EXCEEDED") { if (code === "MOVE_MESSAGES_TIME_LIMIT_EXCEEDED") {

View File

@@ -317,8 +317,17 @@ export function initialize(): void {
}, },
); );
message_list_tooltip("#message_feed_container .recipient-bar-control-icon:not(.toggle_resolve_topic_spinner)", { message_list_tooltip("#message_feed_container .recipient-bar-control-icon", {
delay: LONG_HOVER_DELAY, delay: LONG_HOVER_DELAY,
onShow(instance) {
const $reference = $(instance.reference);
if ($reference.hasClass("loading-resolve-topic-state")) {
// Don't show tooltip when the loading indicator is being
// displayed while resolving/unresolving a topic.
return false;
}
return undefined;
},
onHidden(instance) { onHidden(instance) {
instance.destroy(); instance.destroy();
}, },

View File

@@ -1285,16 +1285,14 @@ nav {
text-align: center; text-align: center;
} }
div.topic_edit_spinner, div.topic_edit_spinner {
div.toggle_resolve_topic_spinner {
display: flex; display: flex;
align-items: center; align-items: center;
width: 1.2em; /* 18px at 15px/em (from font size set in .message-header-contents) */ width: 1.2em; /* 18px at 15px/em (from font size set in .message-header-contents) */
height: 1.2em; /* 18px at 15px/em */ height: 1.2em; /* 18px at 15px/em */
} }
div.topic_edit_spinner .loading_indicator_spinner, div.topic_edit_spinner .loading_indicator_spinner {
div.toggle_resolve_topic_spinner .loading_indicator_spinner {
width: 0.9333em; /* 14px at 15px/em (from font size set in .message-header-contents) */ width: 0.9333em; /* 14px at 15px/em (from font size set in .message-header-contents) */
height: 0.9333em; /* 14px at 15px/em */ height: 0.9333em; /* 14px at 15px/em */

View File

@@ -60,7 +60,6 @@
{{else}} {{else}}
{{> components/icon_button icon="check" intent="neutral" custom_classes="on_hover_topic_resolve recipient-bar-control recipient-bar-control-icon hidden-for-spectators" data-tippy-content=(t "Mark as resolved") aria-label=(t "Mark as resolved") }} {{> components/icon_button icon="check" intent="neutral" custom_classes="on_hover_topic_resolve recipient-bar-control recipient-bar-control-icon hidden-for-spectators" data-tippy-content=(t "Mark as resolved") aria-label=(t "Mark as resolved") }}
{{/if}} {{/if}}
<div class="toggle_resolve_topic_spinner recipient_bar_icon" style="display: none"></div>
{{/if}} {{/if}}
{{! visibility policy menu }} {{! visibility policy menu }}