import * as React from 'react'; import { FixedSizeList as List } from 'react-window'; import { Menu } from '../Menu/Menu'; import { MenuItem } from '../Menu/MenuItem'; import { handleLeftClick, handleRightClick } from './MouseEventHandlers'; import { IPoint } from '../../Interfaces/IPoint'; import { ISymbolModel } from '../../Interfaces/ISymbolModel'; import { SymbolProperties } from '../SymbolProperties/SymbolProperties'; interface ISymbolsSidebarProps { SelectedSymbolId: string symbols: Map isOpen: boolean isHistoryOpen: boolean OnPropertyChange: (key: string, value: string | number | boolean) => void SelectSymbol: (symbolId: string) => void DeleteSymbol: (containerid: string) => void } export const SymbolsSidebar: React.FC = (props: ISymbolsSidebarProps): JSX.Element => { // States const [isContextMenuOpen, setIsContextMenuOpen] = React.useState(false); const [onClickSymbolId, setOnClickSymbolId] = React.useState(''); const [contextMenuPosition, setContextMenuPosition] = React.useState({ x: 0, y: 0 }); const elementRef = React.useRef(null); // Event listeners React.useEffect(() => { const onContextMenu = (event: MouseEvent): void => handleRightClick( event, setIsContextMenuOpen, setOnClickSymbolId, setContextMenuPosition ); const onLeftClick = (): void => handleLeftClick( isContextMenuOpen, setIsContextMenuOpen, setOnClickSymbolId ); elementRef.current?.addEventListener( 'contextmenu', onContextMenu ); window.addEventListener( 'click', onLeftClick ); return () => { elementRef.current?.removeEventListener( 'contextmenu', onContextMenu ); window.removeEventListener( 'click', onLeftClick ); }; }); // Render let isOpenClasses = '-right-64'; if (props.isOpen) { isOpenClasses = props.isHistoryOpen ? 'right-64' : 'right-0'; } const containers = [...props.symbols.values()]; const Row = ({ index, style }: {index: number, style: React.CSSProperties}): JSX.Element => { const container = containers[index]; const key = container.id.toString(); const text = key; const selectedClass: string = props.SelectedSymbolId !== '' && props.SelectedSymbolId === container.id ? 'border-l-4 bg-slate-400/60 hover:bg-slate-400' : 'bg-slate-300/60 hover:bg-slate-300'; return ( ); }; return (
Elements
{ Row }
{ setIsContextMenuOpen(false); props.DeleteSymbol(onClickSymbolId); }} />
); };