All files / src/pages/ConnectedRobots ConnectedRobots.tsx

0% Statements 0/14
0% Branches 0/6
0% Functions 0/4
0% Lines 0/13

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61                                                                                                                         
import { useEffect, useState } from 'react'
 
/**
 * Displays the current connection status of a robot in real time.
 *
 * Opens an SSE connection to the backend (`/robot/ping_stream`) that emits
 * simple boolean JSON messages (`true` or `false`). Updates automatically when
 * the robot connects or disconnects.
 *
 * @returns A React element showing the current robot connection status.
 */
export default function ConnectedRobots() {
  
  /**
   * The current connection state:
   * - `true`: Robot is connected.
   * - `false`: Robot is not connected.
   * - `null`: Connection status is unknown (initial check in progress).
   */
  const [connected, setConnected] = useState<boolean | null>(null);
 
  useEffect(() => {
    // Open a Server-Sent Events (SSE) connection to receive live ping updates.
    // We're expecting a stream of data like that looks like this: `data = False` or `data = True`
    const eventSource = new EventSource("http://localhost:8000/robot/ping_stream");
    eventSource.onmessage = (event) => {
    
      // Expecting messages in JSON format: `true` or `false`
      console.log("received message:", event.data);
      try {
        const data = JSON.parse(event.data);
 
        try {
          setConnected(data)
        }
        catch {
          console.log("couldnt extract connected from incoming ping data")
        }
 
      } catch {
        console.log("Ping message not in correct format:", event.data);
      }
    };
 
    // Clean up the SSE connection when the component unmounts.
    return () => eventSource.close();
  }, []);
 
  return (
    <div>
      <h1>Is robot currently connected?</h1>
      <div>
        <h2>Robot is currently: {connected == null ? "checking..." : (connected ? "connected! 🟢" : "not connected... 🔴")} </h2>
        <h3>
          {connected == null ? "If checking continues, make sure CB is properly loaded with robot at least once." : ""}
        </h3>
      </div>
    </div>
  );
}