From 97ff9a981d8aa97437b61cef4b31b6c98683a831 Mon Sep 17 00:00:00 2001 From: Toba Ojo Date: Wed, 26 Nov 2025 15:31:19 +0000 Subject: [PATCH] - added form fetch and post for optional constants for UTMC --- .../dashboard/components/SystemHealth.tsx | 1 - .../output/components/ChannelFields.tsx | 21 ++++++- .../output/components/OutputForms.tsx | 31 +++++++--- .../output/hooks/useOptionalConstants.tsx | 62 +++++++++++++++++++ src/types/types.ts | 8 +++ 5 files changed, 113 insertions(+), 10 deletions(-) diff --git a/src/features/dashboard/components/SystemHealth.tsx b/src/features/dashboard/components/SystemHealth.tsx index 4a21206..f6cee37 100644 --- a/src/features/dashboard/components/SystemHealth.tsx +++ b/src/features/dashboard/components/SystemHealth.tsx @@ -19,7 +19,6 @@ const SystemHealth = ({ startTime, uptime, statuses, isLoading, isError, dateUpd if (isLoading) { return Loading system health…; } - console.log(statuses); return (
diff --git a/src/features/output/components/ChannelFields.tsx b/src/features/output/components/ChannelFields.tsx index 6162946..b3ab4c4 100644 --- a/src/features/output/components/ChannelFields.tsx +++ b/src/features/output/components/ChannelFields.tsx @@ -1,6 +1,7 @@ import { Field } from "formik"; import type { FormTypes, InitialValuesFormErrors, OutputDataResponse } from "../../../types/types"; import { useEffect, useMemo } from "react"; +import { useOptionalConstants } from "../hooks/useOptionalConstants"; type ChannelFieldsProps = { values: FormTypes; @@ -14,6 +15,8 @@ type ChannelFieldsProps = { }; const ChannelFields = ({ errors, touched, values, outputData, onSetFieldValue }: ChannelFieldsProps) => { + const { optionalConstantsQuery } = useOptionalConstants(outputData?.id?.split("-")[1] || ""); + const optionalConstants = optionalConstantsQuery?.data; const channelFieldsObject = useMemo(() => { return { connectTimeoutSeconds: outputData?.propConnectTimeoutSeconds?.value || "5", @@ -21,8 +24,22 @@ const ChannelFields = ({ errors, touched, values, outputData, onSetFieldValue }: backOfficeURL: outputData?.propBackofficeURL?.value || "", username: outputData?.propUsername?.value || "", password: outputData?.propPassword?.value || "", + SCID: optionalConstants?.propSourceIdentifier?.value || "", + timestampSource: optionalConstants?.propTimeZoneType?.value || "UTC", + GPSFormat: optionalConstants?.propGpsFormat?.value || "Minutes", + FFID: optionalConstants?.propFeedIdentifier?.value || "", }; - }, [outputData]); + }, [ + optionalConstants?.propFeedIdentifier?.value, + optionalConstants?.propGpsFormat?.value, + optionalConstants?.propSourceIdentifier?.value, + optionalConstants?.propTimeZoneType?.value, + outputData?.propBackofficeURL?.value, + outputData?.propConnectTimeoutSeconds?.value, + outputData?.propPassword?.value, + outputData?.propReadTimeoutSeconds?.value, + outputData?.propUsername?.value, + ]); useEffect(() => { for (const [key, value] of Object.entries(channelFieldsObject)) { @@ -194,7 +211,7 @@ const ChannelFields = ({ errors, touched, values, outputData, onSetFieldValue }: className="p-2 border border-gray-400 rounded-lg text-white bg-[#253445] w-full md:w-60" > - +
diff --git a/src/features/output/components/OutputForms.tsx b/src/features/output/components/OutputForms.tsx index 8f8fe88..aa52ece 100644 --- a/src/features/output/components/OutputForms.tsx +++ b/src/features/output/components/OutputForms.tsx @@ -1,15 +1,21 @@ import { Formik, Form } from "formik"; import BearerTypeCard from "./BearerTypeCard"; import ChannelCard from "./ChannelCard"; -import type { BearerTypeFields, FormTypes, OptionalBOF2Constants } from "../../../types/types"; +import type { BearerTypeFields, FormTypes, OptionalBOF2Constants, OptionalUTMCConstants } from "../../../types/types"; import { usePostBearerConfig } from "../hooks/useBearer"; import { useDispatcherConfig } from "../hooks/useDispatcherConfig"; +import { useOptionalConstants } from "../hooks/useOptionalConstants"; const OutputForms = () => { const { bearerMutation } = usePostBearerConfig(); const { dispatcherQuery, dispatcherMutation } = useDispatcherConfig(); const format = dispatcherQuery?.data?.propFormat?.value; + const { optionalConstantsQuery, optionalConstantsMutation } = useOptionalConstants(format?.toLowerCase()); + const FFID = optionalConstantsQuery?.data?.propFeedIdentifier?.value; + const SCID = optionalConstantsQuery?.data?.propSourceIdentifier?.value; + const timestampSource = optionalConstantsQuery?.data?.propTimeZoneType?.value; + const gpsFormat = optionalConstantsQuery?.data?.propGpsFormat?.value; const inititalValues: FormTypes = { format: format ?? "JSON", @@ -22,11 +28,11 @@ const OutputForms = () => { overviewQuality: "HIGH", cropSizeFactor: "3/4", - // Bof2 -optional constants - FFID: "", - SCID: "", - timestampSource: "UTC", - GPSFormat: "Minutes", + // optional constants + FFID: FFID ?? "", + SCID: SCID ?? "", + timestampSource: timestampSource ?? "UTC", + GPSFormat: gpsFormat ?? "Minutes", //BOF2 - optional Lane IDs laneId: "", @@ -56,14 +62,25 @@ const OutputForms = () => { if (result?.id) { await bearerMutation.mutateAsync(bearerFields); + if (values.format === "BOF2") { const optionalBOF2Fields: OptionalBOF2Constants = { + format: values.format, FFID: values.FFID, SCID: values.SCID, timestampSource: values.timestampSource, GPSFormat: values.GPSFormat, }; - console.log("Submit BOF2 optional fields:", optionalBOF2Fields); + await optionalConstantsMutation.mutateAsync(optionalBOF2Fields); + } + if (values.format === "UTMC") { + const optionalUTMCFields: OptionalUTMCConstants = { + format: values.format, + SCID: values.SCID, + timestampSource: values.timestampSource, + GPSFormat: values.GPSFormat, + }; + await optionalConstantsMutation.mutateAsync(optionalUTMCFields); } } }; diff --git a/src/features/output/hooks/useOptionalConstants.tsx b/src/features/output/hooks/useOptionalConstants.tsx index e69de29..2ddb1f8 100644 --- a/src/features/output/hooks/useOptionalConstants.tsx +++ b/src/features/output/hooks/useOptionalConstants.tsx @@ -0,0 +1,62 @@ +import { useQuery, useMutation } from "@tanstack/react-query"; +import type { OptionalBOF2Constants } from "../../../types/types"; + +const fetchOptionalConstants = async (format: string) => { + if (!format || format === "json") return null; + const response = await fetch(`http://100.115.148.59/api/fetch-config?id=Dispatcher0-${format}-constants`); + if (!response.ok) { + throw new Error("Network response was not ok"); + } + return response.json(); +}; + +const postOptionalConstants = async (config: OptionalBOF2Constants) => { + const fields = [ + { + property: "propSourceIdentifier", + value: config?.SCID, + }, + { + property: "propTimeZoneType", + value: config?.timestampSource, + }, + { + property: "propGpsFormat", + value: config?.GPSFormat, + }, + ]; + + if (config.FFID) { + fields.push({ + property: "propFeedIdentifier", + value: config.FFID, + }); + } + const updateConfigPayload = { + id: `Dispatcher0-${config.format?.toLowerCase()}-constants`, + fields: fields, + }; + + const response = await fetch(`http://100.115.148.59/api/update-config`, { + method: "POST", + body: JSON.stringify(updateConfigPayload), + }); + if (!response.ok) { + throw new Error("Network response was not ok"); + } + return response.json(); +}; + +export const useOptionalConstants = (format: string) => { + const optionalConstantsQuery = useQuery({ + queryKey: ["optionalConstants", format], + queryFn: () => fetchOptionalConstants(format), + enabled: !!format && format !== "json", + }); + + const optionalConstantsMutation = useMutation({ + mutationKey: ["postOptionalConstants"], + mutationFn: postOptionalConstants, + }); + return { optionalConstantsQuery, optionalConstantsMutation }; +}; diff --git a/src/types/types.ts b/src/types/types.ts index 4477f7a..cf5bbb7 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -76,11 +76,19 @@ export type DispatcherConfig = { }; export type OptionalBOF2Constants = { + format?: string; FFID?: string; SCID?: string; timestampSource?: string; GPSFormat?: string; }; + +export type OptionalUTMCConstants = { + format?: string; + SCID?: string; + timestampSource?: string; + GPSFormat?: string; +}; export type OptionalBOF2LaneIDs = { laneId?: string; LID1?: string;