Browse Source

feat: add udp over mesh toggle

pull/536/head
Dan Ditomaso 1 year ago
parent
commit
8d5dc440d0
  1. 5
      src/components/Form/FormSelect.tsx
  2. 22
      src/components/PageComponents/Config/Network.tsx
  3. 1
      src/pages/Config/DeviceConfig.tsx
  4. 85
      src/validation/config/network.ts
  5. 13
      src/validation/validate.ts

5
src/components/Form/FormSelect.tsx

@ -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}
> >

22
src/components/PageComponents/Config/Network.tsx

@ -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();
console.log(config.network);
const onSubmit = (data: NetworkValidation) => { const onSubmit = (data: NetworkValidation) => {
const result = validateSchema(NetworkValidationSchema, data);
console.log("Network data", 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,

1
src/pages/Config/DeviceConfig.tsx

@ -31,7 +31,6 @@ export const DeviceConfig = () => {
{ {
label: "Network", label: "Network",
element: Network, element: Network,
// disabled: !metadata.get(0)?.hasWifi,
}, },
{ {
label: "Display", label: "Display",

85
src/validation/config/network.ts

@ -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() export const NetworkValidationIpV4ConfigSchema = z.object({
wifiEnabled: boolean; ip: z.string().ip(),
gateway: z.string().ip(),
subnet: z.string().ip(),
dns: z.string().ip(),
});
export const NetworkValidationSchema = z.object({
wifiEnabled: z.boolean(),
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(),
});
export type NetworkValidation = z.infer<typeof NetworkValidationSchema>;
@Length(1, 33)
@IsOptional({})
wifiSsid: string;
@Length(8, 64)
@IsOptional()
wifiPsk: string;
@Length(2, 30)
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;
}

13
src/validation/validate.ts

@ -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 };
}
}
Loading…
Cancel
Save