import { Formik, Field, Form } from "formik"; import type { CameraConfig, CameraSettingErrorValues, CameraSettingValues, ZoomInOptions, } from "../../types/types"; import { useEffect, useMemo, useState } from "react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faEye, faEyeSlash } from "@fortawesome/free-regular-svg-icons"; import CardHeader from "../UI/CardHeader"; import { useCameraZoom } from "../../hooks/useCameraZoom"; import { parseRTSPUrl } from "../../utils/utils"; type CameraSettingsProps = { initialData: CameraConfig; updateCameraConfig: (values: CameraSettingValues) => Promise | void; zoomLevel?: number; onZoomLevelChange?: (level: number) => void; updateCameraConfigError: null | Error; }; const CameraSettingFields = ({ initialData, updateCameraConfig, zoomLevel, onZoomLevelChange, updateCameraConfigError, }: CameraSettingsProps) => { const [showPwd, setShowPwd] = useState(false); const cameraControllerSide = initialData?.id === "CameraA" ? "CameraControllerA" : "CameraControllerB"; const { mutation, query } = useCameraZoom({ camera: cameraControllerSide }); const zoomOptions = [1, 2, 4, 8]; const parsed = parseRTSPUrl(initialData?.propURI?.value); useEffect(() => { if (!query?.data) return; const apiZoom = getZoomLevel(query.data); onZoomLevelChange?.(apiZoom); }, [query?.data, onZoomLevelChange]); const getZoomLevel = (levelstring: string | undefined) => { switch (levelstring) { case "1x": return 1; case "2x": return 2; case "4x": return 4; case "8x": return 8; default: return 1; } }; const initialValues = useMemo( () => ({ friendlyName: initialData?.id ?? "", cameraAddress: initialData?.propURI?.value ?? "", userName: parsed?.username ?? "", password: parsed?.password ?? "", id: initialData?.id, zoom: zoomLevel, }), // eslint-disable-next-line react-hooks/exhaustive-deps [initialData?.id, initialData?.propURI?.value, zoomLevel] ); const validateValues = (values: CameraSettingValues) => { const errors: CameraSettingErrorValues = {}; if (!values.friendlyName) errors.friendlyName = "Required"; if (!values.cameraAddress) errors.cameraAddress = "Required"; return errors; }; const handleSubmit = (values: CameraSettingValues) => { updateCameraConfig(values); }; const handleRadioButtonChange = async (levelNumber: number) => { if (!onZoomLevelChange || !zoomLevel) return; onZoomLevelChange(levelNumber); const zoomInOptions: ZoomInOptions = { camera: cameraControllerSide, multiplier: levelNumber, }; mutation.mutate(zoomInOptions); }; const selectedZoom = zoomLevel ?? 1; return ( {({ errors, touched }) => (
{touched.friendlyName && errors.friendlyName && ( {errors.friendlyName} )}
{touched.cameraAddress && errors.cameraAddress && ( {errors.cameraAddress} )}
{touched.userName && errors.userName && ( {errors.userName} )}
{touched.password && errors.password && ( {errors.password} )}
setShowPwd((s) => !s)} icon={showPwd ? faEyeSlash : faEye} />
{zoomOptions.map((zoom) => (
handleRadioButtonChange(zoom)} />
))}
{updateCameraConfigError ? ( ) : ( )}
)}
); }; export default CameraSettingFields;