Skip to content

Commit e7264b0

Browse files
committed
refactor: replace TokenHelpPanel with pushTokenHelpLogs for improved token guidance in setup
1 parent 2c23176 commit e7264b0

2 files changed

Lines changed: 49 additions & 64 deletions

File tree

src/commands/setup.tsx

Lines changed: 34 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -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

1717
export 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-
10173
export 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
)}

src/lib/icqq-setup-hint.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,18 @@ export const TOKEN_HELP = {
2424
],
2525
alt: "也可跳过交互:icqq setup --token <PAT> 或 export GITHUB_TOKEN=<PAT>",
2626
} as const;
27+
28+
type LogFn = (text: string, tone?: "dim" | "ok" | "warn" | "err") => void;
29+
30+
/** 将 Token 获取说明写入 setup 步骤日志(③ 阶段立即展示) */
31+
export function pushTokenHelpLogs(log: LogFn, retryNote?: string): void {
32+
if (retryNote) {
33+
log(` ⚠ ${retryNote}`, "warn");
34+
}
35+
log(` 【${TOKEN_HELP.title}】`, "ok");
36+
log(` ${TOKEN_HELP.intro}`);
37+
for (const step of TOKEN_HELP.steps) {
38+
log(` ${step}`);
39+
}
40+
log(` ${TOKEN_HELP.alt}`);
41+
}

0 commit comments

Comments
 (0)