From 4f1d7f495ac6b5f6c55375f4794a1858a62b14de Mon Sep 17 00:00:00 2001 From: Roe-xin Date: Wed, 28 Jan 2026 21:38:49 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0Webview=E8=A7=86?= =?UTF-8?q?=E5=9B=BE=E6=8F=90=E4=BE=9B=E8=80=85=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?HTML=E5=86=85=E5=AE=B9=E7=94=9F=E6=88=90=E5=92=8C=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E6=9C=8D=E5=8A=A1=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- src/extension.ts | 7 +- src/services/notificationService.ts | 17 +- src/views/ICViewProvider.ts | 304 ++++++++++------------------ 4 files changed, 130 insertions(+), 200 deletions(-) diff --git a/package.json b/package.json index 1752096..cef51f8 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ }, "activationEvents": [ "onCommand:ic-coder.openPanel", - "onView:ic-coder-sidebar", + "onView:ic-coder.mainView", "onLanguage:verilog", "onLanguage:vhdl", "onStartupFinished" diff --git a/src/extension.ts b/src/extension.ts index cb9192a..ba00e75 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -289,7 +289,12 @@ export async function activate(context: vscode.ExtensionContext) { const viewProvider = new ICViewProvider(context.extensionUri, context); const viewRegistration = vscode.window.registerWebviewViewProvider( "ic-coder.mainView", - viewProvider + viewProvider, + { + webviewOptions: { + retainContextWhenHidden: true + } + } ); // 注册 VCD 自定义编辑器 diff --git a/src/services/notificationService.ts b/src/services/notificationService.ts index db18ee0..86f6442 100644 --- a/src/services/notificationService.ts +++ b/src/services/notificationService.ts @@ -1,8 +1,14 @@ import * as vscode from 'vscode'; import * as path from 'path'; -// 使用 require 导入 node-notifier -const notifier = require('node-notifier'); +// 尝试加载 node-notifier,如果失败则使用 null +let notifier: any = null; +try { + notifier = require('node-notifier'); + console.log('[NotificationService] node-notifier 加载成功'); +} catch (error) { + console.log('[NotificationService] node-notifier 加载失败,将只使用 VS Code 内置通知'); +} /** * 通知类型枚举 @@ -114,6 +120,13 @@ export class NotificationService { } console.log('[NotificationService] 通过防抖检查'); + // 如果 node-notifier 不可用,直接使用 VS Code 内置通知 + if (!notifier) { + console.log('[NotificationService] node-notifier 不可用,使用 VS Code 内置通知'); + this.showVSCodeNotification(title, message, type, onClick); + return; + } + // 使用 node-notifier 发送系统通知 console.log('[NotificationService] 使用 node-notifier 发送系统通知'); diff --git a/src/views/ICViewProvider.ts b/src/views/ICViewProvider.ts index 6fcece9..f4a55fb 100644 --- a/src/views/ICViewProvider.ts +++ b/src/views/ICViewProvider.ts @@ -206,35 +206,46 @@ export class ICViewProvider implements vscode.WebviewViewProvider { } resolveWebviewView(webviewView: vscode.WebviewView) { + console.log('[ICViewProvider] ========== resolveWebviewView 被调用 =========='); + // 保存引用以便后续刷新 this._view = webviewView; webviewView.webview.options = { enableScripts: true, - localResourceRoots: [vscode.Uri.joinPath(this.extensionUri, "media")], + localResourceRoots: [ + vscode.Uri.joinPath(this.extensionUri, "media"), + vscode.Uri.joinPath(this.extensionUri, "src", "assets") + ], }; - // 异步检查 token 是否过期并清除 - vscode.authentication.getSession("iccoder", [], { createIfNone: false }) - .then((session) => { - const token = session?.accessToken; - if (token && isTokenExpired(token)) { - // 静默清除过期的 session - this.context.globalState.update('icCoderSessions', []); - this.context.globalState.update('icCoderUserInfo', undefined); - console.log('[ICViewProvider] Token 已过期,已清除所有登录状态'); - } - }, () => { - // 忽略错误 - }); + console.log('[ICViewProvider] Webview options 已设置'); + console.log('[ICViewProvider] extensionUri:', this.extensionUri.toString()); - // 检查是否已登录(使用 Authentication API) - this.checkLoginStatus().then((isLoggedIn) => { - webviewView.webview.html = this.getWebviewContent( - webviewView.webview, - isLoggedIn - ); - }); + // 【关键修复】先设置默认 HTML,避免一直加载 + try { + const html = this.getWebviewContent(webviewView.webview, false); + console.log('[ICViewProvider] HTML 内容已生成,长度:', html.length); + webviewView.webview.html = html; + console.log('[ICViewProvider] HTML 已设置到 webview'); + } catch (error) { + console.error('[ICViewProvider] 设置 HTML 失败:', error); + } + + // 异步检查登录状态并更新 UI + this.checkLoginStatus() + .then((isLoggedIn) => { + console.log('[ICViewProvider] 登录状态检查完成:', isLoggedIn); + webviewView.webview.html = this.getWebviewContent( + webviewView.webview, + isLoggedIn + ); + }) + .catch((error) => { + console.error('[ICViewProvider] 检查登录状态失败:', error); + // 即使失败也显示未登录状态 + webviewView.webview.html = this.getWebviewContent(webviewView.webview, false); + }); // 处理侧边栏的消息 webviewView.webview.onDidReceiveMessage( @@ -265,187 +276,88 @@ export class ICViewProvider implements vscode.WebviewViewProvider { webview: vscode.Webview, isLoggedIn: boolean ): string { + console.log('[ICViewProvider] 开始生成 HTML 内容, isLoggedIn:', isLoggedIn); + const logoUri = webview.asWebviewUri( vscode.Uri.joinPath(this.extensionUri, "media", "icon.png") ); - return ` - - - - - - -
- IC Coder -

欢迎使用 IC Coder

- ${ - isLoggedIn - ? '' - : '' - } -
+ return ` + + + + + + + +
+ IC Coder +

欢迎使用 IC Coder

+ ${isLoggedIn + ? '' + : '' + } +
+ - - - `; + console.log('[Webview] 初始化完成'); + + +`; } }