diff --git a/package.json b/package.json
index 1691c225..0da61189 100644
--- a/package.json
+++ b/package.json
@@ -23,6 +23,8 @@
"@hookform/error-message": "^2.0.1",
"@hookform/resolvers": "^2.9.11",
"@meshtastic/meshtasticjs": "2.0.20-1",
+ "@radix-ui/react-accordion": "^1.1.0",
+ "@radix-ui/react-checkbox": "^1.0.1",
"@radix-ui/react-dialog": "^1.0.2",
"@radix-ui/react-label": "^2.0.0",
"@radix-ui/react-menubar": "^1.0.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 942c5d42..dcb16dcb 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -5,6 +5,8 @@ specifiers:
'@hookform/error-message': ^2.0.1
'@hookform/resolvers': ^2.9.11
'@meshtastic/meshtasticjs': 2.0.20-1
+ '@radix-ui/react-accordion': ^1.1.0
+ '@radix-ui/react-checkbox': ^1.0.1
'@radix-ui/react-dialog': ^1.0.2
'@radix-ui/react-label': ^2.0.0
'@radix-ui/react-menubar': ^1.0.0
@@ -73,7 +75,9 @@ dependencies:
'@emeraldpay/hashicon-react': 0.5.2
'@hookform/error-message': 2.0.1_zf7ga3u4zrffjlingb6kh5ipva
'@hookform/resolvers': 2.9.11_react-hook-form@7.43.1
- '@meshtastic/meshtasticjs': 2.0.20-1
+ '@meshtastic/meshtasticjs': link:../js
+ '@radix-ui/react-accordion': 1.1.0_biqbaboplfbrettd7655fr4n2y
+ '@radix-ui/react-checkbox': 1.0.1_biqbaboplfbrettd7655fr4n2y
'@radix-ui/react-dialog': 1.0.2_zula6vjvt3wdocc4mwcxqa6nzi
'@radix-ui/react-label': 2.0.0_biqbaboplfbrettd7655fr4n2y
'@radix-ui/react-menubar': 1.0.0_zula6vjvt3wdocc4mwcxqa6nzi
@@ -1326,18 +1330,6 @@ packages:
to-fast-properties: 2.0.0
dev: true
- /@buf/meshtastic_protobufs.bufbuild_es/1.0.0-20230211031647-2cce48659fb1.1_@bufbuild+protobuf@1.0.0:
- resolution: {registry: https://buf.build/gen/npm/v1, tarball: https://buf.build/gen/npm/v1/@buf/meshtastic_protobufs.bufbuild_es/1.0.0-20230211031647-2cce48659fb1.1/tarball}
- peerDependencies:
- '@bufbuild/protobuf': ^1.0.0
- dependencies:
- '@bufbuild/protobuf': 1.0.0
- dev: false
-
- /@bufbuild/protobuf/1.0.0:
- resolution: {integrity: sha512-oH3jHBrZ6to8Qf4zLg7O8KqSY42kQZNBRXJRMp5uSi0mqE4L8NbyMnZHeOsbXmTb0xpptRyH11LfS+KeVhXzAA==}
- dev: false
-
/@emeraldpay/hashicon-react/0.5.2:
resolution: {integrity: sha512-XCoYKpq8QQOniiSZf5ouzdvXbKfG6q4ICHRqCO/GNofiF0Ra+LR/7+tomHlXVcLPBS9sDAoZQQw/Sr24KRAbJg==}
engines: {node: '>=8'}
@@ -1725,18 +1717,6 @@ packages:
engines: {node: '>=6.0.0'}
dev: false
- /@meshtastic/meshtasticjs/2.0.20-1:
- resolution: {integrity: sha512-ShYcQ0/T4reWHcfgMIGhqjBQIIz4GrTZOJ9p+O9ChXxND+sWdmFe4U3e5sCMnEZW33xbI6bgQhq7De2sjqAzcQ==}
- dependencies:
- '@buf/meshtastic_protobufs.bufbuild_es': 1.0.0-20230211031647-2cce48659fb1.1_@bufbuild+protobuf@1.0.0
- '@bufbuild/protobuf': 1.0.0
- crc: 4.3.2
- sub-events: 1.9.0
- tslog: 4.7.2
- transitivePeerDependencies:
- - buffer
- dev: false
-
/@nodelib/fs.scandir/2.1.5:
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
@@ -1779,6 +1759,26 @@ packages:
'@babel/runtime': 7.20.13
dev: false
+ /@radix-ui/react-accordion/1.1.0_biqbaboplfbrettd7655fr4n2y:
+ resolution: {integrity: sha512-CNN9ZBgCK4i4SX7gFk5s8095j55DUWi85vwRNfkfBLs0QdAG5Tb4ku6sBeugCAiLvsmxw481GyNl+C3stoJVBQ==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.20.13
+ '@radix-ui/primitive': 1.0.0
+ '@radix-ui/react-collapsible': 1.0.1_biqbaboplfbrettd7655fr4n2y
+ '@radix-ui/react-collection': 1.0.1_biqbaboplfbrettd7655fr4n2y
+ '@radix-ui/react-compose-refs': 1.0.0_react@18.2.0
+ '@radix-ui/react-context': 1.0.0_react@18.2.0
+ '@radix-ui/react-direction': 1.0.0_react@18.2.0
+ '@radix-ui/react-id': 1.0.0_react@18.2.0
+ '@radix-ui/react-primitive': 1.0.1_biqbaboplfbrettd7655fr4n2y
+ '@radix-ui/react-use-controllable-state': 1.0.0_react@18.2.0
+ react: 18.2.0
+ react-dom: 18.2.0_react@18.2.0
+ dev: false
+
/@radix-ui/react-arrow/1.0.1_biqbaboplfbrettd7655fr4n2y:
resolution: {integrity: sha512-1yientwXqXcErDHEv8av9ZVNEBldH8L9scVR3is20lL+jOCfcJyMFZFEY5cgIrgexsq1qggSXqiEL/d/4f+QXA==}
peerDependencies:
@@ -1791,6 +1791,44 @@ packages:
react-dom: 18.2.0_react@18.2.0
dev: false
+ /@radix-ui/react-checkbox/1.0.1_biqbaboplfbrettd7655fr4n2y:
+ resolution: {integrity: sha512-TisH0B8hWmYP3ONRduYCyN04rR9yLPIw/Rwyn1RoC1suSoGCa8Wn+YPdSSSarSszeIbcg3p2lBkDp2XXit4sZw==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.20.13
+ '@radix-ui/primitive': 1.0.0
+ '@radix-ui/react-compose-refs': 1.0.0_react@18.2.0
+ '@radix-ui/react-context': 1.0.0_react@18.2.0
+ '@radix-ui/react-presence': 1.0.0_biqbaboplfbrettd7655fr4n2y
+ '@radix-ui/react-primitive': 1.0.1_biqbaboplfbrettd7655fr4n2y
+ '@radix-ui/react-use-controllable-state': 1.0.0_react@18.2.0
+ '@radix-ui/react-use-previous': 1.0.0_react@18.2.0
+ '@radix-ui/react-use-size': 1.0.0_react@18.2.0
+ react: 18.2.0
+ react-dom: 18.2.0_react@18.2.0
+ dev: false
+
+ /@radix-ui/react-collapsible/1.0.1_biqbaboplfbrettd7655fr4n2y:
+ resolution: {integrity: sha512-0maX4q91iYa4gjt3PsNf7dq/yqSR+HGAE8I5p54dQ6gnveS+ETWlMoijxrhmgV1k8svxpm34mQAtqIrJt4XZmA==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.20.13
+ '@radix-ui/primitive': 1.0.0
+ '@radix-ui/react-compose-refs': 1.0.0_react@18.2.0
+ '@radix-ui/react-context': 1.0.0_react@18.2.0
+ '@radix-ui/react-id': 1.0.0_react@18.2.0
+ '@radix-ui/react-presence': 1.0.0_biqbaboplfbrettd7655fr4n2y
+ '@radix-ui/react-primitive': 1.0.1_biqbaboplfbrettd7655fr4n2y
+ '@radix-ui/react-use-controllable-state': 1.0.0_react@18.2.0
+ '@radix-ui/react-use-layout-effect': 1.0.0_react@18.2.0
+ react: 18.2.0
+ react-dom: 18.2.0_react@18.2.0
+ dev: false
+
/@radix-ui/react-collection/1.0.1_biqbaboplfbrettd7655fr4n2y:
resolution: {integrity: sha512-uuiFbs+YCKjn3X1DTSx9G7BHApu4GHbi3kgiwsnFUbOKCrwejAJv4eE4Vc8C0Oaxt9T0aV4ox0WCOdx+39Xo+g==}
peerDependencies:
@@ -4273,16 +4311,6 @@ packages:
resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
dev: true
- /crc/4.3.2:
- resolution: {integrity: sha512-uGDHf4KLLh2zsHa8D8hIQ1H/HtFQhyHrc0uhHBcoKGol/Xnb+MPYfUMw7cvON6ze/GUESTudKayDcJC5HnJv1A==}
- engines: {node: '>=12'}
- peerDependencies:
- buffer: '>=6.0.3'
- peerDependenciesMeta:
- buffer:
- optional: true
- dev: false
-
/cross-spawn/7.0.3:
resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
engines: {node: '>= 8'}
@@ -6753,11 +6781,6 @@ packages:
engines: {node: '>=8'}
dev: true
- /sub-events/1.9.0:
- resolution: {integrity: sha512-dnFBayilG9Ku0k/lNs1Y7WV4kv91+ovCoeBV3uIYrY49DylvBb6z9d9ED2ctcrvX2YlReFalpCgJNtSgmrOaJg==}
- engines: {node: '>=10.0.0'}
- dev: false
-
/supercluster/7.1.5:
resolution: {integrity: sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==}
dependencies:
@@ -6974,11 +6997,6 @@ packages:
/tslib/2.5.0:
resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==}
- /tslog/4.7.2:
- resolution: {integrity: sha512-NZCunFmbQK25tt+Egv28MLcmbo8M1HgUy6X2hdVbgrAlcR7zRGvPmM8SnpoljXZ48zHRRYWp9vYIHFHKWsR4HA==}
- engines: {node: '>=16'}
- dev: false
-
/tsutils/3.21.0_typescript@4.9.5:
resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
engines: {node: '>= 6'}
diff --git a/src/App.tsx b/src/App.tsx
index 2f91c9c3..c268ac8f 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -5,10 +5,10 @@ import { PageRouter } from "@app/PageRouter.js";
import { CommandPalette } from "@components/CommandPalette.js";
import { DeviceSelector } from "@components/DeviceSelector.js";
import { DialogManager } from "@components/Dialog/DialogManager.js";
-import { Dashboard } from "@app/components/Dashboard.js";
+import { Dashboard } from "@components/Dashboard.js";
import { useDeviceStore } from "@core/stores/deviceStore.js";
import { ThemeController } from "@components/generic/ThemeController.js";
-import { NewDeviceDialog } from "./components/Dialog/NewDevice.js";
+import { NewDeviceDialog } from "@components/Dialog/NewDeviceDialog.js";
export const App = (): JSX.Element => {
const { getDevice } = useDeviceStore();
diff --git a/src/components/Dashboard.tsx b/src/components/Dashboard.tsx
index c6afe68c..53ee5a44 100644
--- a/src/components/Dashboard.tsx
+++ b/src/components/Dashboard.tsx
@@ -10,11 +10,11 @@ import {
UsbIcon,
NetworkIcon
} from "lucide-react";
-import { Subtle } from "./UI/Typography/Subtle.js";
-import { H3 } from "./UI/Typography/H3.js";
+import { Subtle } from "@components/UI/Typography/Subtle.js";
+import { H3 } from "@components/UI/Typography/H3.js";
import { useDeviceStore } from "@app/core/stores/deviceStore.js";
import { useMemo } from "react";
-import { Separator } from "./UI/Seperator.js";
+import { Separator } from "@components/UI/Seperator.js";
export const Dashboard = () => {
const { setConnectDialogOpen } = useAppStore();
diff --git a/src/components/DeviceSelector.tsx b/src/components/DeviceSelector.tsx
index 2d2baec9..d93274a0 100644
--- a/src/components/DeviceSelector.tsx
+++ b/src/components/DeviceSelector.tsx
@@ -10,8 +10,8 @@ import {
GithubIcon,
TerminalIcon
} from "lucide-react";
-import { Separator } from "./UI/Seperator.js";
-import { Code } from "./UI/Typography/Code.js";
+import { Separator } from "@components/UI/Seperator.js";
+import { Code } from "@components/UI/Typography/Code.js";
import { DeviceSelectorButton } from "./DeviceSelectorButton.js";
export const DeviceSelector = (): JSX.Element => {
diff --git a/src/components/Dialog/DeviceNameDialog.tsx b/src/components/Dialog/DeviceNameDialog.tsx
index c13efc74..b0f55b27 100644
--- a/src/components/Dialog/DeviceNameDialog.tsx
+++ b/src/components/Dialog/DeviceNameDialog.tsx
@@ -11,7 +11,7 @@ import { Button } from "@components/UI/Button.js";
import { useDevice } from "@app/core/stores/deviceStore.js";
import { useForm } from "react-hook-form";
import { Protobuf } from "@meshtastic/meshtasticjs";
-import { Label } from "../UI/Label.js";
+import { Label } from "@components/UI/Label.js";
export interface User {
longName: string;
@@ -27,7 +27,7 @@ export const DeviceNameDialog = ({
open,
onOpenChange
}: DeviceNameDialogProps): JSX.Element => {
- const { hardware, nodes, connection, setDialogOpen } = useDevice();
+ const { hardware, nodes, connection } = useDevice();
const myNode = nodes.find((n) => n.data.num === hardware.myNodeNum);
@@ -45,7 +45,7 @@ export const DeviceNameDialog = ({
...data
})
);
- setDialogOpen("deviceName", false);
+ onOpenChange(false);
});
return (
diff --git a/src/components/Dialog/ImportDialog.tsx b/src/components/Dialog/ImportDialog.tsx
index 72490985..b0df5e9a 100644
--- a/src/components/Dialog/ImportDialog.tsx
+++ b/src/components/Dialog/ImportDialog.tsx
@@ -1,7 +1,7 @@
import { useEffect, useState } from "react";
import { toByteArray } from "base64-js";
-import { Checkbox } from "@components/form/Checkbox.js";
-import { Input } from "@components/form/Input.js";
+import { Checkbox } from "@components/UI/Checkbox.js";
+import { Input } from "@components/UI/Input.js";
import {
Dialog,
DialogContent,
@@ -11,9 +11,10 @@ import {
DialogTitle
} from "@components/UI/Dialog.js";
import { Protobuf } from "@meshtastic/meshtasticjs";
-import { Toggle } from "@components/form/Toggle.js";
+import { Switch } from "@components/UI/Switch.js";
import { Button } from "@components/UI/Button.js";
import { useDevice } from "@core/stores/deviceStore.js";
+import { Label } from "@components/UI/Label.js";
export interface ImportDialogProps {
open: boolean;
@@ -82,8 +83,8 @@ export const ImportDialog = ({
+
{
@@ -94,8 +95,8 @@ export const ImportDialog = ({
-
Use Preset?
+
@@ -121,14 +122,14 @@ export const ImportDialog = ({
{channelSet?.settings.map((channel, index) => (
-
+
+
+ >
))}
diff --git a/src/components/Dialog/NewDevice.tsx b/src/components/Dialog/NewDeviceDialog.tsx
similarity index 92%
rename from src/components/Dialog/NewDevice.tsx
rename to src/components/Dialog/NewDeviceDialog.tsx
index 3b302601..3ba12905 100644
--- a/src/components/Dialog/NewDevice.tsx
+++ b/src/components/Dialog/NewDeviceDialog.tsx
@@ -1,4 +1,3 @@
-import { Input } from "@components/form/Input.js";
import {
Dialog,
DialogContent,
@@ -6,9 +5,14 @@ import {
DialogHeader,
DialogTitle
} from "@components/UI/Dialog.js";
-import { Tabs, TabsContent, TabsList, TabsTrigger } from "../UI/Tabs.js";
-import { Subtle } from "../UI/Typography/Subtle.js";
-import { Link } from "../UI/Typography/Link.js";
+import {
+ Tabs,
+ TabsContent,
+ TabsList,
+ TabsTrigger
+} from "@components/UI/Tabs.js";
+import { Subtle } from "@components/UI/Typography/Subtle.js";
+import { Link } from "@components/UI/Typography/Link.js";
import { HTTP } from "../PageComponents/Connect/HTTP.js";
import { BLE } from "../PageComponents/Connect/BLE.js";
import { Serial } from "../PageComponents/Connect/Serial.js";
diff --git a/src/components/Dialog/QRDialog.tsx b/src/components/Dialog/QRDialog.tsx
index 88c8fc09..97cc6890 100644
--- a/src/components/Dialog/QRDialog.tsx
+++ b/src/components/Dialog/QRDialog.tsx
@@ -1,8 +1,8 @@
import { useEffect, useState } from "react";
import { fromByteArray } from "base64-js";
import { QRCode } from "react-qrcode-logo";
-import { Checkbox } from "@components/form/Checkbox.js";
-import { Input } from "@components/form/Input.js";
+import { Checkbox } from "@components/UI/Checkbox.js";
+import { Input } from "@components/UI/Input.js";
import {
Dialog,
DialogContent,
@@ -13,6 +13,7 @@ import {
} from "@components/UI/Dialog.js";
import { ClipboardIcon } from "lucide-react";
import { Protobuf } from "@meshtastic/meshtasticjs";
+import { Label } from "@components/UI/Label.js";
export interface QRDialogProps {
open: boolean;
@@ -62,39 +63,44 @@ export const QRDialog = ({
{channels.map((channel) => (
-
+
+ {
+ if (selectedChannels.includes(channel.index)) {
+ setSelectedChannels(
+ selectedChannels.filter((c) => c !== channel.index)
+ );
+ } else {
+ setSelectedChannels([
+ ...selectedChannels,
+ channel.index
+ ]);
+ }
+ }}
+ />
+ >
))}
+
,
- action() {
+ icon: ClipboardIcon,
+ onClick() {
void navigator.clipboard.writeText(QRCodeURL);
}
}}
diff --git a/src/components/Dialog/RebootDialog.tsx b/src/components/Dialog/RebootDialog.tsx
index e425da20..bcc3dbca 100644
--- a/src/components/Dialog/RebootDialog.tsx
+++ b/src/components/Dialog/RebootDialog.tsx
@@ -10,7 +10,7 @@ import {
} from "@components/UI/Dialog.js";
import { ClockIcon, RefreshCwIcon } from "lucide-react";
import { Button } from "@components/UI/Button.js";
-import { Input } from "@components/form/Input.js";
+import { Input } from "@components/UI/Input.js";
export interface RebootDialogProps {
open: boolean;
@@ -21,7 +21,7 @@ export const RebootDialog = ({
open,
onOpenChange
}: RebootDialogProps): JSX.Element => {
- const { connection, setDialogOpen } = useDevice();
+ const { connection } = useDevice();
const [time, setTime] = useState(5);
@@ -40,21 +40,19 @@ export const RebootDialog = ({
value={time}
onChange={(e) => setTime(parseInt(e.target.value))}
action={{
- icon: ,
- action() {
- connection
- ?.reboot(time * 60)
- .then(() => setDialogOpen("reboot", false));
+ icon: ClockIcon,
+ onClick() {
+ connection?.reboot(time * 60).then(() => onOpenChange(false));
}
}}
/>
diff --git a/src/components/Dialog/ShutdownDialog.tsx b/src/components/Dialog/ShutdownDialog.tsx
index 2e635d10..5b77ebb9 100644
--- a/src/components/Dialog/ShutdownDialog.tsx
+++ b/src/components/Dialog/ShutdownDialog.tsx
@@ -9,7 +9,7 @@ import {
} from "@components/UI/Dialog.js";
import { ClockIcon, PowerIcon } from "lucide-react";
import { Button } from "@components/UI/Button.js";
-import { Input } from "@components/form/Input.js";
+import { Input } from "@components/UI/Input.js";
export interface ShutdownDialogProps {
open: boolean;
@@ -20,7 +20,7 @@ export const ShutdownDialog = ({
open,
onOpenChange
}: ShutdownDialogProps): JSX.Element => {
- const { connection, setDialogOpen } = useDevice();
+ const { connection } = useDevice();
const [time, setTime] = useState
(5);
@@ -39,25 +39,24 @@ export const ShutdownDialog = ({
type="number"
value={time}
onChange={(e) => setTime(parseInt(e.target.value))}
- action={{
- icon: ,
- action() {
- connection
- ?.shutdown(time * 60)
- .then(() => setDialogOpen("shutdown", false));
- }
- }}
+ suffix="Minutes"
/>
+
diff --git a/src/components/DynamicForm.tsx b/src/components/DynamicForm.tsx
index 3cc27f33..16b4d2c9 100644
--- a/src/components/DynamicForm.tsx
+++ b/src/components/DynamicForm.tsx
@@ -6,8 +6,8 @@ import {
SubmitHandler,
useForm
} from "react-hook-form";
-import { Input } from "./UI/Input.js";
-import { Label } from "./UI/Label.js";
+import { Input } from "@components/UI/Input.js";
+import { Label } from "@components/UI/Label.js";
import { ErrorMessage } from "@hookform/error-message";
import {
Select,
@@ -15,10 +15,10 @@ import {
SelectItem,
SelectTrigger,
SelectValue
-} from "./UI/Select.js";
-import { Switch } from "./UI/Switch.js";
-import { H4 } from "./UI/Typography/H4.js";
-import { Subtle } from "./UI/Typography/Subtle.js";
+} from "@components/UI/Select.js";
+import { Switch } from "@components/UI/Switch.js";
+import { H4 } from "@components/UI/Typography/H4.js";
+import { Subtle } from "@components/UI/Typography/Subtle.js";
interface DisabledBy {
fieldName: Path;
@@ -114,6 +114,8 @@ export function DynamicForm({
return (
@@ -129,8 +131,10 @@ export function DynamicForm({
onChange(parseInt(e.target.value))}
disabled={fieldWrapperData.disabled}
+ {...rest}
/>
)}
/>
@@ -141,7 +145,13 @@ export function DynamicForm({
{
+ // }
+ // }}
{...register(field.name)}
/>
diff --git a/src/components/PageComponents/Channel.tsx b/src/components/PageComponents/Channel.tsx
index 06f1b5d0..089134a9 100644
--- a/src/components/PageComponents/Channel.tsx
+++ b/src/components/PageComponents/Channel.tsx
@@ -2,12 +2,13 @@ import { useEffect, useState } from "react";
import { fromByteArray, toByteArray } from "base64-js";
import { Controller, useForm } from "react-hook-form";
import { ChannelSettingsValidation } from "@app/validation/channelSettings.js";
-import { Input } from "@components/form/Input.js";
-import { Toggle } from "@components/form/Toggle.js";
+import { Input } from "@components/UI/Input.js";
+import { Switch } from "@components/UI/Switch.js";
import { useDevice } from "@core/stores/deviceStore.js";
import { RefreshCwIcon, EyeIcon, EyeOffIcon } from "lucide-react";
import { classValidatorResolver } from "@hookform/resolvers/class-validator";
import { Protobuf } from "@meshtastic/meshtasticjs";
+import { Label } from "@radix-ui/react-label";
export interface SettingsPanelProps {
channel: Protobuf.Channel;
@@ -94,18 +95,21 @@ export const Channel = ({ channel }: SettingsPanelProps): JSX.Element => {
name="enabled"
control={control}
render={({ field: { value, ...rest } }) => (
-
+ <>
+
+
+ >
)}
/>
+
>
@@ -131,42 +135,49 @@ export const Channel = ({ channel }: SettingsPanelProps): JSX.Element => {
*/}
+
: ,
- action: () => {
+ icon: pskHidden ? EyeIcon : EyeOffIcon,
+ onClick: () => {
setPskHidden(!pskHidden);
}
}}
- error={errors.psk?.message}
+ // error={errors.psk?.message}
{...register("psk")}
/>
(
-
+ <>
+
+
+ >
)}
/>
(
-
+ <>
+
+
+ >
)}
/>
diff --git a/src/components/PageComponents/Config/Bluetooth.tsx b/src/components/PageComponents/Config/Bluetooth.tsx
index 736b2b43..4fd8a9c6 100644
--- a/src/components/PageComponents/Config/Bluetooth.tsx
+++ b/src/components/PageComponents/Config/Bluetooth.tsx
@@ -1,7 +1,7 @@
import type { BluetoothValidation } from "@app/validation/config/bluetooth.js";
import { useDevice } from "@core/stores/deviceStore.js";
import { Protobuf } from "@meshtastic/meshtasticjs";
-import { DynamicForm } from "@app/components/DynamicForm.js";
+import { DynamicForm } from "@components/DynamicForm.js";
export const Bluetooth = (): JSX.Element => {
const { config, setWorkingConfig } = useDevice();
diff --git a/src/components/PageComponents/Config/Device.tsx b/src/components/PageComponents/Config/Device.tsx
index 8f43ce9b..7bb15c97 100644
--- a/src/components/PageComponents/Config/Device.tsx
+++ b/src/components/PageComponents/Config/Device.tsx
@@ -1,7 +1,7 @@
import type { DeviceValidation } from "@app/validation/config/device.js";
import { useDevice } from "@core/stores/deviceStore.js";
import { Protobuf } from "@meshtastic/meshtasticjs";
-import { DynamicForm } from "@app/components/DynamicForm.js";
+import { DynamicForm } from "@components/DynamicForm.js";
export const Device = (): JSX.Element => {
const { config, setWorkingConfig } = useDevice();
diff --git a/src/components/PageComponents/Config/Display.tsx b/src/components/PageComponents/Config/Display.tsx
index dd3fd423..cba020a1 100644
--- a/src/components/PageComponents/Config/Display.tsx
+++ b/src/components/PageComponents/Config/Display.tsx
@@ -1,7 +1,7 @@
import type { DisplayValidation } from "@app/validation/config/display.js";
import { useDevice } from "@core/stores/deviceStore.js";
import { Protobuf } from "@meshtastic/meshtasticjs";
-import { DynamicForm } from "@app/components/DynamicForm.js";
+import { DynamicForm } from "@components/DynamicForm.js";
export const Display = (): JSX.Element => {
const { config, setWorkingConfig } = useDevice();
@@ -30,7 +30,8 @@ export const Display = (): JSX.Element => {
type: "number",
name: "screenOnSecs",
label: "Screen Timeout",
- description: "Turn off the display after this long"
+ description: "Turn off the display after this long",
+ suffix: "seconds"
},
{
type: "select",
diff --git a/src/components/PageComponents/Config/LoRa.tsx b/src/components/PageComponents/Config/LoRa.tsx
index c8662f51..d203c7f6 100644
--- a/src/components/PageComponents/Config/LoRa.tsx
+++ b/src/components/PageComponents/Config/LoRa.tsx
@@ -1,7 +1,7 @@
import type { LoRaValidation } from "@app/validation/config/lora.js";
import { useDevice } from "@core/stores/deviceStore.js";
import { Protobuf } from "@meshtastic/meshtasticjs";
-import { DynamicForm } from "@app/components/DynamicForm.js";
+import { DynamicForm } from "@components/DynamicForm.js";
export const LoRa = (): JSX.Element => {
const { config, setWorkingConfig } = useDevice();
diff --git a/src/components/PageComponents/Config/Network.tsx b/src/components/PageComponents/Config/Network.tsx
index eab8f887..576c7933 100644
--- a/src/components/PageComponents/Config/Network.tsx
+++ b/src/components/PageComponents/Config/Network.tsx
@@ -1,7 +1,7 @@
import type { NetworkValidation } from "@app/validation/config/network.js";
import { useDevice } from "@core/stores/deviceStore.js";
import { Protobuf } from "@meshtastic/meshtasticjs";
-import { DynamicForm } from "@app/components/DynamicForm.js";
+import { DynamicForm } from "@components/DynamicForm.js";
export const Network = (): JSX.Element => {
const { config, setWorkingConfig } = useDevice();
diff --git a/src/components/PageComponents/Config/Position.tsx b/src/components/PageComponents/Config/Position.tsx
index bee58109..c7859bfd 100644
--- a/src/components/PageComponents/Config/Position.tsx
+++ b/src/components/PageComponents/Config/Position.tsx
@@ -1,7 +1,7 @@
import type { PositionValidation } from "@app/validation/config/position.js";
import { useDevice } from "@core/stores/deviceStore.js";
import { Protobuf } from "@meshtastic/meshtasticjs";
-import { DynamicForm } from "@app/components/DynamicForm.js";
+import { DynamicForm } from "@components/DynamicForm.js";
export const Position = (): JSX.Element => {
const { config, nodes, hardware, setWorkingConfig } = useDevice();
diff --git a/src/components/PageComponents/Config/Power.tsx b/src/components/PageComponents/Config/Power.tsx
index a645d0ac..7431ea92 100644
--- a/src/components/PageComponents/Config/Power.tsx
+++ b/src/components/PageComponents/Config/Power.tsx
@@ -1,7 +1,7 @@
import type { PowerValidation } from "@app/validation/config/power.js";
import { useDevice } from "@core/stores/deviceStore.js";
import { Protobuf } from "@meshtastic/meshtasticjs";
-import { DynamicForm } from "@app/components/DynamicForm.js";
+import { DynamicForm } from "@components/DynamicForm.js";
export const Power = (): JSX.Element => {
const { config, setWorkingConfig } = useDevice();
diff --git a/src/components/PageComponents/Connect/HTTP.tsx b/src/components/PageComponents/Connect/HTTP.tsx
index f5e4e2d1..8f435d81 100644
--- a/src/components/PageComponents/Connect/HTTP.tsx
+++ b/src/components/PageComponents/Connect/HTTP.tsx
@@ -1,12 +1,14 @@
import { Controller, useForm, useWatch } from "react-hook-form";
-import { Input } from "@components/form/Input.js";
-import { Toggle } from "@components/form/Toggle.js";
+import { Input } from "@components/UI/Input.js";
+import { Switch } from "@components/UI/Switch.js";
import { Button } from "@components/UI/Button.js";
import { useAppStore } from "@core/stores/appStore.js";
import { useDeviceStore } from "@core/stores/deviceStore.js";
import { subscribeAll } from "@core/subscriptions.js";
import { randId } from "@core/utils/randId.js";
import { IHTTPConnection } from "@meshtastic/meshtasticjs";
+import { Label } from "@components/UI/Label.js";
+import { SelectLabel } from "@components/UI/Select.js";
export const HTTP = (): JSX.Element => {
const { addDevice } = useDeviceStore();
@@ -50,8 +52,9 @@ export const HTTP = (): JSX.Element => {
// eslint-disable-next-line @typescript-eslint/no-misused-promises