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 trayMenuItemsInjectable from "./tray/tray-menu-items.injectable";
import { broadcastNativeThemeOnUpdate } from "./native-theme";
import getAppMenuItemsInjectable from "./menu/get-app-menu-items.injectable";
import windowManagerInjectable from "./window-manager.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 hotbarStoreInjectable from "../common/hotbar-store.injectable";
import applicationMenuItemsInjectable from "./menu/application-menu-items.injectable";
const di = getDi();
@ -298,12 +298,12 @@ app.on("ready", async () => {
logger.info("🖥️ Starting WindowManager");
const windowManager = di.inject(windowManagerInjectable);
const getAppMenuItems = di.inject(getAppMenuItemsInjectable);
const applicationMenuItems = di.inject(applicationMenuItemsInjectable);
const trayMenuItems = di.inject(trayMenuItemsInjectable);
const navigateToPreferences = di.inject(navigateToPreferencesInjectable);
onQuitCleanup.push(
initMenu(getAppMenuItems),
initMenu(applicationMenuItems),
initTray(windowManager, trayMenuItems, navigateToPreferences),
() => ShellSession.cleanup(),
);

View File

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

View File

@ -21,16 +21,17 @@ import { showOpenDialog } from "../../ipc/dialog";
import { windowActionHandleChannel, windowLocationChangedChannel, windowOpenAppMenuAsContextMenuChannel } from "../../../common/ipc/window";
import { getNativeColorTheme } from "../../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 { IComputedValue } from "mobx";
import type { MenuItemsOpts } from "../../menu/application-menu-items.injectable";
interface Dependencies {
getAppMenuItems: () => MenuItemsOpts[];
directoryForLensLocalStorage: string;
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) => {
return ClusterStore.getInstance()
.getById(clusterId)
@ -149,7 +150,7 @@ export const initIpcMainHandlers = ({ getAppMenuItems, directoryForLensLocalStor
ipcMainHandle(broadcastMainChannel, (event, channel, ...args) => broadcastMessage(channel, ...args));
ipcMainOn(windowOpenAppMenuAsContextMenuChannel, async (event) => {
const appMenu = getAppMenuItems();
const appMenu = applicationMenuItems.get();
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 navigateToAddClusterInjectable from "../../common/front-end-routing/routes/add-cluster/navigate-to-add-cluster.injectable";
import isMacInjectable from "../../common/vars/is-mac.injectable";
import { computed } from "mobx";
function ignoreIf(check: boolean, menuItems: MenuItemConstructorOptions[]) {
return check ? [] : menuItems;
@ -35,24 +36,27 @@ export interface MenuItemsOpts extends MenuItemConstructorOptions {
submenu?: MenuItemConstructorOptions[];
}
const getAppMenuItemsInjectable = getInjectable({
id: "get-app-menu-items",
const applicationMenuItemsInjectable = getInjectable({
id: "application-menu-items",
instantiate: (di) => {
const windowManager = di.inject(windowManagerInjectable);
const logger = di.inject(loggerInjectable);
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 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();
logger.info(`[MENU]: autoUpdateDisabled=${autoUpdateDisabled}`);
@ -326,8 +330,8 @@ const getAppMenuItemsInjectable = getInjectable({
}
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.
*/
import { app, BrowserWindow, dialog, Menu } from "electron";
import { autorun } from "mobx";
import { autorun, IComputedValue } from "mobx";
import { appName, isWindows, productName } from "../../common/vars";
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 function initMenu(
getAppMenuItems: () => MenuItemsOpts[],
applicationMenuItems: IComputedValue<MenuItemsOpts[]>,
) {
return autorun(() => buildMenu(getAppMenuItems), {
return autorun(() => buildMenu(applicationMenuItems.get()), {
delay: 100,
});
}
@ -37,11 +37,9 @@ export function showAbout(browserWindow: BrowserWindow) {
}
export function buildMenu(
getAppMenuItems: () => MenuItemsOpts[],
applicationMenuItems: MenuItemsOpts[],
) {
const menuItems = getAppMenuItems();
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 type { LensMainExtension } from "../../../extensions/lens-main-extension";
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 { flatMap, compact, join, get, filter } from "lodash/fp";
import preferenceNavigationItemsInjectable from "../+preferences/preferences-navigation/preference-navigation-items.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>;
@ -126,14 +126,12 @@ export const getApplicationBuilder = () => {
applicationMenu: {
click: (path: string) => {
const getApplicationMenuItems = mainDi.inject(
getAppMenuItemsInjectable,
const applicationMenuItems = mainDi.inject(
applicationMenuItemsInjectable,
);
const applicationMenuItems = getApplicationMenuItems();
const menuItems = pipeline(
applicationMenuItems,
applicationMenuItems.get(),
flatMap(toFlatChildren(null)),
filter((menuItem) => !!menuItem.click),
);