import * as React from 'react'; import { motion } from 'framer-motion'; import { Properties } from '../Properties/Properties'; import ContainerProperties from '../../Interfaces/IProperties'; 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) => void OnPropertiesSubmit: (event: React.FormEvent, properties: ContainerProperties) => void SelectContainer: (container: IContainerModel) => void DeleteContainer: (containerid: string) => void AddContainer: (index: number, type: string, parent: string) => void } function createRows( container: IContainerModel, props: IElementsSidebarProps, containerRows: React.ReactNode[] ): void { 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'; containerRows.push( handleOnDrop(event, props.MainContainer, props.AddContainer)} onDragOver={(event) => handleDragOver(event, props.MainContainer)} onDragLeave={(event) => handleDragLeave(event)} onClick={() => props.SelectContainer(container)} > { text } ); }; 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 containerRows: React.ReactNode[] = []; const it = MakeIterator(props.MainContainer); for (const container of it) { createRows( container, props, containerRows ); } return (
Elements
{ containerRows }
{ setIsContextMenuOpen(false); props.DeleteContainer(onClickContainerId); }} />
); };