diff --git a/web/src/hooks/resize-observer.ts b/web/src/hooks/resize-observer.ts index 664110220..234c6a0c7 100644 --- a/web/src/hooks/resize-observer.ts +++ b/web/src/hooks/resize-observer.ts @@ -43,7 +43,21 @@ export function useResizeObserver(...refs: RefType[]) { }; }, [refs, resizeObserver]); - return dimensions; + if (dimensions.length == refs.length) { + return dimensions; + } else { + const items = [...dimensions]; + for (let i = dimensions.length; i < refs.length; i++) { + items.push({ + width: 0, + height: 0, + x: -Infinity, + y: -Infinity, + }); + } + + return items; + } } export function useOverflowObserver(ref: MutableRefObject) { diff --git a/web/src/views/events/RecordingView.tsx b/web/src/views/events/RecordingView.tsx index 3a33cdc4f..9b32180a9 100644 --- a/web/src/views/events/RecordingView.tsx +++ b/web/src/views/events/RecordingView.tsx @@ -43,7 +43,10 @@ import { Skeleton } from "@/components/ui/skeleton"; import { FaVideo } from "react-icons/fa"; import { VideoResolutionType } from "@/types/live"; import { ASPECT_VERTICAL_LAYOUT, ASPECT_WIDE_LAYOUT } from "@/types/record"; -import { useOverflowObserver } from "@/hooks/resize-observer"; +import { + useOverflowObserver, + useResizeObserver, +} from "@/hooks/resize-observer"; import { cn } from "@/lib/utils"; const SEGMENT_DURATION = 30; @@ -79,6 +82,7 @@ export function RecordingView({ const [mainCamera, setMainCamera] = useState(startCamera); const mainControllerRef = useRef(null); const mainLayoutRef = useRef(null); + const cameraLayoutRef = useRef(null); const previewRowRef = useRef(null); const previewRefs = useRef<{ [camera: string]: PreviewController }>({}); @@ -294,6 +298,38 @@ export function RecordingView({ } }, [mainCameraAspect]); + const [{ width: mainWidth, height: mainHeight }] = + useResizeObserver(cameraLayoutRef); + + const mainCameraStyle = useMemo(() => { + if (isMobile || mainCameraAspect != "normal" || !config) { + return undefined; + } + + const camera = config.cameras[mainCamera]; + + if (!camera) { + return undefined; + } + + const aspect = camera.detect.width / camera.detect.height; + + if (!aspect) { + return undefined; + } + + const availableHeight = mainHeight - 112; + const availableWidth = aspect * availableHeight; + const percent = + (mainWidth < availableWidth + ? mainWidth / availableWidth + : availableWidth / mainWidth) * 100; + + return { + width: `${Math.round(percent)}%`, + }; + }, [config, mainCameraAspect, mainWidth, mainHeight, mainCamera]); + return (
@@ -415,6 +451,7 @@ export function RecordingView({ )} >