feat: add udp over mesh toggle
This commit is contained in:
@@ -39,15 +39,11 @@ export function SelectInput<T extends FieldValues>({
|
|||||||
disabled,
|
disabled,
|
||||||
field,
|
field,
|
||||||
}: GenericFormElementProps<T, SelectFieldProps<T>>) {
|
}: GenericFormElementProps<T, SelectFieldProps<T>>) {
|
||||||
// Get default value and set it
|
|
||||||
const defaultValue = field.properties.defaultValue ?? field.defaultValue;
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
field: { value, onChange, ...rest },
|
field: { value, onChange, ...rest },
|
||||||
} = useController({
|
} = useController({
|
||||||
name: field.name,
|
name: field.name,
|
||||||
control,
|
control,
|
||||||
defaultValue: defaultValue ? defaultValue.toString() : undefined,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const { enumValue, formatEnumName, ...remainingProperties } = field.properties;
|
const { enumValue, formatEnumName, ...remainingProperties } = field.properties;
|
||||||
@@ -80,7 +76,6 @@ export function SelectInput<T extends FieldValues>({
|
|||||||
onValueChange={handleValueChange}
|
onValueChange={handleValueChange}
|
||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
value={value?.toString()}
|
value={value?.toString()}
|
||||||
defaultValue={defaultValue?.toString()}
|
|
||||||
{...remainingProperties}
|
{...remainingProperties}
|
||||||
{...rest}
|
{...rest}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import type { NetworkValidation } from "@app/validation/config/network.ts";
|
import { NetworkValidationSchema, type NetworkValidation } from "@app/validation/config/network.ts";
|
||||||
import { create } from "@bufbuild/protobuf";
|
import { create } from "@bufbuild/protobuf";
|
||||||
import { DynamicForm } from "@components/Form/DynamicForm.tsx";
|
import { DynamicForm } from "@components/Form/DynamicForm.tsx";
|
||||||
import { useDevice } from "@core/stores/deviceStore.ts";
|
import { useDevice } from "@core/stores/deviceStore.ts";
|
||||||
@@ -7,13 +7,19 @@ import {
|
|||||||
convertIpAddressToInt,
|
convertIpAddressToInt,
|
||||||
} from "@core/utils/ip.ts";
|
} from "@core/utils/ip.ts";
|
||||||
import { Protobuf } from "@meshtastic/core";
|
import { Protobuf } from "@meshtastic/core";
|
||||||
|
import { validateSchema } from "@app/validation/validate.ts";
|
||||||
|
|
||||||
export const Network = () => {
|
export const Network = () => {
|
||||||
const { config, setWorkingConfig } = useDevice();
|
const { config, setWorkingConfig } = useDevice();
|
||||||
|
|
||||||
const onSubmit = (data: NetworkValidation) => {
|
console.log(config.network);
|
||||||
|
|
||||||
console.log("Network data", data);
|
const onSubmit = (data: NetworkValidation) => {
|
||||||
|
const result = validateSchema(NetworkValidationSchema, data);
|
||||||
|
|
||||||
|
if (!result.success) {
|
||||||
|
console.error("Validation errors:", result.errors);
|
||||||
|
}
|
||||||
|
|
||||||
setWorkingConfig(
|
setWorkingConfig(
|
||||||
create(Protobuf.Config.ConfigSchema, {
|
create(Protobuf.Config.ConfigSchema, {
|
||||||
@@ -24,10 +30,10 @@ export const Network = () => {
|
|||||||
ipv4Config: create(
|
ipv4Config: create(
|
||||||
Protobuf.Config.Config_NetworkConfig_IpV4ConfigSchema,
|
Protobuf.Config.Config_NetworkConfig_IpV4ConfigSchema,
|
||||||
{
|
{
|
||||||
ip: convertIpAddressToInt(data?.ipv4Config?.ip) ?? 0,
|
ip: convertIpAddressToInt(data.ipv4Config?.ip ?? ""),
|
||||||
gateway: convertIpAddressToInt(data.ipv4Config.gateway) ?? 0,
|
gateway: convertIpAddressToInt(data.ipv4Config?.gateway ?? ""),
|
||||||
subnet: convertIpAddressToInt(data.ipv4Config.subnet) ?? 0,
|
subnet: convertIpAddressToInt(data.ipv4Config?.subnet ?? ""),
|
||||||
dns: convertIpAddressToInt(data.ipv4Config.dns) ?? 0,
|
dns: convertIpAddressToInt(data.ipv4Config?.dns ?? ""),
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
@@ -51,6 +57,8 @@ export const Network = () => {
|
|||||||
),
|
),
|
||||||
dns: convertIntToIpAddress(config.network?.ipv4Config?.dns ?? 0),
|
dns: convertIntToIpAddress(config.network?.ipv4Config?.dns ?? 0),
|
||||||
},
|
},
|
||||||
|
enabledProtocols: config.network?.enabledProtocols ?? Protobuf.Config.Config_NetworkConfig_ProtocolFlags.NO_BROADCAST
|
||||||
|
|
||||||
}}
|
}}
|
||||||
fieldGroups={[
|
fieldGroups={[
|
||||||
{
|
{
|
||||||
@@ -175,7 +183,7 @@ export const Network = () => {
|
|||||||
{
|
{
|
||||||
type: "select",
|
type: "select",
|
||||||
name: "enabledProtocols",
|
name: "enabledProtocols",
|
||||||
label: "Mesh via UDP enabled",
|
label: "Mesh via UDP",
|
||||||
properties: {
|
properties: {
|
||||||
enumValue:
|
enumValue:
|
||||||
Protobuf.Config.Config_NetworkConfig_ProtocolFlags,
|
Protobuf.Config.Config_NetworkConfig_ProtocolFlags,
|
||||||
|
|||||||
@@ -31,7 +31,6 @@ export const DeviceConfig = () => {
|
|||||||
{
|
{
|
||||||
label: "Network",
|
label: "Network",
|
||||||
element: Network,
|
element: Network,
|
||||||
// disabled: !metadata.get(0)?.hasWifi,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Display",
|
label: "Display",
|
||||||
|
|||||||
@@ -1,64 +1,27 @@
|
|||||||
import type { Message } from "@bufbuild/protobuf";
|
import { z } from "zod";
|
||||||
import { Protobuf } from "@meshtastic/core";
|
import { Protobuf } from "@meshtastic/core";
|
||||||
import {
|
|
||||||
IsBoolean,
|
|
||||||
IsEnum,
|
|
||||||
IsIP,
|
|
||||||
IsOptional,
|
|
||||||
IsString,
|
|
||||||
Length,
|
|
||||||
} from "class-validator";
|
|
||||||
|
|
||||||
export class NetworkValidation
|
const AddressModeEnum = z.nativeEnum(Protobuf.Config.Config_NetworkConfig_AddressMode);
|
||||||
implements
|
const ProtocolFlagsEnum = z.nativeEnum(Protobuf.Config.Config_NetworkConfig_ProtocolFlags);
|
||||||
Omit<Protobuf.Config.Config_NetworkConfig, keyof Message | "ipv4Config"> {
|
|
||||||
@IsBoolean()
|
|
||||||
wifiEnabled: boolean;
|
|
||||||
|
|
||||||
@Length(1, 33)
|
export const NetworkValidationIpV4ConfigSchema = z.object({
|
||||||
@IsOptional({})
|
ip: z.string().ip(),
|
||||||
wifiSsid: string;
|
gateway: z.string().ip(),
|
||||||
|
subnet: z.string().ip(),
|
||||||
|
dns: z.string().ip(),
|
||||||
|
});
|
||||||
|
|
||||||
@Length(8, 64)
|
export const NetworkValidationSchema = z.object({
|
||||||
@IsOptional()
|
wifiEnabled: z.boolean(),
|
||||||
wifiPsk: string;
|
wifiSsid: z.string().min(0).max(33).optional(),
|
||||||
|
wifiPsk: z.string().min(0).max(64).optional(),
|
||||||
|
ntpServer: z.string().min(2).max(30),
|
||||||
|
ethEnabled: z.boolean(),
|
||||||
|
addressMode: AddressModeEnum,
|
||||||
|
ipv4Config: NetworkValidationIpV4ConfigSchema.optional(),
|
||||||
|
enabledProtocols: ProtocolFlagsEnum,
|
||||||
|
rsyslogServer: z.string(),
|
||||||
|
});
|
||||||
|
|
||||||
@Length(2, 30)
|
export type NetworkValidation = z.infer<typeof NetworkValidationSchema>;
|
||||||
ntpServer: string;
|
|
||||||
|
|
||||||
@IsBoolean()
|
|
||||||
ethEnabled: boolean;
|
|
||||||
|
|
||||||
@IsEnum(Protobuf.Config.Config_NetworkConfig_AddressMode)
|
|
||||||
addressMode: Protobuf.Config.Config_NetworkConfig_AddressMode;
|
|
||||||
|
|
||||||
ipv4Config: NetworkValidationIpV4Config;
|
|
||||||
|
|
||||||
@IsEnum(Protobuf.Config.Config_NetworkConfig_EnabledProtocols)
|
|
||||||
enabledProtocols: Protobuf.Config.Config_NetworkConfig_ProtocolFlags;
|
|
||||||
|
|
||||||
@IsString()
|
|
||||||
rsyslogServer: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class NetworkValidationIpV4Config implements
|
|
||||||
Omit<
|
|
||||||
Protobuf.Config.Config_NetworkConfig_IpV4Config,
|
|
||||||
keyof Message | "ip" | "gateway" | "subnet" | "dns"
|
|
||||||
> {
|
|
||||||
@IsIP()
|
|
||||||
@IsOptional()
|
|
||||||
ip: string;
|
|
||||||
|
|
||||||
@IsIP()
|
|
||||||
@IsOptional()
|
|
||||||
gateway: string;
|
|
||||||
|
|
||||||
@IsIP()
|
|
||||||
@IsOptional()
|
|
||||||
subnet: string;
|
|
||||||
|
|
||||||
@IsIP()
|
|
||||||
@IsOptional()
|
|
||||||
dns: string;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
import { ZodError, ZodSchema } from "zod";
|
||||||
|
|
||||||
|
export function validateSchema<T>(
|
||||||
|
schema: ZodSchema<T>,
|
||||||
|
data: unknown
|
||||||
|
): { success: true; data: T } | { success: false; errors: ZodError["issues"] } {
|
||||||
|
const result = schema.safeParse(data);
|
||||||
|
if (result.success) {
|
||||||
|
return { success: true, data: result.data };
|
||||||
|
} else {
|
||||||
|
return { success: false, errors: result.error.issues };
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user