@@ -13,6 +13,8 @@ import {
13
13
window ,
14
14
} from "vscode" ;
15
15
import { getNonce } from "./utilities/getNonce" ;
16
+ import { ExtensionData , WebviewType } from "@editor-extensions/shared" ;
17
+ import { Immutable } from "immer" ;
16
18
17
19
export class KonveyorGUIWebviewViewProvider implements WebviewViewProvider {
18
20
public static readonly SIDEBAR_VIEW_TYPE = "konveyor.konveyorAnalysisView" ;
@@ -28,60 +30,60 @@ export class KonveyorGUIWebviewViewProvider implements WebviewViewProvider {
28
30
29
31
constructor (
30
32
private readonly _extensionState : ExtensionState ,
31
- private readonly _viewType : string ,
33
+ private readonly _viewType : WebviewType ,
32
34
) { }
33
35
36
+ isAnalysisView ( ) {
37
+ return this . _viewType === "sidebar" ;
38
+ }
39
+
34
40
public resolveWebviewView (
35
41
webviewView : WebviewView ,
36
42
_context : WebviewViewResolveContext ,
37
43
_token : CancellationToken ,
38
44
) : void | Thenable < void > {
39
45
this . _view = webviewView ;
40
- this . initializeWebview ( webviewView . webview ) ;
46
+ this . initializeWebview ( webviewView . webview , this . _extensionState . data ) ;
41
47
}
42
48
43
49
public createWebviewPanel ( ) : void {
44
- if ( ! this . _panel ) {
45
- this . _panel = window . createWebviewPanel (
46
- KonveyorGUIWebviewViewProvider . RESOLUTION_VIEW_TYPE ,
47
- "Resolution Details" ,
48
- ViewColumn . One ,
49
- {
50
- enableScripts : true ,
51
- localResourceRoots : [ this . _extensionState . extensionContext . extensionUri ] ,
52
- retainContextWhenHidden : true ,
53
- } ,
54
- ) ;
55
-
56
- this . initializeWebview ( this . _panel . webview ) ;
50
+ if ( this . _panel ) {
51
+ return ;
52
+ }
53
+ this . _panel = window . createWebviewPanel (
54
+ this . isAnalysisView ( )
55
+ ? KonveyorGUIWebviewViewProvider . SIDEBAR_VIEW_TYPE
56
+ : KonveyorGUIWebviewViewProvider . RESOLUTION_VIEW_TYPE ,
57
+ this . isAnalysisView ( ) ? "Konveyor Analysis View" : "Resolution Details" ,
58
+ ViewColumn . One ,
59
+ {
60
+ enableScripts : true ,
61
+ localResourceRoots : [ this . _extensionState . extensionContext . extensionUri ] ,
62
+ retainContextWhenHidden : true ,
63
+ } ,
64
+ ) ;
57
65
58
- if ( this . _viewType === KonveyorGUIWebviewViewProvider . RESOLUTION_VIEW_TYPE ) {
59
- const savedData = this . _extensionState . data . resolutionPanelData ;
60
- if ( savedData ) {
61
- this . _panel . webview . postMessage ( this . _extensionState . data ) ;
62
- }
63
- }
66
+ this . initializeWebview ( this . _panel . webview , this . _extensionState . data ) ;
64
67
65
- this . _panel . onDidDispose ( ( ) => {
66
- this . handleResolutionViewClosed ( ) ;
67
- this . _panel = undefined ;
68
- this . _isWebviewReady = false ;
69
- this . _isPanelReady = false ;
70
- } ) ;
71
- }
68
+ this . _panel . onDidDispose ( ( ) => {
69
+ this . handleViewClosed ( ) ;
70
+ this . _panel = undefined ;
71
+ this . _isWebviewReady = false ;
72
+ this . _isPanelReady = false ;
73
+ } ) ;
72
74
}
73
75
74
- private handleResolutionViewClosed ( ) : void {
76
+ private handleViewClosed ( ) : void {
75
77
// Assuming the analysis webview is tracked and can be accessed via the ExtensionState or similar
76
- const sidebarProvider = this . _extensionState . webviewProviders . get ( "sidebar" ) ;
77
- if ( sidebarProvider ?. webview && sidebarProvider . _isWebviewReady ) {
78
- // sidebarProvider.webview.postMessage({
79
- // type: "solutionConfirmation",
80
- // data: { confirmed: true, solution: null },
81
- // });
82
- } else {
83
- console . error ( "Analysis webview is not ready or not available." ) ;
84
- }
78
+ // const sidebarProvider = this._extensionState.webviewProviders.get("sidebar");
79
+ // if (sidebarProvider?.webview && sidebarProvider._isWebviewReady) {
80
+ // sidebarProvider.webview.postMessage({
81
+ // type: "solutionConfirmation",
82
+ // data: { confirmed: true, solution: null },
83
+ // });
84
+ // } else {
85
+ // console.error("Analysis webview is not ready or not available.");
86
+ // }
85
87
}
86
88
87
89
public showWebviewPanel ( ) : void {
@@ -92,7 +94,7 @@ export class KonveyorGUIWebviewViewProvider implements WebviewViewProvider {
92
94
}
93
95
}
94
96
95
- private initializeWebview ( webview : Webview ) : void {
97
+ private initializeWebview ( webview : Webview , data : Immutable < ExtensionData > ) : void {
96
98
const isProd = process . env . NODE_ENV === "production" ;
97
99
const extensionUri = this . _extensionState . extensionContext . extensionUri ;
98
100
@@ -108,11 +110,11 @@ export class KonveyorGUIWebviewViewProvider implements WebviewViewProvider {
108
110
localResourceRoots : isProd ? [ assetsUri ] : [ extensionUri ] ,
109
111
} ;
110
112
111
- webview . html = this . getHtmlForWebview ( webview ) ;
113
+ webview . html = this . getHtmlForWebview ( webview , data ) ;
112
114
this . _setWebviewMessageListener ( webview ) ;
113
115
}
114
116
115
- public getHtmlForWebview ( webview : Webview ) : string {
117
+ public getHtmlForWebview ( webview : Webview , data : Immutable < ExtensionData > ) : string {
116
118
const stylesUri = this . _getStylesUri ( webview ) ;
117
119
const scriptUri = this . _getScriptUri ( webview ) ;
118
120
const nonce = getNonce ( ) ;
@@ -129,6 +131,7 @@ export class KonveyorGUIWebviewViewProvider implements WebviewViewProvider {
129
131
const vscode = acquireVsCodeApi();
130
132
window.vscode = vscode;
131
133
window.viewType = "${ this . _viewType } ";
134
+ window.konveyorInitialData = ${ JSON . stringify ( data ) } ;
132
135
</script>
133
136
</head>
134
137
<body>
@@ -218,7 +221,7 @@ export class KonveyorGUIWebviewViewProvider implements WebviewViewProvider {
218
221
this . _isPanelReady = true ;
219
222
while ( this . _messageQueue . length > 0 ) {
220
223
const queuedMessage = this . _messageQueue . shift ( ) ;
221
- webview . postMessage ( queuedMessage ) ;
224
+ this . sendMessage ( queuedMessage , webview ) ;
222
225
}
223
226
}
224
227
} ,
@@ -235,11 +238,19 @@ export class KonveyorGUIWebviewViewProvider implements WebviewViewProvider {
235
238
}
236
239
}
237
240
}
241
+ private sendMessage ( message : any , webview : Webview ) {
242
+ webview . postMessage ( message ) . then ( ( deliveryStatus ) => {
243
+ if ( ! deliveryStatus ) {
244
+ console . error ( `Message to Konveyor webview '${ this . _viewType } ' not delivered` ) ;
245
+ }
246
+ } ) ;
247
+ }
248
+
238
249
public sendMessageToWebview ( message : any ) : void {
239
250
if ( this . _view ?. webview && this . _isWebviewReady ) {
240
- this . _view . webview . postMessage ( message ) ;
251
+ this . sendMessage ( message , this . _view . webview ) ;
241
252
} else if ( this . _panel && this . _isPanelReady ) {
242
- this . _panel . webview . postMessage ( message ) ;
253
+ this . sendMessage ( message , this . _panel . webview ) ;
243
254
} else {
244
255
this . _messageQueue . push ( message ) ;
245
256
}
0 commit comments