import * as React from 'react'; import { FixedSizeList as List } from 'react-window'; import { Properties } from '../Properties/Properties'; import { IContainerModel } from '../../Interfaces/IContainerModel'; import { getDepth, MakeIterator } from '../../utils/itertools'; import { Menu } from '../Menu/Menu'; import { MenuItem } from '../Menu/MenuItem'; import { handleDragLeave, handleDragOver, handleLeftClick, handleOnDrop, handleRightClick } from './MouseEventHandlers'; import { IPoint } from '../../Interfaces/IPoint'; interface IElementsSidebarProps { MainContainer: IContainerModel isOpen: boolean isHistoryOpen: boolean SelectedContainer: IContainerModel | null OnPropertyChange: (key: string, value: string | number | boolean, isStyle?: boolean) => void OnPropertiesSubmit: (event: React.FormEvent) => void SelectContainer: (container: IContainerModel) => void DeleteContainer: (containerid: string) => void AddContainer: (index: number, type: string, parent: string) => void } export const ElementsSidebar: React.FC = (props: IElementsSidebarProps): JSX.Element => { // States const [isContextMenuOpen, setIsContextMenuOpen] = React.useState(false); const [onClickContainerId, setOnClickContainerId] = 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, setOnClickContainerId, setContextMenuPosition ); const onLeftClick = (): void => handleLeftClick( isContextMenuOpen, setIsContextMenuOpen, setOnClickContainerId ); 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 it = MakeIterator(props.MainContainer); const containers = [...it]; const Row = ({ index, style }: {index: number, style: React.CSSProperties}): JSX.Element => { const container = containers[index]; const depth: number = getDepth(container); const key = container.properties.id.toString(); const text = '|\t'.repeat(depth) + key; const selectedClass: string = props.SelectedContainer !== undefined && props.SelectedContainer !== null && props.SelectedContainer.properties.id === container.properties.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.DeleteContainer(onClickContainerId); }} />
); };