import { Box } from '@mui/material'; import { useSetAtom } from 'jotai'; import { type ReactElement, useCallback, useEffect, useState } from 'react'; import { type Layout, LayoutItem, ReactGridLayout } from 'react-grid-layout'; import { ParentSize, useMemoComponent } from '..'; import { isResizingItemAtom } from './atoms'; import { useDashboardLayoutStyles } from './Dashboard.styles'; import { getColumnsFromScreenSize, getLayout, rowHeight } from './utils'; import 'react-grid-layout/css/styles.css'; interface DashboardLayoutProps { additionalMemoProps?: Array; changeLayout?: (newLayout: Layout) => void; children: Array; displayGrid?: boolean; isStatic?: boolean; layout: Array; } const Handle = (axis: string, ref: React.Ref) => { return ( ); }; const DashboardLayout = ({ children, changeLayout, layout, isStatic = false, additionalMemoProps = [] }: DashboardLayoutProps): ReactElement => { const { classes } = useDashboardLayoutStyles(isStatic); const [columns, setColumns] = useState(getColumnsFromScreenSize()); const setIsResizingItem = useSetAtom(isResizingItemAtom); const resize = useCallback((): void => { setColumns(getColumnsFromScreenSize()); }, [JSON.stringify(getColumnsFromScreenSize())]); const startResize = useCallback( (_: Layout, _e: LayoutItem | null, newItem: LayoutItem | null) => { setIsResizingItem((newItem as LayoutItem & { id: string })?.id ?? null); }, [setIsResizingItem] ); const stopResize = useCallback(() => { setIsResizingItem(null); }, [setIsResizingItem]); useEffect(() => { window.addEventListener('resize', resize); return (): void => { window.removeEventListener('resize', resize); }; }, [resize]); const currentLayout = getLayout(layout); return useMemoComponent({ Component: ( {({ width }): ReactElement => ( {children} )} ), memoProps: [columns, currentLayout, isStatic, ...additionalMemoProps] }); }; export default DashboardLayout;