Files
Mav-Mobile-UI/src/hooks/useCameraOutput.ts
Toba Ojo f9188bb46f - implement user settings reset functionality with modal confirmation
and bug fixes regarding lane IDs to sighting endpoints
2026-01-07 09:39:46 +00:00

164 lines
4.4 KiB
TypeScript

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 };
};