import { useMutation, useQuery, type QueryFunctionContext } from "@tanstack/react-query"; import { CAM_BASE } from "../utils/config"; import type { zoomConfig, ZoomInOptions } from "../types/types"; import { toast } from "sonner"; import { useEffect } from "react"; const getCameraMode = async (options: { camera: string }) => { const response = await fetch(`${CAM_BASE}/api/fetch-config?id=Ip${options.camera}`); if (!response.ok) throw new Error("Cannot get camera mode"); return response.json(); }; const updateCameraMode = async (options: { camera: string; mode: string }) => { console.log(options); const dayNightPayload = { id: options.camera, fields: [ { property: "propDayNightMode", value: options.mode, }, ], }; const response = await fetch(`${CAM_BASE}/Ip${options.camera}-command?dayNightMode=${options.mode}`, { method: "post", body: JSON.stringify(dayNightPayload), }); if (!response.ok) throw new Error("cannot update camera mode"); return response.json(); }; async function zoomIn(options: ZoomInOptions) { const response = await fetch( `${CAM_BASE}/Ip${options.camera}-command?magnification=${options.multiplierText?.toLowerCase()}`, { signal: AbortSignal.timeout(300000), } ); if (!response.ok) { throw new Error("Cannot reach camera zoom endpoint"); } return response.json(); } async function fetchZoomInConfig({ queryKey }: QueryFunctionContext<[string, zoomConfig]>) { const [, { camera }] = queryKey; const response = await fetch(`${CAM_BASE}/api/fetch-config?id=Ip${camera}`, { signal: AbortSignal.timeout(300000), }); if (!response.ok) { throw new Error("Cannot get camera zoom settings"); } return response.json(); } //change to string export const useCameraZoom = (options: zoomConfig) => { const mutation = useMutation({ mutationKey: ["zoomIn"], mutationFn: (options: ZoomInOptions) => zoomIn(options), }); const query = useQuery({ queryKey: ["fetchZoomInConfig", options], queryFn: fetchZoomInConfig, }); useEffect(() => { if (query.isError) toast.error(query.error.message, { id: "zoom" }); }, [query?.error?.message, query.isError]); return { mutation, query }; }; export const useCameraMode = (option: { camera: string }) => { const cameraModeQuery = useQuery({ queryKey: ["getCameraMode"], queryFn: () => getCameraMode(option), }); const cameraModeMutation = useMutation({ mutationKey: ["updateCameraMode"], mutationFn: updateCameraMode, }); return { cameraModeQuery, cameraModeMutation, }; };