fix offline overlay overflowing on mobile when in grid mode

This commit is contained in:
Josh Hawkins 2026-03-12 14:31:48 -05:00
parent 0184729f09
commit 887702c016

View File

@ -3,6 +3,7 @@ import { CameraConfig } from "@/types/frigateConfig";
import AutoUpdatingCameraImage from "../camera/AutoUpdatingCameraImage"; import AutoUpdatingCameraImage from "../camera/AutoUpdatingCameraImage";
import ActivityIndicator from "../indicators/activity-indicator"; import ActivityIndicator from "../indicators/activity-indicator";
import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { useCallback, useEffect, useMemo, useRef, useState } from "react";
import { useResizeObserver } from "@/hooks/resize-observer";
import MSEPlayer from "./MsePlayer"; import MSEPlayer from "./MsePlayer";
import JSMpegPlayer from "./JSMpegPlayer"; import JSMpegPlayer from "./JSMpegPlayer";
import { MdCircle } from "react-icons/md"; import { MdCircle } from "react-icons/md";
@ -80,6 +81,7 @@ export default function LivePlayer({
const { t } = useTranslation(["components/player"]); const { t } = useTranslation(["components/player"]);
const internalContainerRef = useRef<HTMLDivElement | null>(null); const internalContainerRef = useRef<HTMLDivElement | null>(null);
const overlayRef = useRef<HTMLDivElement | null>(null);
const cameraName = useCameraFriendlyName(cameraConfig); const cameraName = useCameraFriendlyName(cameraConfig);
@ -87,6 +89,10 @@ export default function LivePlayer({
const inDashboard = containerRef?.current == null; const inDashboard = containerRef?.current == null;
const [overlayDimensions] = useResizeObserver(overlayRef);
const isCompact =
overlayDimensions.width > 0 && overlayDimensions.width < 280;
// stats // stats
const [stats, setStats] = useState<PlayerStatsType>({ const [stats, setStats] = useState<PlayerStatsType>({
@ -317,7 +323,14 @@ export default function LivePlayer({
return ( return (
<div <div
ref={cameraRef ?? internalContainerRef} ref={(node) => {
overlayRef.current = node;
if (cameraRef) {
cameraRef(node);
} else {
internalContainerRef.current = node;
}
}}
data-camera={cameraConfig.name} data-camera={cameraConfig.name}
className={cn( className={cn(
"relative flex w-full cursor-pointer justify-center outline", "relative flex w-full cursor-pointer justify-center outline",
@ -428,6 +441,7 @@ export default function LivePlayer({
<div className="flex flex-col items-center justify-center gap-2 rounded-lg bg-background/50 p-3 text-center"> <div className="flex flex-col items-center justify-center gap-2 rounded-lg bg-background/50 p-3 text-center">
<div className="text-md">{t("streamOffline.title")}</div> <div className="text-md">{t("streamOffline.title")}</div>
<TbExclamationCircle className="size-6" /> <TbExclamationCircle className="size-6" />
{!isCompact && (
<p className="text-center text-sm"> <p className="text-center text-sm">
<Trans <Trans
ns="components/player" ns="components/player"
@ -438,6 +452,7 @@ export default function LivePlayer({
streamOffline.desc streamOffline.desc
</Trans> </Trans>
</p> </p>
)}
</div> </div>
</div> </div>
</> </>
@ -448,6 +463,7 @@ export default function LivePlayer({
<div className="flex flex-col items-center justify-center rounded-lg bg-background/50 p-5"> <div className="flex flex-col items-center justify-center rounded-lg bg-background/50 p-5">
<p className="my-5 text-lg">{t("streamOffline.title")}</p> <p className="my-5 text-lg">{t("streamOffline.title")}</p>
<TbExclamationCircle className="mb-3 size-10" /> <TbExclamationCircle className="mb-3 size-10" />
{!isCompact && (
<p className="max-w-96 text-center"> <p className="max-w-96 text-center">
<Trans <Trans
ns="components/player" ns="components/player"
@ -458,6 +474,7 @@ export default function LivePlayer({
streamOffline.desc streamOffline.desc
</Trans> </Trans>
</p> </p>
)}
</div> </div>
</div> </div>
)} )}