import { faArrowsSpin, faBug, faCog, faCogs, faDownLong, faFileDownload, faInfo, faLink, faObjectGroup, faReceipt, faWandMagic, faWandSparkles, } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { type JSX, lazy, useEffect } from "react"; import { useTranslation } from "react-i18next"; import { NavLink, type NavLinkRenderProps, useNavigate, useParams } from "react-router"; import { useShallow } from "zustand/react/shallow"; import HeaderDeviceSelector from "../components/device-page/HeaderDeviceSelector.js"; import { NavBarContent } from "../layout/NavBarContext.js"; import { useAppStore } from "../store.js"; import type { Device } from "../types.js"; import { getValidSourceIdx } from "../utils.js"; export type TabName = | "info" | "bind" | "state" | "exposes" | "clusters" | "reporting" | "settings" | "settings-specific" | "dev-console" | "groups" | "scene" | "docs"; type DevicePageUrlParams = { sourceIdx: `${number}`; deviceId: string; tab?: TabName; }; const BindTab = lazy(async () => await import("../components/device-page/tabs/Bind.js")); const ClustersTab = lazy(async () => await import("../components/device-page/tabs/Clusters.js")); const DevConsoleTab = lazy(async () => await import("../components/device-page/tabs/DevConsole.js")); const DeviceInfoTab = lazy(async () => await import("../components/device-page/tabs/DeviceInfo.js")); const DeviceSettingsTab = lazy(async () => await import("../components/device-page/tabs/DeviceSettings.js")); const DeviceSpecificSettingsTab = lazy(async () => await import("../components/device-page/tabs/DeviceSpecificSettings.js")); const DocsTab = lazy(async () => await import("../components/device-page/tabs/Docs.js")); const ExposesTab = lazy(async () => await import("../components/device-page/tabs/Exposes.js")); const GroupsTab = lazy(async () => await import("../components/device-page/tabs/Groups.js")); const ReportingTab = lazy(async () => await import("../components/device-page/tabs/Reporting.js")); const SceneTab = lazy(async () => await import("../components/device-page/tabs/Scene.js")); const StateTab = lazy(async () => await import("../components/device-page/tabs/State.js")); function renderTab(sourceIdx: number, tab: TabName, device: Device) { const key = `${sourceIdx}-${device.ieee_address}`; switch (tab) { case "info": return ; case "exposes": return ; case "bind": return ; case "reporting": return ; case "settings": return ; case "settings-specific": return ; case "state": return ; case "clusters": return ; case "groups": return ; case "scene": return ; case "dev-console": return ; case "docs": return device.definition?.model ? : null; } } const isTabActive = ({ isActive }: NavLinkRenderProps) => (isActive ? "tab tab-active" : "tab"); export default function DevicePage(): JSX.Element { const navigate = useNavigate(); const { t } = useTranslation(["devicePage", "common"]); const { sourceIdx, deviceId, tab } = useParams(); const [numSourceIdx, validSourceIdx] = getValidSourceIdx(sourceIdx); const device = useAppStore( useShallow((state) => (deviceId ? state.devices[numSourceIdx].find((device) => device.ieee_address === deviceId) : undefined)), ); useEffect(() => { if (sourceIdx && validSourceIdx && device) { if (device.type === "Coordinator") { void navigate(`/settings/${sourceIdx}/about`, { replace: true }); } else if (!tab) { void navigate(`/device/${sourceIdx}/${device.ieee_address}/info`, { replace: true }); } } else { void navigate("/devices", { replace: true }); } }, [sourceIdx, validSourceIdx, tab, device, navigate]); return ( <>
{t(($) => $.about)} {t(($) => $.exposes, { ns: "common" })} {t(($) => $.bind)} {t(($) => $.reporting)} {t(($) => $.settings)} {t(($) => $.settings_specific)} {t(($) => $.state)} {t(($) => $.clusters)} {t(($) => $.groups)} {t(($) => $.scene)} {t(($) => $.dev_console)} {device?.supported && device.definition?.source === "native" ? ( {t(($) => $.docs)} ) : null}
{tab && device ? ( renderTab(numSourceIdx, tab, device) ) : (
{t(($) => $.unknown_device, { ns: "common" })}
)}
); }