@@ -284,7 +284,6 @@ type GitpodWorkspaceElement = PortsTreeItem | PortTreeItem;
284
284
export class GitpodWorkspaceTreeDataProvider implements vscode . TreeDataProvider < GitpodWorkspaceElement > {
285
285
286
286
readonly ports = new PortsTreeItem ( 'Ports' , vscode . TreeItemCollapsibleState . Expanded ) ;
287
- readonly portViewNotice = new PortsTreeItem ( 'Please try new Ports view and provide your feedback' , vscode . TreeItemCollapsibleState . None ) ;
288
287
289
288
protected readonly onDidChangeTreeDataEmitter = new vscode . EventEmitter < GitpodWorkspaceElement | undefined > ( ) ;
290
289
readonly onDidChangeTreeData = this . onDidChangeTreeDataEmitter . event ;
@@ -293,12 +292,11 @@ export class GitpodWorkspaceTreeDataProvider implements vscode.TreeDataProvider<
293
292
readonly onDidExposeServedPort = this . onDidExposeServedPortEmitter . event ;
294
293
295
294
296
- constructor ( private readonly context : GitpodExtensionContext , private readonly isPortsViewExperimentEnable ?: boolean ) {
297
- this . portViewNotice . iconPath = new vscode . ThemeIcon ( 'info' , new vscode . ThemeColor ( 'foreground' ) ) ;
298
- this . portViewNotice . command = {
299
- title : '' ,
300
- command : 'gitpod.portsView.focus'
301
- } ;
295
+ constructor ( private readonly context : GitpodExtensionContext , private isPortsViewExperimentEnable ?: boolean ) { }
296
+
297
+ updateIsPortsViewExperimentEnable ( value : boolean ) {
298
+ this . isPortsViewExperimentEnable = value ;
299
+ this . onDidChangeTreeDataEmitter . fire ( undefined ) ;
302
300
}
303
301
304
302
getTreeItem ( element : GitpodWorkspaceElement ) : vscode . TreeItem {
@@ -310,11 +308,7 @@ export class GitpodWorkspaceTreeDataProvider implements vscode.TreeDataProvider<
310
308
return [ this . ports ] ;
311
309
}
312
310
if ( element === this . ports ) {
313
- const list : GitpodWorkspaceElement [ ] = [ ...this . ports . ports . values ( ) ] ;
314
- if ( this . isPortsViewExperimentEnable ) {
315
- list . unshift ( this . portViewNotice ) ;
316
- }
317
- return list ;
311
+ return [ ...this . ports . ports . values ( ) ] ;
318
312
}
319
313
return [ ] ;
320
314
}
@@ -432,11 +426,6 @@ export class GitpodPortViewProvider implements vscode.WebviewViewProvider {
432
426
const scriptUri = webview . asWebviewUri ( vscode . Uri . joinPath ( this . context . extensionUri , 'portsview' , 'public' , 'bundle.js' ) ) ;
433
427
const styleUri = webview . asWebviewUri ( vscode . Uri . joinPath ( this . context . extensionUri , 'portsview' , 'public' , 'bundle.css' ) ) ;
434
428
const nonce = getNonce ( ) ;
435
- // <meta
436
- // csp-nonce
437
- // http-equiv="Content-Security-Policy"
438
- // content="default-src 'none'; img-src data: ${webview.cspSource}; font-src ${webview.cspSource}; style-src ${webview.cspSource} 'nonce-${nonce}'; script-src 'nonce-${nonce}';"
439
- // />
440
429
return `<!DOCTYPE html>
441
430
<html lang="en">
442
431
<head>
@@ -527,8 +516,7 @@ export function getNonce() {
527
516
interface PortItem { port : GitpodWorkspacePort ; isWebview ?: boolean }
528
517
529
518
export function registerPorts ( context : GitpodExtensionContext ) : void {
530
- const experimentCfg = vscode . workspace . getConfiguration ( 'gitpod.experimental' ) ;
531
- const isPortsViewExperimentEnable = experimentCfg . get < boolean > ( 'portsView.enabled' ) ;
519
+ const isPortsViewExperimentEnable = vscode . workspace . getConfiguration ( 'gitpod.experimental.portsView' ) . get < boolean > ( 'enabled' ) ;
532
520
533
521
const portMap = new Map < number , GitpodWorkspacePort > ( ) ;
534
522
const tunnelMap = new Map < number , vscode . TunnelDescription > ( ) ;
@@ -539,12 +527,27 @@ export function registerPorts(context: GitpodExtensionContext): void {
539
527
context . subscriptions . push ( treeView ) ;
540
528
541
529
// register webview
542
- let portViewProvider : GitpodPortViewProvider | undefined ;
543
- if ( isPortsViewExperimentEnable ) {
544
- vscode . commands . executeCommand ( 'setContext' , 'gitpod.portsView.visible' , true ) ;
545
- portViewProvider = new GitpodPortViewProvider ( context ) ;
546
- context . subscriptions . push ( vscode . window . registerWebviewViewProvider ( GitpodPortViewProvider . viewType , portViewProvider , { webviewOptions : { retainContextWhenHidden : true } } ) ) ;
547
- }
530
+ const portViewProvider = new GitpodPortViewProvider ( context ) ;
531
+ context . subscriptions . push ( vscode . window . registerWebviewViewProvider ( GitpodPortViewProvider . viewType , portViewProvider , { webviewOptions : { retainContextWhenHidden : true } } ) ) ;
532
+
533
+ // new Ports view - try it out
534
+ let hasShownTryItOut = false ;
535
+ treeView . onDidChangeVisibility ( async ( e ) => {
536
+ const config = vscode . workspace . getConfiguration ( 'gitpod.experimental.portsView' ) ;
537
+ if ( hasShownTryItOut || ! e . visible || config . get < boolean > ( 'enabled' ) || config . get < boolean > ( 'neverPrompt' ) === true ) {
538
+ return ;
539
+ }
540
+ hasShownTryItOut = true ;
541
+ const openAction = 'Open' ;
542
+ const neverAgain = 'Don\'t Show Again' ;
543
+ const action = await vscode . window . showInformationMessage ( 'Do you want to try with our new experimental Ports view?' , openAction , neverAgain ) ;
544
+ if ( action === openAction ) {
545
+ config . update ( 'enabled' , true , true ) ;
546
+ setTimeout ( ( ) => vscode . commands . executeCommand ( 'gitpod.portsView.focus' ) , 2000 ) ;
547
+ } else if ( action === neverAgain ) {
548
+ config . update ( 'neverPrompt' , true , true ) ;
549
+ }
550
+ } ) ;
548
551
549
552
function openExternal ( port : GitpodWorkspacePort ) {
550
553
return vscode . env . openExternal ( vscode . Uri . parse ( port . localUrl ) ) ;
@@ -570,7 +573,7 @@ export function registerPorts(context: GitpodExtensionContext): void {
570
573
const portNumber = e . getLocalPort ( ) ;
571
574
portMap . set ( portNumber , new GitpodWorkspacePort ( portNumber , context , e , tunnelMap . get ( portNumber ) ) ) ;
572
575
} ) ;
573
- portViewProvider ? .updatePortsStatus ( update ) ;
576
+ portViewProvider . updatePortsStatus ( update ) ;
574
577
gitpodWorkspaceTreeDataProvider . updatePortsStatus ( update ) ;
575
578
} ) ;
576
579
} ) ;
@@ -607,8 +610,8 @@ export function registerPorts(context: GitpodExtensionContext): void {
607
610
return false ;
608
611
} ;
609
612
if ( ! tryResolve ( ) ) {
610
- const listenerWebview = portViewProvider ? .onDidChangePorts ( element => {
611
- if ( element === portViewProvider ? .portMap && tryResolve ( ) ) {
613
+ const listenerWebview = portViewProvider . onDidChangePorts ( element => {
614
+ if ( element === portViewProvider . portMap && tryResolve ( ) ) {
612
615
listenerWebview ?. dispose ( ) ;
613
616
}
614
617
} ) ;
@@ -694,15 +697,13 @@ export function registerPorts(context: GitpodExtensionContext): void {
694
697
695
698
portsStatusBarItem . text = text ;
696
699
portsStatusBarItem . tooltip = tooltip ;
700
+ const isPortsViewExperimentEnable = vscode . workspace . getConfiguration ( 'gitpod.experimental.portsView' ) . get < boolean > ( 'enabled' ) ;
697
701
portsStatusBarItem . command = isPortsViewExperimentEnable ? 'gitpod.portsView.focus' : 'gitpod.ports.reveal' ;
698
702
portsStatusBarItem . show ( ) ;
699
703
}
700
704
updateStatusBar ( ) ;
701
- if ( isPortsViewExperimentEnable && ! ! portViewProvider ) {
702
- context . subscriptions . push ( portViewProvider . onDidChangePorts ( ( ) => updateStatusBar ( ) ) ) ;
703
- } else {
704
- context . subscriptions . push ( gitpodWorkspaceTreeDataProvider . onDidChangeTreeData ( ( ) => updateStatusBar ( ) ) ) ;
705
- }
705
+
706
+ context . subscriptions . push ( portViewProvider . onDidChangePorts ( ( ) => updateStatusBar ( ) ) ) ;
706
707
context . subscriptions . push ( gitpodWorkspaceTreeDataProvider . onDidChangeTreeData ( ( ) => updateStatusBar ( ) ) ) ;
707
708
708
709
context . subscriptions . push ( vscode . commands . registerCommand ( 'gitpod.ports.reveal' , ( ) => {
@@ -745,11 +746,7 @@ export function registerPorts(context: GitpodExtensionContext): void {
745
746
preserveFocus : true
746
747
} ) ;
747
748
}
748
- let provider : GitpodWorkspaceTreeDataProvider | GitpodPortViewProvider = gitpodWorkspaceTreeDataProvider ;
749
- if ( isPortsViewExperimentEnable && ! ! portViewProvider ) {
750
- provider = portViewProvider ;
751
- }
752
- context . subscriptions . push ( provider . onDidExposeServedPort ( port => {
749
+ const onDidExposeServedPortListener = ( port : ExposedServedGitpodWorkspacePort ) => {
753
750
if ( port . status . exposed . onExposed === OnPortExposedAction . IGNORE ) {
754
751
return ;
755
752
}
@@ -773,7 +770,9 @@ export function registerPorts(context: GitpodExtensionContext): void {
773
770
showOpenServiceNotification ( port , port . status . exposed . visibility !== PortVisibility . PUBLIC ) ;
774
771
return ;
775
772
}
776
- } ) ) ;
773
+ } ;
774
+ context . subscriptions . push ( gitpodWorkspaceTreeDataProvider . onDidExposeServedPort ( onDidExposeServedPortListener ) ) ;
775
+ context . subscriptions . push ( portViewProvider . onDidExposeServedPort ( onDidExposeServedPortListener ) ) ;
777
776
778
777
let updateTunnelsTokenSource : vscode . CancellationTokenSource | undefined ;
779
778
async function updateTunnels ( ) : Promise < void > {
@@ -791,7 +790,7 @@ export function registerPorts(context: GitpodExtensionContext): void {
791
790
currentTunnels . forEach ( tunnel => {
792
791
tunnelMap . set ( tunnel . remoteAddress . port , tunnel ) ;
793
792
} ) ;
794
- portViewProvider ? .updateTunnels ( tunnelMap ) ;
793
+ portViewProvider . updateTunnels ( tunnelMap ) ;
795
794
gitpodWorkspaceTreeDataProvider . updateTunnels ( tunnelMap ) ;
796
795
}
797
796
updateTunnels ( ) ;
@@ -839,6 +838,16 @@ export function registerPorts(context: GitpodExtensionContext): void {
839
838
vscode . commands . executeCommand ( 'gitpod.api.connectLocalApp' , apiPort ) ;
840
839
}
841
840
} ) ) ;
841
+ vscode . workspace . onDidChangeConfiguration ( ( e : vscode . ConfigurationChangeEvent ) => {
842
+ if ( ! e . affectsConfiguration ( 'gitpod.experimental.portsView.enabled' ) ) {
843
+ return ;
844
+ }
845
+ const isPortsViewExperimentEnable = vscode . workspace . getConfiguration ( 'gitpod.experimental.portsView' ) . get < boolean > ( 'enabled' ) ;
846
+ vscode . commands . executeCommand ( 'setContext' , 'gitpod.portsView.visible' , isPortsViewExperimentEnable ) ;
847
+ gitpodWorkspaceTreeDataProvider . updateIsPortsViewExperimentEnable ( isPortsViewExperimentEnable ?? false ) ;
848
+ updateStatusBar ( ) ;
849
+ } ) ;
850
+ vscode . commands . executeCommand ( 'setContext' , 'gitpod.portsView.visible' , isPortsViewExperimentEnable ) ;
842
851
}
843
852
844
853
export function registerWelcomeWalkthroughCommands ( context : GitpodExtensionContext ) : void {
0 commit comments