mirror of
https://github.com/QwenLM/qwen-code.git
synced 2025-12-19 09:33:53 +00:00
fix(vscode-ide-companion): 重构 useVSCode hook 实现, 解决 webview 中 vscode api 重复声明
This commit is contained in:
@@ -4,8 +4,6 @@
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
import { useMemo } from 'react';
|
||||
|
||||
export interface VSCodeAPI {
|
||||
postMessage: (message: unknown) => void;
|
||||
getState: () => unknown;
|
||||
@@ -14,14 +12,28 @@ export interface VSCodeAPI {
|
||||
|
||||
declare const acquireVsCodeApi: () => VSCodeAPI;
|
||||
|
||||
export function useVSCode(): VSCodeAPI {
|
||||
return useMemo(() => {
|
||||
/**
|
||||
* 模块级别的 VS Code API 实例缓存
|
||||
* acquireVsCodeApi() 只能调用一次,必须在模块级别缓存
|
||||
*/
|
||||
let vscodeApiInstance: VSCodeAPI | null = null;
|
||||
|
||||
/**
|
||||
* 获取 VS Code API 实例
|
||||
* 使用模块级别缓存确保 acquireVsCodeApi() 只被调用一次
|
||||
*/
|
||||
function getVSCodeAPI(): VSCodeAPI {
|
||||
if (vscodeApiInstance) {
|
||||
return vscodeApiInstance;
|
||||
}
|
||||
|
||||
if (typeof acquireVsCodeApi !== 'undefined') {
|
||||
return acquireVsCodeApi();
|
||||
vscodeApiInstance = acquireVsCodeApi();
|
||||
return vscodeApiInstance;
|
||||
}
|
||||
|
||||
// Fallback for development/testing
|
||||
return {
|
||||
vscodeApiInstance = {
|
||||
postMessage: (message: unknown) => {
|
||||
console.log('Mock postMessage:', message);
|
||||
},
|
||||
@@ -30,5 +42,13 @@ export function useVSCode(): VSCodeAPI {
|
||||
console.log('Mock setState:', state);
|
||||
},
|
||||
};
|
||||
}, []);
|
||||
return vscodeApiInstance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Hook to get VS Code API
|
||||
* 多个组件可以安全地调用此 hook,API 实例会被复用
|
||||
*/
|
||||
export function useVSCode(): VSCodeAPI {
|
||||
return getVSCodeAPI();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user