@@ -10,10 +10,27 @@ import { RegionProvider } from '../shared/regions/regionProvider'
10
10
import { RefreshableAwsTreeProvider } from '../shared/treeview/awsTreeProvider'
11
11
import { AWSCommandTreeNode } from '../shared/treeview/nodes/awsCommandTreeNode'
12
12
import { AWSTreeNodeBase } from '../shared/treeview/nodes/awsTreeNodeBase'
13
+ import { makeChildrenNodes } from '../shared/treeview/treeNodeUtilities'
13
14
import { intersection , toMap , updateInPlace } from '../shared/utilities/collectionUtils'
14
15
import { localize } from '../shared/utilities/vsCodeUtils'
15
16
import { RegionNode } from './regionNode'
16
17
18
+ const ROOT_NODE_SIGN_IN = new AWSCommandTreeNode (
19
+ undefined ,
20
+ localize ( 'AWS.explorerNode.signIn' , 'Connect to AWS...' ) ,
21
+ 'aws.login' ,
22
+ undefined ,
23
+ localize ( 'AWS.explorerNode.signIn.tooltip' , 'Click here to select credentials for the AWS Toolkit' )
24
+ )
25
+
26
+ const ROOT_NODE_ADD_REGION = new AWSCommandTreeNode (
27
+ undefined ,
28
+ localize ( 'AWS.explorerNode.addRegion' , 'Add a region to AWS Explorer...' ) ,
29
+ 'aws.showRegion' ,
30
+ undefined ,
31
+ localize ( 'AWS.explorerNode.addRegion.tooltip' , 'Click here to add a region to AWS Explorer.' )
32
+ )
33
+
17
34
export class AwsExplorer implements vscode . TreeDataProvider < AWSTreeNodeBase > , RefreshableAwsTreeProvider {
18
35
public viewProviderId : string = 'aws.explorer'
19
36
public readonly onDidChangeTreeData : vscode . Event < AWSTreeNodeBase | undefined >
@@ -37,60 +54,32 @@ export class AwsExplorer implements vscode.TreeDataProvider<AWSTreeNodeBase>, Re
37
54
}
38
55
39
56
public async getChildren ( element ?: AWSTreeNodeBase ) : Promise < AWSTreeNodeBase [ ] > {
40
- if ( ! ! element ) {
41
- try {
42
- return await element . getChildren ( )
43
- } catch ( error ) {
44
- return [
45
- new AWSCommandTreeNode (
46
- element ,
47
- localize (
48
- 'AWS.explorerNode.lambda.retry' ,
49
- 'Unable to load Lambda Functions, click here to retry'
50
- ) ,
51
- 'aws.refreshAwsExplorerNode' ,
52
- [ this , element ]
53
- )
54
- ]
57
+ let childNodes : AWSTreeNodeBase [ ] = [ ]
58
+
59
+ try {
60
+ if ( element ) {
61
+ childNodes = childNodes . concat ( await element . getChildren ( ) )
62
+ } else {
63
+ childNodes = childNodes . concat ( await this . getRootNodes ( ) )
55
64
}
56
- }
65
+ } catch ( err ) {
66
+ const error = err as Error
67
+ this . logger . error ( `Error getting children for node ${ element ?. label ?? 'Root Node' } ` , error )
57
68
58
- const profileName = this . awsContext . getCredentialProfileName ( )
59
- if ( ! profileName ) {
60
- return [
69
+ childNodes . splice (
70
+ 0 ,
71
+ childNodes . length ,
61
72
new AWSCommandTreeNode (
62
- undefined ,
63
- localize ( 'AWS.explorerNode.signIn ' , 'Connect to AWS... ' ) ,
64
- 'aws.login ' ,
65
- undefined ,
66
- localize ( 'AWS.explorerNode.signIn.tooltip' , 'Connect to AWS using a credential profile' )
73
+ element ,
74
+ localize ( 'AWS.explorerNode.error.retry ' , 'Unable to get child nodes, click here to retry ' ) ,
75
+ 'aws.refreshAwsExplorerNode ' ,
76
+ [ this , element ] ,
77
+ error . message
67
78
)
68
- ]
79
+ )
69
80
}
70
81
71
- const explorerRegionCodes = await this . awsContext . getExplorerRegions ( )
72
- const regionMap = toMap ( await this . regionProvider . getRegionData ( ) , r => r . regionCode )
73
-
74
- updateInPlace (
75
- this . regionNodes ,
76
- intersection ( regionMap . keys ( ) , explorerRegionCodes ) ,
77
- key => this . regionNodes . get ( key ) ! . update ( regionMap . get ( key ) ! ) ,
78
- key => new RegionNode ( regionMap . get ( key ) ! , this . regionProvider )
79
- )
80
-
81
- if ( this . regionNodes . size > 0 ) {
82
- return [ ...this . regionNodes . values ( ) ]
83
- } else {
84
- return [
85
- new AWSCommandTreeNode (
86
- undefined ,
87
- localize ( 'AWS.explorerNode.addRegion' , 'Click to add a region to view functions...' ) ,
88
- 'aws.showRegion' ,
89
- undefined ,
90
- localize ( 'AWS.explorerNode.addRegion.tooltip' , 'Configure a region to show available functions' )
91
- )
92
- ]
93
- }
82
+ return childNodes
94
83
}
95
84
96
85
public getRegionNodesSize ( ) {
@@ -100,4 +89,32 @@ export class AwsExplorer implements vscode.TreeDataProvider<AWSTreeNodeBase>, Re
100
89
public refresh ( node ?: AWSTreeNodeBase ) {
101
90
this . _onDidChangeTreeData . fire ( node )
102
91
}
92
+
93
+ private async getRootNodes ( ) : Promise < AWSTreeNodeBase [ ] > {
94
+ if ( ! ( await this . awsContext . getCredentials ( ) ) ) {
95
+ return [ ROOT_NODE_SIGN_IN ]
96
+ }
97
+
98
+ const userVisibleRegionCodes = await this . awsContext . getExplorerRegions ( )
99
+ const regionMap = toMap ( await this . regionProvider . getRegionData ( ) , r => r . regionCode )
100
+
101
+ return await makeChildrenNodes ( {
102
+ getChildNodes : async ( ) => {
103
+ updateInPlace (
104
+ this . regionNodes ,
105
+ intersection ( regionMap . keys ( ) , userVisibleRegionCodes ) ,
106
+ key => this . regionNodes . get ( key ) ! . update ( regionMap . get ( key ) ! ) ,
107
+ key => new RegionNode ( regionMap . get ( key ) ! , this . regionProvider )
108
+ )
109
+
110
+ return [ ...this . regionNodes . values ( ) ]
111
+ } ,
112
+ getErrorNode : async ( error : Error ) => {
113
+ // Let the calling function handle the error
114
+ throw error
115
+ } ,
116
+ getNoChildrenPlaceholderNode : async ( ) => ROOT_NODE_ADD_REGION ,
117
+ sort : ( nodeA : RegionNode , nodeB : RegionNode ) => nodeA . regionName . localeCompare ( nodeB . regionName )
118
+ } )
119
+ }
103
120
}
0 commit comments