overlays: Fix dependency cycle between popover.js and overlays.js.

This is a Prep PR for #24426.

Removes direct dependency cycle between 'popover.js'
and overlays.js by creating popover.initialize method
called from 'ui_init.js' that calls
overlays.register_pre_open_hook(hide_all) and
overlays.register_pre_close_hook(hide_all).

Created a function call_hook that loop call all
registered hooks at the start of 'open_overlay' and
'close_overlay'.
This commit is contained in:
Hardik Dharmani 2023-03-09 14:15:40 +05:30 committed by Tim Abbott
parent 3bfbfb014a
commit 570c9e260b
3 changed files with 26 additions and 3 deletions

View File

@ -3,18 +3,34 @@ import Micromodal from "micromodal";
import * as blueslip from "./blueslip"; import * as blueslip from "./blueslip";
import * as browser_history from "./browser_history"; import * as browser_history from "./browser_history";
import * as popovers from "./popovers";
let $active_overlay; let $active_overlay;
let close_handler; let close_handler;
let open_overlay_name; let open_overlay_name;
const pre_open_hooks = [];
const pre_close_hooks = [];
function reset_state() { function reset_state() {
$active_overlay = undefined; $active_overlay = undefined;
close_handler = undefined; close_handler = undefined;
open_overlay_name = undefined; open_overlay_name = undefined;
} }
export function register_pre_open_hook(func) {
pre_open_hooks.push(func);
}
export function register_pre_close_hook(func) {
pre_close_hooks.push(func);
}
function call_hooks(func_list) {
for (const element of func_list) {
element();
}
}
export function is_active() { export function is_active() {
return Boolean(open_overlay_name); return Boolean(open_overlay_name);
} }
@ -62,7 +78,7 @@ export function active_modal() {
} }
export function open_overlay(opts) { export function open_overlay(opts) {
popovers.hide_all(); call_hooks(pre_open_hooks);
if (!opts.name || !opts.$overlay || !opts.on_close) { if (!opts.name || !opts.$overlay || !opts.on_close) {
blueslip.error("Programming error in open_overlay"); blueslip.error("Programming error in open_overlay");
@ -210,7 +226,7 @@ export function open_modal(selector, conf = {}) {
} }
export function close_overlay(name) { export function close_overlay(name) {
popovers.hide_all(); call_hooks(pre_close_hooks);
if (name !== open_overlay_name) { if (name !== open_overlay_name) {
blueslip.error("Trying to close " + name + " when " + open_overlay_name + " is open."); blueslip.error("Trying to close " + name + " when " + open_overlay_name + " is open.");

View File

@ -56,6 +56,11 @@ let userlist_placement = "right";
let list_of_popovers = []; let list_of_popovers = [];
export function initialize() {
overlays.register_pre_open_hook(hide_all);
overlays.register_pre_close_hook(hide_all);
}
export function clear_for_testing() { export function clear_for_testing() {
$current_message_info_popover_elem = undefined; $current_message_info_popover_elem = undefined;
$current_user_info_popover_elem = undefined; $current_user_info_popover_elem = undefined;

View File

@ -62,6 +62,7 @@ import * as people from "./people";
import * as pm_conversations from "./pm_conversations"; import * as pm_conversations from "./pm_conversations";
import * as pm_list from "./pm_list"; import * as pm_list from "./pm_list";
import * as popover_menus from "./popover_menus"; import * as popover_menus from "./popover_menus";
import * as popovers from "./popovers";
import * as presence from "./presence"; import * as presence from "./presence";
import * as realm_logo from "./realm_logo"; import * as realm_logo from "./realm_logo";
import * as realm_playground from "./realm_playground"; import * as realm_playground from "./realm_playground";
@ -578,6 +579,7 @@ export function initialize_everything() {
i18n.initialize(i18n_params); i18n.initialize(i18n_params);
tippyjs.initialize(); tippyjs.initialize();
popovers.initialize();
popover_menus.initialize(); popover_menus.initialize();
initialize_user_settings(user_settings_params); initialize_user_settings(user_settings_params);