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