diff --git a/.env b/.env
index 8914832..6c5ddb9 100644
--- a/.env
+++ b/.env
@@ -1,5 +1,5 @@
VITE_BASEURL=http://192.168.75.11/
-VITE_CAM_BASE=http://100.72.72.70:8080
+VITE_CAM_BASE=http://100.118.196.113:8080
VITE_FOLKESTONE_BASE=http://100.116.253.81
VITE_TESTURL=http://100.82.205.44/SightingListRear/sightingSummary?mostRecentRef=-1
VITE_OUTSIDE_BASEURL=http://100.82.205.44
diff --git a/src/components/SettingForms/WiFi&Modem/ModemCard.tsx b/src/components/SettingForms/WiFi&Modem/ModemCard.tsx
index 79bcc52..dcc2dfc 100644
--- a/src/components/SettingForms/WiFi&Modem/ModemCard.tsx
+++ b/src/components/SettingForms/WiFi&Modem/ModemCard.tsx
@@ -1,96 +1,13 @@
import Card from "../../UI/Card";
import CardHeader from "../../UI/CardHeader";
-import { useState } from "react";
-import FormGroup from "../components/FormGroup";
+import ModemSettings from "./ModemSettings";
const ModemCard = () => {
- const [apn, setApn] = useState("");
- const [username, setUsername] = useState("");
- const [password, setPassword] = useState("");
- const [authType, setAuthType] = useState("PAP");
-
return (
- // TODO: Add switch for Auto vs Manual settings
-
-
-
- setApn(e.target.value)}
- />
-
-
-
- setUsername(e.target.value)}
- />
-
-
-
- setPassword(e.target.value)}
- />
-
-
-
-
-
-
-
+
+
);
};
diff --git a/src/components/SettingForms/WiFi&Modem/ModemSettings.tsx b/src/components/SettingForms/WiFi&Modem/ModemSettings.tsx
new file mode 100644
index 0000000..ccf6402
--- /dev/null
+++ b/src/components/SettingForms/WiFi&Modem/ModemSettings.tsx
@@ -0,0 +1,148 @@
+import { Formik, Form, Field } from "formik";
+import FormGroup from "../components/FormGroup";
+import type { ModemSettingsType } from "../../../types/types";
+import { useWifiAndModem } from "../../../hooks/useCameraWifiandModem";
+import { useEffect, useState } from "react";
+import ModemToggle from "./ModemToggle";
+import { toast } from "sonner";
+
+const ModemSettings = () => {
+ const [showSettings, setShowSettings] = useState(false);
+ const { modemQuery, modemMutation } = useWifiAndModem();
+
+ const apn = modemQuery?.data?.propAPN?.value;
+ const username = modemQuery?.data?.propUsername.value;
+ const password = modemQuery?.data?.propPassword?.value;
+ const mode = modemQuery?.data?.propMode?.value;
+
+ useEffect(() => {
+ setShowSettings(mode === "AUTO");
+ }, [mode]);
+
+ const inititalValues = {
+ apn: apn ?? "",
+ username: username ?? "",
+ password: password ?? "",
+ authenticationType: "PAP",
+ };
+
+ const handleSubmit = (values: ModemSettingsType) => {
+ const modemConfig = {
+ id: "ModemAndWifiManager-modem",
+ fields: [
+ {
+ property: "propAPN",
+ value: values.apn,
+ },
+ {
+ property: "propPassword",
+ value: values.password,
+ },
+ {
+ property: "propUsername",
+ value: values.username,
+ },
+
+ {
+ property: "propMode",
+ value: showSettings ? "AUTO" : "MANUAL",
+ },
+ ],
+ };
+ modemMutation.mutate(modemConfig);
+ if (modemMutation.error) {
+ toast.error("Failed to update modem settings");
+ return;
+ }
+ toast.success("Modem settings updated");
+ };
+
+ return (
+ <>
+
+ {!showSettings && (
+
+
+
+ )}
+ >
+ );
+};
+
+export default ModemSettings;
diff --git a/src/components/SettingForms/WiFi&Modem/ModemToggle.tsx b/src/components/SettingForms/WiFi&Modem/ModemToggle.tsx
new file mode 100644
index 0000000..dab4f41
--- /dev/null
+++ b/src/components/SettingForms/WiFi&Modem/ModemToggle.tsx
@@ -0,0 +1,30 @@
+type ModemToggleProps = {
+ showSettings: boolean;
+ onShowSettings: (showSettings: boolean) => void;
+};
+
+const ModemToggle = ({ showSettings, onShowSettings }: ModemToggleProps) => {
+ return (
+
+
+
+ );
+};
+
+export default ModemToggle;
diff --git a/src/components/SettingForms/WiFi&Modem/WiFiCard.tsx b/src/components/SettingForms/WiFi&Modem/WiFiCard.tsx
index 12345f9..ce28728 100644
--- a/src/components/SettingForms/WiFi&Modem/WiFiCard.tsx
+++ b/src/components/SettingForms/WiFi&Modem/WiFiCard.tsx
@@ -1,78 +1,12 @@
import Card from "../../UI/Card";
import CardHeader from "../../UI/CardHeader";
-import { useState } from "react";
-import FormGroup from "../components/FormGroup";
+import WiFiSettingsForm from "./WiFiSettingsForm";
const WiFiCard = () => {
- const [ssid, setSsid] = useState("");
- const [password, setPassword] = useState("");
- const [encryption, setEncryption] = useState("WPA2");
-
return (
-
-
-
- setSsid(e.target.value)}
- />
-
-
-
- setPassword(e.target.value)}
- />
-
-
-
-
-
-
-
+
);
};
diff --git a/src/components/SettingForms/WiFi&Modem/WiFiSettingsForm.tsx b/src/components/SettingForms/WiFi&Modem/WiFiSettingsForm.tsx
new file mode 100644
index 0000000..6d1588b
--- /dev/null
+++ b/src/components/SettingForms/WiFi&Modem/WiFiSettingsForm.tsx
@@ -0,0 +1,111 @@
+import { Field, Form, Formik } from "formik";
+import FormGroup from "../components/FormGroup";
+import type { WifiSettingValues } from "../../../types/types";
+import { useWifiAndModem } from "../../../hooks/useCameraWifiandModem";
+import { toast } from "sonner";
+
+const WiFiSettingsForm = () => {
+ const { wifiQuery, wifiMutation } = useWifiAndModem();
+
+ const wifiSSID = wifiQuery?.data?.propSSID?.value;
+ const wifiPassword = wifiQuery?.data?.propPassword?.value;
+
+ const initialValues = {
+ ssid: wifiSSID ?? "",
+ password: wifiPassword ?? "",
+ encryption: "WPA2",
+ };
+
+ const handleSubmit = (values: WifiSettingValues) => {
+ const wifiConfig = {
+ id: "ModemAndWifiManager-wifi",
+ fields: [
+ {
+ property: "propSSID",
+ value: values.ssid,
+ },
+ {
+ property: "propPassword",
+ value: values.password,
+ },
+ ],
+ };
+
+ wifiMutation.mutate(wifiConfig);
+ //todo: check what response is
+ if (wifiMutation.error) {
+ toast.error("Failed to update WiFi settings");
+ return;
+ }
+ toast.success("WiFi settings updated");
+ };
+ return (
+
+ {() => (
+
+ )}
+
+ );
+};
+
+export default WiFiSettingsForm;
diff --git a/src/components/UI/Header.tsx b/src/components/UI/Header.tsx
index 2de4734..daceab3 100644
--- a/src/components/UI/Header.tsx
+++ b/src/components/UI/Header.tsx
@@ -32,7 +32,7 @@ export default function Header() {
};
return (
-
+

diff --git a/src/hooks/useCameraWifiandModem.ts b/src/hooks/useCameraWifiandModem.ts
new file mode 100644
index 0000000..d501a6b
--- /dev/null
+++ b/src/hooks/useCameraWifiandModem.ts
@@ -0,0 +1,83 @@
+import { useQuery, useMutation } from "@tanstack/react-query";
+import { CAM_BASE } from "../utils/config";
+import type { ModemConfig, WifiConfig } from "../types/types";
+
+const getWiFiSettings = async () => {
+ const response = await fetch(
+ `${CAM_BASE}/api/fetch-config?id=ModemAndWifiManager-wifi`
+ );
+ if (!response.ok) {
+ throw new Error("Cannot fetch Wifi settings");
+ }
+ return response.json();
+};
+
+const updateWifiSettings = async (wifiConfig: WifiConfig) => {
+ const response = await fetch(
+ `${CAM_BASE}/api/update-config?id=ModemAndWifiManager-wifi`,
+ {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify(wifiConfig),
+ }
+ );
+ if (!response.ok) {
+ throw new Error("Cannot update wifi settings");
+ }
+ return response.json();
+};
+
+const getModemSettings = async () => {
+ const response = await fetch(
+ `${CAM_BASE}/api/fetch-config?id=ModemAndWifiManager-modem`
+ );
+ if (!response.ok) {
+ throw new Error("Cannot fetch modem settings");
+ }
+ return response.json();
+};
+
+const updateModemSettings = async (modemConfig: ModemConfig) => {
+ const response = await fetch(
+ `${CAM_BASE}/api/update-config?id=ModemAndWifiManager-modem`,
+ {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify(modemConfig),
+ }
+ );
+ if (!response.ok) {
+ throw new Error("cannot update modem settings");
+ }
+ return response.json();
+};
+
+export const useWifiAndModem = () => {
+ const wifiQuery = useQuery({
+ queryKey: ["getWifiSettings"],
+ queryFn: getWiFiSettings,
+ });
+
+ const wifiMutation = useMutation({
+ mutationKey: ["updateWifiSettings"],
+ mutationFn: (wifiConfig: WifiConfig) => updateWifiSettings(wifiConfig),
+ onError: (error) => console.log(error),
+ });
+
+ const modemQuery = useQuery({
+ queryKey: ["getModemSettings"],
+ queryFn: getModemSettings,
+ });
+
+ const modemMutation = useMutation({
+ mutationKey: ["updateModemSettings"],
+ mutationFn: (modemConfig: ModemConfig) => updateModemSettings(modemConfig),
+ });
+
+ return {
+ wifiQuery,
+ wifiMutation,
+ modemQuery,
+ modemMutation,
+ };
+};
diff --git a/src/types/types.ts b/src/types/types.ts
index b72161f..234d015 100644
--- a/src/types/types.ts
+++ b/src/types/types.ts
@@ -262,6 +262,30 @@ export type ZoomLevel = {
level?: number;
};
+export type WifiSettingValues = {
+ ssid: string;
+ password: string;
+ encryption: string;
+};
+export type ModemConfigPayload = {
+ property: string;
+ value: string;
+};
+export type WifiConfigPayload = {
+ property: string;
+ value: string;
+};
+
+export type WifiConfig = {
+ id: string;
+ fields: WifiConfigPayload[];
+};
+
+export type ModemConfig = {
+ id: string;
+ fields: ModemConfigPayload[];
+};
+
export type ZoomInOptions = {
camera: string;
multiplier: number;
@@ -270,3 +294,10 @@ export type ZoomInOptions = {
export type zoomConfig = {
camera: string;
};
+
+export type ModemSettingsType = {
+ apn: string;
+ username: string;
+ password: string;
+ authenticationType: string;
+};