Files
Mav-Mobile-UI/src/components/SettingForms/System/SystemConfigFields.tsx

191 lines
7.1 KiB
TypeScript
Raw Normal View History

2025-09-12 13:28:14 +01:00
import { Formik, Field, Form } from "formik";
import FormGroup from "../components/FormGroup";
import { useReboots } from "../../../hooks/useReboots";
2025-09-12 13:28:14 +01:00
import { timezones } from "./timezones";
import SystemFileUpload from "./SystemFileUpload";
import type { SystemValues, SystemValuesErrors } from "../../../types/types";
2025-11-04 17:04:19 +00:00
import { useDNSSettings, useSystemConfig } from "../../../hooks/useSystemConfig";
2025-09-12 13:28:14 +01:00
const SystemConfigFields = () => {
2025-10-20 10:50:16 +01:00
const { saveSystemSettings, systemSettingsData, saveSystemSettingsLoading } = useSystemConfig();
const { hardRebootMutation } = useReboots();
2025-11-04 17:04:19 +00:00
const { dnsQuery, dnsMutation } = useDNSSettings();
2025-11-04 17:04:19 +00:00
const dnsPrimary = dnsQuery?.data?.propNameServerPrimary?.value;
const dnsSecondary = dnsQuery?.data?.propNameServerSecondary?.value;
2025-09-12 13:28:14 +01:00
const initialvalues: SystemValues = {
2025-09-16 14:20:38 +01:00
deviceName: systemSettingsData?.deviceName ?? "",
timeZone: systemSettingsData?.timeZone ?? "",
sntpServer: systemSettingsData?.sntpServer ?? "",
sntpInterval: systemSettingsData?.sntpInterval ?? 60,
2025-11-04 17:04:19 +00:00
serverPrimary: dnsPrimary ?? "",
serverSecondary: dnsSecondary ?? "",
2025-09-12 13:28:14 +01:00
softwareUpdate: null,
};
2025-11-04 17:04:19 +00:00
const handleSubmit = async (values: SystemValues) => {
saveSystemSettings(values);
await dnsMutation.mutateAsync(values);
};
2025-09-12 13:28:14 +01:00
const validateValues = (values: SystemValues) => {
const errors: SystemValuesErrors = {};
const interval = Number(values.sntpInterval);
if (!values.deviceName) errors.deviceName = "Required";
if (!values.timeZone) errors.timeZone = "Required";
2025-10-20 10:50:16 +01:00
if (isNaN(interval) || interval <= 0) errors.sntpInterval = "Cannot be less than 0";
2025-09-12 13:28:14 +01:00
if (!values.sntpServer) errors.sntpServer = "Required";
return errors;
};
// const handleSoftReboot = async () => {
// await softRebootMutation.mutate();
// };
const handleHardReboot = async () => {
await hardRebootMutation.mutate();
};
2025-09-12 13:28:14 +01:00
return (
<Formik
initialValues={initialvalues}
onSubmit={handleSubmit}
validate={validateValues}
2025-09-16 14:20:38 +01:00
enableReinitialize
validateOnChange
validateOnBlur
2025-09-12 13:28:14 +01:00
>
{({ values, errors, touched, isSubmitting }) => (
2025-09-26 13:58:14 +01:00
<Form className="flex flex-col space-y-5 px-2">
2025-09-12 13:28:14 +01:00
<FormGroup>
2025-10-20 10:50:16 +01:00
<label htmlFor="deviceName" className="font-medium whitespace-nowrap md:w-1/2 text-left">
2025-09-12 13:28:14 +01:00
Device Name
</label>
{touched.deviceName && errors.deviceName && (
2025-10-20 10:50:16 +01:00
<small className="absolute right-0 -top-5 text-red-500">{errors.deviceName}</small>
2025-09-12 13:28:14 +01:00
)}
<Field
id="deviceName"
name="deviceName"
type="text"
className="p-2 border border-gray-400 rounded-lg w-full max-w-xs"
placeholder="Enter device name"
2025-09-16 14:20:38 +01:00
autoComplete="off"
2025-09-12 13:28:14 +01:00
/>
</FormGroup>
<FormGroup>
2025-10-20 10:50:16 +01:00
<label htmlFor="timeZone" className="font-medium whitespace-nowrap md:w-1/2 text-left">
2025-09-12 13:28:14 +01:00
Local Time Zone
</label>
{touched.timeZone && errors.timeZone && (
2025-10-20 10:50:16 +01:00
<small className="absolute right-0 -top-5 text-red-500">{errors.timeZone}</small>
2025-09-12 13:28:14 +01:00
)}
<Field
id="timeZone"
name="timeZone"
as="select"
className="p-2 border border-gray-400 rounded-lg text-white bg-[#253445] w-full max-w-xs"
>
2025-09-16 14:20:38 +01:00
<option value="">Select a timezone</option>
2025-09-12 13:28:14 +01:00
{timezones.map((timezone) => (
<option value={timezone.value} key={timezone.label}>
{timezone.label}
</option>
))}
</Field>
</FormGroup>
<FormGroup>
2025-10-20 10:50:16 +01:00
<label htmlFor="sntpServer" className="font-medium whitespace-nowrap md:w-1/2 text-left">
2025-09-12 13:28:14 +01:00
SNTP Server
</label>
{touched.sntpServer && errors.sntpServer && (
2025-10-20 10:50:16 +01:00
<small className="absolute right-0 -top-5 text-red-500">{errors.sntpServer}</small>
2025-09-12 13:28:14 +01:00
)}
<Field
id="sntpServer"
name="sntpServer"
type="text"
className="p-2 border border-gray-400 rounded-lg w-full max-w-xs"
placeholder="Enter SNTP server address"
2025-09-16 14:20:38 +01:00
autoComplete="off"
2025-09-12 13:28:14 +01:00
/>
</FormGroup>
<FormGroup>
<label htmlFor="sntpInterval" className="font-medium whitespace-nowrap md:w-1/2 text-left">
SNTP Interval minutes
</label>
{touched.sntpInterval && errors.sntpInterval && (
<small className="absolute right-0 -top-5 text-red-500">{errors.sntpInterval}</small>
)}
<Field
id="sntpInterval"
name="sntpInterval"
type="number"
min={1}
inputMode="numeric"
className="p-2 border border-gray-400 rounded-lg w-full max-w-xs"
/>
</FormGroup>
2025-11-04 17:04:19 +00:00
<FormGroup>
<label htmlFor="serverPrimary" className="font-medium whitespace-nowrap md:w-1/2 text-left">
Primary DNS Server
2025-11-04 17:04:19 +00:00
</label>
<Field
id="serverPrimary"
name="serverPrimary"
type="text"
className="p-2 border border-gray-400 rounded-lg w-full max-w-xs"
placeholder="Enter DNS primary address"
autoComplete="off"
/>
</FormGroup>
<FormGroup>
<label htmlFor="serverSecondary" className="font-medium whitespace-nowrap md:w-1/2 text-left">
Secondary DNS Server
2025-11-04 17:04:19 +00:00
</label>
<Field
id="serverSecondary"
name="serverSecondary"
type="text"
className="p-2 border border-gray-400 rounded-lg w-full max-w-xs"
placeholder="Enter DNS secondary address"
autoComplete="off"
/>
</FormGroup>
2025-09-12 13:28:14 +01:00
<button
type="submit"
2025-10-20 10:50:16 +01:00
className="w-1/4 text-white bg-green-700 hover:bg-green-800 font-small rounded-lg text-sm px-2 py-2.5"
disabled={isSubmitting}
2025-09-12 13:28:14 +01:00
>
{saveSystemSettingsLoading ? "Saving..." : "Save System Settings"}
2025-09-12 13:28:14 +01:00
</button>
2025-10-20 10:50:16 +01:00
<SystemFileUpload name={"softwareUpdate"} selectedFile={values.softwareUpdate} />
<div className="border-b border-gray-600">
<p>Reboot</p>
</div>
{/* <button
2025-09-16 14:20:38 +01:00
type="button"
className="bg-red-600 text-white px-4 py-2 rounded hover:bg-red-700 transition w-full md:w-[50%]"
2025-09-12 13:28:14 +01:00
onClick={handleSoftReboot}
>
2025-10-20 10:50:16 +01:00
{softRebootMutation.isPending || isSubmitting ? "Rebooting..." : "Software Reboot"}
</button> */}
2025-09-12 13:28:14 +01:00
<button
2025-09-16 14:20:38 +01:00
type="button"
className="bg-red-600 text-white px-4 py-2 rounded hover:bg-red-700 transition w-full md:w-[50%]"
2025-09-12 13:28:14 +01:00
onClick={handleHardReboot}
>
2025-10-20 10:50:16 +01:00
{hardRebootMutation.isPending || isSubmitting ? "Rebooting" : "Hardware Reboot"}
2025-09-12 13:28:14 +01:00
</button>
</Form>
)}
</Formik>
);
};
export default SystemConfigFields;