diff --git a/AppImage/app/terminal/page.tsx b/AppImage/app/terminal/page.tsx index 910bdb9..5830403 100644 --- a/AppImage/app/terminal/page.tsx +++ b/AppImage/app/terminal/page.tsx @@ -1,9 +1,16 @@ -"use client" - -import { TerminalPanel } from "@/components/terminal-panel" +import dynamic from "next/dynamic" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { TerminalIcon } from "lucide-react" +const TerminalPanel = dynamic(() => import("@/components/terminal-panel").then((mod) => mod.TerminalPanel), { + ssr: false, + loading: () => ( +
+
Loading terminal...
+
+ ), +}) + export default function TerminalPage() { return (
diff --git a/AppImage/components/terminal-panel.tsx b/AppImage/components/terminal-panel.tsx index 6168dc2..cae3bfb 100644 --- a/AppImage/components/terminal-panel.tsx +++ b/AppImage/components/terminal-panel.tsx @@ -2,9 +2,15 @@ import type React from "react" import { useEffect, useRef } from "react" -import { Terminal } from "xterm" -import { FitAddon } from "xterm-addon-fit" -import "xterm/css/xterm.css" + +let Terminal: any +let FitAddon: any + +if (typeof window !== "undefined") { + Terminal = require("xterm").Terminal + FitAddon = require("xterm-addon-fit").FitAddon + require("xterm/css/xterm.css") +} type TerminalPanelProps = { websocketUrl?: string // Custom WebSocket URL if needed @@ -12,15 +18,15 @@ type TerminalPanelProps = { export const TerminalPanel: React.FC = ({ websocketUrl = "ws://localhost:8008/ws/terminal" }) => { const containerRef = useRef(null) - const termRef = useRef(null) - const fitAddonRef = useRef(null) + const termRef = useRef(null) + const fitAddonRef = useRef(null) const wsRef = useRef(null) // For touch gestures const touchStartRef = useRef<{ x: number; y: number; time: number } | null>(null) useEffect(() => { - if (!containerRef.current) return + if (!containerRef.current || !Terminal || !FitAddon) return const term = new Terminal({ fontFamily: "monospace",