Files
Mav-Mobile-UI/src/components/CameraOverview/SnapshotContainer.tsx

65 lines
2.1 KiB
TypeScript
Raw Normal View History

2025-08-13 14:23:48 +01:00
import { useGetOverviewSnapshot } from "../../hooks/useGetOverviewSnapshot";
import type { ZoomInOptions } from "../../types/types";
import NavigationArrow from "../UI/NavigationArrow";
import { useCameraZoom } from "../../hooks/useCameraZoom";
import { useEffect } from "react";
import Loading from "../UI/Loading";
import ErrorState from "../UI/ErrorState";
2025-11-04 15:29:48 +00:00
import { reverseZoomMapping, zoomMapping } from "../../utils/utils";
2025-08-13 14:23:48 +01:00
type SnapshotContainerProps = {
side: string;
2025-08-18 12:53:30 +01:00
settingsPage?: boolean;
zoomLevel?: number;
onZoomLevelChange?: (level: number) => void;
2025-08-13 14:23:48 +01:00
};
export const SnapshotContainer = ({ side, settingsPage, zoomLevel, onZoomLevelChange }: SnapshotContainerProps) => {
const { canvasRef, isError, isPending } = useGetOverviewSnapshot(side);
const cameraControllerSide = side === "CameraA" ? "CameraControllerA" : "CameraControllerB";
2025-11-04 15:29:48 +00:00
const { mutation, query } = useCameraZoom({ camera: cameraControllerSide });
const magnification = query?.data?.propMagnification?.value;
const apiZoom = reverseZoomMapping(magnification);
2025-08-13 14:23:48 +01:00
const handleZoomClick = () => {
const baseLevel = zoomLevel ?? 1;
const newLevel = baseLevel >= 4 ? 1 : baseLevel * 2;
if (onZoomLevelChange) onZoomLevelChange(newLevel);
if (!zoomLevel) return;
2025-09-29 08:47:13 +01:00
};
useEffect(() => {
if (zoomLevel) {
2025-11-04 15:29:48 +00:00
const text = zoomMapping(apiZoom);
const zoomInOptions: ZoomInOptions = {
camera: cameraControllerSide,
multiplier: zoomLevel,
multiplierText: text,
};
2025-11-04 15:29:48 +00:00
console.log(zoomInOptions);
mutation.mutate(zoomInOptions);
}
2025-11-04 15:29:48 +00:00
}, [cameraControllerSide, apiZoom, zoomLevel]);
2025-08-13 14:23:48 +01:00
return (
<div className="flex flex-col md:flex-row">
2025-08-18 12:53:30 +01:00
<NavigationArrow side={side} settingsPage={settingsPage} />
<div className="w-full">
{isError && <ErrorState />}
{isPending && (
<div className="my-50 h-[50%]">
<Loading message="Camera Preview" />
</div>
)}
<canvas
2025-09-29 08:47:13 +01:00
onClick={handleZoomClick}
ref={canvasRef}
className="absolute inset-0 object-contain min-h-[100%] z-20"
/>
</div>
2025-08-13 14:23:48 +01:00
</div>
);
};