From 02fb4a501fb7863ca2f28bd727928b76bedf1a6c Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Thu, 9 May 2024 10:39:43 -0600 Subject: [PATCH] Add observer to detect of row overflows --- web/src/hooks/resize-observer.ts | 31 ++++++++++++++++++++++++++ web/src/views/events/RecordingView.tsx | 7 +++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/web/src/hooks/resize-observer.ts b/web/src/hooks/resize-observer.ts index 13e79f58c..6dc7afd5b 100644 --- a/web/src/hooks/resize-observer.ts +++ b/web/src/hooks/resize-observer.ts @@ -45,3 +45,34 @@ export function useResizeObserver(...refs: RefType[]) { return dimensions; } + +export function useOverflowObserver(ref: MutableRefObject) { + const [overflow, setOverflow] = useState(false); + const resizeObserver = useMemo( + () => + new ResizeObserver(() => { + window.requestAnimationFrame(() => { + if (ref.current) { + setOverflow(ref.current.scrollWidth > ref.current.clientWidth); + } + }); + }), + [ref], + ); + + useEffect(() => { + const elem = ref.current; + + if (elem) { + resizeObserver.observe(elem); + } + + return () => { + if (elem) { + resizeObserver.unobserve(elem); + } + }; + }, [ref, resizeObserver]); + + return overflow; +} diff --git a/web/src/views/events/RecordingView.tsx b/web/src/views/events/RecordingView.tsx index c7fcc11aa..e7029bf94 100644 --- a/web/src/views/events/RecordingView.tsx +++ b/web/src/views/events/RecordingView.tsx @@ -43,6 +43,7 @@ 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"; const SEGMENT_DURATION = 30; @@ -77,6 +78,7 @@ export function RecordingView({ const [mainCamera, setMainCamera] = useState(startCamera); const mainControllerRef = useRef(null); const mainLayoutRef = useRef(null); + const previewRowRef = useRef(null); const previewRefs = useRef<{ [camera: string]: PreviewController }>({}); const [playbackStart, setPlaybackStart] = useState(startTime); @@ -240,6 +242,8 @@ export function RecordingView({ // layout + const previewRowOverflows = useOverflowObserver(previewRowRef); + const getCameraAspect = useCallback( (cam: string) => { if (!config) { @@ -450,7 +454,8 @@ export function RecordingView({ {isDesktop && (
{allCameras.map((cam) => {