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:
parent
c0776a495c
commit
3e3fde3c67
@ -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(),
|
||||
);
|
||||
|
||||
@ -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),
|
||||
}),
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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;
|
||||
@ -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),
|
||||
);
|
||||
}
|
||||
|
||||
@ -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),
|
||||
);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user