fix: revert CameraMotionDot, restore built-in LivePlayer motion dot

Remove the external CameraMotionDot component and showMotionDot={false}
override. The ws.ts fix (camera_activity -> motion topic sync) ensures
useCameraActivity gets fresh data, so the built-in dot in LivePlayer works.

https://claude.ai/code/session_019B4dJXtcxvHn97ZaqHUB62
This commit is contained in:
Claude 2026-03-18 07:39:00 +00:00
parent 703ffcf82e
commit 76652861b5
No known key found for this signature in database

View File

@ -29,8 +29,6 @@ import {
} from "@/types/live"; } from "@/types/live";
import ActivityIndicator from "@/components/indicators/activity-indicator"; import ActivityIndicator from "@/components/indicators/activity-indicator";
import { PlayerStats } from "@/components/player/PlayerStats"; import { PlayerStats } from "@/components/player/PlayerStats";
import { MdCircle } from "react-icons/md";
import { useCameraActivity } from "@/hooks/use-camera-activity";
import { Skeleton } from "@/components/ui/skeleton"; import { Skeleton } from "@/components/ui/skeleton";
import { isEqual } from "lodash"; import { isEqual } from "lodash";
@ -879,7 +877,6 @@ export default function DraggableGridLayout({
[camera.name]: loading, [camera.name]: loading,
})) }))
} }
showMotionDot={false}
onClick={() => { onClick={() => {
!isEditMode && onSelectCamera(camera.name); !isEditMode && onSelectCamera(camera.name);
}} }}
@ -911,10 +908,7 @@ export default function DraggableGridLayout({
minimal={true} minimal={true}
/> />
)} )}
<CameraMotionDot
camera={camera}
autoLive={autoLive ?? globalAutoLive}
/>
</div> </div>
{isEditMode && showCircles && <CornerCircles />} {isEditMode && showCircles && <CornerCircles />}
</GridLiveContextMenu> </GridLiveContextMenu>
@ -1081,24 +1075,6 @@ const BirdseyeLivePlayerGridItem = React.forwardRef<
}, },
); );
// Separate component so it can call useCameraActivity as a hook (no hooks in loops).
// Direct WS subscription guarantees the dot reacts to motion changes in real-time
// without relying on an intermediate callback → parent-state chain.
function CameraMotionDot({
camera,
autoLive,
}: {
camera: CameraConfig;
autoLive?: boolean;
}) {
const { activeMotion, offline } = useCameraActivity(camera);
if (autoLive === false || offline || !activeMotion) return null;
return (
<div className="absolute right-2 top-2 z-40">
<MdCircle className="mr-2 size-2 animate-pulse text-danger shadow-danger drop-shadow-md" />
</div>
);
}
type GridLiveContextMenuProps = { type GridLiveContextMenuProps = {
className?: string; className?: string;