diff --git a/src/App.tsx b/src/App.tsx index 57077d83..4aab13b5 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -5,17 +5,16 @@ import { MapProvider } from "react-map-gl"; import { useAppStore } from "@app/core/stores/appStore.js"; import { DeviceWrapper } from "@app/DeviceWrapper.js"; +import { PageRouter } from "@app/PageRouter.js"; +import { CommandPalette } from "@components/CommandPalette/Index.js"; +import { DeviceSelector } from "@components/DeviceSelector.js"; +import { DialogManager } from "@components/Dialog/DialogManager.js"; +import { Drawer } from "@components/Drawer/index.js"; +import { NewDevice } from "@components/NewDevice.js"; +import { PageNav } from "@components/PageNav.js"; +import { Sidebar } from "@components/Sidebar.js"; import { useDeviceStore } from "@core/stores/deviceStore.js"; -import { CommandPalette } from "./components/CommandPalette/Index.js"; -import { DeviceSelector } from "./components/DeviceSelector.js"; -import { DialogManager } from "./components/Dialog/DialogManager.js"; -import { Drawer } from "./components/Drawer/index.js"; -import { NewDevice } from "./components/NewDevice.js"; -import { PageNav } from "./components/PageNav.js"; -import { Sidebar } from "./components/Sidebar.js"; -import { PageRouter } from "./PageRouter.js"; - export const App = (): JSX.Element => { const { getDevice } = useDeviceStore(); const { selectedDevice } = useAppStore(); diff --git a/src/PageRouter.tsx b/src/PageRouter.tsx index 6a2d4570..8a60e37c 100644 --- a/src/PageRouter.tsx +++ b/src/PageRouter.tsx @@ -5,11 +5,10 @@ import { ChannelsPage } from "@pages/Channels.js"; import { ConfigPage } from "@pages/Config/index.js"; import { ExtensionsPage } from "@pages/Extensions/Index.js"; import { InfoPage } from "@pages/Info.js"; +import { LogsPage } from "@pages/Logs.js"; import { MapPage } from "@pages/Map.js"; import { MessagesPage } from "@pages/Messages.js"; - -import { LogsPage } from "./pages/Logs.js"; -import { PeersPage } from "./pages/Peers.js"; +import { PeersPage } from "@pages/Peers.js"; export const PageRouter = (): JSX.Element => { const { activePage } = useDevice(); diff --git a/src/components/Card.tsx b/src/components/Card.tsx deleted file mode 100644 index e43f7b84..00000000 --- a/src/components/Card.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import type React from "react"; - -export const Card = ({ - children, - className, - ...rest -}: JSX.IntrinsicElements["div"]): JSX.Element => { - return ( -
- {children} -
- ); -}; diff --git a/src/components/CommandPalette/GroupView.tsx b/src/components/CommandPalette/GroupView.tsx index 44174faf..9499cb5c 100644 --- a/src/components/CommandPalette/GroupView.tsx +++ b/src/components/CommandPalette/GroupView.tsx @@ -1,10 +1,9 @@ import type React from "react"; +import type { Group } from "@components/CommandPalette/Index.js"; import { Combobox } from "@headlessui/react"; import { ChevronRightIcon } from "@heroicons/react/24/outline"; -import type { Group } from "./Index.js"; - export interface GroupViewProps { group: Group; } diff --git a/src/components/CommandPalette/Index.tsx b/src/components/CommandPalette/Index.tsx index a765ec23..f1090214 100644 --- a/src/components/CommandPalette/Index.tsx +++ b/src/components/CommandPalette/Index.tsx @@ -18,6 +18,11 @@ import { toast } from "react-hot-toast"; import { useDevice } from "@app/core/providers/useDevice.js"; import { useAppStore } from "@app/core/stores/appStore.js"; +import { GroupView } from "@components/CommandPalette/GroupView.js"; +import { NoResults } from "@components/CommandPalette/NoResults.js"; +import { PaletteTransition } from "@components/CommandPalette/PaletteTransition.js"; +import { SearchBox } from "@components/CommandPalette/SearchBox.js"; +import { SearchResult } from "@components/CommandPalette/SearchResult.js"; import { Combobox, Dialog, Transition } from "@headlessui/react"; import { ArchiveBoxXMarkIcon, @@ -43,12 +48,6 @@ import { XCircleIcon } from "@heroicons/react/24/outline"; -import { GroupView } from "./GroupView.js"; -import { NoResults } from "./NoResults.js"; -import { PaletteTransition } from "./PaletteTransition.js"; -import { SearchBox } from "./SearchBox.js"; -import { SearchResult } from "./SearchResult.js"; - export interface Group { name: string; icon: (props: React.ComponentProps<"svg">) => JSX.Element; diff --git a/src/components/CommandPalette/NoResults.tsx b/src/components/CommandPalette/NoResults.tsx index a5229edb..a7e4f65c 100644 --- a/src/components/CommandPalette/NoResults.tsx +++ b/src/components/CommandPalette/NoResults.tsx @@ -1,9 +1,8 @@ import type React from "react"; +import { Mono } from "@components/generic/Mono.js"; import { CommandLineIcon } from "@heroicons/react/24/outline"; -import { Mono } from "../Mono.js"; - export const NoResults = (): JSX.Element => { return (
diff --git a/src/components/CommandPalette/SearchResult.tsx b/src/components/CommandPalette/SearchResult.tsx index c3149532..94c80b48 100644 --- a/src/components/CommandPalette/SearchResult.tsx +++ b/src/components/CommandPalette/SearchResult.tsx @@ -1,10 +1,9 @@ import type React from "react"; +import type { Group } from "@components/CommandPalette/Index.js"; import { Combobox } from "@headlessui/react"; import { ChevronRightIcon } from "@heroicons/react/24/outline"; -import type { Group } from "./Index.js"; - export interface SearchResultProps { group: Group; } diff --git a/src/components/DeviceSelector.tsx b/src/components/DeviceSelector.tsx index 2d96443d..55c0e9de 100644 --- a/src/components/DeviceSelector.tsx +++ b/src/components/DeviceSelector.tsx @@ -2,11 +2,10 @@ import type React from "react"; import { useAppStore } from "@app/core/stores/appStore.js"; import { useDeviceStore } from "@app/core/stores/deviceStore.js"; +import { Mono } from "@components/generic/Mono.js"; import { Hashicon } from "@emeraldpay/hashicon-react"; import { CommandLineIcon, PlusIcon } from "@heroicons/react/24/outline"; -import { Mono } from "./Mono.js"; - export const DeviceSelector = (): JSX.Element => { const { getDevices } = useDeviceStore(); const { selectedDevice, setSelectedDevice } = useAppStore(); diff --git a/src/components/Dialog/DialogManager.tsx b/src/components/Dialog/DialogManager.tsx index 75d203f0..ac118639 100644 --- a/src/components/Dialog/DialogManager.tsx +++ b/src/components/Dialog/DialogManager.tsx @@ -1,8 +1,7 @@ import type React from "react"; import { useDevice } from "@app/core/providers/useDevice.js"; - -import { QRDialog } from "./QRDialog.js"; +import { QRDialog } from "@components/Dialog/QRDialog.js"; export const DialogManager = (): JSX.Element => { const { channels, config, QRDialogOpen, setQRDialogOpen } = useDevice(); diff --git a/src/components/Dialog/ImportDialog.tsx b/src/components/Dialog/ImportDialog.tsx index d19278e8..cfd6b821 100644 --- a/src/components/Dialog/ImportDialog.tsx +++ b/src/components/Dialog/ImportDialog.tsx @@ -5,14 +5,13 @@ import { fromByteArray } from "base64-js"; import { toast } from "react-hot-toast"; import { QRCode } from "react-qrcode-logo"; +import { Checkbox } from "@components/form/Checkbox.js"; +import { IconButton } from "@components/form/IconButton.js"; +import { Input } from "@components/form/Input.js"; import { Dialog } from "@headlessui/react"; import { ClipboardIcon, XMarkIcon } from "@heroicons/react/24/outline"; import { Protobuf } from "@meshtastic/meshtasticjs"; -import { Checkbox } from "../form/Checkbox.js"; -import { Input } from "../form/Input.js"; -import { IconButton } from "../IconButton.js"; - export interface ImportDialogProps { isOpen: boolean; close: () => void; diff --git a/src/components/Dialog/QRDialog.tsx b/src/components/Dialog/QRDialog.tsx index 4d5aaa16..7d004474 100644 --- a/src/components/Dialog/QRDialog.tsx +++ b/src/components/Dialog/QRDialog.tsx @@ -5,14 +5,13 @@ import { fromByteArray } from "base64-js"; import { toast } from "react-hot-toast"; import { QRCode } from "react-qrcode-logo"; +import { Checkbox } from "@components/form/Checkbox.js"; +import { IconButton } from "@components/form/IconButton.js"; +import { Input } from "@components/form/Input.js"; import { Dialog } from "@headlessui/react"; import { ClipboardIcon, XMarkIcon } from "@heroicons/react/24/outline"; import { Protobuf } from "@meshtastic/meshtasticjs"; -import { Checkbox } from "../form/Checkbox.js"; -import { Input } from "../form/Input.js"; -import { IconButton } from "../IconButton.js"; - export interface QRDialogProps { isOpen: boolean; close: () => void; diff --git a/src/components/Drawer/index.tsx b/src/components/Drawer/index.tsx index 9f44e97f..63456fc5 100644 --- a/src/components/Drawer/index.tsx +++ b/src/components/Drawer/index.tsx @@ -1,13 +1,12 @@ import type React from "react"; import { useState } from "react"; +import { Metrics } from "@components/Drawer/Metrics.js"; +import { Notifications } from "@components/Drawer/Notifications.js"; +import type { TabType } from "@components/generic/TabbedContent.js"; import { Tab } from "@headlessui/react"; import { ChevronDownIcon, ChevronUpIcon } from "@heroicons/react/24/outline"; -import type { TabType } from "../layout/page/TabbedContent.js"; -import { Metrics } from "./Metrics.js"; -import { Notifications } from "./Notifications.js"; - export const Drawer = (): JSX.Element => { const [drawerOpen, setDrawerOpen] = useState(false); @@ -25,7 +24,7 @@ export const Drawer = (): JSX.Element => { onClick={() => { setDrawerOpen(true); }} - className={`flex h-full cursor-pointer px-1 first:pl-2 last:pr-2 hover:bg-orange-300 ${ + className={`flex h-full cursor-pointer px-1 first:pl-2 last:pr-2 hover:bg-orange-200 hover:text-orange-700 ${ selected ? "bg-orange-500 text-white" : "bg-white text-black" }`} > diff --git a/src/components/Dropdown.tsx b/src/components/Dropdown.tsx deleted file mode 100644 index 71ab6a01..00000000 --- a/src/components/Dropdown.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import type React from "react"; - -import { Disclosure } from "@headlessui/react"; -import { ChevronDownIcon, ChevronUpIcon } from "@heroicons/react/24/outline"; - -import { Mono } from "./Mono.js"; - -export interface DropdownProps { - title: string; - stat?: number; - icon: JSX.Element; - defaultOpen?: boolean; - children: React.ReactNode; -} - -export const Dropdown = ({ - title, - stat, - icon, - defaultOpen, - children -}: DropdownProps): JSX.Element => { - return ( - - {({ open }) => ( - <> - -
-
{icon}
- {title} - {stat !== undefined && ( - - {stat} - - )} -
-
- {open ? ( - - ) : ( - - )} -
-
- {children} - - )} -
- ); -}; diff --git a/src/components/NewDevice.tsx b/src/components/NewDevice.tsx index d5514cc9..0ae287bd 100644 --- a/src/components/NewDevice.tsx +++ b/src/components/NewDevice.tsx @@ -1,14 +1,14 @@ -import React, { useState } from "react"; +import React from "react"; import { FiBluetooth, FiTerminal, FiWifi } from "react-icons/fi"; -import { TabbedContent, TabType } from "./layout/page/TabbedContent.js"; -import { BLE } from "./PageComponents/Connect/BLE.js"; -import { HTTP } from "./PageComponents/Connect/HTTP.js"; -import { Serial } from "./PageComponents/Connect/Serial.js"; +import { TabbedContent, TabType } from "@components/generic/TabbedContent.js"; +import { BLE } from "@components/PageComponents/Connect/BLE.js"; +import { HTTP } from "@components/PageComponents/Connect/HTTP.js"; +import { Serial } from "@components/PageComponents/Connect/Serial.js"; export const NewDevice = () => { - const [tabs, _setTabs] = useState([ + const tabs: TabType[] = [ { name: "BLE", icon: , @@ -34,7 +34,7 @@ export const NewDevice = () => { disabledMessage: "WebSerial is currently only supported by Chromium based browsers: https://developer.mozilla.org/en-US/docs/Web/API/Web_Bluetooth_API#browser_compatibility" } - ]); + ]; return (
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 {