import { useMutation, useQuery } from "@tanstack/react-query"; import { CAM_BASE } from "../utils/config"; import { useEffect } from "react"; import { toast } from "sonner"; import type { BearerTypeFieldType, OptionalBOF2Constants, OptionalBOF2LaneIDs } from "../types/types"; const getDispatcherConfig = async () => { const response = await fetch(`${CAM_BASE}/api/fetch-config?id=Dispatcher`); if (!response.ok) throw new Error("Cannot get dispatcher configuration"); return response.json(); }; const updateDispatcherConfig = async (data: BearerTypeFieldType) => { const updateConfigPayload = { id: "Dispatcher", fields: [ { property: "propEnabled", value: data.enabled, }, { property: "propFormat", value: data.format, }, ], }; const response = await fetch(`${CAM_BASE}/api/update-config`, { method: "POST", body: JSON.stringify(updateConfigPayload), }); if (!response.ok) throw new Error("Cannot update dispatcher configuration"); return response.json(); }; const updateBackOfficeDispatcher = async (data: OptionalBOF2Constants) => { const bof2ContantsPayload = { id: "Dispatcher-bof2-constants", fields: [ { property: "propFeedIdentifier", value: data?.FFID, }, { property: "propSourceIdentifier", value: data?.SCID, }, { property: "propTimeZoneType", value: data?.timestampSource, }, { property: "propGpsFormat", value: data?.GPSFormat, }, ], }; const response = await fetch(`${CAM_BASE}/api/update-config`, { method: "POST", body: JSON.stringify(bof2ContantsPayload), }); if (!response.ok) throw new Error("Cannot update dispatcher configuration"); return response.json(); }; const getBof2DispatcherData = async () => { const response = await fetch(`${CAM_BASE}/api/fetch-config?id=Dispatcher-bof2-constants`); if (!response.ok) throw new Error("Cannot get BOF2 dispatcher config"); return response.json(); }; const updateBOF2LaneId = async (data: OptionalBOF2LaneIDs) => { const bof2LaneIds = { id: data?.laneId, fields: [ { property: "propLaneID1", value: data?.LID1, }, { property: "propLaneID2", value: data?.LID1, }, { property: "propLaneID3", value: data?.LID1, }, ], }; const response = await fetch(`${CAM_BASE}/api/update-config`, { method: "post", body: JSON.stringify(bof2LaneIds), }); if (!response.ok) throw new Error("cannot send to lane IDs"); return response.json(); }; const getBOF2LaneId = async (cameraID: string) => { const response = await fetch(`${CAM_BASE}/api/fetch-config?id=SightingAmmend${cameraID}-lane-ids`); if (!response.ok) throw new Error("Canot get Lane Ids"); return response.json(); }; export const useCameraOutput = () => { const dispatcherQuery = useQuery({ queryKey: ["dispatcher"], queryFn: getDispatcherConfig, }); const dispatcherMutation = useMutation({ mutationFn: updateDispatcherConfig, mutationKey: ["dispatcherUpdate"], onError: (error) => toast.error(error.message), onSuccess: (data) => { if (data) { toast.success("Settings successfully updated", { id: "dispatchSettings" }); } }, }); const backOfficeDispatcherMutation = useMutation({ mutationKey: ["backofficedDispatcher"], mutationFn: updateBackOfficeDispatcher, onSuccess: (data) => { if (data) { toast.success("Settings successfully updated", { id: "dispatchSettings" }); } }, }); useEffect(() => { if (dispatcherQuery.isError) toast.error(dispatcherQuery.error.message); }, [dispatcherQuery?.error?.message, dispatcherQuery.isError]); return { dispatcherQuery, dispatcherMutation, backOfficeDispatcherMutation, }; }; export const useGetDispatcherConfig = () => { const bof2ConstantsQuery = useQuery({ queryKey: ["getBof2DispatcherData"], queryFn: getBof2DispatcherData, }); return { bof2ConstantsQuery }; }; export const useLaneIds = (cameraID: string) => { const laneIdQuery = useQuery({ queryKey: ["getBOF2LaneId", cameraID], queryFn: () => getBOF2LaneId(cameraID), }); const laneIdMutation = useMutation({ mutationKey: ["updateBOF2LaneId", cameraID], mutationFn: (data: OptionalBOF2LaneIDs) => updateBOF2LaneId(data), }); return { laneIdQuery, laneIdMutation }; };