/** * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ import styles from "./sidebar-cluster.module.scss"; import { observable } from "mobx"; import React, { useState } from "react"; import { broadcastMessage } from "../../../common/ipc"; import type { CatalogEntity, CatalogEntityContextMenu } from "../../api/catalog-entity"; import { IpcRendererNavigationEvents } from "../../../common/ipc/navigation-events"; import { Avatar } from "../avatar"; import { Icon } from "../icon"; import { Menu, MenuItem } from "../menu"; import { Tooltip } from "../tooltip"; import { withInjectables } from "@ogre-tools/injectable-react"; import hotbarStoreInjectable from "../../../common/hotbars/store.injectable"; import type { HotbarStore } from "../../../common/hotbars/store"; import { observer } from "mobx-react"; import type { VisitEntityContextMenu } from "../../../common/catalog/visit-entity-context-menu.injectable"; import visitEntityContextMenuInjectable from "../../../common/catalog/visit-entity-context-menu.injectable"; import type { Navigate } from "../../navigation/navigate.injectable"; import type { NormalizeCatalogEntityContextMenu } from "../../catalog/normalize-menu-item.injectable"; import navigateInjectable from "../../navigation/navigate.injectable"; import normalizeCatalogEntityContextMenuInjectable from "../../catalog/normalize-menu-item.injectable"; export interface SidebarClusterProps { clusterEntity: CatalogEntity | null | undefined; } interface Dependencies { navigate: Navigate; normalizeMenuItem: NormalizeCatalogEntityContextMenu; hotbarStore: HotbarStore; visitEntityContextMenu: VisitEntityContextMenu; } const NonInjectedSidebarCluster = observer(({ clusterEntity, hotbarStore, visitEntityContextMenu: onContextMenuOpen, navigate, normalizeMenuItem, }: Dependencies & SidebarClusterProps) => { const [menuItems] = useState(observable.array()); const [opened, setOpened] = useState(false ); if (!clusterEntity) { // render a Loading version of the SidebarCluster return (
); } const onMenuOpen = () => { const isAddedToActive = hotbarStore.isAddedToActive(clusterEntity); const title = isAddedToActive ? "Remove from Hotbar" : "Add to Hotbar"; const onClick = isAddedToActive ? () => hotbarStore.removeFromHotbar(clusterEntity.getId()) : () => hotbarStore.addToHotbar(clusterEntity); menuItems.replace([{ title, onClick }]); onContextMenuOpen(clusterEntity, { menuItems, navigate: (url, forceMainFrame = true) => { if (forceMainFrame) { broadcastMessage(IpcRendererNavigationEvents.NAVIGATE_IN_APP, url); } else { navigate(url); } }, }); toggle(); }; const onKeyDown = (evt: React.KeyboardEvent) => { if (evt.code == "Space") { toggle(); } }; const toggle = () => { setOpened(!opened); }; const id = `cluster-${clusterEntity.getId()}`; const tooltipId = `tooltip-${id}`; return ( ); }); export const SidebarCluster = withInjectables(NonInjectedSidebarCluster, { getProps: (di, props) => ({ ...props, hotbarStore: di.inject(hotbarStoreInjectable), visitEntityContextMenu: di.inject(visitEntityContextMenuInjectable), navigate: di.inject(navigateInjectable), normalizeMenuItem: di.inject(normalizeCatalogEntityContextMenuInjectable), }), });