fix: 优化登录流程和余额查询逻辑

- 添加 fetchBalanceWithToken 支持登录时直接传入 token 查询余额
- AuthProvider 会话加载改为同步方式避免时序问题
- 添加调试日志便于排查问题
This commit is contained in:
XiaoFeng
2026-01-13 20:06:42 +08:00
parent 5753e120ba
commit 7d1b8f7e26
4 changed files with 35 additions and 6 deletions

View File

@ -8,7 +8,7 @@ import * as vscode from "vscode";
type Environment = "dev" | "test" | "prod"; type Environment = "dev" | "test" | "prod";
/** 当前环境 - 修改这里切换环境 */ /** 当前环境 - 修改这里切换环境 */
const CURRENT_ENV: Environment = "test"; const CURRENT_ENV: Environment = "dev";
/** 服务等级类型 */ /** 服务等级类型 */
export type ServiceTier = "lite" | "syntaxic" | "max" | "auto"; export type ServiceTier = "lite" | "syntaxic" | "max" | "auto";

View File

@ -100,7 +100,18 @@ export async function fetchBalance(): Promise<number | null> {
return null; return null;
} }
const token = session.accessToken; return await fetchBalanceWithToken(session.accessToken);
} catch (error) {
console.error('[CreditsService] 查询余额异常:', error);
return null;
}
}
/**
* 使用指定 token 查询余额(登录过程中使用)
*/
export async function fetchBalanceWithToken(token: string): Promise<number | null> {
try {
console.log('[CreditsService] 开始查询余额token 长度:', token.length); console.log('[CreditsService] 开始查询余额token 长度:', token.length);
// 直接调用 StrangeLoop 的 /api/credit/balance 接口 // 直接调用 StrangeLoop 的 /api/credit/balance 接口

View File

@ -24,8 +24,23 @@ export class ICCoderAuthenticationProvider
private _sessions: vscode.AuthenticationSession[] = []; private _sessions: vscode.AuthenticationSession[] = [];
constructor(private readonly context: vscode.ExtensionContext) { constructor(private readonly context: vscode.ExtensionContext) {
// 从存储中恢复会话 // 从存储中恢复会话(同步执行)
this.loadSessions(); this.loadSessionsSync();
}
/**
* 从存储中加载会话(同步版本)
*/
private loadSessionsSync(): void {
const storedSessions = this.context.globalState.get<
vscode.AuthenticationSession[]
>("icCoderSessions", []);
this._sessions = storedSessions;
console.log("[AuthProvider] 同步加载 sessions, 数量:", this._sessions.length);
if (this._sessions.length > 0) {
console.log("[AuthProvider] Session ID:", this._sessions[0].id);
console.log("[AuthProvider] Account:", this._sessions[0].account.label);
}
} }
/** /**
@ -42,7 +57,9 @@ export class ICCoderAuthenticationProvider
* 保存会话到存储 * 保存会话到存储
*/ */
private async saveSessions(): Promise<void> { private async saveSessions(): Promise<void> {
console.log("[AuthProvider] 保存 sessions, 数量:", this._sessions.length);
await this.context.globalState.update("icCoderSessions", this._sessions); await this.context.globalState.update("icCoderSessions", this._sessions);
console.log("[AuthProvider] sessions 已保存到 globalState");
} }
/** /**
@ -51,6 +68,7 @@ export class ICCoderAuthenticationProvider
async getSessions( async getSessions(
scopes?: readonly string[] scopes?: readonly string[]
): Promise<vscode.AuthenticationSession[]> { ): Promise<vscode.AuthenticationSession[]> {
console.log("[AuthProvider] getSessions 被调用, 当前 sessions 数量:", this._sessions.length);
return [...this._sessions]; return [...this._sessions];
} }

View File

@ -8,7 +8,7 @@ import { URL } from 'url';
import * as vscode from 'vscode'; import * as vscode from 'vscode';
import { getStrangeLoopApiUrl, getConfig } from '../config/settings'; import { getStrangeLoopApiUrl, getConfig } from '../config/settings';
import type { UserInfoResponse, MembershipResponse, MultiMembershipVO, MembershipItemVO } from '../types/api'; import type { UserInfoResponse, MembershipResponse, MultiMembershipVO, MembershipItemVO } from '../types/api';
import { fetchBalance, getCachedBalance } from './creditsService'; import { fetchBalanceWithToken, getCachedBalance } from './creditsService';
/** /**
* HTTP 请求选项 * HTTP 请求选项
@ -230,7 +230,7 @@ export async function onTokenReceived(token: string): Promise<UserInfo | null> {
const [userInfo, membershipInfo, credits] = await Promise.all([ const [userInfo, membershipInfo, credits] = await Promise.all([
getUserInfo(token), getUserInfo(token),
getMembershipInfo(token), getMembershipInfo(token),
fetchBalance() fetchBalanceWithToken(token)
]); ]);
if (!userInfo) { if (!userInfo) {