/** * 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, CatalogEntityContextMenuContext } from "../../api/catalog-entity"; import { IpcRendererNavigationEvents } from "../../navigation/events"; import { Avatar } from "../avatar"; import { Icon } from "../icon"; import { navigate } from "../../navigation"; import { Menu, MenuItem } from "../menu"; import { ConfirmDialog } from "../confirm-dialog"; import { Tooltip } from "../tooltip"; import { withInjectables } from "@ogre-tools/injectable-react"; import hotbarStoreInjectable from "../../../common/hotbar-store.injectable"; import type { HotbarStore } from "../../../common/hotbar-store"; import { observer } from "mobx-react"; const contextMenu: CatalogEntityContextMenuContext = observable({ menuItems: [], navigate: (url: string, forceMainFrame = true) => { if (forceMainFrame) { broadcastMessage(IpcRendererNavigationEvents.NAVIGATE_IN_APP, url); } else { navigate(url); } }, }); function onMenuItemClick(menuItem: CatalogEntityContextMenu) { if (menuItem.confirm) { ConfirmDialog.open({ okButtonProps: { primary: false, accent: true, }, ok: () => { menuItem.onClick(); }, message: menuItem.confirm.message, }); } else { menuItem.onClick(); } } function renderLoadingSidebarCluster() { return (
); } interface Dependencies { hotbarStore: HotbarStore; } interface SidebarClusterProps { clusterEntity: CatalogEntity; } const NonInjectedSidebarCluster = observer(({ clusterEntity, hotbarStore }: Dependencies & SidebarClusterProps) => { const [opened, setOpened] = useState(false); if (!clusterEntity) { return renderLoadingSidebarCluster(); } 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); contextMenu.menuItems = [{ title, onClick }]; clusterEntity.onContextMenuOpen(contextMenu); 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) => ({ hotbarStore: di.inject(hotbarStoreInjectable), ...props, }), }, );