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

extensions-api -- registering menu icon, part 1

Signed-off-by: Roman <ixrock@gmail.com>
This commit is contained in:
Roman 2020-09-07 12:30:30 +03:00
parent d9385a4589
commit 554097e91b
6 changed files with 53 additions and 16 deletions

View File

@ -1,4 +1,4 @@
import { LensExtension, LensRuntimeRendererEnv } from "@lens/extensions"; // fixme: map to generated types from "extension-api.d.ts" import { LensExtension, Icon, LensRuntimeRendererEnv } from "@lens/extensions"; // fixme: map to generated types from "extension-api.d.ts"
// todo: register custom icon in cluster-menu // todo: register custom icon in cluster-menu
// todo: register custom view by clicking the item // todo: register custom view by clicking the item
@ -13,3 +13,5 @@ export default class ExampleExtension extends LensExtension {
} }
} }
} }
// <Icon material="camera" onClick={() => console.log("done")}/>

View File

@ -1,10 +1,12 @@
// Lens runtime for injecting to extension on activation // Lens runtime for injecting to extension on activation
import { apiManager, ApiManager } from "../renderer/api/api-manager"; import { apiManager } from "../renderer/api/api-manager";
import logger from "../main/logger"; import logger from "../main/logger";
import { dynamicPages } from "../renderer/components/cluster-manager/register-page";
export interface LensRuntimeRendererEnv { export interface LensRuntimeRendererEnv {
apiManager: ApiManager; apiManager: typeof apiManager;
logger: typeof logger; logger: typeof logger;
dynamicPages: typeof dynamicPages
} }
// todo: expose more public runtime apis: stores, managers, etc. // todo: expose more public runtime apis: stores, managers, etc.
@ -12,5 +14,6 @@ export function getLensRuntime(): LensRuntimeRendererEnv {
return { return {
apiManager, apiManager,
logger, logger,
dynamicPages,
} }
} }

View File

@ -63,4 +63,14 @@
pointer-events: none; pointer-events: none;
} }
} }
> .dynamic-pages {
&:not(:empty) {
padding-top: $spacing;
}
.Icon {
--size: 40px;
}
}
} }

View File

@ -20,6 +20,7 @@ import { Tooltip } from "../tooltip";
import { ConfirmDialog } from "../confirm-dialog"; import { ConfirmDialog } from "../confirm-dialog";
import { clusterIpc } from "../../../common/cluster-ipc"; import { clusterIpc } from "../../../common/cluster-ipc";
import { clusterViewURL, getMatchedClusterId } from "./cluster-view.route"; import { clusterViewURL, getMatchedClusterId } from "./cluster-view.route";
import { dynamicPages } from "./register-page";
// fixme: allow to rearrange clusters with drag&drop // fixme: allow to rearrange clusters with drag&drop
@ -116,6 +117,12 @@ export class ClustersMenu extends React.Component<Props> {
<Badge className="counter" label={newContexts.size} tooltip={<Trans>new</Trans>}/> <Badge className="counter" label={newContexts.size} tooltip={<Trans>new</Trans>}/>
)} )}
</div> </div>
<div className="dynamic-pages">
{Array.from(dynamicPages.all).map(([path, { MenuIcon }]) => {
if (!MenuIcon) return;
return <MenuIcon onClick={() => navigate(path)}/>
})}
</div>
</div> </div>
); );
} }

View File

@ -0,0 +1,28 @@
// Dynamic pages
import React from "react";
import { observable } from "mobx";
import type { IconProps } from "../icon";
export interface PageComponents {
Main: React.ComponentType<any>;
MenuIcon: React.ComponentType<IconProps>;
}
export class PagesStore {
all = observable.map<string, PageComponents>();
getComponents(path: string): PageComponents | null {
return this.all.get(path);
}
register(path: string, components: PageComponents) {
this.all.set(path, components);
}
unregister(path: string) {
this.all.delete(path);
}
}
export const dynamicPages = new PagesStore();

View File

@ -1,13 +0,0 @@
// Extensions-api > Dynamic pages
import { observable } from "mobx";
export class PagesStore {
@observable dynamicRoutes: string[] = [];
registerRoute(path: string | string[]) {
return;
}
}
export const pagesStore = new PagesStore();