import * as vscode from 'vscode'; import * as os from 'os'; import * as path from 'path'; import RemoteContainer from './remote-container'; import User from './user'; import * as utils from './utils' export default class DSHome { private context: vscode.ExtensionContext; private remoteContainer: RemoteContainer; private user: User; private devstarDomain: string | undefined; /** * 配置项提供devstarDomain * @param context * @param user */ constructor(context: vscode.ExtensionContext, user: User) /** * open with vscode链接提供devstarDomain * @param context * @param user * @param devstarDomain */ constructor(context: vscode.ExtensionContext, user: User, devstarDomain: string) constructor(context: vscode.ExtensionContext, user: User, devstarDomain?: string) { this.context = context; this.user = user; this.remoteContainer = new RemoteContainer(user); if (devstarDomain != undefined && devstarDomain != "") { this.devstarDomain = devstarDomain.endsWith('/') ? devstarDomain.slice(0, -1) : devstarDomain; } else { const devstarDomainFromConfig = utils.devstarDomain(); if (devstarDomainFromConfig != undefined && devstarDomainFromConfig != "") { this.devstarDomain = devstarDomainFromConfig.endsWith('/') ? devstarDomainFromConfig.slice(0, -1) : devstarDomainFromConfig; } else { this.devstarDomain = "https://devstar.cn"; } } } setUser(user: User) { this.user = user; } setRemoteContainer(remoteContainer: RemoteContainer) { this.remoteContainer = remoteContainer; } setDevstarDomainAndHomePageURL(devstarDomain: string) { if (devstarDomain != undefined && devstarDomain != "") { this.devstarDomain = devstarDomain.endsWith('/') ? devstarDomain.slice(0, -1) : devstarDomain; } else { console.error("devstarDomain is undefined or null"); } } async toggle() { const panel = vscode.window.createWebviewPanel( 'homeWebview', vscode.l10n.t('Home'), vscode.ViewColumn.One, { enableScripts: true, retainContextWhenHidden: true, localResourceRoots: [ vscode.Uri.file(path.join(this.context.extensionPath, 'assets')) ] } ); panel.webview.html = await this.getWebviewContent(panel); panel.webview.onDidReceiveMessage( async (message) => { const data = message.data; const need_return = message.need_return; if (need_return) { // 处理需要返回结果的消息 switch (message.command) { case 'getUserToken': panel.webview.postMessage({ command: 'getUserToken', data: { userToken: this.user.getUserTokenFromLocal() } }); break; case 'getUsername': panel.webview.postMessage({ command: 'getUsername', data: { username: this.user.getUsernameFromLocal() } }); break; case 'getDevstarDomain': panel.webview.postMessage({ command: 'getDevstarDomain', data: { devstarDomain: this.devstarDomain } }); break; } } else { // 处理不需要返回结果的消息 switch (message.command) { case 'openExternalUrl': const url = message.url || (data && data.url); if (url) { try { await vscode.env.openExternal(vscode.Uri.parse(url)); vscode.window.showInformationMessage(`已在浏览器中打开: ${url}`); } catch (error) { vscode.window.showErrorMessage(`打开链接失败: ${url}`); console.error('打开外部链接失败:', error); } } else { console.error('openExternalUrl: url is undefined', message); vscode.window.showErrorMessage('打开链接失败: 链接地址无效'); } break; case 'showInformationNotification': if (data && data.message) { vscode.window.showInformationMessage(data.message); } break; case 'showErrorNotification': if (data && data.message) { vscode.window.showErrorMessage(data.message); } break; } } }, undefined, this.context.subscriptions ); this.context.subscriptions.push(panel); } async getWebviewContent(panel?: vscode.WebviewPanel): Promise { // 获取图片的 Webview URI let logoUri = ''; if (panel) { const logoPath = vscode.Uri.file( path.join(this.context.extensionPath, 'assets', 'images', 'logo.png') ); logoUri = panel.webview.asWebviewUri(logoPath).toString(); } return ` DevStar Home
${logoUri ? `` : '🚀'}

欢迎使用 DevStar 扩展

`; } }