DEV: Minor refactor of tooltip and menu services (#27466)

* use `TrackedSet` instead of `@tracked []`
* correct return type annotations
* move code to outside Promise blocks where possible
* fix an outdated comment
This commit is contained in:
Jarek Radosz 2024-06-13 16:43:28 +02:00 committed by GitHub
parent 3b653a918e
commit b289351a3f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 37 additions and 55 deletions

View File

@ -1,12 +1,12 @@
import { tracked } from "@glimmer/tracking";
import { getOwner } from "@ember/application";
import { action } from "@ember/object";
import { schedule } from "@ember/runloop";
import Service from "@ember/service";
import { TrackedSet } from "@ember-compat/tracked-built-ins";
import DMenuInstance from "float-kit/lib/d-menu-instance";
export default class Menu extends Service {
@tracked registeredMenus = [];
registeredMenus = new TrackedSet();
/**
* Render a menu
@ -25,7 +25,7 @@ export default class Menu extends Service {
* @param {String} [options.groupIdentifier] - Only one menu with the same groupIdentifier can be open at a time
* @param {Boolean} [options.inline] - Improves positioning for trigger that spans over multiple lines
*
* @returns {Promise<DMenuInstance>}
* @returns {Promise<DMenuInstance | undefined>}
*/
@action
async show() {
@ -38,7 +38,7 @@ export default class Menu extends Service {
return;
}
} else {
instance = this.registeredMenus.find(
instance = [...this.registeredMenus].find(
(registeredMenu) => registeredMenu.trigger === arguments[0]
);
@ -66,20 +66,17 @@ export default class Menu extends Service {
}
if (instance.expanded) {
return await this.close(instance);
await this.close(instance);
return;
}
await new Promise((resolve) => {
if (!this.registeredMenus.includes(instance)) {
this.registeredMenus = this.registeredMenus.concat(instance);
}
if (!this.registeredMenus.has(instance)) {
this.registeredMenus.add(instance);
}
instance.expanded = true;
instance.expanded = true;
schedule("afterRender", () => {
resolve();
});
});
await new Promise((resolve) => schedule("afterRender", resolve));
return instance;
}
@ -89,10 +86,10 @@ export default class Menu extends Service {
*
* @param {String} identifier - the menu identifier to retrieve
*
* @returns {Promise<DMenuInstance>}
* @returns {DMenuInstance | undefined}
*/
getByIdentifier(identifier) {
return this.registeredMenus.find(
return [...this.registeredMenus].find(
(registeredMenu) => registeredMenu.options.identifier === identifier
);
}
@ -105,7 +102,7 @@ export default class Menu extends Service {
@action
async close(menu) {
if (typeof menu === "string") {
menu = this.registeredMenus.find(
menu = [...this.registeredMenus].find(
(registeredMenu) => registeredMenu.options.identifier === menu
);
}
@ -114,19 +111,13 @@ export default class Menu extends Service {
return;
}
await new Promise((resolve) => {
menu.expanded = false;
menu.expanded = false;
if (this.registeredMenus.includes(menu)) {
this.registeredMenus = this.registeredMenus.filter(
(registeredMenu) => registeredMenu !== menu
);
}
if (this.registeredMenus.has(menu)) {
this.registeredMenus.delete(menu);
}
schedule("afterRender", () => {
resolve();
});
});
await new Promise((resolve) => schedule("afterRender", resolve));
}
/**

View File

@ -1,12 +1,12 @@
import { tracked } from "@glimmer/tracking";
import { getOwner } from "@ember/application";
import { action } from "@ember/object";
import { schedule } from "@ember/runloop";
import Service from "@ember/service";
import { TrackedSet } from "@ember-compat/tracked-built-ins";
import DTooltipInstance from "float-kit/lib/d-tooltip-instance";
export default class Tooltip extends Service {
@tracked registeredTooltips = [];
registeredTooltips = new TrackedSet();
/**
* Render a tooltip
@ -23,7 +23,7 @@ export default class Tooltip extends Service {
* @param {String} [options.identifier] - Add a data-identifier attribute to the trigger and the content
* @param {Boolean} [options.inline] - Improves positioning for trigger that spans over multiple lines
*
* @returns {Promise<DTooltipInstance>}
* @returns {Promise<DTooltipInstance | undefined>}
*/
@action
async show() {
@ -36,7 +36,7 @@ export default class Tooltip extends Service {
return;
}
} else {
instance = this.registeredTooltips.find(
instance = [...this.registeredTooltips].find(
(registeredTooltips) => registeredTooltips.trigger === arguments[0]
);
if (!instance) {
@ -58,32 +58,29 @@ export default class Tooltip extends Service {
}
if (instance.expanded) {
return await this.close(instance);
await this.close(instance);
return;
}
await new Promise((resolve) => {
if (!this.registeredTooltips.includes(instance)) {
this.registeredTooltips = this.registeredTooltips.concat(instance);
}
if (!this.registeredTooltips.has(instance)) {
this.registeredTooltips.add(instance);
}
instance.expanded = true;
instance.expanded = true;
schedule("afterRender", () => {
resolve();
});
});
await new Promise((resolve) => schedule("afterRender", resolve));
return instance;
}
/**
* Closes the active tooltip
* @param {DTooltipInstance} [tooltip] - the tooltip to close, if not provider will close any active tooltip
* Closes the given tooltip
* @param {DTooltipInstance | String} [tooltip | identifier] - the tooltip to close, can accept an instance or an identifier
*/
@action
async close(tooltip) {
if (typeof tooltip === "string") {
tooltip = this.registeredTooltips.find(
tooltip = [...this.registeredTooltips].find(
(registeredTooltip) => registeredTooltip.options.identifier === tooltip
);
}
@ -94,17 +91,11 @@ export default class Tooltip extends Service {
tooltip.expanded = false;
await new Promise((resolve) => {
if (this.registeredTooltips.includes(tooltip)) {
this.registeredTooltips = this.registeredTooltips.filter(
(registeredTooltip) => registeredTooltip !== tooltip
);
}
if (this.registeredTooltips.has(tooltip)) {
this.registeredTooltips.delete(tooltip);
}
schedule("afterRender", () => {
resolve();
});
});
await new Promise((resolve) => schedule("afterRender", resolve));
}
/**