/* eslint-disable no-nested-ternary */ import { Box } from '@rocket.chat/fuselage'; import { useResizeObserver } from '@rocket.chat/fuselage-hooks'; import breakpointsDefinitions from '@rocket.chat/fuselage-tokens/dist/breakpoints.json'; import { LayoutContext, useLayout } from '@rocket.chat/ui-contexts'; import type { ComponentProps, ReactNode } from 'react'; import { Suspense, useMemo } from 'react'; import HeaderSkeleton from '../Header/HeaderSkeleton'; export type RoomLayoutProps = { classificationBanner?: ReactNode; header?: ReactNode; body?: ReactNode; footer?: ReactNode; aside?: ReactNode; } & ComponentProps; const useBreakpointsElement = () => { const { ref, borderBoxSize } = useResizeObserver({ debounceDelay: 30, }); const breakpoints = useMemo( () => Object.entries(breakpointsDefinitions) .filter(([, { minViewportWidth }]) => minViewportWidth && borderBoxSize.inlineSize && borderBoxSize.inlineSize >= minViewportWidth) .map(([name]) => name), [borderBoxSize], ); return { ref, breakpoints, }; }; const RoomLayout = ({ classificationBanner, header, body, footer, aside, ...props }: RoomLayoutProps) => { const { ref, breakpoints } = useBreakpointsElement(); const contextualbarPosition = breakpoints.includes('md') ? 'relative' : 'absolute'; const contextualbarSize = breakpoints.includes('sm') ? (breakpoints.includes('xl') ? '38%' : '380px') : '100%'; const hideBody = aside && contextualbarSize === '100%'; const layout = useLayout(); return ( ({ ...layout, contextualBarPosition: contextualbarPosition, size: { ...layout.size, contextualBar: contextualbarSize, }, }), [layout, contextualbarPosition, contextualbarSize], )} > {classificationBanner} }>{header} {body} {footer && {footer}} {aside && {aside}} ); }; export default RoomLayout;