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) { // ================= need return ==================== switch (message.command) { // ----------------- frequent ----------------------- case 'getHomeConfig': const config = { language: vscode.env.language }; panel.webview.postMessage({ command: 'getHomeConfig', data: { homeConfig: config } }); break; case 'getUserToken': const userToken = this.user.getUserTokenFromLocal(); if (userToken === undefined) { panel.webview.postMessage({ command: 'getUserToken', data: { userToken: '' } }); } else { panel.webview.postMessage({ command: 'getUserToken', data: { userToken: userToken } }); } break; case 'getUsername': const username = this.user.getUsernameFromLocal(); if (username === undefined) { panel.webview.postMessage({ command: 'getUsername', data: { username: '' } }); } else { panel.webview.postMessage({ command: 'getUsername', data: { username: username } }); } break; case 'firstOpenRemoteFolder': // data.host - project name await this.remoteContainer.firstOpenProject(data.host, data.hostname, data.port, data.username, data.path, this.context); break; case 'openRemoteFolder': this.remoteContainer.openRemoteFolder(data.host, data.port, data.username, data.path); break; case 'getDevstarDomain': panel.webview.postMessage({ command: 'getDevstarDomain', data: { devstarDomain: this.devstarDomain } }); break; // ----------------- not frequent ----------------------- case 'setUserToken': this.user.setUserTokenToLocal(data.userToken); if (data.userToken === this.user.getUserTokenFromLocal()) { panel.webview.postMessage({ command: 'setUserToken', data: { ok: true } }); } else { panel.webview.postMessage({ command: 'setUserToken', data: { ok: false } }); } break; case 'setUsername': this.user.setUsernameToLocal(data.username); if (data.username === this.user.getUsernameFromLocal()) { panel.webview.postMessage({ command: 'setUsername', data: { ok: true } }); } else { panel.webview.postMessage({ command: 'setUsername', data: { ok: false } }); } break; case 'getUserPublicKey': let userPublicKey = ''; if (this.user.existUserPrivateKey()) { userPublicKey = this.user.getUserPublicKey(); } panel.webview.postMessage({ command: 'getUserPublicKey', data: { userPublicKey: userPublicKey } }); break; case 'createUserPublicKey': await this.user.createUserSSHKey(); if (this.user.existUserPublicKey()) { panel.webview.postMessage({ command: 'createUserPublicKey', data: { ok: true } }); } else { panel.webview.postMessage({ command: 'createUserPublicKey', data: { ok: false } }); } break; case 'getMachineName': const machineName = os.hostname(); panel.webview.postMessage({ command: 'getMachineName', data: { machineName: machineName } }); break; } } else { // ================= don't need return ============== // frequent switch (message.command) { // ----------------- frequent ----------------------- case 'showInformationNotification': vscode.window.showInformationMessage(data.message); break; case 'showWarningNotification': vscode.window.showWarningMessage(data.message); break; case 'showErrorNotification': await utils.showErrorNotification(data.message); break; case 'openExternalUrl': // 修复:直接从 message 中获取 url,而不是从 data 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; } } }, 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 扩展

`; } }