microsoft/vscode-react-native

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
a446900cd626f9cbc32aa7e01ae1de6248513c66

Branches

Tags

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

Clone

HTTPS

Download ZIP

src/extension/appcenter/command/commandExecutor.ts

214lines · modecode

1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the MIT license. See LICENSE file in the project root for details.
3
4import * as vscode from "vscode";
5import * as Q from "q";
6import * as qs from "qs";
7import * as os from "os";
8
9import { ILogger, LogLevel } from "../../log/LogHelper";
10import Auth from "../../appcenter/auth/auth";
11import { AppCenterLoginType } from "../appCenterConstants";
12import { Profile, getUser } from "../../appcenter/auth/profile/profile";
13import { SettingsHelper } from "../../settingsHelper";
14import { AppCenterClient } from "../api/index";
15import { DefaultApp, ICodePushReleaseParams } from "./commandParams";
16import { AppCenterExtensionManager } from "../appCenterExtensionManager";
17import { ACStrings } from "../appCenterStrings";
18import CodePushReleaseReact from "../codepush/releaseReact";
19import { ACUtils } from "../appCenterUtils";
20import { updateContents, reactNative } from "codepush-node-sdk";
21import BundleConfig = reactNative.BundleConfig;
22
23interface IAppCenterAuth {
24 login(appcenterManager: AppCenterExtensionManager): Q.Promise<void>;
25 logout(appcenterManager: AppCenterExtensionManager): Q.Promise<void>;
26 whoAmI(): Q.Promise<void>;
27}
28
29interface IAppCenterApps {
30 getCurrentApp(): Q.Promise<void>;
31 setCurrentApp(appCenterManager: AppCenterExtensionManager): Q.Promise<void>;
32}
33
34interface IAppCenterCodePush {
35 releaseReact(client: AppCenterClient, appCenterManager: AppCenterExtensionManager): Q.Promise<void>;
36}
37
38export class AppCenterCommandExecutor implements IAppCenterAuth, IAppCenterCodePush, IAppCenterApps {
39 private logger: ILogger;
40
41 constructor(logger: ILogger) {
42 this.logger = logger;
43 }
44
45 public login(appCenterManager: AppCenterExtensionManager): Q.Promise<void> {
46 const appCenterLoginOptions: string[] = Object.keys(AppCenterLoginType).filter(k => typeof AppCenterLoginType[k as any] === "number");
47 vscode.window.showQuickPick(appCenterLoginOptions, { placeHolder: ACStrings.SelectLoginTypeMsg })
48 .then((loginType) => {
49 switch (loginType) {
50 case (AppCenterLoginType[AppCenterLoginType.Interactive]):
51 vscode.window.showInformationMessage(ACStrings.PleaseLoginViaBrowser, "OK")
52 .then((selection: string) => {
53 if (selection.toLowerCase() === "ok") {
54 const loginUrl = `${SettingsHelper.getAppCenterLoginEndpoint()}?${qs.stringify({ hostname: os.hostname()})}`;
55 ACUtils.OpenUrl(loginUrl);
56 return vscode.window.showInputBox({ prompt: ACStrings.PleaseProvideToken, ignoreFocusOut: true })
57 .then(token => {
58 this.loginWithToken(token, appCenterManager);
59 });
60 } else return Q.resolve(void 0);
61 });
62 break;
63 case (AppCenterLoginType[AppCenterLoginType.Token]):
64 vscode.window.showInputBox({ prompt: ACStrings.PleaseProvideToken , ignoreFocusOut: true})
65 .then(token => {
66 this.loginWithToken(token, appCenterManager);
67 });
68 break;
69 default:
70 throw new Error("Unsupported login parameter!");
71 }
72 });
73 return Q.resolve(void 0);
74 }
75
76 public logout(appCenterManager: AppCenterExtensionManager): Q.Promise<void> {
77 const logoutOption = "Logout";
78 const logoutChoices: string[] = [logoutOption];
79 vscode.window.showQuickPick(logoutChoices, { placeHolder: ACStrings.LogoutPrompt })
80 .then((logoutType) => {
81 switch (logoutType) {
82 case (logoutOption):
83 return Auth.doLogout().then(() => {
84 vscode.window.showInformationMessage(ACStrings.UserLoggedOutMsg);
85 appCenterManager.setupNotAuthenticatedStatusBar();
86 return Q.resolve(void 0);
87 }).catch(() => {
88 this.logger.log("An errro occured on logout", LogLevel.Error);
89 });
90 default:
91 return Q.resolve(void 0);
92 }
93 });
94 return Q.resolve(void 0);
95 }
96
97 public whoAmI(): Q.Promise<void> {
98 return Auth.whoAmI().then((profile: Profile) => {
99 if (profile.displayName) {
100 vscode.window.showInformationMessage(ACStrings.YouAreLoggedInMsg(profile.displayName));
101 return;
102 }
103 }).catch(() => {
104 vscode.window.showInformationMessage(ACStrings.UserIsNotLoggedInMsg);
105 return;
106 });
107 }
108
109 public getCurrentApp(): Q.Promise<void> {
110 this.restoreCurrentApp().then((app: DefaultApp) => {
111 vscode.window.showInformationMessage(ACStrings.YourCurrentAppMsg(app.identifier));
112 }).catch(e => {
113 vscode.window.showInformationMessage(ACStrings.NoCurrentAppSetMsg);
114 });
115 return Q.resolve(void 0);
116 }
117
118 public setCurrentApp(appCenterManager: AppCenterExtensionManager): Q.Promise<void> {
119 vscode.window.showInputBox({ prompt: ACStrings.ProvideCurrentAppPromptMsg, ignoreFocusOut: true })
120 .then((currentApp: string) => {
121 // TODO: I believe we should validate app here for existance! before we save anything
122 this.saveCurrentApp(<string>currentApp).then((saved: boolean) => {
123 if (saved) {
124 vscode.window.showInformationMessage(ACStrings.YourCurrentAppMsg(currentApp));
125 appCenterManager.setCurrentAppStatusBar(currentApp);
126 }
127 });
128 });
129 return Q.resolve(void 0);
130 }
131
132 public releaseReact(client: AppCenterClient, appCenterManager: AppCenterExtensionManager): Q.Promise<void> {
133 let codePushRelaseParams = <ICodePushReleaseParams>{};
134 const projectRootPath: string = appCenterManager.projectRootPath;
135 return Q.Promise<void>((resolve, reject) => {
136 reactNative.getAndroidAppVersion(projectRootPath)
137 .then((appVersion: string) => {
138 codePushRelaseParams.appVersion = appVersion;
139 return reactNative.makeUpdateContents(<BundleConfig>{
140 os: "android",
141 projectRootPath: projectRootPath,
142 });
143 }).then((pathToUpdateContents: string) => {
144 return updateContents.zip(pathToUpdateContents, projectRootPath);
145 }).then((pathToZippedBundle: string) => {
146 codePushRelaseParams.updatedContentZipPath = pathToZippedBundle;
147 return new Promise<DefaultApp>((appResolve, appReject) => {
148 this.restoreCurrentApp()
149 .then(currentApp => appResolve(<DefaultApp>currentApp))
150 .catch(err => appReject(err));
151 });
152 }).then((currentApp: DefaultApp) => {
153 if (!currentApp) {
154 vscode.window.showInformationMessage(ACStrings.NoCurrentAppSetMsg);
155 return;
156 }
157 codePushRelaseParams.app = currentApp;
158 codePushRelaseParams.deploymentName = "Staging";
159 CodePushReleaseReact.exec(client, codePushRelaseParams, this.logger)
160 .then((value: any) => resolve(value))
161 .catch((error: any) => reject(error));
162 }).catch((error: any) => reject(error));
163 });
164 }
165
166 private saveCurrentApp(currentApp: string): Q.Promise<boolean> {
167 const defaultApp = ACUtils.toDefaultApp(currentApp);
168 if (!defaultApp) {
169 vscode.window.showInformationMessage(ACStrings.InvalidCurrentAppNameMsg);
170 return Q<boolean>(false);
171 }
172 let profile = getUser();
173 if (profile) {
174 profile.defaultApp = defaultApp;
175 profile.save();
176 return Q<boolean>(true);
177 } else {
178 // No profile - not logged in?
179 vscode.window.showInformationMessage(ACStrings.UserIsNotLoggedInMsg);
180 return Q<boolean>(false);
181 }
182 }
183
184 private restoreCurrentApp(): Q.Promise<DefaultApp | null> {
185 const user = getUser();
186 if (user) {
187 const currentApp = user.defaultApp
188 ? `${user.defaultApp.ownerName}/${user.defaultApp.appName}`
189 : "";
190 const defaultApp: DefaultApp | null = ACUtils.toDefaultApp(currentApp);
191 if (defaultApp) {
192 return Q.resolve(defaultApp);
193 }
194 }
195 return Q.resolve(null);
196 }
197
198 private loginWithToken(token: string | undefined, appCenterManager: AppCenterExtensionManager) {
199 if (!token) {
200 return;
201 }
202 return Auth.doTokenLogin(token).then((profile: Profile) => {
203 vscode.window.showInformationMessage(ACStrings.YouAreLoggedInMsg(profile.displayName));
204 appCenterManager.setuAuthenticatedStatusBar(profile.displayName);
205 this.restoreCurrentApp().then((currentApp: DefaultApp) => {
206 if (currentApp) {
207 appCenterManager.setCurrentAppStatusBar(currentApp.identifier);
208 } else {
209 appCenterManager.setCurrentAppStatusBar(null);
210 }
211 });
212 });
213 }
214}