microsoft/vscode-react-native

Public

mirrored from https://github.com/microsoft/vscode-react-nativeAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
0.6.6

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

src/extension/commandPaletteHandler.ts

430lines · modeblame

bef522ffMeena Kunnathur Balakrishnan10 years ago1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the MIT license. See LICENSE file in the project root for details.
3
6e179583digeff10 years ago4import * as vscode from "vscode";
5import * as Q from "q";
0a68f8dbArtem Egorov8 years ago6import * as XDL from "./exponent/xdlInterface";
df4bce40digeff10 years ago7import {SettingsHelper} from "./settingsHelper";
0a68f8dbArtem Egorov8 years ago8import {OutputChannelLogger} from "./log/OutputChannelLogger";
1c32fe84Patricio Beltran9 years ago9import {Packager, PackagerRunAs} from "../common/packager";
0a68f8dbArtem Egorov8 years ago10import {AndroidPlatform} from "./android/androidPlatform";
11import {IOSPlatform} from "./ios/iOSPlatform";
2e432a9eArtem Egorov8 years ago12import {PackagerStatus} from "./packagerStatusIndicator";
b0061ac6Meena Kunnathur Balakrishnan10 years ago13import {ReactNativeProjectHelper} from "../common/reactNativeProjectHelper";
aeaf46bcMeena Kunnathur Balakrishnan10 years ago14import {TargetPlatformHelper} from "../common/targetPlatformHelper";
d976d077Meena Kunnathur Balakrishnan10 years ago15import {TelemetryHelper} from "../common/telemetryHelper";
0a68f8dbArtem Egorov8 years ago16import {ExponentHelper} from "./exponent/exponentHelper";
4edcda70Artem Egorov8 years ago17import {ReactDirManager} from "./reactDirManager";
18import {ExtensionServer} from "./extensionServer";
e4dd9aa4Serge Svekolnikov8 years ago19import { IAndroidRunOptions } from "./launchArgs";
640e6e98max-mironov8 years ago20import { AppCenterCommandPalleteHandler } from "./appcenter/appCenterCommandPalleteHandler";
21import { AppCenterCommandType } from "./appcenter/appCenterConstants";
22import { AppCenterExtensionManager } from "./appcenter/appCenterExtensionManager";
4b37483dmax-mironov8 years ago23
4edcda70Artem Egorov8 years ago24interface IReactNativeStuff {
25packager: Packager;
2e432a9eArtem Egorov8 years ago26exponentHelper: ExponentHelper;
4edcda70Artem Egorov8 years ago27reactDirManager: ReactDirManager;
28extensionServer: ExtensionServer;
6a465861max-mironov8 years ago29appCenterManager: AppCenterExtensionManager; // Actually not an RN Stuff, but this is RN only extension so no other than RN stuff could exist at all, yeah?
4edcda70Artem Egorov8 years ago30}
640e6e98max-mironov8 years ago31
4edcda70Artem Egorov8 years ago32interface IReactNativeProject extends IReactNativeStuff {
2e432a9eArtem Egorov8 years ago33workspaceFolder: vscode.WorkspaceFolder;
34}
35
e1c05e69dlebu10 years ago36export class CommandPaletteHandler {
4edcda70Artem Egorov8 years ago37private static projectsCache: {[key: string]: IReactNativeProject} = {};
2e432a9eArtem Egorov8 years ago38private static logger: OutputChannelLogger = OutputChannelLogger.getMainChannel();
6a465861max-mironov8 years ago39
40// Use this class to further cmd exec delegation and not to pollute this class with AppCenter logic
bb45fbe6max-mironov8 years ago41private static appCenterCommandPalleteHandler: AppCenterCommandPalleteHandler;
2e432a9eArtem Egorov8 years ago42
4edcda70Artem Egorov8 years ago43public static addFolder(workspaceFolder: vscode.WorkspaceFolder, stuff: IReactNativeStuff): void {
44this.projectsCache[workspaceFolder.uri.fsPath] = {
45...stuff,
2e432a9eArtem Egorov8 years ago46workspaceFolder,
47};
48}
bef522ffMeena Kunnathur Balakrishnan10 years ago49
4edcda70Artem Egorov8 years ago50public static getFolder(workspaceFolder: vscode.WorkspaceFolder): IReactNativeProject {
51return this.projectsCache[workspaceFolder.uri.fsPath];
2e432a9eArtem Egorov8 years ago52}
53
4edcda70Artem Egorov8 years ago54public static delFolder(workspaceFolder: vscode.WorkspaceFolder): void {
55delete this.projectsCache[workspaceFolder.uri.fsPath];
bef522ffMeena Kunnathur Balakrishnan10 years ago56}
57
0904a0d7Meena Kunnathur Balakrishnan10 years ago58/**
59* Starts the React Native packager
60*/
2e432a9eArtem Egorov8 years ago61public static startPackager(): Q.Promise<void> {
62return this.selectProject()
63.then((project: IReactNativeProject) => {
64return this.executeCommandInContext("startPackager", project.workspaceFolder, () =>
4edcda70Artem Egorov8 years ago65project.packager.isRunning()
2e432a9eArtem Egorov8 years ago66.then((running) => {
4edcda70Artem Egorov8 years ago67return running ? project.packager.stop() : Q.resolve(void 0);
2e432a9eArtem Egorov8 years ago68})
69)
70.then(() => this.runStartPackagerCommandAndUpdateStatus(project));
71});
1c32fe84Patricio Beltran9 years ago72}
73
74/**
75* Starts the Exponent packager
76*/
2e432a9eArtem Egorov8 years ago77public static startExponentPackager(): Q.Promise<void> {
78return this.selectProject()
79.then((project: IReactNativeProject) => {
80return this.executeCommandInContext("startExponentPackager", project.workspaceFolder, () =>
4edcda70Artem Egorov8 years ago81project.packager.isRunning()
2e432a9eArtem Egorov8 years ago82.then((running) => {
4edcda70Artem Egorov8 years ago83return running ? project.packager.stop() : Q.resolve(void 0);
2e432a9eArtem Egorov8 years ago84})
85).then(() =>
86project.exponentHelper.configureExponentEnvironment()
87).then(() => this.runStartPackagerCommandAndUpdateStatus(project, PackagerRunAs.EXPONENT));
88});
bef522ffMeena Kunnathur Balakrishnan10 years ago89}
90
0904a0d7Meena Kunnathur Balakrishnan10 years ago91/**
92* Kills the React Native packager invoked by the extension's packager
93*/
2e432a9eArtem Egorov8 years ago94public static stopPackager(): Q.Promise<void> {
95return this.selectProject()
96.then((project: IReactNativeProject) => {
4edcda70Artem Egorov8 years ago97return this.executeCommandInContext("stopPackager", project.workspaceFolder, () => project.packager.stop())
98.then(() => project.packager.statusIndicator.updatePackagerStatus(PackagerStatus.PACKAGER_STOPPED));
2e432a9eArtem Egorov8 years ago99});
3194e9afMeena Kunnathur Balakrishnan10 years ago100}
101
4edcda70Artem Egorov8 years ago102public static stopAllPackagers(): Q.Promise<void> {
103let keys = Object.keys(this.projectsCache);
104let promises: Q.Promise<void>[] = [];
105keys.forEach((key) => {
106let project = this.projectsCache[key];
107promises.push(this.executeCommandInContext("stopPackager", project.workspaceFolder, () => project.packager.stop())
108.then(() => project.packager.statusIndicator.updatePackagerStatus(PackagerStatus.PACKAGER_STOPPED)));
109});
110
111return Q.all(promises).then(() => {});
112}
113
f2a58eefBret Johnson9 years ago114/**
115* Restarts the React Native packager
116*/
2e432a9eArtem Egorov8 years ago117public static restartPackager(): Q.Promise<void> {
118return this.selectProject()
119.then((project: IReactNativeProject) => {
120return this.executeCommandInContext("restartPackager", project.workspaceFolder, () =>
121this.runRestartPackagerCommandAndUpdateStatus(project));
122});
f2a58eefBret Johnson9 years ago123}
124
7893fb7eJimmy Thomson9 years ago125/**
126* Execute command to publish to exponent host.
127*/
2e432a9eArtem Egorov8 years ago128public static publishToExpHost(): Q.Promise<void> {
129return this.selectProject()
130.then((project: IReactNativeProject) => {
131return this.executeCommandInContext("publishToExpHost", project.workspaceFolder, () => {
132return this.executePublishToExpHost(project).then((didPublish) => {
133if (!didPublish) {
134CommandPaletteHandler.logger.warning("Publishing was unsuccessful. Please make sure you are logged in Exponent and your project is a valid Exponentjs project");
135}
136});
137});
7893fb7eJimmy Thomson9 years ago138});
139}
140
3194e9afMeena Kunnathur Balakrishnan10 years ago141/**
142* Executes the 'react-native run-android' command
143*/
2e432a9eArtem Egorov8 years ago144public static runAndroid(target: "device" | "simulator" = "simulator"): Q.Promise<void> {
2d8b9177Daniel Lebu10 years ago145TargetPlatformHelper.checkTargetPlatformSupport("android");
2e432a9eArtem Egorov8 years ago146return this.selectProject()
147.then((project: IReactNativeProject) => {
148return this.executeCommandInContext("runAndroid", project.workspaceFolder, () => this.executeWithPackagerRunning(project, () => {
a41f5c68Artem Egorov8 years ago149const packagerPort = SettingsHelper.getPackagerPort(project.workspaceFolder.uri.fsPath);
4edcda70Artem Egorov8 years ago150const runArgs = SettingsHelper.getRunArgs("android", target, project.workspaceFolder.uri);
e26a1f43Artem Egorov8 years ago151const envArgs = SettingsHelper.getEnvArgs("android", target, project.workspaceFolder.uri);
152const envFile = SettingsHelper.getEnvFile("android", target, project.workspaceFolder.uri);
e4dd9aa4Serge Svekolnikov8 years ago153const projectRoot = SettingsHelper.getReactNativeProjectRoot(project.workspaceFolder.uri.fsPath);
154const runOptions: IAndroidRunOptions = {
155platform: "android",
156workspaceRoot: project.workspaceFolder.uri.fsPath,
157projectRoot: projectRoot,
158packagerPort: packagerPort,
159runArguments: runArgs,
e26a1f43Artem Egorov8 years ago160env: envArgs,
161envFile: envFile,
e4dd9aa4Serge Svekolnikov8 years ago162};
163const platform = new AndroidPlatform(runOptions, {
4edcda70Artem Egorov8 years ago164packager: project.packager,
2e432a9eArtem Egorov8 years ago165});
166return platform.runApp(/*shouldLaunchInAllDevices*/true)
167.then(() => {
168return platform.disableJSDebuggingMode();
169});
170}));
0a68f8dbArtem Egorov8 years ago171});
3194e9afMeena Kunnathur Balakrishnan10 years ago172}
173
174/**
175* Executes the 'react-native run-ios' command
176*/
2e432a9eArtem Egorov8 years ago177public static runIos(target: "device" | "simulator" = "simulator"): Q.Promise<void> {
6e7f90d8Daniel Lebu10 years ago178TargetPlatformHelper.checkTargetPlatformSupport("ios");
2e432a9eArtem Egorov8 years ago179return this.selectProject()
180.then((project: IReactNativeProject) => {
181return this.executeCommandInContext("runIos", project.workspaceFolder, () => this.executeWithPackagerRunning(project, () => {
a41f5c68Artem Egorov8 years ago182const packagerPort = SettingsHelper.getPackagerPort(project.workspaceFolder.uri.fsPath);
4edcda70Artem Egorov8 years ago183const runArgs = SettingsHelper.getRunArgs("ios", target, project.workspaceFolder.uri);
e26a1f43Artem Egorov8 years ago184const envArgs = SettingsHelper.getEnvArgs("ios", target, project.workspaceFolder.uri);
185const envFile = SettingsHelper.getEnvFile("ios", target, project.workspaceFolder.uri);
186const platform = new IOSPlatform({
187platform: "ios",
188workspaceRoot: project.workspaceFolder.uri.fsPath,
189projectRoot: project.workspaceFolder.uri.fsPath,
190packagerPort: packagerPort,
191runArguments: runArgs,
192env: envArgs,
193envFile: envFile,
194}, { packager: project.packager });
2e432a9eArtem Egorov8 years ago195
196// Set the Debugging setting to disabled, because in iOS it's persisted across runs of the app
197return platform.disableJSDebuggingMode()
198.catch(() => { }) // If setting the debugging mode fails, we ignore the error and we run the run ios command anyways
199.then(() => {
200return platform.runApp();
201});
202}));
203});
3194e9afMeena Kunnathur Balakrishnan10 years ago204}
205
2e432a9eArtem Egorov8 years ago206public static showDevMenu(): Q.Promise<void> {
a41f5c68Artem Egorov8 years ago207return this.selectProject()
208.then((project: IReactNativeProject) => {
209AndroidPlatform.showDevMenu()
210.catch(() => { }); // Ignore any errors
4edcda70Artem Egorov8 years ago211IOSPlatform.showDevMenu(project.workspaceFolder.uri.fsPath)
a41f5c68Artem Egorov8 years ago212.catch(() => { }); // Ignore any errors
213return Q.resolve(void 0);
214});
7daed3fcArtem Egorov8 years ago215}
216
2e432a9eArtem Egorov8 years ago217public static reloadApp(): Q.Promise<void> {
a41f5c68Artem Egorov8 years ago218return this.selectProject()
219.then((project: IReactNativeProject) => {
220AndroidPlatform.reloadApp()
221.catch(() => { }); // Ignore any errors
4edcda70Artem Egorov8 years ago222IOSPlatform.reloadApp(project.workspaceFolder.uri.fsPath)
a41f5c68Artem Egorov8 years ago223.catch(() => { }); // Ignore any errors
224return Q.resolve(void 0);
225});
7daed3fcArtem Egorov8 years ago226}
227
4b37483dmax-mironov8 years ago228public static appCenterLogin(): Q.Promise<void> {
640e6e98max-mironov8 years ago229return this.selectProject()
230.then((project: IReactNativeProject) => {
18c1b13amax-mironov8 years ago231return CommandPaletteHandler.getAppCenterCommandPalleteHandler(project).run(AppCenterCommandType.Login);
640e6e98max-mironov8 years ago232});
4b37483dmax-mironov8 years ago233}
234
235public static appCenterLogout(): Q.Promise<void> {
640e6e98max-mironov8 years ago236return this.selectProject()
237.then((project: IReactNativeProject) => {
18c1b13amax-mironov8 years ago238return CommandPaletteHandler.getAppCenterCommandPalleteHandler(project).run(AppCenterCommandType.Logout);
6a465861max-mironov8 years ago239});
4b37483dmax-mironov8 years ago240}
241
242public static appCenterWhoAmI(): Q.Promise<void> {
640e6e98max-mironov8 years ago243return this.selectProject()
244.then((project: IReactNativeProject) => {
18c1b13amax-mironov8 years ago245return CommandPaletteHandler.getAppCenterCommandPalleteHandler(project).run(AppCenterCommandType.Whoami);
6a465861max-mironov8 years ago246});
640e6e98max-mironov8 years ago247}
248
249public static appCenterSetCurrentApp(): Q.Promise<void> {
250return this.selectProject()
251.then((project: IReactNativeProject) => {
18c1b13amax-mironov8 years ago252return CommandPaletteHandler.getAppCenterCommandPalleteHandler(project).run(AppCenterCommandType.SetCurrentApp);
6a465861max-mironov8 years ago253});
254}
255
256public static appCenterGetCurrentApp(): Q.Promise<void> {
257return this.selectProject()
258.then((project: IReactNativeProject) => {
18c1b13amax-mironov8 years ago259return CommandPaletteHandler.getAppCenterCommandPalleteHandler(project).run(AppCenterCommandType.GetCurrentApp);
6a465861max-mironov8 years ago260});
261}
262
4a66f08bmax-mironov8 years ago263public static appCenterSetCurrentDeployment(): Q.Promise<void> {
264return this.selectProject()
265.then((project: IReactNativeProject) => {
266return CommandPaletteHandler.getAppCenterCommandPalleteHandler(project).run(AppCenterCommandType.SetCurrentDeployment);
267});
268}
269
6a465861max-mironov8 years ago270public static appCenterCodePushReleaseReact(): Q.Promise<void> {
271return this.selectProject()
272.then((project: IReactNativeProject) => {
18c1b13amax-mironov8 years ago273return CommandPaletteHandler.getAppCenterCommandPalleteHandler(project).run(AppCenterCommandType.CodePushReleaseReact);
6a465861max-mironov8 years ago274});
bb45fbe6max-mironov8 years ago275}
276
ef14e11bmax-mironov8 years ago277public static appCenterShowMenu(): Q.Promise<void> {
278return this.selectProject()
279.then((project: IReactNativeProject) => {
280return CommandPaletteHandler.getAppCenterCommandPalleteHandler(project).run(AppCenterCommandType.ShowMenu);
281});
282}
283
2ceda59emax-mironov8 years ago284public static appCenterSwitchMandatoryPropForRelease(): Q.Promise<void> {
285return this.selectProject()
286.then((project: IReactNativeProject) => {
287return CommandPaletteHandler.getAppCenterCommandPalleteHandler(project).run(AppCenterCommandType.SwitchMandatoryPropForRelease);
288});
289}
290
291public static appCenterSetTargetBinaryVersionForRelease(): Q.Promise<void> {
292return this.selectProject()
293.then((project: IReactNativeProject) => {
294return CommandPaletteHandler.getAppCenterCommandPalleteHandler(project).run(AppCenterCommandType.SetTargetBinaryVersionForRelease);
295});
296}
297
2e432a9eArtem Egorov8 years ago298private static runRestartPackagerCommandAndUpdateStatus(project: IReactNativeProject): Q.Promise<void> {
4edcda70Artem Egorov8 years ago299return project.packager.restart(SettingsHelper.getPackagerPort(project.workspaceFolder.uri.fsPath))
300.then(() => project.packager.statusIndicator.updatePackagerStatus(PackagerStatus.PACKAGER_STARTED));
f2a58eefBret Johnson9 years ago301}
302
1c32fe84Patricio Beltran9 years ago303/**
304* Helper method to run packager and update appropriate configurations
305*/
2e432a9eArtem Egorov8 years ago306private static runStartPackagerCommandAndUpdateStatus(project: IReactNativeProject, startAs: PackagerRunAs = PackagerRunAs.REACT_NATIVE): Q.Promise<any> {
1c32fe84Patricio Beltran9 years ago307if (startAs === PackagerRunAs.EXPONENT) {
2e432a9eArtem Egorov8 years ago308return this.loginToExponent(project)
7059d307Patricio Beltran9 years ago309.then(() =>
4edcda70Artem Egorov8 years ago310project.packager.startAsExponent()
7059d307Patricio Beltran9 years ago311).then(exponentUrl => {
4edcda70Artem Egorov8 years ago312project.packager.statusIndicator.updatePackagerStatus(PackagerStatus.EXPONENT_PACKAGER_STARTED);
2e432a9eArtem Egorov8 years ago313CommandPaletteHandler.logger.info("Application is running on Exponent.");
280c0746Patricio Beltran9 years ago314const exponentOutput = `Open your exponent app at ${exponentUrl}`;
2e432a9eArtem Egorov8 years ago315CommandPaletteHandler.logger.info(exponentOutput);
e23fa745Vladimir Kotikov9 years ago316vscode.commands.executeCommand("vscode.previewHtml", vscode.Uri.parse(exponentUrl), 1, "Expo QR code");
1c32fe84Patricio Beltran9 years ago317});
318}
4edcda70Artem Egorov8 years ago319return project.packager.startAsReactNative()
320.then(() => project.packager.statusIndicator.updatePackagerStatus(PackagerStatus.PACKAGER_STARTED));
5e651f3edigeff10 years ago321}
322
52f3873ddigeff10 years ago323/**
324* Executes a lambda function after starting the packager
325* {lambda} The lambda function to be executed
326*/
2e432a9eArtem Egorov8 years ago327private static executeWithPackagerRunning(project: IReactNativeProject, lambda: () => Q.Promise<void>): Q.Promise<void> {
ec6e115dMeena Kunnathur Balakrishnan10 years ago328// Start the packager before executing the React-Native command
2e432a9eArtem Egorov8 years ago329CommandPaletteHandler.logger.info("Attempting to start the React Native packager");
330return this.runStartPackagerCommandAndUpdateStatus(project).then(lambda);
3194e9afMeena Kunnathur Balakrishnan10 years ago331}
b3a793eeNisheet Jain10 years ago332
333/**
334* Ensures that we are in a React Native project and then executes the operation
335* Otherwise, displays an error message banner
336* {operation} - a function that performs the expected operation
337*/
2e432a9eArtem Egorov8 years ago338private static executeCommandInContext(rnCommand: string, workspaceFolder: vscode.WorkspaceFolder, operation: () => Q.Promise<void>): Q.Promise<void> {
10873e11digeff10 years ago339return TelemetryHelper.generate("RNCommand", (generator) => {
8512ccfeMeena Kunnathur Balakrishnan10 years ago340generator.add("command", rnCommand, false);
e4dd9aa4Serge Svekolnikov8 years ago341const projectRoot = SettingsHelper.getReactNativeProjectRoot(workspaceFolder.uri.fsPath);
342return ReactNativeProjectHelper.isReactNativeProject(projectRoot).then(isRNProject => {
0633e07bMeena Kunnathur Balakrishnan10 years ago343generator.add("isRNProject", isRNProject, false);
8512ccfeMeena Kunnathur Balakrishnan10 years ago344if (isRNProject) {
cf138e34Meena Kunnathur Balakrishnan10 years ago345// Bring the log channel to focus
2e432a9eArtem Egorov8 years ago346CommandPaletteHandler.logger.setFocusOnLogChannel();
cf138e34Meena Kunnathur Balakrishnan10 years ago347
348// Execute the operation
8512ccfeMeena Kunnathur Balakrishnan10 years ago349return operation();
350} else {
351vscode.window.showErrorMessage("Current workspace is not a React Native project.");
3c172a05Artem Egorov8 years ago352return;
8512ccfeMeena Kunnathur Balakrishnan10 years ago353}
354});
10873e11digeff10 years ago355});
b3a793eeNisheet Jain10 years ago356}
7893fb7eJimmy Thomson9 years ago357
358/**
359* Publish project to exponent server. In order to do this we need to make sure the user is logged in exponent and the packager is running.
360*/
2e432a9eArtem Egorov8 years ago361private static executePublishToExpHost(project: IReactNativeProject): Q.Promise<boolean> {
362CommandPaletteHandler.logger.info("Publishing app to Exponent server. This might take a moment.");
363return this.loginToExponent(project)
7059d307Patricio Beltran9 years ago364.then(user => {
2e432a9eArtem Egorov8 years ago365CommandPaletteHandler.logger.debug(`Publishing as ${user.username}...`);
7059d307Patricio Beltran9 years ago366return this.startExponentPackager()
367.then(() =>
a41f5c68Artem Egorov8 years ago368XDL.publish(project.workspaceFolder.uri.fsPath))
7059d307Patricio Beltran9 years ago369.then(response => {
370if (response.err || !response.url) {
371return false;
372}
373const publishedOutput = `App successfully published to ${response.url}`;
2e432a9eArtem Egorov8 years ago374CommandPaletteHandler.logger.info(publishedOutput);
7059d307Patricio Beltran9 years ago375vscode.window.showInformationMessage(publishedOutput);
376return true;
377});
378}).catch(() => {
2e432a9eArtem Egorov8 years ago379CommandPaletteHandler.logger.warning("An error has occured. Please make sure you are logged in to exponent, your project is setup correctly for publishing and your packager is running as exponent.");
7893fb7eJimmy Thomson9 years ago380return false;
7059d307Patricio Beltran9 years ago381});
382}
383
2e432a9eArtem Egorov8 years ago384private static loginToExponent(project: IReactNativeProject): Q.Promise<XDL.IUser> {
385return project.exponentHelper.loginToExponent(
5c8365a6Artem Egorov8 years ago386(message, password) => {
387return Q.Promise((resolve, reject) => {
388vscode.window.showInputBox({ placeHolder: message, password: password })
2e432a9eArtem Egorov8 years ago389.then(login => {
390resolve(login || "");
391}, reject);
5c8365a6Artem Egorov8 years ago392});
393},
394(message) => {
395return Q.Promise((resolve, reject) => {
396vscode.window.showInformationMessage(message)
2e432a9eArtem Egorov8 years ago397.then(password => {
398resolve(password || "");
399}, reject);
5c8365a6Artem Egorov8 years ago400});
401}
7059d307Patricio Beltran9 years ago402);
7893fb7eJimmy Thomson9 years ago403}
2e432a9eArtem Egorov8 years ago404
18c1b13amax-mironov8 years ago405private static getAppCenterCommandPalleteHandler(project: IReactNativeProject): AppCenterCommandPalleteHandler {
bb45fbe6max-mironov8 years ago406if (!CommandPaletteHandler.appCenterCommandPalleteHandler) {
407CommandPaletteHandler.appCenterCommandPalleteHandler = new AppCenterCommandPalleteHandler(CommandPaletteHandler.logger);
408}
18c1b13amax-mironov8 years ago409CommandPaletteHandler.appCenterCommandPalleteHandler.AppCenterManager = project.appCenterManager;
bb45fbe6max-mironov8 years ago410return CommandPaletteHandler.appCenterCommandPalleteHandler;
411}
412
2e432a9eArtem Egorov8 years ago413private static selectProject(): Q.Promise<IReactNativeProject> {
414let keys = Object.keys(this.projectsCache);
415if (keys.length > 1) {
416return Q.Promise((resolve, reject) => {
417vscode.window.showQuickPick(keys)
418.then((selected) => {
419if (selected) {
420resolve(this.projectsCache[selected]);
421}
422}, reject);
423});
424} else if (keys.length === 1) {
425return Q.resolve(this.projectsCache[keys[0]]);
426} else {
427return Q.reject();
428}
429}
bef522ffMeena Kunnathur Balakrishnan10 years ago430}