import styled from '@emotion/styled'; import ErrorBoundary from 'sentry/components/errorBoundary'; import ReplayTimeline from 'sentry/components/replays/breadcrumbs/replayTimeline'; import ReplayView from 'sentry/components/replays/replayView'; import {space} from 'sentry/styles/space'; import useFullscreen from 'sentry/utils/replays/hooks/useFullscreen'; import {LayoutKey} from 'sentry/utils/replays/hooks/useReplayLayout'; import FluidHeight from 'sentry/views/replays/detail/layout/fluidHeight'; import FluidPanel from 'sentry/views/replays/detail/layout/fluidPanel'; import FocusArea from 'sentry/views/replays/detail/layout/focusArea'; import FocusTabs from 'sentry/views/replays/detail/layout/focusTabs'; import MeasureSize from 'sentry/views/replays/detail/layout/measureSize'; import SidebarArea from 'sentry/views/replays/detail/layout/sidebarArea'; import SideTabs from 'sentry/views/replays/detail/layout/sideTabs'; import SplitPanel from 'sentry/views/replays/detail/layout/splitPanel'; const MIN_VIDEO_WIDTH = 325; const MIN_CONTENT_WIDTH = 340; const MIN_SIDEBAR_WIDTH = 325; const MIN_VIDEO_HEIGHT = 200; const MIN_CONTENT_HEIGHT = 180; const MIN_SIDEBAR_HEIGHT = 120; const DIVIDER_SIZE = 16; type Props = { layout?: LayoutKey; }; function ReplayLayout({layout = LayoutKey.TOPBAR}: Props) { const {ref: fullscreenRef, toggle: toggleFullscreen} = useFullscreen(); const timeline = ( ); const video = ( ); if (layout === LayoutKey.VIDEO_ONLY) { return ( {timeline} {video} ); } const focusArea = ( }> ); const sidebarArea = ( }> ); if (layout === LayoutKey.NO_VIDEO) { return ( {timeline} {({width}) => ( )} ); } if (layout === LayoutKey.SIDEBAR_LEFT) { return ( {timeline} {({height, width}) => ( ), default: (width - DIVIDER_SIZE) * 0.5, min: MIN_SIDEBAR_WIDTH, max: width - DIVIDER_SIZE - MIN_CONTENT_WIDTH, }} right={focusArea} /> )} ); } // layout === 'topbar' return ( {timeline} {({height, width}) => ( ), default: (height - DIVIDER_SIZE) * 0.5, min: MIN_VIDEO_HEIGHT, max: height - DIVIDER_SIZE - MIN_CONTENT_HEIGHT, }} bottom={focusArea} /> )} ); } const BodyContent = styled('main')` background: ${p => p.theme.background}; width: 100%; height: 100%; display: grid; grid-template-rows: auto 1fr; overflow: hidden; padding: ${space(2)}; `; const SmallMarginFocusTabs = styled(FocusTabs)` margin-bottom: ${space(1)}; `; const SmallMarginSideTabs = styled(SideTabs)` margin-bottom: ${space(1)}; `; const VideoSection = styled(FluidHeight)` background: ${p => p.theme.background}; gap: ${space(1)}; :fullscreen { padding: ${space(1)}; } `; export default ReplayLayout;