11import * as vscode from 'vscode' ;
22import { ExtensionModel } from './extension-model' ;
3- import { posix } from 'path' ;
3+ import { posix , resolve } from 'path' ;
44import { AppPageHtml } from './app-page' ;
55
66export function activate ( context : vscode . ExtensionContext ) {
@@ -20,22 +20,20 @@ export function activate(context: vscode.ExtensionContext) {
2020 vscode . window . showInputBox ( searchOptions ) . then ( ( searchQuery : string | undefined ) => {
2121
2222 if ( searchQuery ) {
23- // Create webview panel
24- const stackoverflowPanel = vscode . window . createWebviewPanel ( 'webview' , `SO: ${ searchQuery } ` , vscode . ViewColumn . Beside , {
25- localResourceRoots : [ vscode . Uri . file ( posix . join ( context . extensionPath , 'app' , 'public' ) ) ] ,
26- enableScripts : true ,
27- retainContextWhenHidden : true
28- } ) ;
2923
24+ // Create webview panel
25+ const stackoverflowPanel = createWebViewPanel ( `SO: ${ searchQuery } ` , context . extensionPath ) ;
3026 // Set webview - svelte built to ./app/public/*
3127 stackoverflowPanel . webview . html = AppPageHtml ( context . extensionPath ) ;
32-
33- // Post search term
28+ // Post search term, read in App.svelte as window.addEventListener("message"
3429 stackoverflowPanel . webview . postMessage ( {
3530 action : 'search' ,
3631 query : searchQuery
3732 } ) ;
3833
34+ // Show progress loader
35+ showWindowProgress ( `Loading Stackoverflow Search Results` , stackoverflowPanel ) ;
36+
3937 }
4038
4139 } ) ;
@@ -49,26 +47,23 @@ export function activate(context: vscode.ExtensionContext) {
4947 vscode . window . showQuickPick ( ExtensionModel . topPickQuickInputItems ) . then ( ( selectedTopPick : vscode . QuickPickItem | undefined ) => {
5048
5149 if ( selectedTopPick ) {
50+
51+ // Get article selected artical with ID
5252 const selectedArticle : any = ExtensionModel . topPickIds . find ( ( element : any ) => {
5353 return element . label === selectedTopPick . label ;
5454 } ) ;
5555
5656 // Create webview panel
57- const stackoverflowPanel = vscode . window . createWebviewPanel ( 'webview' , `SO: ${ selectedTopPick . label } ` , vscode . ViewColumn . Beside , {
58- localResourceRoots : [ vscode . Uri . file ( posix . join ( context . extensionPath , 'app' , 'public' ) ) ] ,
59- enableScripts : true ,
60- retainContextWhenHidden : true
61- } ) ;
62-
57+ const stackoverflowPanel = createWebViewPanel ( `SO: ${ selectedTopPick . label } ` , context . extensionPath ) ;
6358 // Set webview - svelte built to ./app/public/*
6459 stackoverflowPanel . webview . html = AppPageHtml ( context . extensionPath ) ;
65-
66- // Post article Id
60+ // Post article Id to app, read in App.svelte as window.addEventListener("message"
6761 stackoverflowPanel . webview . postMessage ( {
6862 action : 'topPick' ,
6963 questionId : selectedArticle . id
7064 } ) ;
7165
66+ // Show progress loader
7267 showWindowProgress ( `Loading Stackoverflow Article` , stackoverflowPanel ) ;
7368
7469 }
@@ -81,7 +76,20 @@ export function activate(context: vscode.ExtensionContext) {
8176}
8277
8378/**
84- * Show built in loader
79+ * Create a vscode webViewPanel
80+ * @param panelTitle string
81+ * @param path string
82+ */
83+ function createWebViewPanel ( panelTitle : string , path : string ) : vscode . WebviewPanel {
84+ return vscode . window . createWebviewPanel ( 'webview' , panelTitle , vscode . ViewColumn . Beside , {
85+ localResourceRoots : [ vscode . Uri . file ( posix . join ( path , 'app' , 'public' ) ) ] ,
86+ enableScripts : true ,
87+ retainContextWhenHidden : true
88+ } ) ;
89+ }
90+
91+ /**
92+ * Show progress in window (bottom left)
8593 * @param title string
8694 */
8795function showWindowProgress ( title : string , panel : vscode . WebviewPanel ) {
@@ -90,19 +98,14 @@ function showWindowProgress(title: string, panel: vscode.WebviewPanel) {
9098 title : title ,
9199 } , ( progress , token ) => {
92100
101+ // Resolve once fetch() is complete
102+ // message has command: "progress", action: "stop" | "start"
93103 const progressPromise = new Promise ( resolve => {
94- setTimeout ( ( ) => {
95- resolve ( ) ;
96- } , 5000 ) ;
97- // TODO: resolve once fetch() is complete - needs a listener
98- } ) ;
99-
100- // Resolve once fetch() is complete - needs a listener
101- panel . webview . onDidReceiveMessage ( message => {
102- console . log ( 'message' , message ) ;
103- if ( message . command === 'progress' && message . action === 'stop' ) {
104- console . log ( 'TEST' ) ;
105- }
104+ panel . webview . onDidReceiveMessage ( message => {
105+ if ( message . command === 'progress' && message . action === 'stop' ) {
106+ resolve ( ) ;
107+ }
108+ } ) ;
106109 } ) ;
107110
108111 return progressPromise ;
0 commit comments