Skip to content

Commit be596bd

Browse files
committed
Add Preview Function(#132)
1 parent dbeddab commit be596bd

File tree

8 files changed

+106
-2
lines changed

8 files changed

+106
-2
lines changed

package.json

+10
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,11 @@
9393
"command": "leetcode.showProblem",
9494
"title": "Show Problem",
9595
"category": "LeetCode"
96+
},
97+
{
98+
"command": "leetcode.previewProblem",
99+
"title": "Preview Problem",
100+
"category": "LeetCode"
96101
},
97102
{
98103
"command": "leetcode.searchProblem",
@@ -164,6 +169,11 @@
164169
"command": "leetcode.showProblem",
165170
"when": "view == leetCodeExplorer && viewItem == problem",
166171
"group": "leetcode@1"
172+
},
173+
{
174+
"command": "leetcode.previewProblem",
175+
"when": "view == leetCodeExplorer && viewItem == problem",
176+
"group": "leetcode@1"
167177
}
168178
],
169179
"commandPalette": [

src/commands/show.ts

+20-1
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ import { LeetCodeNode } from "../explorer/LeetCodeNode";
88
import { leetCodeChannel } from "../leetCodeChannel";
99
import { leetCodeExecutor } from "../leetCodeExecutor";
1010
import { leetCodeManager } from "../leetCodeManager";
11-
import { IProblem, IQuickItemEx, languages, ProblemState } from "../shared";
11+
import { Command, IProblem, IQuickItemEx, IWebViewMessage, languages, ProblemState } from "../shared";
1212
import { DialogOptions, DialogType, promptForOpenOutputChannel, promptForSignIn } from "../utils/uiUtils";
13+
import { renderHTML } from "../utils/webviewUtils";
1314
import { selectWorkspaceFolder } from "../utils/workspaceUtils";
1415
import * as wsl from "../utils/wslUtils";
1516
import * as list from "./list";
@@ -135,3 +136,21 @@ async function resolveRelativePath(value: string, node: IProblem, selectedLangua
135136
throw new Error(errorMsg);
136137
}
137138
}
139+
140+
export async function previewProblem(node: IProblem): Promise<void> {
141+
const panelType: string = "previewProblem";
142+
const panelTitle: string = node.name;
143+
const panel: vscode.WebviewPanel = vscode.window.createWebviewPanel(panelType, panelTitle, vscode.ViewColumn.Active, {
144+
enableScripts: true,
145+
enableCommandUris: true,
146+
});
147+
panel.webview.onDidReceiveMessage(async (message: IWebViewMessage) => {
148+
switch (message.command) {
149+
case Command.ShowProblem:
150+
await showProblemInternal(node);
151+
panel.dispose();
152+
return;
153+
}
154+
});
155+
panel.webview.html = await renderHTML(node);
156+
}

src/explorer/LeetCodeNode.ts

+8
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,14 @@ export class LeetCodeNode {
5050
return this.parentNodeName;
5151
}
5252

53+
public get previewCommand(): Command {
54+
return {
55+
title: "Preview Problem",
56+
command: "leetcode.previewProblem",
57+
arguments: [this],
58+
};
59+
}
60+
5361
public get selectedCommand(): Command {
5462
return {
5563
title: "Open Problem",

src/explorer/LeetCodeTreeDataProvider.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ export class LeetCodeTreeDataProvider implements vscode.TreeDataProvider<LeetCod
5252
collapsibleState: element.isProblem ? vscode.TreeItemCollapsibleState.None : vscode.TreeItemCollapsibleState.Collapsed,
5353
contextValue: element.isProblem ? "problem" : element.id.toLowerCase(),
5454
iconPath: this.parseIconPathFromProblemState(element),
55-
command: element.isProblem ? element.selectedCommand : undefined,
55+
command: element.isProblem ? element.previewCommand : undefined,
5656
};
5757
}
5858

src/extension.ts

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export async function activate(context: vscode.ExtensionContext): Promise<void>
4343
vscode.commands.registerCommand("leetcode.signout", () => leetCodeManager.signOut()),
4444
vscode.commands.registerCommand("leetcode.selectSessions", () => session.selectSession()),
4545
vscode.commands.registerCommand("leetcode.createSession", () => session.createSession()),
46+
vscode.commands.registerCommand("leetcode.previewProblem", (node: LeetCodeNode) => show.previewProblem(node)),
4647
vscode.commands.registerCommand("leetcode.showProblem", (node: LeetCodeNode) => show.showProblem(node)),
4748
vscode.commands.registerCommand("leetcode.searchProblem", () => show.searchProblem()),
4849
vscode.commands.registerCommand("leetcode.refreshExplorer", () => leetCodeTreeDataProvider.refresh()),

src/leetCodeExecutor.ts

+4
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ class LeetCodeExecutor {
8787
return filePath;
8888
}
8989

90+
public async getDescription(node: IProblem): Promise<string> {
91+
return await this.executeCommandWithProgressEx("Fetching problem description...", "node", [await this.getLeetCodeBinaryPath(), "show", node.id, "-x"]);
92+
}
93+
9094
public async listSessions(): Promise<string> {
9195
return await this.executeCommandEx("node", [await this.getLeetCodeBinaryPath(), "session"]);
9296
}

src/shared.ts

+8
Original file line numberDiff line numberDiff line change
@@ -91,3 +91,11 @@ export enum Category {
9191
Company = "Company",
9292
Favorite = "Favorite",
9393
}
94+
95+
export enum Command {
96+
ShowProblem = "ShowProblem",
97+
}
98+
99+
export interface IWebViewMessage {
100+
command: string;
101+
}

src/utils/webviewUtils.ts

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { leetCodeExecutor } from "../leetCodeExecutor";
2+
import { Command, IProblem } from "../shared";
3+
4+
export async function renderHTML(node: IProblem): Promise<string> {
5+
const description: string = await leetCodeExecutor.getDescription(node);
6+
const descriptionHTML: string = description.replace(/\n/g, "<br>");
7+
const htmlTemplate: string = `
8+
<!DOCTYPE html>
9+
<html>
10+
<head>
11+
<meta charset="UTF-8">
12+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
13+
<title>Preview Problem</title>
14+
</head>
15+
<style>
16+
#solve {
17+
position: fixed;
18+
bottom: 10px;
19+
right: 10px;
20+
border: 0;
21+
margin: 10px 0;
22+
padding: 2px 14px;
23+
color: white;
24+
background-color: rgb(14, 99, 156);
25+
}
26+
#solve:hover {
27+
background-color: rgb(17, 119, 187);
28+
}
29+
#solve:active {
30+
border: 0;
31+
}
32+
</style>
33+
<body>
34+
<div >
35+
${ descriptionHTML}
36+
</div>
37+
<button id="solve">Code Now</button>
38+
<script>
39+
(function() {
40+
const vscode = acquireVsCodeApi();
41+
let button = document.getElementById('solve');
42+
button.onclick = solveHandler;
43+
function solveHandler() {
44+
vscode.postMessage({
45+
command: '${Command.ShowProblem}',
46+
})
47+
}
48+
}())
49+
</script>
50+
</body>
51+
</html>
52+
`;
53+
return htmlTemplate;
54+
}

0 commit comments

Comments
 (0)