When selected custom menu is removed, go to settings menu Allow iframe in custom menu to use Scripting API Return menu object when it is registered, can call remove function on it
101 lines
3 KiB
TypeScript
101 lines
3 KiB
TypeScript
import { get, writable } from "svelte/store";
|
|
import Timeout = NodeJS.Timeout;
|
|
|
|
export const menuIconVisiblilityStore = writable(false);
|
|
export const menuVisiblilityStore = writable(false);
|
|
export const menuInputFocusStore = writable(false);
|
|
|
|
let warningContainerTimeout: Timeout | null = null;
|
|
function createWarningContainerStore() {
|
|
const { subscribe, set } = writable<boolean>(false);
|
|
|
|
return {
|
|
subscribe,
|
|
activateWarningContainer() {
|
|
set(true);
|
|
if (warningContainerTimeout) clearTimeout(warningContainerTimeout);
|
|
warningContainerTimeout = setTimeout(() => {
|
|
set(false);
|
|
warningContainerTimeout = null;
|
|
}, 120000);
|
|
},
|
|
};
|
|
}
|
|
|
|
export const warningContainerStore = createWarningContainerStore();
|
|
|
|
export enum SubMenusInterface {
|
|
settings = "Settings",
|
|
profile = "Profile",
|
|
createMap = "Create a Map",
|
|
aboutRoom = "About the Room",
|
|
globalMessages = "Global Messages",
|
|
contact = "Contact",
|
|
}
|
|
|
|
function createSubMenusStore() {
|
|
const { subscribe, update } = writable<string[]>([
|
|
SubMenusInterface.settings,
|
|
SubMenusInterface.profile,
|
|
SubMenusInterface.createMap,
|
|
SubMenusInterface.aboutRoom,
|
|
SubMenusInterface.globalMessages,
|
|
SubMenusInterface.contact,
|
|
]);
|
|
|
|
return {
|
|
subscribe,
|
|
addMenu(menuCommand: string) {
|
|
update((menuList: string[]) => {
|
|
if (!menuList.find((menu) => menu === menuCommand)) {
|
|
menuList.push(menuCommand);
|
|
}
|
|
return menuList;
|
|
});
|
|
},
|
|
removeMenu(menuCommand: string) {
|
|
update((menuList: string[]) => {
|
|
const index = menuList.findIndex((menu) => menu === menuCommand);
|
|
if (index !== -1) {
|
|
menuList.splice(index, 1);
|
|
}
|
|
return menuList;
|
|
});
|
|
},
|
|
};
|
|
}
|
|
|
|
export const subMenusStore = createSubMenusStore();
|
|
|
|
export const customMenuIframe = new Map<string, { url: string; allowApi: boolean }>();
|
|
|
|
export function handleMenuRegistrationEvent(
|
|
menuName: string,
|
|
iframeUrl: string | undefined = undefined,
|
|
source: string | undefined = undefined,
|
|
options: { allowApi: boolean }
|
|
) {
|
|
if (get(subMenusStore).includes(menuName)) {
|
|
console.warn("The menu " + menuName + " already exist.");
|
|
return;
|
|
}
|
|
|
|
subMenusStore.addMenu(menuName);
|
|
|
|
if (iframeUrl !== undefined) {
|
|
const url = new URL(iframeUrl, source);
|
|
customMenuIframe.set(menuName, { url: url.toString(), allowApi: options.allowApi });
|
|
}
|
|
}
|
|
|
|
export function handleMenuUnregisterEvent(menuName: string) {
|
|
const subMenuGeneral: string[] = Object.values(SubMenusInterface);
|
|
if (subMenuGeneral.includes(menuName)) {
|
|
console.warn("The menu " + menuName + " is a mandatory menu. It can't be remove");
|
|
return;
|
|
}
|
|
|
|
subMenusStore.removeMenu(menuName);
|
|
customMenuIframe.delete(menuName);
|
|
}
|