ProzillaOS/src/features/modals/modalsManager.js
2024-05-01 16:48:58 +02:00

94 lines
No EOL
1.6 KiB
JavaScript

import Modal from "./modal.js";
export default class ModalsManager {
/**
* @type {Modal}
*/
modals = {};
/**
* @type {Function}
*/
updateModals = () => {};
/**
* @param {Modal} modal
* @param {boolean} closeOthers
*/
open(modal, closeOthers = true) {
if (closeOthers) {
this.modalIds.forEach((id) => {
this.close(id, false);
});
}
let id = 0;
while (this.modalIds.includes(id.toString())) {
id++;
}
modal.id = id;
modal.modalsManager = this;
this.modals[id] = modal;
this.updateModals(this.modals);
}
/**
* @param {string} modalId
* @param {boolean} sendModalsUpdate
*/
close(modalId, sendModalsUpdate = true) {
modalId = modalId.toString();
if (!this.modalIds.includes(modalId)) {
console.warn(`Failed to close modal ${modalId}: modal not found`);
return;
}
console.info(`Closing modal ${modalId}`);
delete this.modals[modalId];
if (sendModalsUpdate)
this.updateModals(this.modals);
}
/**
* @param {string} modalId
*/
focus(modalId) {
modalId = modalId.toString();
if (!this.modalIds.includes(modalId)) {
console.warn(`Failed to focus modal ${modalId}: modal not found`);
return;
}
const modal = this.modals[modalId];
modal.focus();
this.updateModals(this.modals);
}
/**
* @param {Function} updateModals
*/
setUpdateModals(updateModals) {
this.updateModals = updateModals;
}
/**
* @returns {string[]}
*/
get modalIds() {
return Object.keys(this.modals);
}
/**
* @param {string} name
* @returns {string}
*/
static getModalIconUrl(name) {
return `${process.env.PUBLIC_URL}/assets/modals/icons/${name}.svg`;
}
}