From 24df60ca16b9091b3f35ed0a27bc9021c4c4d64b Mon Sep 17 00:00:00 2001 From: yinxue <2643126914@qq.com> Date: Mon, 10 Nov 2025 08:45:19 +0000 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9HOME=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/home.ts | 364 +++++++++++++++++++++++++++++++--------------------- src/main.ts | 4 +- 2 files changed, 220 insertions(+), 148 deletions(-) diff --git a/src/home.ts b/src/home.ts index b23670b..22e6303 100644 --- a/src/home.ts +++ b/src/home.ts @@ -8,9 +8,7 @@ export default class DSHome { private context: vscode.ExtensionContext; private remoteContainer: RemoteContainer; private user: User; - private devstarHomePageUrl: string; - private devstarDomain: string | undefined - + private devstarDomain: string | undefined; /** * 配置项提供devstarDomain @@ -33,54 +31,51 @@ export default class DSHome { this.remoteContainer = new RemoteContainer(user); if (devstarDomain != undefined && devstarDomain != "") { - this.devstarDomain = devstarDomain.endsWith('/') ? devstarDomain.slice(0, -1) : devstarDomain - this.devstarHomePageUrl = this.devstarDomain + "/devstar-home" + this.devstarDomain = devstarDomain.endsWith('/') ? devstarDomain.slice(0, -1) : devstarDomain; } else { - const devstarDomainFromConfig = utils.devstarDomain() + const devstarDomainFromConfig = utils.devstarDomain(); if (devstarDomainFromConfig != undefined && devstarDomainFromConfig != "") { - this.devstarDomain = devstarDomainFromConfig.endsWith('/') ? devstarDomainFromConfig.slice(0, -1) : devstarDomainFromConfig - this.devstarHomePageUrl = this.devstarDomain + "/devstar-home" + this.devstarDomain = devstarDomainFromConfig.endsWith('/') ? devstarDomainFromConfig.slice(0, -1) : devstarDomainFromConfig; } else { - this.devstarDomain = "https://devstar.cn" - this.devstarHomePageUrl = "https://devstar.cn/devstar-home" + this.devstarDomain = "https://devstar.cn"; } } } setUser(user: User) { - this.user = user + this.user = user; } setRemoteContainer(remoteContainer: RemoteContainer) { - this.remoteContainer = remoteContainer + this.remoteContainer = remoteContainer; } setDevstarDomainAndHomePageURL(devstarDomain: string) { if (devstarDomain != undefined && devstarDomain != "") { - this.devstarDomain = devstarDomain.endsWith('/') ? devstarDomain.slice(0, -1) : devstarDomain - this.devstarHomePageUrl = devstarDomain.endsWith('/') ? this.devstarDomain + "devstar-home" : devstarDomain + "/devstar-home" + this.devstarDomain = devstarDomain.endsWith('/') ? devstarDomain.slice(0, -1) : devstarDomain; } else { - console.error("devstarDomain is undefined or null") + console.error("devstarDomain is undefined or null"); } } - async toggle(devstarHomePageUrl: string = this.devstarHomePageUrl) { + async toggle() { const panel = vscode.window.createWebviewPanel( 'homeWebview', vscode.l10n.t('Home'), vscode.ViewColumn.One, { enableScripts: true, + enableForms: true, retainContextWhenHidden: true, } ); - panel.webview.html = await this.getWebviewContent(devstarHomePageUrl); + panel.webview.html = await this.getWebviewContent(); panel.webview.onDidReceiveMessage( async (message) => { - const data = message.data - const need_return = message.need_return + const data = message.data; + const need_return = message.need_return; if (need_return) { // ================= need return ==================== switch (message.command) { @@ -88,78 +83,71 @@ export default class DSHome { case 'getHomeConfig': const config = { language: vscode.env.language - } - panel.webview.postMessage({ command: 'getHomeConfig', data: { homeConfig: config } }) + }; + panel.webview.postMessage({ command: 'getHomeConfig', data: { homeConfig: config } }); break; case 'getUserToken': - const userToken = this.user.getUserTokenFromLocal() + const userToken = this.user.getUserTokenFromLocal(); if (userToken === undefined) { - panel.webview.postMessage({ command: 'getUserToken', data: { userToken: '' } }) - break; + panel.webview.postMessage({ command: 'getUserToken', data: { userToken: '' } }); } else { - panel.webview.postMessage({ command: 'getUserToken', data: { userToken: userToken } }) - break; + panel.webview.postMessage({ command: 'getUserToken', data: { userToken: userToken } }); } + break; case 'getUsername': - const username = this.user.getUsernameFromLocal() + const username = this.user.getUsernameFromLocal(); if (username === undefined) { - panel.webview.postMessage({ command: 'getUsername', data: { username: '' } }) - break; + panel.webview.postMessage({ command: 'getUsername', data: { username: '' } }); } else { - panel.webview.postMessage({ command: 'getUsername', data: { username: username } }) - break; + 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) + 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 } }) + panel.webview.postMessage({ command: 'getDevstarDomain', data: { devstarDomain: this.devstarDomain } }); break; // ----------------- not frequent ----------------------- case 'setUserToken': - this.user.setUserTokenToLocal(data.userToken) + this.user.setUserTokenToLocal(data.userToken); if (data.userToken === this.user.getUserTokenFromLocal()) { - panel.webview.postMessage({ command: 'setUserToken', data: { ok: true } }) - break; + panel.webview.postMessage({ command: 'setUserToken', data: { ok: true } }); } else { - panel.webview.postMessage({ command: 'setUserToken', data: { ok: false } }) - break; + 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 } }); - break; } else { panel.webview.postMessage({ command: 'setUsername', data: { ok: false } }); - break; } + break; case 'getUserPublicKey': - var userPublicKey = ''; + let userPublicKey = ''; if (this.user.existUserPrivateKey()) { userPublicKey = this.user.getUserPublicKey(); - panel.webview.postMessage({ command: 'getUserPublicKey', data: { userPublicKey: userPublicKey } }) - break; - } else { - panel.webview.postMessage({ command: 'getUserPublicKey', data: { userPublicKey: userPublicKey } }) - break; } + 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 } }) - break; + panel.webview.postMessage({ command: 'createUserPublicKey', data: { ok: true } }); } else { - panel.webview.postMessage({ command: 'createUserPublicKey', data: { ok: false } }) - break; + panel.webview.postMessage({ command: 'createUserPublicKey', data: { ok: false } }); } + break; case 'getMachineName': const machineName = os.hostname(); - panel.webview.postMessage({ command: 'getMachineName', data: { machineName: machineName } }) + panel.webview.postMessage({ command: 'getMachineName', data: { machineName: machineName } }); + break; } } else { // ================= don't need return ============== @@ -170,10 +158,10 @@ export default class DSHome { vscode.window.showInformationMessage(data.message); break; case 'showWarningNotification': - vscode.window.showWarningMessage(data.message) + vscode.window.showWarningMessage(data.message); break; case 'showErrorNotification': - await utils.showErrorNotification(data.message) + await utils.showErrorNotification(data.message); break; } } @@ -182,105 +170,189 @@ export default class DSHome { this.context.subscriptions ); - this.context.subscriptions.push(panel) + this.context.subscriptions.push(panel); } - - async getWebviewContent(devstarHomePageUrl: string): Promise { + async getWebviewContent(): Promise { return ` - - - + + + + + + DevStar Home + + + +
+

🚀 DevStar Home

+

欢迎使用 DevStar 扩展

+
- - - - DevStar Home - + + + + - - + - + } - ` + async function communicateVSCode(command, data) { + return new Promise((resolve, reject) => { + vscode.postMessage({ command: command, need_return: true, data: data }); + + function handleResponse(event) { + const jsonData = event.data; + if (jsonData.command === command) { + window.removeEventListener('message', handleResponse); + resolve(jsonData.data); + } + } + + window.addEventListener('message', handleResponse); + + setTimeout(() => { + window.removeEventListener('message', handleResponse); + reject('timeout'); + }, 5000); + }); + } + + // 检查登录状态 + async function checkLoginStatus() { + try { + const userTokenResult = await communicateVSCode('getUserToken', {}); + const usernameResult = await communicateVSCode('getUsername', {}); + + const userToken = userTokenResult.userToken; + username = usernameResult.username; + + isLoggedIn = !!(userToken && userToken.trim() !== '' && username && username.trim() !== ''); + + updateUI(); + } catch (error) { + console.error('检查登录状态失败:', error); + isLoggedIn = false; + updateUI(); + } + } + + // 更新UI显示 + function updateUI() { + const loginStatus = document.getElementById('loginStatus'); + const statusText = document.getElementById('statusText'); + const usernameDisplay = document.getElementById('usernameDisplay'); + const mainActionButton = document.getElementById('mainActionButton'); + + loginStatus.classList.remove('hidden'); + + if (isLoggedIn) { + loginStatus.classList.remove('logged-out'); + loginStatus.classList.add('logged-in'); + statusText.textContent = '已登录'; + usernameDisplay.textContent = username ? ' - 用户: ' + username : ''; + mainActionButton.textContent = '跳转到本地服务 (端口 80)'; + } else { + loginStatus.classList.remove('logged-in'); + loginStatus.classList.add('logged-out'); + statusText.textContent = '未登录'; + usernameDisplay.textContent = ''; + mainActionButton.textContent = '跳转到 DevStar 官网'; + } + } + + // 处理主要功能点击 + function handleMainAction() { + if (isLoggedIn) { + // 已登录:跳转到本地80端口 + vscodePostMessage('showInformationNotification', {message: '跳转到本地服务 http://localhost:80'}); + window.open('http://localhost:80', '_blank'); + } else { + // 未登录:跳转到 DevStar 官网 + vscodePostMessage('showInformationNotification', {message: '跳转到 DevStar 官网'}); + window.open('https://devstar.cn', '_blank'); + } + } + + // 页面加载时检查登录状态 + window.addEventListener('load', async () => { + await checkLoginStatus(); + }); + + // 可选:添加重新检查登录状态的功能 + function refreshLoginStatus() { + checkLoginStatus(); + vscodePostMessage('showInformationNotification', {message: '登录状态已刷新'}); + } + + + `; } -} +} \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index 52ea4d5..52c142d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -179,8 +179,8 @@ export class DevStarExtension { registerGlobalCommands(context: vscode.ExtensionContext) { context.subscriptions.push( - vscode.commands.registerCommand('devstar.showHome', (url: string) => - this.dsHome.toggle(url) + vscode.commands.registerCommand('devstar.showHome', () => + this.dsHome.toggle() ), vscode.commands.registerCommand('devstar.clean', () => { // 先清除ssh key