feat(api): migrate HTTP layer to ofetch with token interceptor
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
/**
|
||||
* Auth 存储 - localStorage 包装
|
||||
*
|
||||
* 存储登录 token、刷新 token、游客 token、设备 ID。
|
||||
* 原始 Dart: lib/data/services/storage/auth_storage.dart
|
||||
*
|
||||
* 注:localStorage 仅在浏览器环境可用;
|
||||
* 在 Server Components 中调用会抛错,应仅在 Client Components 或拦截器中使用。
|
||||
*/
|
||||
|
||||
const STORAGE_KEYS = {
|
||||
loginToken: "cozsweet.loginToken",
|
||||
refreshToken: "cozsweet.refreshToken",
|
||||
guestToken: "cozsweet.guestToken",
|
||||
deviceId: "cozsweet.deviceId",
|
||||
} as const;
|
||||
|
||||
function getStorage(): Storage | null {
|
||||
if (typeof window === "undefined") return null;
|
||||
try {
|
||||
return window.localStorage;
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
export class AuthStorage {
|
||||
// ============ 登录 Token ============
|
||||
|
||||
getLoginToken(): string | null {
|
||||
return getStorage()?.getItem(STORAGE_KEYS.loginToken) ?? null;
|
||||
}
|
||||
|
||||
setLoginToken(token: string): void {
|
||||
getStorage()?.setItem(STORAGE_KEYS.loginToken, token);
|
||||
}
|
||||
|
||||
removeLoginToken(): void {
|
||||
getStorage()?.removeItem(STORAGE_KEYS.loginToken);
|
||||
}
|
||||
|
||||
// ============ 刷新 Token ============
|
||||
|
||||
getRefreshToken(): string | null {
|
||||
return getStorage()?.getItem(STORAGE_KEYS.refreshToken) ?? null;
|
||||
}
|
||||
|
||||
setRefreshToken(token: string): void {
|
||||
getStorage()?.setItem(STORAGE_KEYS.refreshToken, token);
|
||||
}
|
||||
|
||||
removeRefreshToken(): void {
|
||||
getStorage()?.removeItem(STORAGE_KEYS.refreshToken);
|
||||
}
|
||||
|
||||
// ============ 游客 Token ============
|
||||
|
||||
getGuestToken(): string | null {
|
||||
return getStorage()?.getItem(STORAGE_KEYS.guestToken) ?? null;
|
||||
}
|
||||
|
||||
setGuestToken(token: string): void {
|
||||
getStorage()?.setItem(STORAGE_KEYS.guestToken, token);
|
||||
}
|
||||
|
||||
removeGuestToken(): void {
|
||||
getStorage()?.removeItem(STORAGE_KEYS.guestToken);
|
||||
}
|
||||
|
||||
// ============ 设备 ID ============
|
||||
|
||||
getDeviceId(): string | null {
|
||||
return getStorage()?.getItem(STORAGE_KEYS.deviceId) ?? null;
|
||||
}
|
||||
|
||||
setDeviceId(deviceId: string): void {
|
||||
getStorage()?.setItem(STORAGE_KEYS.deviceId, deviceId);
|
||||
}
|
||||
|
||||
removeDeviceId(): void {
|
||||
getStorage()?.removeItem(STORAGE_KEYS.deviceId);
|
||||
}
|
||||
|
||||
// ============ 复合操作 ============
|
||||
|
||||
/**
|
||||
* 是否有登录 token
|
||||
*/
|
||||
hasLoginToken(): boolean {
|
||||
const token = this.getLoginToken();
|
||||
return token !== null && token.length > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取认证 token(优先登录 token,其次游客 token)
|
||||
*/
|
||||
getAuthToken(): string | null {
|
||||
const loginToken = this.getLoginToken();
|
||||
if (loginToken !== null && loginToken.length > 0) return loginToken;
|
||||
const guestToken = this.getGuestToken();
|
||||
if (guestToken !== null && guestToken.length > 0) return guestToken;
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除所有 auth 数据(登录/刷新/游客 token)
|
||||
*/
|
||||
clearAuthData(): void {
|
||||
this.removeLoginToken();
|
||||
this.removeRefreshToken();
|
||||
this.removeGuestToken();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 全局单例
|
||||
*/
|
||||
export const authStorage = new AuthStorage();
|
||||
Reference in New Issue
Block a user