mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Introduce competition for top bar items to achieve OCP-compliance
Co-authored-by: Janne Savolainen <janne.savolainen@live.fi> Signed-off-by: Iku-turso <mikko.aspiala@gmail.com>
This commit is contained in:
parent
a38c213ba2
commit
b23453ffda
@ -0,0 +1,20 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import type React from "react";
|
||||||
|
import { getInjectionToken } from "@ogre-tools/injectable";
|
||||||
|
import type { IComputedValue } from "mobx";
|
||||||
|
|
||||||
|
export interface TopBarItem {
|
||||||
|
id: string;
|
||||||
|
isShown: IComputedValue<boolean>;
|
||||||
|
orderNumber: number;
|
||||||
|
Component: React.ComponentType;
|
||||||
|
}
|
||||||
|
|
||||||
|
const topBarItemInjectionToken = getInjectionToken<TopBarItem>({
|
||||||
|
id: "top-bar-item-injection-token",
|
||||||
|
});
|
||||||
|
|
||||||
|
export default topBarItemInjectionToken;
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import { pipeline } from "@ogre-tools/fp";
|
||||||
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
|
import { computedInjectManyInjectable } from "@ogre-tools/injectable-extension-for-mobx";
|
||||||
|
import { filter, sortBy } from "lodash/fp";
|
||||||
|
import { computed } from "mobx";
|
||||||
|
import topBarItemInjectionToken from "./top-bar-item-injection-token";
|
||||||
|
|
||||||
|
const topBarItemsInjectable = getInjectable({
|
||||||
|
id: "top-bar-items-2",
|
||||||
|
|
||||||
|
instantiate: (di) => {
|
||||||
|
const computedInjectMany = di.inject(computedInjectManyInjectable);
|
||||||
|
|
||||||
|
const items = computedInjectMany(topBarItemInjectionToken);
|
||||||
|
|
||||||
|
return computed(() =>
|
||||||
|
pipeline(
|
||||||
|
items.get(),
|
||||||
|
filter((item) => item.isShown.get()),
|
||||||
|
sortBy(item => item.orderNumber),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default topBarItemsInjectable;
|
||||||
@ -25,6 +25,8 @@ import closeWindowInjectable from "./close-window.injectable";
|
|||||||
import maximizeWindowInjectable from "./maximize-window.injectable";
|
import maximizeWindowInjectable from "./maximize-window.injectable";
|
||||||
import toggleMaximizeWindowInjectable from "./toggle-maximize-window.injectable";
|
import toggleMaximizeWindowInjectable from "./toggle-maximize-window.injectable";
|
||||||
import watchHistoryStateInjectable from "../../../remote-helpers/watch-history-state.injectable";
|
import watchHistoryStateInjectable from "../../../remote-helpers/watch-history-state.injectable";
|
||||||
|
import topBarItems2Injectable from "./top-bar-items/top-bar-items2.injectable";
|
||||||
|
import type { TopBarItem } from "./top-bar-items/top-bar-item-injection-token";
|
||||||
import welcomeRouteInjectable from "../../../../common/front-end-routing/routes/welcome/welcome-route.injectable";
|
import welcomeRouteInjectable from "../../../../common/front-end-routing/routes/welcome/welcome-route.injectable";
|
||||||
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";
|
||||||
|
|
||||||
@ -32,6 +34,7 @@ interface Dependencies {
|
|||||||
navigateToWelcomePage: () => void;
|
navigateToWelcomePage: () => void;
|
||||||
welcomeRouteIsActive: IComputedValue<boolean>;
|
welcomeRouteIsActive: IComputedValue<boolean>;
|
||||||
items: IComputedValue<TopBarRegistration[]>;
|
items: IComputedValue<TopBarRegistration[]>;
|
||||||
|
items2: IComputedValue<TopBarItem[]>;
|
||||||
isWindows: boolean;
|
isWindows: boolean;
|
||||||
isLinux: boolean;
|
isLinux: boolean;
|
||||||
prevEnabled: IComputedValue<Boolean>;
|
prevEnabled: IComputedValue<Boolean>;
|
||||||
@ -47,6 +50,9 @@ interface Dependencies {
|
|||||||
|
|
||||||
const NonInjectedTopBar = observer(({
|
const NonInjectedTopBar = observer(({
|
||||||
items,
|
items,
|
||||||
|
items2,
|
||||||
|
navigateToCatalog,
|
||||||
|
catalogRouteIsActive,
|
||||||
navigateToWelcomePage,
|
navigateToWelcomePage,
|
||||||
welcomeRouteIsActive,
|
welcomeRouteIsActive,
|
||||||
isWindows,
|
isWindows,
|
||||||
@ -79,9 +85,14 @@ const NonInjectedTopBar = observer(({
|
|||||||
<div
|
<div
|
||||||
className={styles.topBar}
|
className={styles.topBar}
|
||||||
onDoubleClick={windowSizeToggle}
|
onDoubleClick={windowSizeToggle}
|
||||||
ref={elem}
|
ref={elem}>
|
||||||
>
|
|
||||||
<div className={styles.items}>
|
<div className={styles.items}>
|
||||||
|
{items2.get().map((item) => {
|
||||||
|
const Component = item.Component;
|
||||||
|
|
||||||
|
return <Component key={item.id} />;
|
||||||
|
})}
|
||||||
|
|
||||||
{(isWindows || isLinux) && (
|
{(isWindows || isLinux) && (
|
||||||
<div className={styles.winMenu}>
|
<div className={styles.winMenu}>
|
||||||
<div onClick={openAppContextMenu} data-testid="window-menu">
|
<div onClick={openAppContextMenu} data-testid="window-menu">
|
||||||
@ -183,6 +194,7 @@ export const TopBar = withInjectables<Dependencies>(NonInjectedTopBar, {
|
|||||||
getProps: (di) => ({
|
getProps: (di) => ({
|
||||||
navigateToWelcomePage: di.inject(navigateToWelcomeInjectable),
|
navigateToWelcomePage: di.inject(navigateToWelcomeInjectable),
|
||||||
items: di.inject(topBarItemsInjectable),
|
items: di.inject(topBarItemsInjectable),
|
||||||
|
items2: di.inject(topBarItems2Injectable),
|
||||||
isLinux: di.inject(isLinuxInjectable),
|
isLinux: di.inject(isLinuxInjectable),
|
||||||
isWindows: di.inject(isWindowsInjectable),
|
isWindows: di.inject(isWindowsInjectable),
|
||||||
prevEnabled: di.inject(topBarPrevEnabledInjectable),
|
prevEnabled: di.inject(topBarPrevEnabledInjectable),
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user