From d8dcec68533fa661869346917f5e1c46a9ea6593 Mon Sep 17 00:00:00 2001 From: Anders Kaseorg Date: Sun, 15 Oct 2023 21:38:15 -0700 Subject: [PATCH] user_deactivation_ui: Convert module to TypeScript. Signed-off-by: Anders Kaseorg --- tools/test-js-with-node | 2 +- web/src/settings_invites.ts | 2 +- ...tivation_ui.js => user_deactivation_ui.ts} | 41 ++++++++++++++----- 3 files changed, 33 insertions(+), 12 deletions(-) rename web/src/{user_deactivation_ui.js => user_deactivation_ui.ts} (80%) diff --git a/tools/test-js-with-node b/tools/test-js-with-node index ed70721de3..0de9547569 100755 --- a/tools/test-js-with-node +++ b/tools/test-js-with-node @@ -255,7 +255,7 @@ EXEMPT_FILES = make_set( "web/src/upload_widget.ts", "web/src/url-template.d.ts", "web/src/user_card_popover.js", - "web/src/user_deactivation_ui.js", + "web/src/user_deactivation_ui.ts", "web/src/user_group_create.js", "web/src/user_group_create_members.js", "web/src/user_group_create_members_data.ts", diff --git a/web/src/settings_invites.ts b/web/src/settings_invites.ts index e25b3545fa..59ad3dfd3b 100644 --- a/web/src/settings_invites.ts +++ b/web/src/settings_invites.ts @@ -19,7 +19,7 @@ import * as timerender from "./timerender"; import * as ui_report from "./ui_report"; import * as util from "./util"; -const invite_schema = z.intersection( +export const invite_schema = z.intersection( z.object({ invited_by_user_id: z.number(), invited: z.number(), diff --git a/web/src/user_deactivation_ui.js b/web/src/user_deactivation_ui.ts similarity index 80% rename from web/src/user_deactivation_ui.js rename to web/src/user_deactivation_ui.ts index 9e49dc1f8d..956b81f020 100644 --- a/web/src/user_deactivation_ui.js +++ b/web/src/user_deactivation_ui.ts @@ -1,4 +1,5 @@ import $ from "jquery"; +import {z} from "zod"; import render_settings_deactivation_bot_modal from "../templates/confirm_dialog/confirm_deactivate_bot.hbs"; import render_settings_deactivation_user_modal from "../templates/confirm_dialog/confirm_deactivate_user.hbs"; @@ -12,15 +13,22 @@ import * as dialog_widget from "./dialog_widget"; import {$t_html} from "./i18n"; import {page_params} from "./page_params"; import * as people from "./people"; +import {invite_schema} from "./settings_invites"; -export function confirm_deactivation(user_id, handle_confirm, loading_spinner) { +export function confirm_deactivation( + user_id: number, + handle_confirm: () => void, + loading_spinner: boolean, +): void { // Knowing the number of invites requires making this request. If the request fails, // we won't have the accurate number of invites. So, we don't show the modal if the // request fails. - channel.get({ + void channel.get({ url: "/json/invites", timeout: 10 * 1000, - success(data) { + success(raw_data) { + const data = z.object({invites: z.array(invite_schema)}).parse(raw_data); + let number_of_invites_by_user = 0; for (const invite of data.invites) { if (invite.invited_by_user_id === user_id) { @@ -43,7 +51,7 @@ export function confirm_deactivation(user_id, handle_confirm, loading_spinner) { }; const html_body = render_settings_deactivation_user_modal(opts); - function set_email_field_visibility() { + function set_email_field_visibility(): void { const $send_email_checkbox = $("#dialog_widget_modal").find(".send_email"); const $email_field = $("#dialog_widget_modal").find(".email_field"); @@ -74,7 +82,11 @@ export function confirm_deactivation(user_id, handle_confirm, loading_spinner) { }); } -export function confirm_bot_deactivation(bot_id, handle_confirm, loading_spinner) { +export function confirm_bot_deactivation( + bot_id: number, + handle_confirm: () => void, + loading_spinner: boolean, +): void { const bot = people.get_by_user_id(bot_id); const html_body = render_settings_deactivation_bot_modal(); @@ -88,19 +100,28 @@ export function confirm_bot_deactivation(bot_id, handle_confirm, loading_spinner }); } -export function confirm_reactivation(user_id, handle_confirm, loading_spinner) { +export function confirm_reactivation( + user_id: number, + handle_confirm: () => void, + loading_spinner: boolean, +): void { const user = people.get_by_user_id(user_id); - const opts = { + const opts: { + username: string; + original_owner_deactivated?: boolean; + owner_name?: string; + } = { username: user.full_name, }; let html_body; // check if bot or human if (user.is_bot) { - opts.original_owner_deactivated = - user.is_bot && user.bot_owner_id && !people.is_person_active(user.bot_owner_id); - if (opts.original_owner_deactivated) { + if (user.bot_owner_id !== null && !people.is_person_active(user.bot_owner_id)) { + opts.original_owner_deactivated = true; opts.owner_name = people.get_by_user_id(user.bot_owner_id).full_name; + } else { + opts.original_owner_deactivated = false; } html_body = render_settings_reactivation_bot_modal(opts); } else {