diff --git a/src/components/PageComponents/ModuleConfig/NeighborInfo.tsx b/src/components/PageComponents/ModuleConfig/NeighborInfo.tsx new file mode 100644 index 00000000..5fb2db93 --- /dev/null +++ b/src/components/PageComponents/ModuleConfig/NeighborInfo.tsx @@ -0,0 +1,51 @@ +import { useDevice } from "@app/core/stores/deviceStore.js"; +import type { NeighborInfoValidation } from "@app/validation/moduleConfig/neighborInfo.js"; +import { DynamicForm } from "@components/Form/DynamicForm.js"; +import { Protobuf } from "@meshtastic/meshtasticjs"; + +export const NeighborInfo = (): JSX.Element => { + const { moduleConfig, setWorkingModuleConfig } = useDevice(); + + const onSubmit = (data: NeighborInfoValidation) => { + setWorkingModuleConfig( + new Protobuf.ModuleConfig({ + payloadVariant: { + case: "neighborInfo", + value: data, + }, + }), + ); + }; + + return ( + + onSubmit={onSubmit} + defaultValues={moduleConfig.neighborInfo} + fieldGroups={[ + { + label: "Neighbor Info Settings", + description: "Settings for the Neighbor Info module", + fields: [ + { + type: "toggle", + name: "enabled", + label: "Enabled", + description: "Enable or disable Neighbor Info Module", + }, + { + type: "number", + name: "updateInterval", + label: "Update Interval", + description: "Interval in seconds of how often we should try to send our Neighbor Info to the mesh", + disabledBy: [ + { + fieldName: "enabled", + }, + ], + }, + ], + }, + ]} + /> + ); +}; diff --git a/src/core/stores/deviceStore.ts b/src/core/stores/deviceStore.ts index 92f95bbf..82968f46 100644 --- a/src/core/stores/deviceStore.ts +++ b/src/core/stores/deviceStore.ts @@ -185,9 +185,6 @@ export const useDeviceStore = create((set, get) => ({ if (device) { switch (config.payloadVariant.case) { - case "detectionSensor": - device.moduleConfig.detectionSensor = config.payloadVariant.value; - break; case "mqtt": device.moduleConfig.mqtt = config.payloadVariant.value; break; @@ -216,6 +213,12 @@ export const useDeviceStore = create((set, get) => ({ break; case "audio": device.moduleConfig.audio = config.payloadVariant.value; + break; + case "detectionSensor": + device.moduleConfig.detectionSensor = config.payloadVariant.value; + break; + case "neighborInfo": + device.moduleConfig.neighborInfo = config.payloadVariant.value; } } }), diff --git a/src/pages/Config/ModuleConfig.tsx b/src/pages/Config/ModuleConfig.tsx index 6d7a5979..56448817 100644 --- a/src/pages/Config/ModuleConfig.tsx +++ b/src/pages/Config/ModuleConfig.tsx @@ -1,3 +1,4 @@ +import { NeighborInfo } from "@app/components/PageComponents/ModuleConfig/NeighborInfo.js"; import { DetectionSensor } from "@app/components/PageComponents/ModuleConfig/DetectionSensor.js"; import { Audio } from "@components/PageComponents/ModuleConfig/Audio.js"; import { CannedMessage } from "@components/PageComponents/ModuleConfig/CannedMessage.js"; @@ -48,6 +49,10 @@ export const ModuleConfig = (): JSX.Element => { label: "Audio", element: Audio, }, + { + label: "Neighbor Info", + element: NeighborInfo, + }, { label: "Detection Sensor", element: DetectionSensor, diff --git a/src/validation/moduleConfig/neighborInfo.ts b/src/validation/moduleConfig/neighborInfo.ts new file mode 100644 index 00000000..180ae9e3 --- /dev/null +++ b/src/validation/moduleConfig/neighborInfo.ts @@ -0,0 +1,17 @@ +import { IsBoolean, IsInt, Length } from "class-validator"; + +import type { Protobuf } from "@meshtastic/meshtasticjs"; + +export class NeighborInfoValidation + implements + Omit< + Protobuf.ModuleConfig_NeighborInfoConfig, + keyof Protobuf.native.Message + > +{ + @IsBoolean() + enabled: boolean; + + @IsInt() + updateInterval: number; +} \ No newline at end of file