refactor(home): merge content of index.html into webview and enable configuring devstar home url in package.json
This commit is contained in:
@@ -85,6 +85,11 @@
|
||||
"type": "boolean",
|
||||
"default": false,
|
||||
"description": "Disable showing DevStar Home at startup"
|
||||
},
|
||||
"devstar.devstarHomePage": {
|
||||
"type": "string",
|
||||
"default": "https://devstar.cn/devstar-home",
|
||||
"description": "DevStar Home Page"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
113
src/home.ts
113
src/home.ts
@@ -8,16 +8,23 @@ export default class DSHome {
|
||||
private context: vscode.ExtensionContext;
|
||||
private remoteContainer: RemoteContainer;
|
||||
private user:User;
|
||||
static defaultUrl = 'http://localhost:8080/test/index.html';
|
||||
private devstarHomePageUrl:string;
|
||||
|
||||
constructor(context: vscode.ExtensionContext) {
|
||||
this.context = context;
|
||||
this.user = new User(context);
|
||||
this.remoteContainer = new RemoteContainer(this.user);
|
||||
|
||||
const devstarHomePageUrl:string|undefined = vscode.workspace.getConfiguration('devstar').get('devstarHomePage')
|
||||
if (undefined == devstarHomePageUrl || "" == devstarHomePageUrl) {
|
||||
this.devstarHomePageUrl = "https://devstar.cn/devstar-home"
|
||||
// this.devstarHomePageUrl = "http://localhost:3000/devstar-home"
|
||||
} else {
|
||||
this.devstarHomePageUrl = devstarHomePageUrl
|
||||
}
|
||||
}
|
||||
|
||||
async toggle(url: string = DSHome.defaultUrl) {
|
||||
console.log(url);
|
||||
async toggle(devstarHomePageUrl: string = this.devstarHomePageUrl) {
|
||||
const panel = vscode.window.createWebviewPanel(
|
||||
'homeWebview',
|
||||
'Home',
|
||||
@@ -27,9 +34,7 @@ export default class DSHome {
|
||||
}
|
||||
);
|
||||
|
||||
utils.fetch(url).then(async (content) => {
|
||||
panel.webview.html = await this.getWebviewContent(content);
|
||||
})
|
||||
panel.webview.html = await this.getWebviewContent(devstarHomePageUrl);
|
||||
|
||||
panel.webview.onDidReceiveMessage(
|
||||
async (message) => {
|
||||
@@ -129,7 +134,99 @@ export default class DSHome {
|
||||
}
|
||||
|
||||
|
||||
async getWebviewContent(content: string): Promise<string> {
|
||||
return `${content}`
|
||||
async getWebviewContent(devstarHomePageUrl: string): Promise<string> {
|
||||
return `
|
||||
<?php
|
||||
header("Access-Control-Allow-Origin: *");
|
||||
header("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method");
|
||||
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
|
||||
header("Allow: GET, POST, OPTIONS, PUT, DELETE");
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>DevStar Home</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<iframe id="embedded-devstar" src="${devstarHomePageUrl}" width="100%" height="100%" frameborder="0"
|
||||
style="border: 0; left: 0; right: 0; bottom: 0; top: 0; position:absolute;">
|
||||
</iframe>
|
||||
|
||||
<script>
|
||||
const vscode = acquireVsCodeApi();
|
||||
|
||||
function firstOpenRemoteFolder() {
|
||||
vscode.postMessage({ command: 'firstOpenRemoteFolder', host: host, username: username, password: password, port: port, path: path });
|
||||
}
|
||||
|
||||
function openRemoteFolder() {
|
||||
vscode.postMessage({ command: 'openRemoteFolder', host: host, path: path });
|
||||
}
|
||||
|
||||
function firstOpenRemoteFolderWithData(host, username, password, port, path) {
|
||||
vscode.postMessage({ command: 'firstOpenRemoteFolder', host: host, username: username, password: password, port: port, path: path });
|
||||
}
|
||||
|
||||
function openRemoteFolderWithData(host, path) {
|
||||
vscode.postMessage({ command: 'openRemoteFolder', host: host, path: path });
|
||||
}
|
||||
|
||||
|
||||
async function communicateVSCode(command, data) {
|
||||
return new Promise((resolve, reject) => {
|
||||
// request to vscode
|
||||
vscode.postMessage({ command: command, data: data })
|
||||
|
||||
function handleResponse(event) {
|
||||
const jsonData = event.data;
|
||||
if (jsonData.command === command) {
|
||||
// console.log("communicateVSCode", jsonData.data)
|
||||
|
||||
// return vscode response
|
||||
window.removeEventListener('message', handleResponse) // 清理监听器
|
||||
resolve(jsonData.data)
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener('message', handleResponse)
|
||||
|
||||
setTimeout(() => {
|
||||
window.removeEventListener('message', handleResponse)
|
||||
reject('timeout')
|
||||
}, 5000); // 5秒超时
|
||||
})
|
||||
}
|
||||
|
||||
// 监听子页面的消息
|
||||
window.addEventListener('message', async (event) => {
|
||||
// 出于安全考虑,检查 event.origin 是否是你预期的源
|
||||
// if (event.origin !== "http://expected-origin.com") {
|
||||
// return;
|
||||
// }
|
||||
try {
|
||||
const jsonData = event.data;
|
||||
|
||||
if (jsonData.target === 'vscode') {
|
||||
const actionFromHome = jsonData.action
|
||||
const dataFromHome = jsonData.data
|
||||
const dataFromVSCodeResponse = await communicateVSCode(actionFromHome, dataFromHome)
|
||||
|
||||
var iframe = document.getElementById('embedded-devstar');
|
||||
if (iframe && iframe.contentWindow) {
|
||||
iframe.contentWindow.postMessage({ action: actionFromHome, data: dataFromVSCodeResponse }, '*')
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error parsing message:', error);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>`
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user