fix(playground): improve language change handling with proper cleanup and error handling

This commit is contained in:
ngc2207 2025-01-05 04:09:52 +08:00
parent 58e4f1220b
commit d1d8edb8cc

View File

@ -51,6 +51,7 @@ export default function PlaygroundPage() {
const languageClientRef = useRef<MonacoLanguageClient | null>(null); const languageClientRef = useRef<MonacoLanguageClient | null>(null);
useEffect(() => { useEffect(() => {
const handleLanguageChange = async () => {
if (editorRef.current) { if (editorRef.current) {
const model = editorRef.current.getModel(); const model = editorRef.current.getModel();
if (model) { if (model) {
@ -61,21 +62,32 @@ export default function PlaygroundPage() {
column: lastLineLength + 1, column: lastLineLength + 1,
}); });
editorRef.current.focus(); editorRef.current.focus();
if (webSocketRef.current) { if (languageClientRef.current) {
await languageClientRef.current.stop();
languageClientRef.current = null;
}
if (
webSocketRef.current &&
webSocketRef.current.readyState !== WebSocket.CLOSED &&
webSocketRef.current.readyState !== WebSocket.CLOSING
) {
webSocketRef.current.close(); webSocketRef.current.close();
webSocketRef.current = null; webSocketRef.current = null;
} }
if (languageClientRef.current) { try {
languageClientRef.current.stop(); const languageClient = await connectToLanguageServer(
languageClientRef.current = null; language,
} webSocketRef
connectToLanguageServer(language, webSocketRef).then(
(languageClient) => {
languageClientRef.current = languageClient;
}
); );
languageClientRef.current = languageClient;
} catch (error) {
console.error("Failed to connect to language server:", error);
} }
} }
}
};
handleLanguageChange();
}, [language]); }, [language]);
return ( return (
@ -146,11 +158,13 @@ export default function PlaygroundPage() {
column: lastLineLength + 1, column: lastLineLength + 1,
}); });
editorRef.current.focus(); editorRef.current.focus();
connectToLanguageServer(language, webSocketRef).then( connectToLanguageServer(language, webSocketRef)
(languageClient) => { .then((languageClient) => {
languageClientRef.current = languageClient; languageClientRef.current = languageClient;
} })
); .catch((error) => {
console.error("Failed to connect to language server:", error);
});
} }
} }
}} }}