import styles from "./styles.module.css"; import CogSelectedIcon from "../../assets/connect-button/cog_selected.svg"; import MartySelectedIcon from "../../assets/connect-button/marty_selected.svg"; import { ReactComponent as ConnectButtonDefault } from "../../assets/connect-button/connect_btn-default.svg"; import RobotButton from "./RobotButton"; import { FaPlus } from "react-icons/fa"; import { NewRobotIdE } from "@robotical/webapp-types/dist-types/src/store/SelectedRaftContext"; import { useEffect, useRef, useState } from "react"; type ConnectionStatus = "idle" | "connecting" | "error"; type Props = { isNavMenuMinimized: boolean; }; const ConnectionArea: React.FC = ({ isNavMenuMinimized }) => { const [, setRefresh] = useState(0); const [connectionStatus, setConnectionStatus] = useState("idle"); const connectedRafts = window.applicationManager?.connectedRafts || {}; const connectedRaftsArray = Object.values(connectedRafts); const visibleConnectedRafts = connectedRaftsArray.filter(raft => raft.id !== NewRobotIdE.NEW); const hasConnectedRafts = visibleConnectedRafts.length > 0; const connectedRaftsLength = useRef(connectedRaftsArray.length); useEffect(() => { const connectedRaftInterval = setInterval(() => { const allConnectedRafts = window.applicationManager?.connectedRafts || {}; if (connectedRaftsLength.current !== Object.keys(allConnectedRafts).length) { connectedRaftsLength.current = Object.keys(allConnectedRafts).length; setRefresh(old => old + 1); } }, 2000); return () => { clearInterval(connectedRaftInterval); } }, []); const onClickConnect = async () => { if (!window.applicationManager) return; setConnectionStatus("connecting"); try { await window.applicationManager.connectGeneric(() => { setRefresh((old) => old + 1); setConnectionStatus("idle"); }); setConnectionStatus("idle"); } catch { setConnectionStatus("error"); } }; const onClickDisconnect = async (raftId: string) => { if (!window.applicationManager) return; await window.applicationManager.disconnectGeneric( window.applicationManager.connectedRafts[raftId], () => setRefresh((old) => old + 1) ); }; const connectionLabel = connectionStatus === "connecting" ? "Connecting…" : connectionStatus === "error" ? "Try connecting again" : "Connect device"; return
{/* Connection button */} {!hasConnectedRafts && <> {connectionStatus === "connecting" ? "Connecting to a device." : connectionStatus === "error" ? "Connection failed. Please try again." : "Ready to connect a device."} } {/* End of connection button */} {isNavMenuMinimized ? null : visibleConnectedRafts.map((connectedRaft) => { return }) } {hasConnectedRafts && }
} export default ConnectionArea;