diff --git a/extensions/support-page/main.ts b/extensions/support-page/main.ts index 6623b4bcf3..b875c89a19 100644 --- a/extensions/support-page/main.ts +++ b/extensions/support-page/main.ts @@ -1,4 +1,5 @@ import { LensMainExtension, Registry } from "@lens/extensions"; +import { supportPageURL } from "./src/support.route"; export default class SupportPageMainExtension extends LensMainExtension { async onActivate() { @@ -6,6 +7,15 @@ export default class SupportPageMainExtension extends LensMainExtension { } async registerAppMenus(registry: Registry.MenuRegistry) { - // TODO: allow to modify global menu item "Help -> Support" + this.disposers.push( + registry.add({ + parentId: "help", + label: "Support", + async click() { + // fixme: require runtime windowManager (ensureMainWindow + navigate for main) + console.log(`navigate: ${supportPageURL()}`); + } + }) + ) } } diff --git a/src/extensions/menu-registry.ts b/src/extensions/menu-registry.ts index 50e1d5401a..7651e676e1 100644 --- a/src/extensions/menu-registry.ts +++ b/src/extensions/menu-registry.ts @@ -1,15 +1,23 @@ // Extensions API -> Global menu customize import { observable } from "mobx"; +import { MenuItemConstructorOptions } from "electron"; +import type { MenuTopId } from "../main/menu"; -export interface MenuRegistration { - data?: any; +export interface MenuRegistration extends MenuItemConstructorOptions { + parentId?: MenuTopId; } export class MenuRegistry { - items = observable([], { deep: false }); + protected items = observable.array([], { deep: false }); + + getItems(): MenuRegistration[] { + return this.items.toJS(); + } add(item: MenuRegistration) { + this.items.push(item); + return () => this.items.remove(item) } } diff --git a/src/extensions/page-registry.ts b/src/extensions/page-registry.ts index e3e5869ca6..de7d608dcf 100644 --- a/src/extensions/page-registry.ts +++ b/src/extensions/page-registry.ts @@ -38,12 +38,10 @@ export class PageRegistry { } // fixme: validate route paths to avoid collisions - add(params: PageRegistration) { - this.pages.push(params); + add(pageInit: PageRegistration) { + this.pages.push(pageInit); return () => { - this.pages.replace( - this.pages.filter(page => page.components !== params.components) - ) + this.pages.remove(pageInit); // works because of {deep: false} }; } } diff --git a/src/main/menu.ts b/src/main/menu.ts index ac9700886e..7f8b08bafc 100644 --- a/src/main/menu.ts +++ b/src/main/menu.ts @@ -6,8 +6,11 @@ import { addClusterURL } from "../renderer/components/+add-cluster/add-cluster.r import { preferencesURL } from "../renderer/components/+preferences/preferences.route"; import { whatsNewURL } from "../renderer/components/+whats-new/whats-new.route"; import { clusterSettingsURL } from "../renderer/components/+cluster-settings/cluster-settings.route"; +import { menuRegistry } from "../extensions/menu-registry"; import logger from "./logger"; +export type MenuTopId = "mac" | "file" | "edit" | "view" | "help" + export function initMenu(windowManager: WindowManager) { autorun(() => buildMenu(windowManager), { delay: 100 @@ -53,8 +56,6 @@ export function buildMenu(windowManager: WindowManager) { }) } - const mt: MenuItemConstructorOptions[] = []; - const macAppMenu: MenuItemConstructorOptions = { label: app.getName(), submenu: [ @@ -83,10 +84,6 @@ export function buildMenu(windowManager: WindowManager) { ] }; - if (isMac) { - mt.push(macAppMenu); - } - const fileMenu: MenuItemConstructorOptions = { label: "File", submenu: [ @@ -124,7 +121,6 @@ export function buildMenu(windowManager: WindowManager) { ]) ] }; - mt.push(fileMenu) const editMenu: MenuItemConstructorOptions = { label: 'Edit', @@ -140,7 +136,7 @@ export function buildMenu(windowManager: WindowManager) { { role: 'selectAll' }, ] }; - mt.push(editMenu) + const viewMenu: MenuItemConstructorOptions = { label: 'View', submenu: [ @@ -174,7 +170,6 @@ export function buildMenu(windowManager: WindowManager) { { role: 'togglefullscreen' } ] }; - mt.push(viewMenu) const helpMenu: MenuItemConstructorOptions = { role: 'help', @@ -214,7 +209,29 @@ export function buildMenu(windowManager: WindowManager) { ] }; - mt.push(helpMenu) + // Prepare menu items order + const appMenu: Record = { + mac: macAppMenu, + file: fileMenu, + edit: editMenu, + view: viewMenu, + help: helpMenu, + } - Menu.setApplicationMenu(Menu.buildFromTemplate(mt)); + // Modify menu from extensions-api + menuRegistry.getItems().forEach(({ parentId, ...menuItem }) => { + try { + const topMenu = appMenu[parentId].submenu as MenuItemConstructorOptions[]; + topMenu.push(menuItem); + } catch (err) { + logger.error(`[MENU]: can't register menu item, parentId=${parentId}`, { menuItem }) + } + }) + + if (!isMac) { + delete appMenu.mac + } + + const menu = Menu.buildFromTemplate(Object.values(appMenu)); + Menu.setApplicationMenu(menu); } diff --git a/src/renderer/i18n.ts b/src/renderer/i18n.ts index f38bd71f41..fef42e6823 100644 --- a/src/renderer/i18n.ts +++ b/src/renderer/i18n.ts @@ -14,7 +14,7 @@ export interface ILanguage { export const _i18n = setupI18n({ missing: (message, id) => { - console.warn('Missing localization:', message, id); + // console.warn('Missing localization:', message, id); return id; } });