import React, { useEffect, useRef } from "react"; import { Terminal } from "@xterm/xterm"; import { FitAddon } from "xterm-addon-fit"; import "@xterm/xterm/css/xterm.css"; import { AttachAddon } from "@xterm/addon-attach"; import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; interface Props { id: string; containerId: string; } export const DockerTerminal: React.FC = ({ id, containerId }) => { const termRef = useRef(null); const [activeWay, setActiveWay] = React.useState("bash"); useEffect(() => { const container = document.getElementById(id); if (container) { container.innerHTML = ""; } const term = new Terminal({ cursorBlink: true, cols: 80, rows: 30, lineHeight: 1.4, convertEol: true, theme: { cursor: "transparent", background: "rgba(0, 0, 0, 0)", }, }); const addonFit = new FitAddon(); const protocol = window.location.protocol === "https:" ? "wss:" : "ws:"; const wsUrl = `${protocol}//${window.location.host}/docker-container-terminal?containerId=${containerId}&activeWay=${activeWay}`; const ws = new WebSocket(wsUrl); const addonAttach = new AttachAddon(ws); // @ts-ignore term.open(termRef.current); term.loadAddon(addonFit); term.loadAddon(addonAttach); addonFit.fit(); return () => { ws.readyState === WebSocket.OPEN && ws.close(); }; }, [containerId, activeWay, id]); return (
Select way to connect to {containerId} Bash /bin/sh
); };