74 lines
2.7 KiB
TypeScript
74 lines
2.7 KiB
TypeScript
import { useCallback, useEffect, useSyncExternalStore } from 'react';
|
|
import { useAppStore } from '@/components/state-provider';
|
|
import { lspClientManager, toLspLanguage, type LspStatus } from '@/lib/lsp/lsp-client-manager';
|
|
|
|
const DISABLED: LspStatus = { state: 'disabled' };
|
|
|
|
export function useLsp(
|
|
sessionId: string | null,
|
|
monacoLanguage: string
|
|
): {
|
|
status: LspStatus;
|
|
lspLanguage: string | null;
|
|
toggle: () => void;
|
|
} {
|
|
const lspAutoStartLanguages = useAppStore((s) => s.userSettings.lspAutoStartLanguages);
|
|
const lspServerConfigs = useAppStore((s) => s.userSettings.lspServerConfigs);
|
|
const lspLanguage = toLspLanguage(monacoLanguage);
|
|
const shouldAutoStart = lspLanguage ? lspAutoStartLanguages.includes(lspLanguage) : false;
|
|
|
|
const status = useSyncExternalStore(
|
|
(cb) =>
|
|
lspClientManager.onStatusChange((key) => {
|
|
if (key === `${sessionId}:${lspLanguage}`) cb();
|
|
}),
|
|
() =>
|
|
sessionId && lspLanguage
|
|
? lspClientManager.getStatus(sessionId, lspLanguage)
|
|
: DISABLED
|
|
);
|
|
|
|
// Auto-start: connect when file opens if language is in auto-start list
|
|
useEffect(() => {
|
|
if (!shouldAutoStart || !sessionId || !lspLanguage) return;
|
|
const disconnect = lspClientManager.connect(sessionId, lspLanguage, lspServerConfigs);
|
|
return disconnect;
|
|
}, [shouldAutoStart, sessionId, lspLanguage, lspServerConfigs]);
|
|
|
|
// Restore LSP state from localStorage: if the user previously enabled LSP
|
|
// manually for this session+language, reconnect automatically on page load.
|
|
useEffect(() => {
|
|
if (!sessionId || !lspLanguage) return;
|
|
if (shouldAutoStart) return;
|
|
const current = lspClientManager.getStatus(sessionId, lspLanguage);
|
|
if (current.state !== 'disabled') return;
|
|
|
|
if (lspClientManager.isEnabledInStorage(sessionId, lspLanguage)) {
|
|
lspClientManager.connect(sessionId, lspLanguage, lspServerConfigs);
|
|
}
|
|
}, [sessionId, lspLanguage, shouldAutoStart, lspServerConfigs]);
|
|
|
|
// Manual toggle
|
|
const toggle = useCallback(() => {
|
|
if (!sessionId || !lspLanguage) return;
|
|
const current = lspClientManager.getStatus(sessionId, lspLanguage);
|
|
if (
|
|
current.state === 'disabled' ||
|
|
current.state === 'error' ||
|
|
current.state === 'unavailable'
|
|
) {
|
|
lspClientManager.connect(sessionId, lspLanguage, lspServerConfigs);
|
|
lspClientManager.saveEnabledState(sessionId, lspLanguage);
|
|
} else if (
|
|
current.state === 'ready' ||
|
|
current.state === 'connecting' ||
|
|
current.state === 'starting'
|
|
) {
|
|
lspClientManager.stop(sessionId, lspLanguage);
|
|
lspClientManager.clearEnabledState(sessionId, lspLanguage);
|
|
}
|
|
}, [sessionId, lspLanguage, lspServerConfigs]);
|
|
|
|
return { status, lspLanguage, toggle };
|
|
}
|