From 8cf879e00329d0be30b367033d4e6eef965f4c0e Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Fri, 18 Jan 2019 16:47:46 +0800 Subject: [PATCH 1/2] Improve the experience of switch endpoint --- package.json | 14 ++++++--- resources/cn.png | Bin 4920 -> 0 bytes resources/dark/endpoint.svg | 6 ++++ resources/dark/refresh.svg | 7 ++++- resources/dark/search.svg | 6 ++++ resources/dark/signin.png | Bin 395 -> 0 bytes resources/dark/signin.svg | 7 +++++ resources/light/endpoint.svg | 6 ++++ resources/light/refresh.svg | 7 ++++- resources/light/search.svg | 6 ++++ resources/light/signin.png | Bin 427 -> 0 bytes resources/light/signin.svg | 7 +++++ resources/search.png | Bin 541 -> 0 bytes src/commands/plugin.ts | 54 +++++++++-------------------------- src/extension.ts | 4 +-- src/leetCodeExecutor.ts | 12 +++++--- src/utils/uiUtils.ts | 4 +-- 17 files changed, 86 insertions(+), 54 deletions(-) delete mode 100644 resources/cn.png create mode 100644 resources/dark/endpoint.svg create mode 100644 resources/dark/search.svg delete mode 100644 resources/dark/signin.png create mode 100644 resources/dark/signin.svg create mode 100644 resources/light/endpoint.svg create mode 100644 resources/light/search.svg delete mode 100644 resources/light/signin.png create mode 100644 resources/light/signin.svg delete mode 100644 resources/search.png diff --git a/package.json b/package.json index ed290139..c9a1fb10 100644 --- a/package.json +++ b/package.json @@ -50,15 +50,18 @@ "command": "leetcode.toogleLeetCodeCn", "title": "Switch endpoint", "category": "LeetCode", - "icon": "resources/cn.png" + "icon": { + "light": "resources/light/endpoint.svg", + "dark": "resources/dark/endpoint.svg" + } }, { "command": "leetcode.signin", "title": "Sign in", "category": "LeetCode", "icon": { - "light": "resources/light/signin.png", - "dark": "resources/dark/signin.png" + "light": "resources/light/signin.svg", + "dark": "resources/dark/signin.svg" } }, { @@ -94,7 +97,10 @@ "command": "leetcode.searchProblem", "title": "Search Problem", "category": "LeetCode", - "icon": "resources/search.png" + "icon": { + "light": "resources/light/search.svg", + "dark": "resources/dark/search.svg" + } }, { "command": "leetcode.testSolution", diff --git a/resources/cn.png b/resources/cn.png deleted file mode 100644 index 4b05c7f26b635a02986eb834b4862426a97f1e7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4920 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 Som1PR6HryuQm6u(hy4%6Q&zM9 diff --git a/resources/dark/endpoint.svg b/resources/dark/endpoint.svg new file mode 100644 index 00000000..c9b4d058 --- /dev/null +++ b/resources/dark/endpoint.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/resources/dark/refresh.svg b/resources/dark/refresh.svg index 2e184ea7..fbc960f4 100644 --- a/resources/dark/refresh.svg +++ b/resources/dark/refresh.svg @@ -1 +1,6 @@ - + + + + + + diff --git a/resources/dark/search.svg b/resources/dark/search.svg new file mode 100644 index 00000000..6cd41c04 --- /dev/null +++ b/resources/dark/search.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/resources/dark/signin.png b/resources/dark/signin.png deleted file mode 100644 index 35d32ba8459af36525a2900063600852e46fdb3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 395 zcmV;60d)R}P))k*1-AH zo>Nhx;2JoS8aN6%V8sd40^$`nP-h7-RQ7$)(`zbmXM-)UkrW?O_AO>#N{U+oJ(j?W zR0X&L=c}+tA^ya9xKACpmY8Yi^=7ItWmofb=z;ZzHP)_1wO6@pNBrjopQ{)SrwQUF zmc1tR_Wu>9OnVV);3(qG&rdPLmB6Ke@&a$iyU;80$Zfr$;1SrzK013GFw^c==k^B* p(sw)J#xiuJGMreI@|OA%U;xT^aW(5TK7jxL002ovPDHLkV1midr0D + + + + + + diff --git a/resources/light/endpoint.svg b/resources/light/endpoint.svg new file mode 100644 index 00000000..5aa40abe --- /dev/null +++ b/resources/light/endpoint.svg @@ -0,0 +1,6 @@ +?xml version="1.0"?> + + + + + diff --git a/resources/light/refresh.svg b/resources/light/refresh.svg index a88fab81..e1969cd4 100644 --- a/resources/light/refresh.svg +++ b/resources/light/refresh.svg @@ -1 +1,6 @@ - + + + + + + diff --git a/resources/light/search.svg b/resources/light/search.svg new file mode 100644 index 00000000..48ffa86d --- /dev/null +++ b/resources/light/search.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/resources/light/signin.png b/resources/light/signin.png deleted file mode 100644 index 9a9d125070b042a922784afd9bc33726240508d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 427 zcmV;c0aX5pP){sm#f-n%ZrvGIF*+4dc5p)9CKu2H%+@NlN6Nno)0&bua;Jc(KF@9V>0296B zr6jaG-re=C6?I*YhBEnSf)FCbkb2}iLhzbJ4hw-8I9QSez|2Z{WBA*|gb^N#Fp$Ef zwcAat6{grZ=1js+6Oz)2w}fMw;wXKz@n}H%ZgOOK1|X~=2ZEuLuc$!a2NGZ8vb8-z z#{4O;$NUXO^2phVUDx)K9t}|eiN*So)(~70j=Z2;^1y|B3q&rim)yDyg-!3hP&LDv zqVIjaqr~(d)S1^{pj V#zHtlREYop002ovPDHLkV1hg=x9 + + + + + + diff --git a/resources/search.png b/resources/search.png deleted file mode 100644 index 05e881c05ea4097cd26251f8a3c84b97e6f7c070..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 541 zcmV+&0^;PPnV@unWP{QL97gCFOhxU3`hz*iAcdIs&VGJ(kiaEMmcaE9 z2EVVQrwxn>#yLo%V(b;f5;%tIivZS%8b%I8PVNLsc7W@f<(d_ONMlE!WIXF*;1*XH z+nxk9%=|c!*}i>o5Uj=hRp>yDe)|kopk!QN7Z{=Rgo`YLZ0eDDp&`<+&jZmJQ`tE=?eugTUR=1g;vVLN|7@7w8c9R7BYsi)j&CA!b%ln`LXg zyfY}1z$)lFwJg0H{6m{WXXS}fN5D_0L*3_9?Q3#7c*j(-3$paTZc1iqI%-iFza_!N zBmd9(HjT{O@#xirG|KUQz%O_s+OY!n0l(ly+bJR4F>wUXL}nXgziZ(kr(qMS5^w>Z z==XJl4jaU!!FvMRk?z$y_)r6J>uk8~dISG^4F4xFJ2>V8V { - const isCnEnbaled: boolean = isLeetCodeCnEnabled(); +export async function switchEndpoint(): Promise { + const isCnEnbaled: boolean = getLeetCodeEndpoint() === Endpoint.LeetCodeCN; const picks: Array> = []; picks.push( { - label: `${isCnEnbaled ? "$(check) " : ""}On`, - description: "", - detail: `Enable ${Endpoint.LeetCodeCN}.`, - value: "on", + label: `${isCnEnbaled ? "" : "$(check) "}LeetCode`, + description: "leetcode.com", + detail: `Enable LeetCode US`, + value: Endpoint.LeetCode, }, { - label: `${isCnEnbaled ? "" : "$(check) "}Off`, - description: "", - detail: `Disable ${Endpoint.LeetCodeCN}.`, - value: "off", + label: `${isCnEnbaled ? "$(check) " : ""}力扣`, + description: "leetcode-cn.com", + detail: `启用中国版 LeetCode`, + value: Endpoint.LeetCodeCN, }, ); const choice: IQuickItemEx | undefined = await vscode.window.showQuickPick(picks); @@ -34,9 +31,8 @@ export async function toogleLeetCodeCn(): Promise { } const leetCodeConfig: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("leetcode"); try { - const enabled: boolean = choice.value === "on"; - const endpoint: string = enabled ? Endpoint.LeetCodeCN : Endpoint.LeetCode; - await leetCodeExecutor.toggleLeetCodeCn(enabled); + const endpoint: string = choice.value; + await leetCodeExecutor.switchEndpoint(endpoint); await leetCodeConfig.update("endpoint", endpoint, true /* UserSetting */); vscode.window.showInformationMessage(`Switched the endpoint to ${endpoint}`); } catch (error) { @@ -52,29 +48,7 @@ export async function toogleLeetCodeCn(): Promise { } } -export async function initializeEndpoint(): Promise { - const isCnEnabledInExtension: boolean = isLeetCodeCnEnabled(); - const isCnEnabledInCli: boolean = await isLeetCodeCnEnabledInCli(); - await leetCodeExecutor.toggleLeetCodeCn(isCnEnabledInExtension); - if (isCnEnabledInCli !== isCnEnabledInExtension) { - await deleteCache(); - } -} - -export function isLeetCodeCnEnabled(): boolean { +export function getLeetCodeEndpoint(): string { const leetCodeConfig: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("leetcode"); - const endpoint: string | undefined = leetCodeConfig.get("endpoint"); - if (endpoint && endpoint === Endpoint.LeetCodeCN) { - return true; - } - return false; -} - -async function isLeetCodeCnEnabledInCli(): Promise { - const pluginsStatusFile: string = path.join(os.homedir(), ".lc", "plugins.json"); - if (!await fse.pathExists(pluginsStatusFile)) { - return false; - } - const pluginsObj: {} = await fse.readJson(pluginsStatusFile); - return pluginsObj["leetcode.cn"]; + return leetCodeConfig.get("endpoint", Endpoint.LeetCode); } diff --git a/src/extension.ts b/src/extension.ts index 4913756d..67b6c3ca 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -36,7 +36,7 @@ export async function activate(context: vscode.ExtensionContext): Promise vscode.window.registerTreeDataProvider("leetCodeExplorer", leetCodeTreeDataProvider), vscode.languages.registerCodeLensProvider({ scheme: "file" }, codeLensProvider), vscode.commands.registerCommand("leetcode.deleteCache", () => cache.deleteCache()), - vscode.commands.registerCommand("leetcode.toogleLeetCodeCn", () => plugin.toogleLeetCodeCn()), + vscode.commands.registerCommand("leetcode.toogleLeetCodeCn", () => plugin.switchEndpoint()), vscode.commands.registerCommand("leetcode.signin", () => leetCodeManager.signIn()), vscode.commands.registerCommand("leetcode.signout", () => leetCodeManager.signOut()), vscode.commands.registerCommand("leetcode.selectSessions", () => session.selectSession()), @@ -48,7 +48,7 @@ export async function activate(context: vscode.ExtensionContext): Promise vscode.commands.registerCommand("leetcode.submitSolution", (uri?: vscode.Uri) => submit.submitSolution(uri)), ); - await plugin.initializeEndpoint(); + await leetCodeExecutor.switchEndpoint(plugin.getLeetCodeEndpoint()); leetCodeManager.getLoginStatus(); } diff --git a/src/leetCodeExecutor.ts b/src/leetCodeExecutor.ts index f8906f62..e6356a83 100644 --- a/src/leetCodeExecutor.ts +++ b/src/leetCodeExecutor.ts @@ -4,6 +4,7 @@ import * as cp from "child_process"; import * as path from "path"; import * as vscode from "vscode"; +import { Endpoint } from "./shared"; import { executeCommand, executeCommandWithProgress } from "./utils/cpUtils"; import { DialogOptions, openUrl } from "./utils/uiUtils"; import * as wsl from "./utils/wslUtils"; @@ -89,11 +90,14 @@ class LeetCodeExecutor { return await this.executeCommandWithProgressEx("Submitting to LeetCode...", "node", [await this.getLeetCodeBinaryPath(), "test", `"${filePath}"`]); } - public async toggleLeetCodeCn(isEnable: boolean): Promise { - if (isEnable) { - return await this.executeCommandEx("node", [await this.getLeetCodeBinaryPath(), "plugin", "-e", "leetcode.cn"]); + public async switchEndpoint(endpoint: string): Promise { + switch (endpoint) { + case Endpoint.LeetCodeCN: + return await this.executeCommandEx("node", [await this.getLeetCodeBinaryPath(), "plugin", "-e", "leetcode.cn"]); + case Endpoint.LeetCode: + default: + return await this.executeCommandEx("node", [await this.getLeetCodeBinaryPath(), "plugin", "-d", "leetcode.cn"]); } - return await this.executeCommandEx("node", [await this.getLeetCodeBinaryPath(), "plugin", "-d", "leetcode.cn"]); } private async executeCommandEx(command: string, args: string[], options: cp.SpawnOptions = { shell: true }): Promise { diff --git a/src/utils/uiUtils.ts b/src/utils/uiUtils.ts index aeb76ee6..3f17c97b 100644 --- a/src/utils/uiUtils.ts +++ b/src/utils/uiUtils.ts @@ -2,7 +2,7 @@ // Licensed under the MIT license. import * as vscode from "vscode"; -import { isLeetCodeCnEnabled } from "../commands/plugin"; +import { getLeetCodeEndpoint } from "../commands/plugin"; import { leetCodeChannel } from "../leetCodeChannel"; export namespace DialogOptions { @@ -46,7 +46,7 @@ export async function promptForSignIn(): Promise { await vscode.commands.executeCommand("leetcode.signin"); break; case DialogOptions.singUp: - if (isLeetCodeCnEnabled()) { + if (getLeetCodeEndpoint()) { openUrl("https://leetcode-cn.com"); } else { openUrl("https://leetcode.com"); From 1fe33e000bfe60b25f3f026c11fe04c1e71fcfe7 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Fri, 18 Jan 2019 16:50:27 +0800 Subject: [PATCH 2/2] Change command name to upper case --- package.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index c9a1fb10..e809f934 100644 --- a/package.json +++ b/package.json @@ -43,12 +43,12 @@ "commands": [ { "command": "leetcode.deleteCache", - "title": "Delete cache", + "title": "Delete Cache", "category": "LeetCode" }, { "command": "leetcode.toogleLeetCodeCn", - "title": "Switch endpoint", + "title": "Switch Endpoint", "category": "LeetCode", "icon": { "light": "resources/light/endpoint.svg", @@ -57,7 +57,7 @@ }, { "command": "leetcode.signin", - "title": "Sign in", + "title": "Sign In", "category": "LeetCode", "icon": { "light": "resources/light/signin.svg", @@ -66,17 +66,17 @@ }, { "command": "leetcode.signout", - "title": "Sign out", + "title": "Sign Out", "category": "LeetCode" }, { "command": "leetcode.selectSessions", - "title": "Select session", + "title": "Select Session", "category": "LeetCode" }, { "command": "leetcode.createSession", - "title": "Create new session", + "title": "Create New Session", "category": "LeetCode" }, { @@ -90,7 +90,7 @@ }, { "command": "leetcode.showProblem", - "title": "Show problem", + "title": "Show Problem", "category": "LeetCode" }, {