import React, {useEffect, useMemo, useRef, useState} from "react"; import {Divider, Tooltip, Input} from "antd"; import classNames from "classnames"; import { CheckIcon, ExitIcon, PencilAltIcon, RefreshIcon, XIcon, } from "@assets/icon/icon"; import {wsc} from "@network/chrome"; import "./Contro.css"; interface ControProps { } export const Contro: React.FC = () => { const [isEdit, setIsEdit] = useState(false); const [connected, setConnected] = useState(false); const [autoFindFailedReason, setAutoFindFailedReason] = useState(""); const [enginePort, setEnginePort] = useState(""); const [enginePortTemp, setEnginePortTemp] = useState(enginePort); const enginePortRef = useRef(enginePort); useEffect(() => { enginePortRef.current = enginePort; }, [enginePort]); useEffect(() => { const yakitConnectInfo = localStorage.getItem("yakit-connect"); if (!yakitConnectInfo) { findPort(11212, 11222); } else { const {port, connected} = JSON.parse(yakitConnectInfo); setConnected(connected); setEnginePort(port + ""); setAutoFindFailedReason(""); } wsc.onWSCMessage((message) => { if (message.action === wsc.ActionType.STATUS) { if (message.connected === false) { handleConnectFail(); } else { localStorage.setItem( "yakit-connect", JSON.stringify({connected: true, port: message.port}) ); setEnginePort(message.port + ""); setConnected(true); setAutoFindFailedReason(""); } } }); }, []); const findPort = (port: number, max: number) => { const ws = new WebSocket(`ws://127.0.0.1:${port}`); ws.onclose = (e: CloseEvent) => { if (enginePortRef.current) { handleConnectFail(); return; } if (e.reason !== `FoundYakitWebSocketController` && port + 1 <= max) { setTimeout(() => findPort(port + 1, max), 200); } if (port + 1 > max) { setConnected(false); setEnginePort(""); setAutoFindFailedReason("Cannot found Yakit"); localStorage.setItem("yakit-connect", ""); } }; ws.onopen = () => { setConnected(true); setEnginePort(port + ""); ws.close(1000, "FoundYakitWebSocketController"); connectPort(port); }; }; const handleConnectFail = () => { setConnected(false); setAutoFindFailedReason("Yakit WebSocket Controller Connect Fail"); localStorage.setItem("yakit-connect", ""); }; const connectPort = (port: number) => { setAutoFindFailedReason(""); wsc.connect(port); }; const safeConnected = useMemo(() => { return connected && enginePort; }, [connected, enginePort]); const failConnected = useMemo(() => { return !connected && autoFindFailedReason; }, [connected, autoFindFailedReason]); return ( <> {safeConnected || failConnected ? (
Yakit 引擎连接状态:
{isEdit ? ( <> { const value = e.target.value; setEnginePortTemp(value); }} />
{ setIsEdit(false); }} /> { if (enginePortTemp) { setIsEdit(false); setEnginePort(enginePortTemp); connectPort(Number(enginePortTemp)); } }} />
) : ( <>
{safeConnected && "已连接(" + enginePort + ")"} {failConnected && (enginePort ? autoFindFailedReason + "(" + enginePort + ")" : autoFindFailedReason)}
{ setIsEdit(true); setEnginePortTemp(enginePort); }} /> {safeConnected && ( wsc.disconnect()}/> )} {failConnected && ( { if (enginePort) { connectPort(Number(enginePort)); } else { findPort(11212, 11222); } }} /> )}
)}
) : null} ); };