@@ -33,26 +33,29 @@ import { isCloud9 } from '../../../shared/extensionUtilities'
33
33
import { telemetry } from '../../../shared/telemetry/telemetry'
34
34
import { isNonNullable } from '../../../shared/utilities/tsUtils'
35
35
import { recordSource } from '../../utils'
36
- import { QuickPickPrompter } from '../../../shared/ui/pickerPrompter'
37
- import { createProjectPrompter } from '../../wizards/selectResource'
36
+ import { createOrgPrompter , createProjectPrompter } from '../../wizards/selectResource'
38
37
import { GetSourceRepositoryCloneUrlsRequest } from 'aws-sdk/clients/codecatalyst'
38
+ import { QuickPickPrompter } from '../../../shared/ui/pickerPrompter'
39
39
40
40
interface LinkedResponse {
41
41
readonly type : 'linked'
42
+ readonly selectedSpace : Pick < CodeCatalystOrg , 'name' >
42
43
readonly selectedProject : CodeCatalystProject
43
44
readonly selectedBranch : CodeCatalystBranch
44
45
readonly newBranch : string
45
46
}
46
47
47
48
interface EmptyResponse {
48
49
readonly type : 'none'
50
+ readonly selectedSpace : Pick < CodeCatalystOrg , 'name' >
49
51
readonly selectedProject : CodeCatalystProject
50
52
}
51
53
52
54
export type SourceResponse = LinkedResponse | EmptyResponse
53
55
54
56
export class CodeCatalystCreateWebview extends VueWebview {
55
57
private projectPrompter ?: QuickPickPrompter < CodeCatalystProject >
58
+ private spacePrompter ?: QuickPickPrompter < CodeCatalystOrg >
56
59
57
60
public readonly id = 'createCodeCatalyst'
58
61
public readonly source = 'src/codecatalyst/vue/create/index.js'
@@ -64,13 +67,8 @@ export class CodeCatalystCreateWebview extends VueWebview {
64
67
) {
65
68
super ( )
66
69
67
- // When webview first loads, an instance of this class
68
- // is created.
69
- // We build the prompter here since it immeditely starts
70
- // fetching the Projects upon creation.
71
- // When a user triggers the prompt to select a Project the **first** time,
72
- // the fetching of Projects will already be in progress.
73
- this . projectPrompter = createProjectPrompter ( this . client )
70
+ // triggers pre-loading of Spaces
71
+ this . spacePrompter = createOrgPrompter ( client )
74
72
}
75
73
76
74
public close ( ) {
@@ -79,24 +77,38 @@ export class CodeCatalystCreateWebview extends VueWebview {
79
77
}
80
78
81
79
/**
82
- * Opens a quick pick that lists all Projects from all Spaces .
80
+ * Opens a quick pick that lists all Spaces of the user .
83
81
*
84
- * @param spaceName Only show Projects from this Space in the quick pick. If undefined,
85
- * shows Projects from all Spaces.
86
- * @returns Project if it was selected, otherwise undefined due to user cancellation.
82
+ * @returns Space if it was selected, otherwise undefined due to user cancellation.
87
83
*/
88
- public async quickPickProject ( spaceName ?: CodeCatalystOrg [ 'name' ] ) : Promise < CodeCatalystProject | undefined > {
89
- // We use an existing prompter since it would have already started
90
- // fetching Projects (improved UX).
91
- if ( this . projectPrompter === undefined ) {
92
- this . projectPrompter = createProjectPrompter ( this . client , spaceName )
84
+ public async quickPickSpace ( ) : Promise < CodeCatalystOrg | undefined > {
85
+ this . spacePrompter = this . spacePrompter ?? createOrgPrompter ( this . client )
86
+ const selectedSpace = await this . spacePrompter . prompt ( )
87
+ this . spacePrompter = undefined // We want the prompter to be re-created on subsequent calls
88
+
89
+ if ( ! isValidResponse ( selectedSpace ) ) {
90
+ return undefined
93
91
}
94
92
93
+ // This will initiate preloading of the projects
94
+ this . projectPrompter = createProjectPrompter ( this . client , selectedSpace ?. name )
95
+
96
+ return selectedSpace
97
+ }
98
+
99
+ /**
100
+ * Opens a quick pick that lists all Projects from a given Space.
101
+ *
102
+ * @param spaceName Space to show Projects from
103
+ * @returns Project if it was selected, otherwise undefined due to user cancellation.
104
+ */
105
+ public async quickPickProject ( spaceName : CodeCatalystOrg [ 'name' ] ) : Promise < CodeCatalystProject | undefined > {
106
+ this . projectPrompter = this . projectPrompter ?? createProjectPrompter ( this . client , spaceName )
95
107
const selectedProject = await this . projectPrompter . prompt ( )
96
- this . projectPrompter = undefined
108
+ this . projectPrompter = undefined // We want the prompter to be re-created on subsequent calls
97
109
98
110
if ( ! isValidResponse ( selectedProject ) ) {
99
- return
111
+ return undefined
100
112
}
101
113
102
114
return selectedProject
0 commit comments