connections.tsx 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import { useEffect, useState } from "react";
  2. import { Paper } from "@mui/material";
  3. import { Virtuoso } from "react-virtuoso";
  4. import { ApiType } from "../services/types";
  5. import { getInfomation } from "../services/api";
  6. import BasePage from "../components/base-page";
  7. import ConnectionItem from "../components/connection-item";
  8. const ConnectionsPage = () => {
  9. const initConn = { uploadTotal: 0, downloadTotal: 0, connections: [] };
  10. const [conn, setConn] = useState<ApiType.Connections>(initConn);
  11. useEffect(() => {
  12. let ws: WebSocket | null = null;
  13. getInfomation().then((result) => {
  14. const { server = "", secret = "" } = result;
  15. ws = new WebSocket(`ws://${server}/connections?token=${secret}`);
  16. ws.addEventListener("message", (event) => {
  17. const data = JSON.parse(event.data) as ApiType.Connections;
  18. setConn(data);
  19. });
  20. });
  21. return () => ws?.close();
  22. }, []);
  23. return (
  24. <BasePage title="Connections" contentStyle={{ height: "100%" }}>
  25. <Paper sx={{ boxShadow: 2, height: "100%" }}>
  26. <Virtuoso
  27. data={conn.connections}
  28. itemContent={(index, item) => <ConnectionItem value={item} />}
  29. />
  30. </Paper>
  31. </BasePage>
  32. );
  33. };
  34. export default ConnectionsPage;