diff --git a/src/components/PageComponents/AppConfig/Map.tsx b/src/components/PageComponents/AppConfig/Map.tsx
index 9daa1d5d..99dd0392 100644
--- a/src/components/PageComponents/AppConfig/Map.tsx
+++ b/src/components/PageComponents/AppConfig/Map.tsx
@@ -2,11 +2,11 @@ import type React from "react";
import { Controller, useFieldArray, useForm } from "react-hook-form";
-import { Button } from "@app/components/Button.js";
+import { Button } from "@app/components/form/Button.js";
+import { IconButton } from "@app/components/form/IconButton.js";
import { InfoWrapper } from "@app/components/form/InfoWrapper.js";
import { Input } from "@app/components/form/Input.js";
import { Toggle } from "@app/components/form/Toggle.js";
-import { IconButton } from "@app/components/IconButton.js";
import { useAppStore } from "@app/core/stores/appStore.js";
import { MapValidation } from "@app/validation/appConfig/map.js";
import { Form } from "@components/form/Form";
diff --git a/src/components/PageComponents/Channel.tsx b/src/components/PageComponents/Channel.tsx
index 83cf45e3..f8fc389e 100644
--- a/src/components/PageComponents/Channel.tsx
+++ b/src/components/PageComponents/Channel.tsx
@@ -5,9 +5,9 @@ import { fromByteArray, toByteArray } from "base64-js";
import { Controller, useForm } from "react-hook-form";
import { toast } from "react-hot-toast";
-import { Input } from "@app/components/form/Input.js";
import { ChannelSettingsValidation } from "@app/validation/channelSettings.js";
import { Form } from "@components/form/Form";
+import { Input } from "@components/form/Input.js";
import { Select } from "@components/form/Select.js";
import { Toggle } from "@components/form/Toggle.js";
import { useDevice } from "@core/providers/useDevice.js";
diff --git a/src/components/PageComponents/Connect/BLE.tsx b/src/components/PageComponents/Connect/BLE.tsx
index ef3c7f77..d8b0ac2b 100644
--- a/src/components/PageComponents/Connect/BLE.tsx
+++ b/src/components/PageComponents/Connect/BLE.tsx
@@ -1,8 +1,8 @@
import type React from "react";
import { useCallback, useEffect, useState } from "react";
-import { Mono } from "@app/components/Mono.js";
-import { Button } from "@components/Button.js";
+import { Mono } from "@app/components/generic/Mono.js";
+import { Button } from "@components/form/Button.js";
import { useAppStore } from "@core/stores/appStore.js";
import { useDeviceStore } from "@core/stores/deviceStore.js";
import { subscribeAll } from "@core/subscriptions.js";
diff --git a/src/components/PageComponents/Connect/HTTP.tsx b/src/components/PageComponents/Connect/HTTP.tsx
index 223a4de2..7da12fa1 100644
--- a/src/components/PageComponents/Connect/HTTP.tsx
+++ b/src/components/PageComponents/Connect/HTTP.tsx
@@ -4,7 +4,7 @@ import { Controller, useForm, useWatch } from "react-hook-form";
import { Input } from "@app/components/form/Input.js";
import { Toggle } from "@app/components/form/Toggle.js";
-import { Button } from "@components/Button.js";
+import { Button } from "@components/form/Button.js";
import { useAppStore } from "@core/stores/appStore.js";
import { useDeviceStore } from "@core/stores/deviceStore.js";
import { subscribeAll } from "@core/subscriptions.js";
diff --git a/src/components/PageComponents/Connect/Serial.tsx b/src/components/PageComponents/Connect/Serial.tsx
index 7fbc7d34..c088ec78 100644
--- a/src/components/PageComponents/Connect/Serial.tsx
+++ b/src/components/PageComponents/Connect/Serial.tsx
@@ -1,8 +1,8 @@
import type React from "react";
import { useCallback, useEffect, useState } from "react";
-import { Mono } from "@app/components/Mono.js";
-import { Button } from "@components/Button.js";
+import { Mono } from "@app/components/generic/Mono.js";
+import { Button } from "@components/form/Button.js";
import { useAppStore } from "@core/stores/appStore.js";
import { useDeviceStore } from "@core/stores/deviceStore.js";
import { subscribeAll } from "@core/subscriptions.js";
diff --git a/src/components/PageComponents/Map/MapControlls.tsx b/src/components/PageComponents/Map/MapControlls.tsx
index e88599ee..4869f7ed 100644
--- a/src/components/PageComponents/Map/MapControlls.tsx
+++ b/src/components/PageComponents/Map/MapControlls.tsx
@@ -13,7 +13,7 @@ export const MapControlls = (): JSX.Element => {
{
map?.zoomIn();
}}
@@ -21,7 +21,7 @@ export const MapControlls = (): JSX.Element => {
{
map?.zoomOut();
}}
@@ -29,7 +29,7 @@ export const MapControlls = (): JSX.Element => {
{}}
>
diff --git a/src/components/PageComponents/Messages/ChannelChat.tsx b/src/components/PageComponents/Messages/ChannelChat.tsx
index e61c321a..c6826cea 100644
--- a/src/components/PageComponents/Messages/ChannelChat.tsx
+++ b/src/components/PageComponents/Messages/ChannelChat.tsx
@@ -1,11 +1,10 @@
import type React from "react";
import { Message } from "@components/PageComponents/Messages/Message.js";
+import { MessageInput } from "@components/PageComponents/Messages/MessageInput.js";
import { useDevice } from "@core/providers/useDevice.js";
import type { Channel } from "@core/stores/deviceStore.js";
-import { MessageInput } from "./MessageInput.js";
-
export interface ChannelChatProps {
channel: Channel;
}
diff --git a/src/components/PageComponents/Messages/MessageInput.tsx b/src/components/PageComponents/Messages/MessageInput.tsx
index 8afa74a3..91a63c78 100644
--- a/src/components/PageComponents/Messages/MessageInput.tsx
+++ b/src/components/PageComponents/Messages/MessageInput.tsx
@@ -2,8 +2,8 @@ import type React from "react";
import { useForm } from "react-hook-form";
+import { IconButton } from "@app/components/form/IconButton.js";
import { Input } from "@app/components/form/Input.js";
-import { IconButton } from "@app/components/IconButton.js";
import { useDevice } from "@core/providers/useDevice.js";
import type { Channel } from "@core/stores/deviceStore.js";
import { MapPinIcon, PaperAirplaneIcon } from "@heroicons/react/24/outline";
diff --git a/src/components/PageComponents/Messages/NewLocationMessage.tsx b/src/components/PageComponents/Messages/NewLocationMessage.tsx
index eb92ce16..a6f6fc10 100644
--- a/src/components/PageComponents/Messages/NewLocationMessage.tsx
+++ b/src/components/PageComponents/Messages/NewLocationMessage.tsx
@@ -2,7 +2,7 @@ import type React from "react";
import { Input } from "@app/components/form/Input.js";
import { Select } from "@app/components/form/Select.js";
-import { Button } from "@components/Button.js";
+import { Button } from "@components/form/Button.js";
import { useDevice } from "@core/providers/useDevice.js";
import { renderOptions } from "@core/utils/selectEnumOptions.js";
import { Protobuf } from "@meshtastic/meshtasticjs";
diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx
index 92e62792..d9413969 100644
--- a/src/components/Sidebar.tsx
+++ b/src/components/Sidebar.tsx
@@ -2,17 +2,14 @@ import type React from "react";
import { useDevice } from "@app/core/providers/useDevice.js";
import { toMGRS } from "@app/core/utils/toMGRS.js";
+import { BatteryWidget } from "@components/Widgets/BatteryWidget.js";
+import { DeviceWidget } from "@components/Widgets/DeviceWidget.js";
+import { PeersWidget } from "@components/Widgets/PeersWidget.js";
+import { PositionWidget } from "@components/Widgets/PositionWidget.js";
import { useAppStore } from "@core/stores/appStore.js";
import { useDeviceStore } from "@core/stores/deviceStore.js";
import { Types } from "@meshtastic/meshtasticjs";
-import { BatteryWidget } from "./Widgets/BatteryWidget.js";
-import { ConfiguringWidget } from "./Widgets/ConfiguringWidget.js";
-import { DeviceWidget } from "./Widgets/DeviceWidget.js";
-import { NodeInfoWidget } from "./Widgets/NodeInfoWidget.js";
-import { PeersWidget } from "./Widgets/PeersWidget.js";
-import { PositionWidget } from "./Widgets/PositionWidget.js";
-
export const Sidebar = (): JSX.Element => {
const { removeDevice } = useDeviceStore();
const { connection, hardware, nodes, status, currentMetrics } = useDevice();
@@ -39,7 +36,6 @@ export const Sidebar = (): JSX.Element => {
/>
-
{
myNode?.data.position?.longitudeI
)}
/>
-
-
);
diff --git a/src/components/Widgets/ConfiguringWidget.tsx b/src/components/Widgets/ConfiguringWidget.tsx
deleted file mode 100644
index 5ba11ddc..00000000
--- a/src/components/Widgets/ConfiguringWidget.tsx
+++ /dev/null
@@ -1,119 +0,0 @@
-import React, { useEffect } from "react";
-
-import { useDevice } from "@core/providers/useDevice.js";
-import { AdjustmentsHorizontalIcon } from "@heroicons/react/24/outline";
-
-import { Card } from "../Card.js";
-import { Dropdown } from "../Dropdown.js";
-
-export const ConfiguringWidget = (): JSX.Element => {
- const {
- hardware,
- channels,
- config,
- moduleConfig,
- setReady,
- nodes,
- connection
- } = useDevice();
-
- useEffect(() => {
- if (
- hardware.myNodeNum !== 0 &&
- Object.keys(config).length === 7 &&
- Object.keys(moduleConfig).length === 7 &&
- channels.length === hardware.maxChannels
- ) {
- setReady(true);
- }
- }, [
- config,
- moduleConfig,
- channels,
- hardware.maxChannels,
- hardware.myNodeNum,
- setReady
- ]);
-
- return (
-
- }
- >
-
-
-
- );
-};
-
-export interface StatusIndicatorProps {
- title: string;
- current: number;
- total: number;
-}
-
-const StatusIndicator = ({
- title,
- current,
- total
-}: StatusIndicatorProps): JSX.Element => {
- return (
-
- = total ? "bg-green-500" : "bg-[#f9e3aa]"
- }`}
- />
-
-
= total
- ? "border-green-500 bg-green-500"
- : "border-green-500 bg-[#f9e3aa]"
- }`}
- >
- 0 ? "bg-green-500" : "bg-[#f9e3aa]"
- }`}
- />
-
-
-
- {title}
-
- ({current}
- {total !== 0 && `/${total}`})
-
-
-
-
- );
-};
diff --git a/src/components/Widgets/DeviceWidget.tsx b/src/components/Widgets/DeviceWidget.tsx
index 07b14436..7ae45f99 100644
--- a/src/components/Widgets/DeviceWidget.tsx
+++ b/src/components/Widgets/DeviceWidget.tsx
@@ -1,11 +1,9 @@
import type React from "react";
+import { Button } from "@components/form/Button.js";
import { Hashicon } from "@emeraldpay/hashicon-react";
import { XCircleIcon } from "@heroicons/react/24/outline";
-import { Button } from "../Button.js";
-import { Card } from "../Card.js";
-
export interface DeviceWidgetProps {
name: string;
nodeNum: string;
@@ -22,7 +20,7 @@ export const DeviceWidget = ({
reconnect
}: DeviceWidgetProps): JSX.Element => {
return (
-
+
@@ -46,6 +44,6 @@ export const DeviceWidget = ({
-
+
);
};
diff --git a/src/components/Widgets/NodeInfoWidget.tsx b/src/components/Widgets/NodeInfoWidget.tsx
deleted file mode 100644
index d0b33976..00000000
--- a/src/components/Widgets/NodeInfoWidget.tsx
+++ /dev/null
@@ -1,42 +0,0 @@
-import type React from "react";
-
-import { InformationCircleIcon } from "@heroicons/react/24/outline";
-import type { Protobuf } from "@meshtastic/meshtasticjs";
-
-import { Card } from "../Card.js";
-import { Dropdown } from "../Dropdown.js";
-
-export interface NodeInfoWidgetProps {
- hardware: Protobuf.MyNodeInfo;
-}
-
-export const NodeInfoWidget = ({
- hardware
-}: NodeInfoWidgetProps): JSX.Element => {
- return (
-
- }
- >
-
-
-
-
- Firmware version
- -
- {hardware.firmwareVersion}
-
-
-
-
-
Bitrate
-
- {hardware.bitrate.toFixed(2)}
- bps
-
-
-
-
-
- );
-};
diff --git a/src/components/Widgets/PeersWidget.tsx b/src/components/Widgets/PeersWidget.tsx
index a9899f5d..b8777b2a 100644
--- a/src/components/Widgets/PeersWidget.tsx
+++ b/src/components/Widgets/PeersWidget.tsx
@@ -1,15 +1,14 @@
import type React from "react";
import { useDevice } from "@app/core/providers/useDevice.js";
+import { IconButton } from "@components/form/IconButton.js";
+import { Mono } from "@components/generic/Mono.js";
import {
EllipsisHorizontalIcon,
UserGroupIcon
} from "@heroicons/react/24/outline";
import type { Protobuf } from "@meshtastic/meshtasticjs";
-import { IconButton } from "../IconButton.js";
-import { Mono } from "../Mono.js";
-
export interface PeersWidgetProps {
peers: Protobuf.NodeInfo[];
}
diff --git a/src/components/form/BitwiseSelect.tsx b/src/components/form/BitwiseSelect.tsx
index 5f104a18..0707e798 100644
--- a/src/components/form/BitwiseSelect.tsx
+++ b/src/components/form/BitwiseSelect.tsx
@@ -5,11 +5,10 @@ import {
bitwiseEncode,
enumLike
} from "@app/core/utils/bitwise.js";
+import { InfoWrapper } from "@components/form/InfoWrapper.js";
import { Listbox } from "@headlessui/react";
import { Protobuf } from "@meshtastic/meshtasticjs";
-import { InfoWrapper } from "./InfoWrapper.js";
-
export interface BitwiseSelectProps {
label?: string;
description?: string;
diff --git a/src/components/Button.tsx b/src/components/form/Button.tsx
similarity index 100%
rename from src/components/Button.tsx
rename to src/components/form/Button.tsx
diff --git a/src/components/form/Form.tsx b/src/components/form/Form.tsx
index 5ada9e4f..a7893f35 100644
--- a/src/components/form/Form.tsx
+++ b/src/components/form/Form.tsx
@@ -3,7 +3,7 @@ import type { HTMLProps } from "react";
import { FiSave } from "react-icons/fi";
-import { Button } from "@components/Button.js";
+import { Button } from "@components/form/Button.js";
import {
ArrowUturnLeftIcon,
ChevronRightIcon,
diff --git a/src/components/IconButton.tsx b/src/components/form/IconButton.tsx
similarity index 100%
rename from src/components/IconButton.tsx
rename to src/components/form/IconButton.tsx
diff --git a/src/components/form/Input.tsx b/src/components/form/Input.tsx
index b8bde809..b029a463 100644
--- a/src/components/form/Input.tsx
+++ b/src/components/form/Input.tsx
@@ -1,10 +1,9 @@
import type React from "react";
import { forwardRef, InputHTMLAttributes } from "react";
+import { InfoWrapper, InfoWrapperProps } from "@components/form/InfoWrapper.js";
import { ExclamationCircleIcon } from "@heroicons/react/24/outline";
-import { InfoWrapper, InfoWrapperProps } from "./InfoWrapper.js";
-
export interface InputProps
extends InputHTMLAttributes
,
Omit {
diff --git a/src/components/form/Select.tsx b/src/components/form/Select.tsx
index 1ec51d0f..075cc0b2 100644
--- a/src/components/form/Select.tsx
+++ b/src/components/form/Select.tsx
@@ -1,7 +1,7 @@
import type React from "react";
import { forwardRef, SelectHTMLAttributes } from "react";
-import { InfoWrapper, InfoWrapperProps } from "./InfoWrapper.js";
+import { InfoWrapper, InfoWrapperProps } from "@components/form/InfoWrapper.js";
export interface SelectProps
extends SelectHTMLAttributes,
diff --git a/src/components/Mono.tsx b/src/components/generic/Mono.tsx
similarity index 100%
rename from src/components/Mono.tsx
rename to src/components/generic/Mono.tsx
diff --git a/src/components/layout/page/TabbedContent.tsx b/src/components/generic/TabbedContent.tsx
similarity index 85%
rename from src/components/layout/page/TabbedContent.tsx
rename to src/components/generic/TabbedContent.tsx
index 41ad55a7..52494b75 100644
--- a/src/components/layout/page/TabbedContent.tsx
+++ b/src/components/generic/TabbedContent.tsx
@@ -1,7 +1,7 @@
import type React from "react";
import { Fragment } from "react";
-import { Mono } from "@app/components/Mono";
+import { Mono } from "@components/generic/Mono";
import { Tab } from "@headlessui/react";
export interface TabType {
@@ -29,10 +29,11 @@ export const TabbedContent = ({
{({ selected }) => (
{entry.icon && (
@@ -57,12 +58,10 @@ export const TabbedContent = ({
) : (
- {entry.disabledMessage || "This tab is disabled"}.
- {' '}
+ {entry.disabledMessage || "This tab is disabled"}.{" "}
{entry.disabledLink && (
<>
- Click
- {' '}
+ Click{" "}
here
-
- {' '}
+ {" "}
for more information.
>
)}
diff --git a/src/index.tsx b/src/index.tsx
index 6d411ce5..9500e1fe 100644
--- a/src/index.tsx
+++ b/src/index.tsx
@@ -1,4 +1,4 @@
-import "./index.css";
+import "@app/index.css";
import "maplibre-gl/dist/maplibre-gl.css";
import type React from "react";
diff --git a/src/pages/Channels.tsx b/src/pages/Channels.tsx
index 6e08a8f6..78dc8953 100644
--- a/src/pages/Channels.tsx
+++ b/src/pages/Channels.tsx
@@ -1,8 +1,8 @@
import type React from "react";
+import { TabbedContent, TabType } from "@app/components/generic/TabbedContent";
import { Channel } from "@app/components/PageComponents/Channel.js";
-import { Button } from "@components/Button.js";
-import { TabbedContent, TabType } from "@components/layout/page/TabbedContent";
+import { Button } from "@components/form/Button.js";
import { useDevice } from "@core/providers/useDevice.js";
import {
ArrowDownOnSquareStackIcon,
diff --git a/src/pages/Config/index.tsx b/src/pages/Config/index.tsx
index 1f3b85af..ee782bf6 100644
--- a/src/pages/Config/index.tsx
+++ b/src/pages/Config/index.tsx
@@ -1,6 +1,6 @@
import type React from "react";
-import { TabbedContent, TabType } from "@components/layout/page/TabbedContent";
+import { TabbedContent, TabType } from "@app/components/generic/TabbedContent";
import {
Cog8ToothIcon,
CubeTransparentIcon,
diff --git a/src/pages/Extensions/Index.tsx b/src/pages/Extensions/Index.tsx
index 6df735ce..e9a78bc9 100644
--- a/src/pages/Extensions/Index.tsx
+++ b/src/pages/Extensions/Index.tsx
@@ -1,6 +1,6 @@
import type React from "react";
-import { TabbedContent, TabType } from "@components/layout/page/TabbedContent";
+import { TabbedContent, TabType } from "@app/components/generic/TabbedContent";
import { useDevice } from "@core/providers/useDevice.js";
import {
CloudIcon,
diff --git a/src/pages/Info.tsx b/src/pages/Info.tsx
index bcb0e077..9cb3fc66 100644
--- a/src/pages/Info.tsx
+++ b/src/pages/Info.tsx
@@ -6,7 +6,7 @@ import { JSONTree } from "react-json-tree";
import {
TabbedContent,
TabType
-} from "@app/components/layout/page/TabbedContent.js";
+} from "@app/components/generic/TabbedContent.js";
import { useDevice } from "@core/providers/useDevice.js";
import { EyeIcon } from "@heroicons/react/24/outline";
@@ -21,6 +21,11 @@ export const InfoPage = (): JSX.Element => {
});
const tabs: TabType[] = [
+ {
+ name: "Hardware",
+ icon: ,
+ element: () =>
+ },
{
name: "Config",
icon: ,
@@ -31,11 +36,7 @@ export const InfoPage = (): JSX.Element => {
icon: ,
element: () =>
},
- {
- name: "Hardware",
- icon: ,
- element: () =>
- },
+
{
name: "Nodes",
icon: ,
diff --git a/src/pages/Logs.tsx b/src/pages/Logs.tsx
index 38b76381..e277a65a 100644
--- a/src/pages/Logs.tsx
+++ b/src/pages/Logs.tsx
@@ -1,7 +1,7 @@
import type React from "react";
import { useEffect, useState } from "react";
-import { Mono } from "@app/components/Mono.js";
+import { Mono } from "@app/components/generic/Mono.js";
import { useDevice } from "@core/providers/useDevice.js";
import { Protobuf, Types } from "@meshtastic/meshtasticjs";
diff --git a/src/pages/Map.tsx b/src/pages/Map.tsx
index 19a4f63c..e813e098 100644
--- a/src/pages/Map.tsx
+++ b/src/pages/Map.tsx
@@ -23,6 +23,11 @@ export const MapPage = (): JSX.Element => {
maxPitch={0}
dragRotate={false}
touchZoomRotate={false}
+ initialViewState={{
+ zoom: 10,
+ latitude: -38,
+ longitude: 145
+ }}
>
{waypoints.map((wp) => (
diff --git a/src/pages/Messages.tsx b/src/pages/Messages.tsx
index b2052274..29894f00 100644
--- a/src/pages/Messages.tsx
+++ b/src/pages/Messages.tsx
@@ -1,10 +1,10 @@
import type React from "react";
-import { IconButton } from "@app/components/IconButton.js";
+import { IconButton } from "@app/components/form/IconButton.js";
import {
TabbedContent,
TabType
-} from "@components/layout/page/TabbedContent.js";
+} from "@app/components/generic/TabbedContent.js";
import { ChannelChat } from "@components/PageComponents/Messages/ChannelChat.js";
import { useDevice } from "@core/providers/useDevice.js";
import { PencilIcon } from "@heroicons/react/24/outline";
diff --git a/src/pages/Peers.tsx b/src/pages/Peers.tsx
index c82a611d..e9e01b34 100644
--- a/src/pages/Peers.tsx
+++ b/src/pages/Peers.tsx
@@ -3,8 +3,8 @@ import type React from "react";
import toast from "react-hot-toast";
import { base16 } from "rfc4648";
-import { IconButton } from "@app/components/IconButton.js";
-import { Mono } from "@app/components/Mono.js";
+import { IconButton } from "@app/components/form/IconButton.js";
+import { Mono } from "@app/components/generic/Mono.js";
import { useDevice } from "@core/providers/useDevice.js";
import { Hashicon } from "@emeraldpay/hashicon-react";
import {