@@ -12,7 +12,7 @@ import {
1212 IcqqInstallError ,
1313 type PackageManager ,
1414} from "@/lib/icqq-install.js" ;
15- import { TOKEN_HELP } from "@/lib/icqq-setup-hint.js" ;
15+ import { pushTokenHelpLogs } from "@/lib/icqq-setup-hint.js" ;
1616
1717export const description = "检查并安装 @icqqjs/icqq 依赖(不修改 ~/.npmrc)" ;
1818
@@ -70,42 +70,13 @@ function SetupLog({ entries }: { entries: LogEntry[] }) {
7070 ) ;
7171}
7272
73- function TokenHelpPanel ( ) {
74- return (
75- < Box
76- flexDirection = "column"
77- gap = { 0 }
78- borderStyle = "round"
79- borderColor = "cyan"
80- paddingX = { 1 }
81- marginBottom = { 1 }
82- >
83- < Text bold color = "cyan" >
84- { TOKEN_HELP . title }
85- </ Text >
86- < Text > { TOKEN_HELP . intro } </ Text >
87- < Box flexDirection = "column" marginTop = { 1 } >
88- { TOKEN_HELP . steps . map ( ( line ) => (
89- < Text key = { line } wrap = "wrap" >
90- { line }
91- </ Text >
92- ) ) }
93- </ Box >
94- < Box marginTop = { 1 } >
95- < Text dimColor > { TOKEN_HELP . alt } </ Text >
96- </ Box >
97- </ Box >
98- ) ;
99- }
100-
10173export default function Setup ( { options : cliOptions } : Props ) {
10274 const { exit } = useApp ( ) ;
10375 const [ phase , setPhase ] = useState < Phase > ( "init" ) ;
10476 const [ pm , setPm ] = useState < PackageManager > ( "npm" ) ;
10577 const [ icqqPath , setIcqqPath ] = useState < string | null > ( null ) ;
10678 const [ activeToken , setActiveToken ] = useState ( "" ) ;
10779 const [ tokenInput , setTokenInput ] = useState ( "" ) ;
108- const [ retryNote , setRetryNote ] = useState ( "" ) ;
10980 const [ fatalMessage , setFatalMessage ] = useState ( "" ) ;
11081 const [ logs , setLogs ] = useState < LogEntry [ ] > ( [ ] ) ;
11182 const logsRef = useRef < LogEntry [ ] > ( [ ] ) ;
@@ -124,6 +95,17 @@ export default function Setup({ options: cliOptions }: Props) {
12495 [ exit ] ,
12596 ) ;
12697
98+ const enterNeedToken = useCallback (
99+ ( retryNote ?: string ) => {
100+ if ( retryNote ) {
101+ pushLog ( "③ 重新输入 Token …" , "warn" ) ;
102+ pushTokenHelpLogs ( pushLog , retryNote ) ;
103+ }
104+ setPhase ( "need-token" ) ;
105+ } ,
106+ [ pushLog ] ,
107+ ) ;
108+
127109 // 1–2:检测包管理器并查找已安装的 icqq
128110 useEffect ( ( ) => {
129111 if ( phase !== "init" ) return ;
@@ -156,13 +138,15 @@ export default function Setup({ options: cliOptions }: Props) {
156138 setActiveToken ( preset ) ;
157139 setPhase ( "installing" ) ;
158140 } else {
159- pushLog ( " → 未提供 Token,需要交互输入(见下方获取说明)" , "warn" ) ;
160- setPhase ( "need-token" ) ;
141+ pushLog ( " → 未提供 Token,请按下列说明获取后粘贴" , "warn" ) ;
142+ pushTokenHelpLogs ( pushLog ) ;
143+ pushLog ( " → 等待输入 Token:" , "ok" ) ;
144+ enterNeedToken ( ) ;
161145 }
162146 } ) ( ) ;
163- } , [ phase , cliOptions . token , pushLog ] ) ;
147+ } , [ phase , cliOptions . token , pushLog , enterNeedToken ] ) ;
164148
165- // 5–7 :使用 token 全局安装
149+ // 4–5 :使用 token 全局安装
166150 useEffect ( ( ) => {
167151 if ( phase !== "installing" || ! activeToken ) return ;
168152 void ( async ( ) => {
@@ -192,11 +176,10 @@ export default function Setup({ options: cliOptions }: Props) {
192176 } catch ( e ) {
193177 if ( e instanceof IcqqInstallError && e . kind === "auth" ) {
194178 pushLog ( ` → ${ e . message } ` , "warn" ) ;
195- pushLog ( " → 将返回 Token 输入步骤" , "warn" ) ;
196- setRetryNote ( e . message ) ;
179+ pushLog ( " → 返回 ③,请重新获取 Token" , "warn" ) ;
197180 setActiveToken ( "" ) ;
198181 setTokenInput ( "" ) ;
199- setPhase ( "need-token" ) ;
182+ enterNeedToken ( e . message ) ;
200183 return ;
201184 }
202185 const msg =
@@ -212,7 +195,7 @@ export default function Setup({ options: cliOptions }: Props) {
212195 setPhase ( "fatal" ) ;
213196 }
214197 } ) ( ) ;
215- } , [ phase , pm , activeToken , pushLog ] ) ;
198+ } , [ phase , pm , activeToken , pushLog , enterNeedToken ] ) ;
216199
217200 useEffect ( ( ) => {
218201 if ( phase === "ready" || phase === "done" ) finish ( ) ;
@@ -230,7 +213,6 @@ export default function Setup({ options: cliOptions }: Props) {
230213 return ;
231214 }
232215 pushLog ( " → 已接收 Token(交互输入)" , "ok" ) ;
233- setRetryNote ( "" ) ;
234216 setActiveToken ( t ) ;
235217 setPhase ( "installing" ) ;
236218 return ;
@@ -255,38 +237,26 @@ export default function Setup({ options: cliOptions }: Props) {
255237 < Box flexDirection = "column" gap = { 1 } paddingX = { 1 } >
256238 < Text bold > icqq setup</ Text >
257239
258- { phase === "need-token" ? (
259- < >
260- { retryNote && (
261- < Box marginBottom = { 1 } >
262- < Text color = "yellow" >
263- ⚠ { retryNote } (请按下方说明重新获取或检查 Token 权限)
264- </ Text >
265- </ Box >
266- ) }
267- < TokenHelpPanel />
268- < SetupLog entries = { logs } />
269- < Box flexDirection = "column" marginTop = { 1 } >
270- < Text bold > 粘贴 Token:</ Text >
271- < Box >
272- < Text color = "cyan" > ❯ </ Text >
273- < Text >
274- { "•" . repeat ( tokenInput . length ) }
275- < Text color = "cyan" > █</ Text >
276- </ Text >
277- </ Box >
278- </ Box >
279- </ >
280- ) : (
281- < SetupLog entries = { logs } />
282- ) }
240+ < SetupLog entries = { logs } />
283241
284242 { phase === "init" && < Text dimColor > 进行中 …</ Text > }
285243
286244 { phase === "ready" && (
287245 < Text color = "green" > ✓ 完成:@icqqjs/icqq 已可正常加载。</ Text >
288246 ) }
289247
248+ { phase === "need-token" && (
249+ < Box flexDirection = "column" marginTop = { 1 } >
250+ < Box >
251+ < Text color = "cyan" > ❯ </ Text >
252+ < Text >
253+ { "•" . repeat ( tokenInput . length ) }
254+ < Text color = "cyan" > █</ Text >
255+ </ Text >
256+ </ Box >
257+ </ Box >
258+ ) }
259+
290260 { phase === "installing" && (
291261 < Text dimColor > 正在安装,请稍候 …</ Text >
292262 ) }
0 commit comments