claude-code-best/src/hooks/useIDEIntegration.tsx
2026-05-01 21:39:30 +08:00

79 lines
2.6 KiB
TypeScript

import { useEffect } from 'react';
import type { ScopedMcpServerConfig } from '../services/mcp/types.js';
import { getGlobalConfig } from '../utils/config.js';
import { isEnvDefinedFalsy, isEnvTruthy } from '../utils/envUtils.js';
import type { DetectedIDEInfo } from '../utils/ide.js';
import {
type IDEExtensionInstallationStatus,
type IdeType,
initializeIdeIntegration,
isSupportedTerminal,
} from '../utils/ide.js';
type UseIDEIntegrationProps = {
autoConnectIdeFlag?: boolean;
ideToInstallExtension: IdeType | null;
setDynamicMcpConfig: React.Dispatch<React.SetStateAction<Record<string, ScopedMcpServerConfig> | undefined>>;
setShowIdeOnboarding: React.Dispatch<React.SetStateAction<boolean>>;
setIDEInstallationState: React.Dispatch<React.SetStateAction<IDEExtensionInstallationStatus | null>>;
};
export function useIDEIntegration({
autoConnectIdeFlag,
ideToInstallExtension,
setDynamicMcpConfig,
setShowIdeOnboarding,
setIDEInstallationState,
}: UseIDEIntegrationProps): void {
useEffect(() => {
function addIde(ide: DetectedIDEInfo | null) {
if (!ide) {
return;
}
// Check if auto-connect is enabled
const globalConfig = getGlobalConfig();
const autoConnectEnabled =
(globalConfig.autoConnectIde ||
autoConnectIdeFlag ||
isSupportedTerminal() ||
// tmux/screen overwrite TERM_PROGRAM, breaking terminal detection, but the
// IDE extension's port env var is inherited. If set, auto-connect anyway.
process.env.CLAUDE_CODE_SSE_PORT ||
ideToInstallExtension ||
isEnvTruthy(process.env.CLAUDE_CODE_AUTO_CONNECT_IDE)) &&
!isEnvDefinedFalsy(process.env.CLAUDE_CODE_AUTO_CONNECT_IDE);
if (!autoConnectEnabled) {
return;
}
setDynamicMcpConfig(prev => {
// Only add the IDE if we don't already have one
if (prev?.ide) {
return prev;
}
return {
...prev,
ide: {
type: ide.url.startsWith('ws:') ? 'ws-ide' : 'sse-ide',
url: ide.url,
ideName: ide.name,
authToken: ide.authToken,
ideRunningInWindows: ide.ideRunningInWindows,
scope: 'dynamic' as const,
},
};
});
}
// Use the new utility function
void initializeIdeIntegration(
addIde,
ideToInstallExtension,
() => setShowIdeOnboarding(true),
status => setIDEInstallationState(status),
);
}, [autoConnectIdeFlag, ideToInstallExtension, setDynamicMcpConfig, setShowIdeOnboarding, setIDEInstallationState]);
}