1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Replace function for getting application menu items with reactive solution

Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>
This commit is contained in:
Janne Savolainen 2022-03-31 08:50:20 +03:00
parent c0776a495c
commit 3e3fde3c67
No known key found for this signature in database
GPG Key ID: 8C6CFB2FFFE8F68A
6 changed files with 38 additions and 38 deletions

View File

@ -55,11 +55,11 @@ import shellApiRequestInjectable from "./proxy-functions/shell-api-request/shell
import userStoreInjectable from "../common/user-store/user-store.injectable"; import userStoreInjectable from "../common/user-store/user-store.injectable";
import trayMenuItemsInjectable from "./tray/tray-menu-items.injectable"; import trayMenuItemsInjectable from "./tray/tray-menu-items.injectable";
import { broadcastNativeThemeOnUpdate } from "./native-theme"; import { broadcastNativeThemeOnUpdate } from "./native-theme";
import getAppMenuItemsInjectable from "./menu/get-app-menu-items.injectable";
import windowManagerInjectable from "./window-manager.injectable"; import windowManagerInjectable from "./window-manager.injectable";
import navigateToPreferencesInjectable from "../common/front-end-routing/routes/preferences/navigate-to-preferences.injectable"; import navigateToPreferencesInjectable from "../common/front-end-routing/routes/preferences/navigate-to-preferences.injectable";
import syncGeneralCatalogEntitiesInjectable from "./catalog-sources/sync-general-catalog-entities.injectable"; import syncGeneralCatalogEntitiesInjectable from "./catalog-sources/sync-general-catalog-entities.injectable";
import hotbarStoreInjectable from "../common/hotbar-store.injectable"; import hotbarStoreInjectable from "../common/hotbar-store.injectable";
import applicationMenuItemsInjectable from "./menu/application-menu-items.injectable";
const di = getDi(); const di = getDi();
@ -298,12 +298,12 @@ app.on("ready", async () => {
logger.info("🖥️ Starting WindowManager"); logger.info("🖥️ Starting WindowManager");
const windowManager = di.inject(windowManagerInjectable); const windowManager = di.inject(windowManagerInjectable);
const getAppMenuItems = di.inject(getAppMenuItemsInjectable); const applicationMenuItems = di.inject(applicationMenuItemsInjectable);
const trayMenuItems = di.inject(trayMenuItemsInjectable); const trayMenuItems = di.inject(trayMenuItemsInjectable);
const navigateToPreferences = di.inject(navigateToPreferencesInjectable); const navigateToPreferences = di.inject(navigateToPreferencesInjectable);
onQuitCleanup.push( onQuitCleanup.push(
initMenu(getAppMenuItems), initMenu(applicationMenuItems),
initTray(windowManager, trayMenuItems, navigateToPreferences), initTray(windowManager, trayMenuItems, navigateToPreferences),
() => ShellSession.cleanup(), () => ShellSession.cleanup(),
); );

View File

@ -5,15 +5,14 @@
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import directoryForLensLocalStorageInjectable from "../../../common/directory-for-lens-local-storage/directory-for-lens-local-storage.injectable"; import directoryForLensLocalStorageInjectable from "../../../common/directory-for-lens-local-storage/directory-for-lens-local-storage.injectable";
import { initIpcMainHandlers } from "./init-ipc-main-handlers"; import { initIpcMainHandlers } from "./init-ipc-main-handlers";
import getAppMenuItemsInjectable from "../../menu/get-app-menu-items.injectable";
import getAbsolutePathInjectable from "../../../common/path/get-absolute-path.injectable"; import getAbsolutePathInjectable from "../../../common/path/get-absolute-path.injectable";
import applicationMenuItemsInjectable from "../../menu/application-menu-items.injectable";
const initIpcMainHandlersInjectable = getInjectable({ const initIpcMainHandlersInjectable = getInjectable({
id: "init-ipc-main-handlers", id: "init-ipc-main-handlers",
instantiate: (di) => initIpcMainHandlers({ instantiate: (di) => initIpcMainHandlers({
// TODO: Remove requirement for postponing inject applicationMenuItems: di.inject(applicationMenuItemsInjectable),
getAppMenuItems: () => di.inject(getAppMenuItemsInjectable)(),
directoryForLensLocalStorage: di.inject(directoryForLensLocalStorageInjectable), directoryForLensLocalStorage: di.inject(directoryForLensLocalStorageInjectable),
getAbsolutePath: di.inject(getAbsolutePathInjectable), getAbsolutePath: di.inject(getAbsolutePathInjectable),
}), }),

View File

@ -21,16 +21,17 @@ import { showOpenDialog } from "../../ipc/dialog";
import { windowActionHandleChannel, windowLocationChangedChannel, windowOpenAppMenuAsContextMenuChannel } from "../../../common/ipc/window"; import { windowActionHandleChannel, windowLocationChangedChannel, windowOpenAppMenuAsContextMenuChannel } from "../../../common/ipc/window";
import { getNativeColorTheme } from "../../native-theme"; import { getNativeColorTheme } from "../../native-theme";
import { getNativeThemeChannel } from "../../../common/ipc/native-theme"; import { getNativeThemeChannel } from "../../../common/ipc/native-theme";
import type { MenuItemsOpts } from "../../menu/get-app-menu-items.injectable";
import type { GetAbsolutePath } from "../../../common/path/get-absolute-path.injectable"; import type { GetAbsolutePath } from "../../../common/path/get-absolute-path.injectable";
import type { IComputedValue } from "mobx";
import type { MenuItemsOpts } from "../../menu/application-menu-items.injectable";
interface Dependencies { interface Dependencies {
getAppMenuItems: () => MenuItemsOpts[];
directoryForLensLocalStorage: string; directoryForLensLocalStorage: string;
getAbsolutePath: GetAbsolutePath; getAbsolutePath: GetAbsolutePath;
applicationMenuItems: IComputedValue<MenuItemsOpts[]>;
} }
export const initIpcMainHandlers = ({ getAppMenuItems, directoryForLensLocalStorage, getAbsolutePath }: Dependencies) => () => { export const initIpcMainHandlers = ({ applicationMenuItems, directoryForLensLocalStorage, getAbsolutePath }: Dependencies) => () => {
ipcMainHandle(clusterActivateHandler, (event, clusterId: ClusterId, force = false) => { ipcMainHandle(clusterActivateHandler, (event, clusterId: ClusterId, force = false) => {
return ClusterStore.getInstance() return ClusterStore.getInstance()
.getById(clusterId) .getById(clusterId)
@ -149,7 +150,7 @@ export const initIpcMainHandlers = ({ getAppMenuItems, directoryForLensLocalStor
ipcMainHandle(broadcastMainChannel, (event, channel, ...args) => broadcastMessage(channel, ...args)); ipcMainHandle(broadcastMainChannel, (event, channel, ...args) => broadcastMessage(channel, ...args));
ipcMainOn(windowOpenAppMenuAsContextMenuChannel, async (event) => { ipcMainOn(windowOpenAppMenuAsContextMenuChannel, async (event) => {
const appMenu = getAppMenuItems(); const appMenu = applicationMenuItems.get();
const menu = Menu.buildFromTemplate(appMenu); const menu = Menu.buildFromTemplate(appMenu);

View File

@ -26,6 +26,7 @@ import navigateToCatalogInjectable from "../../common/front-end-routing/routes/c
import navigateToWelcomeInjectable from "../../common/front-end-routing/routes/welcome/navigate-to-welcome.injectable"; import navigateToWelcomeInjectable from "../../common/front-end-routing/routes/welcome/navigate-to-welcome.injectable";
import navigateToAddClusterInjectable from "../../common/front-end-routing/routes/add-cluster/navigate-to-add-cluster.injectable"; import navigateToAddClusterInjectable from "../../common/front-end-routing/routes/add-cluster/navigate-to-add-cluster.injectable";
import isMacInjectable from "../../common/vars/is-mac.injectable"; import isMacInjectable from "../../common/vars/is-mac.injectable";
import { computed } from "mobx";
function ignoreIf(check: boolean, menuItems: MenuItemConstructorOptions[]) { function ignoreIf(check: boolean, menuItems: MenuItemConstructorOptions[]) {
return check ? [] : menuItems; return check ? [] : menuItems;
@ -35,24 +36,27 @@ export interface MenuItemsOpts extends MenuItemConstructorOptions {
submenu?: MenuItemConstructorOptions[]; submenu?: MenuItemConstructorOptions[];
} }
const getAppMenuItemsInjectable = getInjectable({ const applicationMenuItemsInjectable = getInjectable({
id: "get-app-menu-items", id: "application-menu-items",
instantiate: (di) => { instantiate: (di) => {
const windowManager = di.inject(windowManagerInjectable);
const logger = di.inject(loggerInjectable); const logger = di.inject(loggerInjectable);
const appName = di.inject(appNameInjectable); const appName = di.inject(appNameInjectable);
const electronMenuItems = di.inject(electronMenuItemsInjectable);
const isAutoUpdateEnabled = di.inject(isAutoUpdateEnabledInjectable);
const navigateToPreferences = di.inject(navigateToPreferencesInjectable);
const navigateToExtensions = di.inject(navigateToExtensionsInjectable);
const navigateToCatalog = di.inject(navigateToCatalogInjectable);
const navigateToWelcome = di.inject(navigateToWelcomeInjectable);
const navigateToAddCluster = di.inject(navigateToAddClusterInjectable);
const isMac = di.inject(isMacInjectable); const isMac = di.inject(isMacInjectable);
const isAutoUpdateEnabled = di.inject(isAutoUpdateEnabledInjectable);
const electronMenuItems = di.inject(electronMenuItemsInjectable);
return computed((): MenuItemsOpts[] => {
// TODO: These injects should happen outside of the computed.
// TODO: Remove temporal dependencies in WindowManager to make sure timing is correct.
const windowManager = di.inject(windowManagerInjectable);
const navigateToPreferences = di.inject(navigateToPreferencesInjectable);
const navigateToExtensions = di.inject(navigateToExtensionsInjectable);
const navigateToCatalog = di.inject(navigateToCatalogInjectable);
const navigateToWelcome = di.inject(navigateToWelcomeInjectable);
const navigateToAddCluster = di.inject(navigateToAddClusterInjectable);
return (): MenuItemsOpts[] => {
const autoUpdateDisabled = !isAutoUpdateEnabled(); const autoUpdateDisabled = !isAutoUpdateEnabled();
logger.info(`[MENU]: autoUpdateDisabled=${autoUpdateDisabled}`); logger.info(`[MENU]: autoUpdateDisabled=${autoUpdateDisabled}`);
@ -326,8 +330,8 @@ const getAppMenuItemsInjectable = getInjectable({
} }
return [...appMenu.values()]; return [...appMenu.values()];
}; });
}, },
}); });
export default getAppMenuItemsInjectable; export default applicationMenuItemsInjectable;

View File

@ -3,17 +3,17 @@
* Licensed under MIT License. See LICENSE in root directory for more information. * Licensed under MIT License. See LICENSE in root directory for more information.
*/ */
import { app, BrowserWindow, dialog, Menu } from "electron"; import { app, BrowserWindow, dialog, Menu } from "electron";
import { autorun } from "mobx"; import { autorun, IComputedValue } from "mobx";
import { appName, isWindows, productName } from "../../common/vars"; import { appName, isWindows, productName } from "../../common/vars";
import packageJson from "../../../package.json"; import packageJson from "../../../package.json";
import type { MenuItemsOpts } from "./get-app-menu-items.injectable"; import type { MenuItemsOpts } from "./application-menu-items.injectable";
export type MenuTopId = "mac" | "file" | "edit" | "view" | "help"; export type MenuTopId = "mac" | "file" | "edit" | "view" | "help";
export function initMenu( export function initMenu(
getAppMenuItems: () => MenuItemsOpts[], applicationMenuItems: IComputedValue<MenuItemsOpts[]>,
) { ) {
return autorun(() => buildMenu(getAppMenuItems), { return autorun(() => buildMenu(applicationMenuItems.get()), {
delay: 100, delay: 100,
}); });
} }
@ -37,11 +37,9 @@ export function showAbout(browserWindow: BrowserWindow) {
} }
export function buildMenu( export function buildMenu(
getAppMenuItems: () => MenuItemsOpts[], applicationMenuItems: MenuItemsOpts[],
) { ) {
const menuItems = getAppMenuItems();
Menu.setApplicationMenu( Menu.setApplicationMenu(
Menu.buildFromTemplate(menuItems), Menu.buildFromTemplate(applicationMenuItems),
); );
} }

View File

@ -25,11 +25,11 @@ import type { ClusterStore } from "../../../common/cluster-store/cluster-store";
import mainExtensionsInjectable from "../../../extensions/main-extensions.injectable"; import mainExtensionsInjectable from "../../../extensions/main-extensions.injectable";
import type { LensMainExtension } from "../../../extensions/lens-main-extension"; import type { LensMainExtension } from "../../../extensions/lens-main-extension";
import currentRouteComponentInjectable from "../../routes/current-route-component.injectable"; import currentRouteComponentInjectable from "../../routes/current-route-component.injectable";
import getAppMenuItemsInjectable, { MenuItemsOpts } from "../../../main/menu/get-app-menu-items.injectable";
import { pipeline } from "@ogre-tools/fp"; import { pipeline } from "@ogre-tools/fp";
import { flatMap, compact, join, get, filter } from "lodash/fp"; import { flatMap, compact, join, get, filter } from "lodash/fp";
import preferenceNavigationItemsInjectable from "../+preferences/preferences-navigation/preference-navigation-items.injectable"; import preferenceNavigationItemsInjectable from "../+preferences/preferences-navigation/preference-navigation-items.injectable";
import navigateToPreferencesInjectable from "../../../common/front-end-routing/routes/preferences/navigate-to-preferences.injectable"; import navigateToPreferencesInjectable from "../../../common/front-end-routing/routes/preferences/navigate-to-preferences.injectable";
import applicationMenuItemsInjectable, { MenuItemsOpts } from "../../../main/menu/application-menu-items.injectable";
type Callback = (dis: DiContainers) => void | Promise<void>; type Callback = (dis: DiContainers) => void | Promise<void>;
@ -126,14 +126,12 @@ export const getApplicationBuilder = () => {
applicationMenu: { applicationMenu: {
click: (path: string) => { click: (path: string) => {
const getApplicationMenuItems = mainDi.inject( const applicationMenuItems = mainDi.inject(
getAppMenuItemsInjectable, applicationMenuItemsInjectable,
); );
const applicationMenuItems = getApplicationMenuItems();
const menuItems = pipeline( const menuItems = pipeline(
applicationMenuItems, applicationMenuItems.get(),
flatMap(toFlatChildren(null)), flatMap(toFlatChildren(null)),
filter((menuItem) => !!menuItem.click), filter((menuItem) => !!menuItem.click),
); );