@@ -8,6 +8,7 @@ import { LeetCodeNode } from "../explorer/LeetCodeNode";
8
8
import { leetCodeChannel } from "../leetCodeChannel" ;
9
9
import { leetCodeExecutor } from "../leetCodeExecutor" ;
10
10
import { leetCodeManager } from "../leetCodeManager" ;
11
+ import { leetCodeSolutionProvider } from "../leetCodeSolutionProvider" ;
11
12
import { IProblem , IQuickItemEx , languages , ProblemState } from "../shared" ;
12
13
import { DialogOptions , DialogType , promptForOpenOutputChannel , promptForSignIn } from "../utils/uiUtils" ;
13
14
import { selectWorkspaceFolder } from "../utils/workspaceUtils" ;
@@ -39,18 +40,58 @@ export async function searchProblem(): Promise<void> {
39
40
await showProblemInternal ( choice . value ) ;
40
41
}
41
42
42
- async function showProblemInternal ( node : IProblem ) : Promise < void > {
43
+ export async function showSolution ( node ?: LeetCodeNode ) : Promise < void > {
44
+ if ( ! node ) {
45
+ return ;
46
+ }
47
+ const language : string | undefined = await fetchProblemLanguage ( ) ;
48
+ if ( ! language ) {
49
+ return ;
50
+ }
43
51
try {
44
- const leetCodeConfig : vscode . WorkspaceConfiguration = vscode . workspace . getConfiguration ( "leetcode" ) ;
45
- let defaultLanguage : string | undefined = leetCodeConfig . get < string > ( "defaultLanguage" ) ;
46
- if ( defaultLanguage && languages . indexOf ( defaultLanguage ) < 0 ) {
47
- defaultLanguage = undefined ;
52
+ const solution : string = await leetCodeExecutor . showSolution ( node , language ) ;
53
+ await leetCodeSolutionProvider . show ( solution ) ;
54
+ } catch ( error ) {
55
+ await promptForOpenOutputChannel ( "Failed to fetch the top voted solution. Please open the output channel for details." , DialogType . error ) ;
56
+ }
57
+ }
58
+
59
+ // SUGGESTION: group config retriving into one file
60
+ async function fetchProblemLanguage ( ) : Promise < string | undefined > {
61
+ const leetCodeConfig : vscode . WorkspaceConfiguration = vscode . workspace . getConfiguration ( "leetcode" ) ;
62
+ let defaultLanguage : string | undefined = leetCodeConfig . get < string > ( "defaultLanguage" ) ;
63
+ if ( defaultLanguage && languages . indexOf ( defaultLanguage ) < 0 ) {
64
+ defaultLanguage = undefined ;
65
+ }
66
+ const language : string | undefined = defaultLanguage || await vscode . window . showQuickPick ( languages , { placeHolder : "Select the language you want to use" } ) ;
67
+ // fire-and-forget default language query
68
+ ( async ( ) : Promise < void > => {
69
+ if ( ! defaultLanguage && leetCodeConfig . get < boolean > ( "showSetDefaultLanguageHint" ) ) {
70
+ const choice : vscode . MessageItem | undefined = await vscode . window . showInformationMessage (
71
+ `Would you like to set '${ language } ' as your default language?` ,
72
+ DialogOptions . yes ,
73
+ DialogOptions . no ,
74
+ DialogOptions . never ,
75
+ ) ;
76
+ if ( choice === DialogOptions . yes ) {
77
+ leetCodeConfig . update ( "defaultLanguage" , language , true /* UserSetting */ ) ;
78
+ } else if ( choice === DialogOptions . never ) {
79
+ leetCodeConfig . update ( "showSetDefaultLanguageHint" , false , true /* UserSetting */ ) ;
80
+ }
48
81
}
49
- const language : string | undefined = defaultLanguage || await vscode . window . showQuickPick ( languages , { placeHolder : "Select the language you want to use" } ) ;
82
+ } ) ( ) ;
83
+ return language ;
84
+ }
85
+
86
+ async function showProblemInternal ( node : IProblem ) : Promise < void > {
87
+ try {
88
+ const language : string | undefined = await fetchProblemLanguage ( ) ;
50
89
if ( ! language ) {
51
90
return ;
52
91
}
53
92
93
+ // SUGGESTION: group config retriving into one file
94
+ const leetCodeConfig : vscode . WorkspaceConfiguration = vscode . workspace . getConfiguration ( "leetcode" ) ;
54
95
let outDir : string = await selectWorkspaceFolder ( ) ;
55
96
let relativePath : string = ( leetCodeConfig . get < string > ( "outputFolder" ) || "" ) . trim ( ) ;
56
97
const matchResult : RegExpMatchArray | null = relativePath . match ( / \$ \{ ( .* ?) \} / ) ;
@@ -69,20 +110,6 @@ async function showProblemInternal(node: IProblem): Promise<void> {
69
110
const originFilePath : string = await leetCodeExecutor . showProblem ( node , language , outDir ) ;
70
111
const filePath : string = wsl . useWsl ( ) ? await wsl . toWinPath ( originFilePath ) : originFilePath ;
71
112
await vscode . window . showTextDocument ( vscode . Uri . file ( filePath ) , { preview : false } ) ;
72
-
73
- if ( ! defaultLanguage && leetCodeConfig . get < boolean > ( "showSetDefaultLanguageHint" ) ) {
74
- const choice : vscode . MessageItem | undefined = await vscode . window . showInformationMessage (
75
- `Would you like to set '${ language } ' as your default language?` ,
76
- DialogOptions . yes ,
77
- DialogOptions . no ,
78
- DialogOptions . never ,
79
- ) ;
80
- if ( choice === DialogOptions . yes ) {
81
- leetCodeConfig . update ( "defaultLanguage" , language , true /* UserSetting */ ) ;
82
- } else if ( choice === DialogOptions . never ) {
83
- leetCodeConfig . update ( "showSetDefaultLanguageHint" , false , true /* UserSetting */ ) ;
84
- }
85
- }
86
113
} catch ( error ) {
87
114
await promptForOpenOutputChannel ( "Failed to show the problem. Please open the output channel for details." , DialogType . error ) ;
88
115
}
0 commit comments