mirror of
https://github.com/blakeblackshear/frigate.git
synced 2024-12-23 19:11:14 +01:00
Bugfixes (#14587)
* Ensure review and search item mobile pages reopen correctly * disable pan/pinch/zoom when native browser video controls are displayed * report 0 for storage usage when api returns null
This commit is contained in:
parent
2d27e72ed9
commit
4dadf6d353
@ -216,7 +216,7 @@ export function CombinedStorageGraph({
|
|||||||
</Popover>
|
</Popover>
|
||||||
)}
|
)}
|
||||||
</TableCell>
|
</TableCell>
|
||||||
<TableCell>{getUnitSize(item.usage)}</TableCell>
|
<TableCell>{getUnitSize(item.usage ?? 0)}</TableCell>
|
||||||
<TableCell>{item.data[0].toFixed(2)}%</TableCell>
|
<TableCell>{item.data[0].toFixed(2)}%</TableCell>
|
||||||
<TableCell>
|
<TableCell>
|
||||||
{item.name === "Unused"
|
{item.name === "Unused"
|
||||||
|
@ -25,7 +25,13 @@ export function MobilePage({
|
|||||||
const [uncontrolledOpen, setUncontrolledOpen] = useState(false);
|
const [uncontrolledOpen, setUncontrolledOpen] = useState(false);
|
||||||
|
|
||||||
const open = controlledOpen ?? uncontrolledOpen;
|
const open = controlledOpen ?? uncontrolledOpen;
|
||||||
const setOpen = onOpenChange ?? setUncontrolledOpen;
|
const setOpen = (value: boolean) => {
|
||||||
|
if (onOpenChange) {
|
||||||
|
onOpenChange(value);
|
||||||
|
} else {
|
||||||
|
setUncontrolledOpen(value);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<MobilePageContext.Provider value={{ open, onOpenChange: setOpen }}>
|
<MobilePageContext.Provider value={{ open, onOpenChange: setOpen }}>
|
||||||
|
@ -13,7 +13,7 @@ import { getIconForLabel } from "@/utils/iconUtil";
|
|||||||
import { useApiHost } from "@/api";
|
import { useApiHost } from "@/api";
|
||||||
import { ReviewDetailPaneType, ReviewSegment } from "@/types/review";
|
import { ReviewDetailPaneType, ReviewSegment } from "@/types/review";
|
||||||
import { Event } from "@/types/event";
|
import { Event } from "@/types/event";
|
||||||
import { useEffect, useMemo, useRef, useState } from "react";
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
import { FrigatePlusDialog } from "../dialog/FrigatePlusDialog";
|
import { FrigatePlusDialog } from "../dialog/FrigatePlusDialog";
|
||||||
import ObjectLifecycle from "./ObjectLifecycle";
|
import ObjectLifecycle from "./ObjectLifecycle";
|
||||||
@ -91,6 +91,22 @@ export default function ReviewDetailDialog({
|
|||||||
review != undefined,
|
review != undefined,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const handleOpenChange = useCallback(
|
||||||
|
(open: boolean) => {
|
||||||
|
setIsOpen(open);
|
||||||
|
if (!open) {
|
||||||
|
// short timeout to allow the mobile page animation
|
||||||
|
// to complete before updating the state
|
||||||
|
setTimeout(() => {
|
||||||
|
setReview(undefined);
|
||||||
|
setSelectedEvent(undefined);
|
||||||
|
setPane("overview");
|
||||||
|
}, 300);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[setReview, setIsOpen],
|
||||||
|
);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setIsOpen(review != undefined);
|
setIsOpen(review != undefined);
|
||||||
// we know that these deps are correct
|
// we know that these deps are correct
|
||||||
@ -109,16 +125,7 @@ export default function ReviewDetailDialog({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Overlay
|
<Overlay open={isOpen ?? false} onOpenChange={handleOpenChange}>
|
||||||
open={isOpen ?? false}
|
|
||||||
onOpenChange={(open) => {
|
|
||||||
if (!open) {
|
|
||||||
setReview(undefined);
|
|
||||||
setSelectedEvent(undefined);
|
|
||||||
setPane("overview");
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<FrigatePlusDialog
|
<FrigatePlusDialog
|
||||||
upload={upload}
|
upload={upload}
|
||||||
onClose={() => setUpload(undefined)}
|
onClose={() => setUpload(undefined)}
|
||||||
@ -140,7 +147,7 @@ export default function ReviewDetailDialog({
|
|||||||
>
|
>
|
||||||
<span tabIndex={0} className="sr-only" />
|
<span tabIndex={0} className="sr-only" />
|
||||||
{pane == "overview" && (
|
{pane == "overview" && (
|
||||||
<Header className="justify-center" onClose={() => setIsOpen(false)}>
|
<Header className="justify-center">
|
||||||
<Title>Review Item Details</Title>
|
<Title>Review Item Details</Title>
|
||||||
<Description className="sr-only">Review item details</Description>
|
<Description className="sr-only">Review item details</Description>
|
||||||
<div
|
<div
|
||||||
|
@ -109,6 +109,20 @@ export default function SearchDetailDialog({
|
|||||||
|
|
||||||
const [isOpen, setIsOpen] = useState(search != undefined);
|
const [isOpen, setIsOpen] = useState(search != undefined);
|
||||||
|
|
||||||
|
const handleOpenChange = useCallback(
|
||||||
|
(open: boolean) => {
|
||||||
|
setIsOpen(open);
|
||||||
|
if (!open) {
|
||||||
|
// short timeout to allow the mobile page animation
|
||||||
|
// to complete before updating the state
|
||||||
|
setTimeout(() => {
|
||||||
|
setSearch(undefined);
|
||||||
|
}, 300);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[setSearch],
|
||||||
|
);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (search) {
|
if (search) {
|
||||||
setIsOpen(search != undefined);
|
setIsOpen(search != undefined);
|
||||||
@ -158,14 +172,7 @@ export default function SearchDetailDialog({
|
|||||||
const Description = isDesktop ? DialogDescription : MobilePageDescription;
|
const Description = isDesktop ? DialogDescription : MobilePageDescription;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Overlay
|
<Overlay open={isOpen} onOpenChange={handleOpenChange}>
|
||||||
open={isOpen}
|
|
||||||
onOpenChange={() => {
|
|
||||||
if (search) {
|
|
||||||
setSearch(undefined);
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Content
|
<Content
|
||||||
className={cn(
|
className={cn(
|
||||||
"scrollbar-container overflow-y-auto",
|
"scrollbar-container overflow-y-auto",
|
||||||
@ -174,7 +181,7 @@ export default function SearchDetailDialog({
|
|||||||
isMobile && "px-4",
|
isMobile && "px-4",
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<Header onClose={() => setIsOpen(false)}>
|
<Header>
|
||||||
<Title>Tracked Object Details</Title>
|
<Title>Tracked Object Details</Title>
|
||||||
<Description className="sr-only">Tracked object details</Description>
|
<Description className="sr-only">Tracked object details</Description>
|
||||||
</Header>
|
</Header>
|
||||||
|
@ -190,6 +190,7 @@ export default function HlsVideoPlayer({
|
|||||||
minScale={1.0}
|
minScale={1.0}
|
||||||
wheel={{ smoothStep: 0.005 }}
|
wheel={{ smoothStep: 0.005 }}
|
||||||
onZoom={(zoom) => setZoomScale(zoom.state.scale)}
|
onZoom={(zoom) => setZoomScale(zoom.state.scale)}
|
||||||
|
disabled={!frigateControls}
|
||||||
>
|
>
|
||||||
{frigateControls && (
|
{frigateControls && (
|
||||||
<VideoControls
|
<VideoControls
|
||||||
|
Loading…
Reference in New Issue
Block a user