@@ -14,6 +14,8 @@ import * as wsl from "./utils/wslUtils";
14
14
class LeetCodeManager extends EventEmitter {
15
15
private currentUser :string | undefined ;
16
16
private userStatus :UserStatus ;
17
+ private readonly successRegex :RegExp = / (?: .* ) S u c c e s s f u l l y .* l o g i n a s ( .* ) / i;
18
+ private readonly failRegex :RegExp = / .* \[ E R R O R \] .* / i;
17
19
18
20
constructor ( ) {
19
21
super ( ) ;
@@ -42,11 +44,6 @@ class LeetCodeManager extends EventEmitter {
42
44
detail :"Use LeetCode account to login" ,
43
45
value :"LeetCode" ,
44
46
} ,
45
- {
46
- label :"LeetCode Cookie" ,
47
- detail :"Use LeetCode cookie copied from browser to login" ,
48
- value :"Cookie" ,
49
- } ,
50
47
{
51
48
label :"Third-Party: GitHub" ,
52
49
detail :"Use GitHub account to login" ,
@@ -57,6 +54,11 @@ class LeetCodeManager extends EventEmitter {
57
54
detail :"Use LinkedIn account to login" ,
58
55
value :"LinkedIn" ,
59
56
} ,
57
+ {
58
+ label :"LeetCode Cookie" ,
59
+ detail :"Use LeetCode cookie copied from browser to login" ,
60
+ value :"Cookie" ,
61
+ } ,
60
62
) ;
61
63
const choice :IQuickItemEx < string > | undefined = await vscode . window . showQuickPick ( picks ) ;
62
64
if ( ! choice ) {
@@ -87,20 +89,22 @@ class LeetCodeManager extends EventEmitter {
87
89
if ( data . includes ( "twoFactorCode" ) ) {
88
90
const twoFactor :string | undefined = await vscode . window . showInputBox ( {
89
91
prompt :"Enter two-factor code." ,
92
+ ignoreFocusOut :true ,
90
93
validateInput :( s :string ) :string | undefined => s && s . trim ( ) ?undefined :"The input must not be empty" ,
91
94
} ) ;
92
95
if ( ! twoFactor ) {
93
96
childProc . kill ( ) ;
94
97
return resolve ( undefined ) ;
95
98
}
96
99
childProc . stdin . write ( `${ twoFactor } \n` ) ;
100
+ }
101
+ const successMatch :RegExpMatchArray | null = data . match ( this . successRegex ) ;
102
+ if ( successMatch && successMatch [ 1 ] ) {
97
103
childProc . stdin . end ( ) ;
98
- } else {
99
- const match :RegExpMatchArray | null = data . match ( / (?: .* ) S u c c e s s f u l l y .* l o g i n a s ( .* ) / i) ;
100
- if ( match && match [ 1 ] ) {
101
- childProc . stdin . end ( ) ;
102
- return resolve ( match [ 1 ] ) ;
103
- }
104
+ return resolve ( successMatch [ 1 ] ) ;
105
+ } else if ( data . match ( this . failRegex ) ) {
106
+ childProc . stdin . end ( ) ;
107
+ return reject ( new Error ( "Faile to login" ) ) ;
104
108
}
105
109
} ) ;
106
110
@@ -109,6 +113,7 @@ class LeetCodeManager extends EventEmitter {
109
113
childProc . on ( "error" , reject ) ;
110
114
const name :string | undefined = await vscode . window . showInputBox ( {
111
115
prompt :"Enter username or E-mail." ,
116
+ ignoreFocusOut :true ,
112
117
validateInput :( s :string ) :string | undefined => s && s . trim ( ) ?undefined :"The input must not be empty" ,
113
118
} ) ;
114
119
if ( ! name ) {
@@ -119,18 +124,14 @@ class LeetCodeManager extends EventEmitter {
119
124
const pwd :string | undefined = await vscode . window . showInputBox ( {
120
125
prompt :isByCookie ?"Enter cookie" :"Enter password." ,
121
126
password :true ,
127
+ ignoreFocusOut :true ,
122
128
validateInput :( s :string ) :string | undefined => s ?undefined :isByCookie ?"Cookie must not be empty" :"Password must not be empty" ,
123
129
} ) ;
124
130
if ( ! pwd ) {
125
131
childProc . kill ( ) ;
126
132
return resolve ( undefined ) ;
127
133
}
128
134
childProc . stdin . write ( `${ pwd } \n` ) ;
129
- childProc . on ( "close" , ( code :number ) => {
130
- if ( code !== 0 ) {
131
- reject ( new Error ( "Failed to login." ) ) ;
132
- }
133
- } ) ;
134
135
} ) ;
135
136
if ( userName ) {
136
137
vscode . window . showInformationMessage ( `Successfully${ inMessage } .` ) ;