Skip to content

Commit 53bee0c

Browse files
authored
support to reload runtime webview (#602)
Signed-off-by: Yan Zhang <[email protected]>
1 parent 6e90029 commit 53bee0c

File tree

4 files changed

+56
-50
lines changed

4 files changed

+56
-50
lines changed

src/java-runtime/assets/index.ts

Lines changed: 36 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -6,74 +6,70 @@ const $ = require("jquery");
66
import * as React from "react";
77
import * as ReactDOM from "react-dom";
88
import "../../assets/vscode.scss";
9-
import { JavaRuntimeEntry, JdkData, ProjectRuntimeEntry } from "../types";
109
import { JdkConfigurationPanel } from "./jdk.configure";
1110
import { JdkInstallationPanel } from "./jdk.installation";
12-
import { requestJdkInfo } from "./vscode.api";
11+
import { onWillListRuntimes, requestJdkInfo } from "./vscode.api";
1312
import bytes = require("bytes");
1413
import "./style.scss";
1514

16-
window.addEventListener("message", event => {
17-
if (event.data.command === "applyJdkInfo") {
18-
applyJdkInfo(event.data.jdkInfo);
19-
} else if (event.data.command === "showJavaRuntimeEntries") {
20-
showJavaRuntimeEntries(event.data.args);
15+
const onInitialize = (event: any) => {
16+
const { data } = event;
17+
if (data.command === "applyJdkInfo") {
18+
applyJdkInfo(data.jdkInfo);
19+
} else if (data.command === "showJavaRuntimeEntries") {
20+
showJavaRuntimeEntries(data.args);
2121
}
22-
});
22+
};
2323

24-
let jdkEntries: JavaRuntimeEntry[] | undefined;
25-
let projectRuntimes: ProjectRuntimeEntry[] | undefined;
26-
let javaHomeError: any;
27-
let javaDotHome: string | undefined;
28-
function showJavaRuntimeEntries(args: {
29-
javaRuntimes?: JavaRuntimeEntry[];
30-
projectRuntimes?: ProjectRuntimeEntry[];
31-
javaHomeError?: string;
32-
javaDotHome?: string;
33-
}) {
34-
jdkEntries = args.javaRuntimes;
35-
projectRuntimes = args.projectRuntimes;
36-
javaHomeError = args.javaHomeError;
37-
javaDotHome = args.javaDotHome;
38-
render();
24+
window.addEventListener("message", onInitialize);
25+
renderLoadingPage();
26+
onWillListRuntimes();
27+
28+
/**
29+
* Listing runtime can be slow, show loading page immediately after opening webview
30+
*/
31+
function renderLoadingPage() {
32+
ReactDOM.render(React.createElement(JdkConfigurationPanel), document.getElementById("jdkConfigurationPanel"));
33+
ReactDOM.render(React.createElement(JdkInstallationPanel), document.getElementById("jdkInstallationPanel"));
3934
}
4035

41-
let jdkData: JdkData;
36+
function showJavaRuntimeEntries(args: any) {
37+
const props = {
38+
jdkEntries: args.javaRuntimes,
39+
projectRuntimes: args.projectRuntimes,
40+
javaHomeError: args.javaHomeError,
41+
javaDotHome: args.javaDotHome
42+
};
43+
ReactDOM.render(React.createElement(JdkConfigurationPanel, props), document.getElementById("jdkConfigurationPanel"));
44+
registerTabSwitchEvents();
45+
}
4246

4347
function applyJdkInfo(jdkInfo: any) {
4448
let binary = jdkInfo.binaries[0];
4549
let downloadLink = binary.installer_link || binary.binary_link;
4650
let encodedLink = `command:java.helper.openUrl?${encodeURIComponent(JSON.stringify(downloadLink))}`;
4751

48-
jdkData = {
52+
const jdkData = {
4953
name: jdkInfo.release_name,
5054
os: binary.os,
5155
arch: binary.architecture,
5256
size: bytes(binary.binary_size, { unitSeparator: " " }),
5357
downloadLink: encodedLink
5458
};
5559

56-
render();
57-
}
58-
59-
function render() {
6060
const props = {
61-
jdkEntries: jdkEntries,
62-
projectRuntimes: projectRuntimes,
63-
jdkData: jdkData,
64-
onRequestJdk: requestJdkInfo,
65-
javaHomeError,
66-
javaDotHome
61+
jdkData,
62+
onRequestJdk: requestJdkInfo
6763
};
6864

69-
ReactDOM.render(React.createElement(JdkConfigurationPanel, props), document.getElementById("jdkConfigurationPanel"));
7065
ReactDOM.render(React.createElement(JdkInstallationPanel, props), document.getElementById("jdkInstallationPanel"));
66+
}
7167

68+
/**
69+
* To remove after we retire jQuery from this page/
70+
*/
71+
function registerTabSwitchEvents() {
7272
$("a.navigation").click((e: any) => {
7373
($($(e.target).attr("href") || "") as any).tab("show");
7474
});
75-
7675
}
77-
78-
render();
79-

src/java-runtime/assets/jdk.installation.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { JdkData } from "../types";
88
export type JdkRquestHandler = (jdkVersion: string, jvmImpl: string) => void;
99

1010
export interface JdkInstallationPanelProps {
11-
jdkData: JdkData;
11+
jdkData?: JdkData;
1212
onRequestJdk: JdkRquestHandler;
1313
}
1414

@@ -63,7 +63,7 @@ export class JdkInstallationPanel extends React.Component<JdkInstallationPanelPr
6363
}
6464
}
6565

66-
this.props.onRequestJdk(newState.jdkVersion, newState.jvmImpl);
66+
this.props?.onRequestJdk(newState.jdkVersion, newState.jvmImpl);
6767
this.setState(newState);
6868
}
6969

src/java-runtime/assets/vscode.api.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT license.
3+
14
declare function acquireVsCodeApi(): any;
25
const vscode = acquireVsCodeApi();
36

@@ -39,3 +42,9 @@ export function openBuildScript(rootUri: string, scriptFile: string) {
3942
scriptFile
4043
});
4144
}
45+
46+
export function onWillListRuntimes() {
47+
vscode.postMessage({
48+
command: "onWillListRuntimes"
49+
});
50+
}

src/java-runtime/index.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,15 @@ async function initializeJavaRuntimeView(context: vscode.ExtensionContext, webvi
4949
context.subscriptions.push(webviewPanel.onDidDispose(onDisposeCallback));
5050
context.subscriptions.push(webviewPanel.webview.onDidReceiveMessage(async (e) => {
5151
switch (e.command) {
52+
case "onWillListRuntimes": {
53+
suggestOpenJdk().then(jdkInfo => {
54+
applyJdkInfo(jdkInfo);
55+
});
56+
findJavaRuntimeEntries().then(data => {
57+
showJavaRuntimeEntries(data);
58+
});
59+
break;
60+
}
5261
case "requestJdkInfo": {
5362
let jdkInfo = await suggestOpenJdk(e.jdkVersion, e.jvmImpl);
5463
applyJdkInfo(jdkInfo);
@@ -133,14 +142,6 @@ async function initializeJavaRuntimeView(context: vscode.ExtensionContext, webvi
133142
});
134143
}
135144

136-
suggestOpenJdk().then(jdkInfo => {
137-
applyJdkInfo(jdkInfo);
138-
});
139-
140-
findJavaRuntimeEntries().then(data => {
141-
showJavaRuntimeEntries(data);
142-
});
143-
144145
// refresh webview with latest source levels when classpath (project info) changes
145146
const javaExt = vscode.extensions.getExtension("redhat.java");
146147
if (javaExt?.isActive && javaExt?.exports?.onDidClasspathUpdate) {

0 commit comments

Comments
 (0)