fix(vscode-ide-companion): 重构 useVSCode hook 实现, 解决 webview 中 vscode api 重复声明

This commit is contained in:
yiliang114
2025-11-20 11:07:09 +08:00
parent 805e5f92c1
commit dcc10eb0a9

View File

@@ -4,8 +4,6 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
import { useMemo } from 'react';
export interface VSCodeAPI { export interface VSCodeAPI {
postMessage: (message: unknown) => void; postMessage: (message: unknown) => void;
getState: () => unknown; getState: () => unknown;
@@ -14,21 +12,43 @@ export interface VSCodeAPI {
declare const acquireVsCodeApi: () => VSCodeAPI; declare const acquireVsCodeApi: () => VSCodeAPI;
export function useVSCode(): VSCodeAPI { /**
return useMemo(() => { * 模块级别的 VS Code API 实例缓存
if (typeof acquireVsCodeApi !== 'undefined') { * acquireVsCodeApi() 只能调用一次,必须在模块级别缓存
return acquireVsCodeApi(); */
} let vscodeApiInstance: VSCodeAPI | null = null;
// Fallback for development/testing /**
return { * 获取 VS Code API 实例
postMessage: (message: unknown) => { * 使用模块级别缓存确保 acquireVsCodeApi() 只被调用一次
console.log('Mock postMessage:', message); */
}, function getVSCodeAPI(): VSCodeAPI {
getState: () => ({}), if (vscodeApiInstance) {
setState: (state: unknown) => { return vscodeApiInstance;
console.log('Mock setState:', state); }
},
}; if (typeof acquireVsCodeApi !== 'undefined') {
}, []); vscodeApiInstance = acquireVsCodeApi();
return vscodeApiInstance;
}
// Fallback for development/testing
vscodeApiInstance = {
postMessage: (message: unknown) => {
console.log('Mock postMessage:', message);
},
getState: () => ({}),
setState: (state: unknown) => {
console.log('Mock setState:', state);
},
};
return vscodeApiInstance;
}
/**
* Hook to get VS Code API
* 多个组件可以安全地调用此 hookAPI 实例会被复用
*/
export function useVSCode(): VSCodeAPI {
return getVSCodeAPI();
} }