feat(challenges): 添加自定义挑战功能和多语言支持

- 新增自定义挑战创建页面,支持设置挑战类型、时间范围、目标值等
- 实现挑战邀请码系统,支持通过邀请码加入自定义挑战
- 完善挑战详情页面的多语言翻译支持
- 优化用户认证状态检查逻辑,使用token作为主要判断依据
- 添加阿里字体文件支持,提升UI显示效果
- 改进确认弹窗组件,支持Liquid Glass效果和自定义内容
- 优化应用启动流程,直接读取onboarding状态而非预加载用户数据
This commit is contained in:
richarjiang
2025-11-26 16:39:01 +08:00
parent 3ad0e08d58
commit 39671ed70f
24 changed files with 3124 additions and 727 deletions

View File

@@ -82,14 +82,38 @@ async function handle401Unauthorized() {
}
}
// Token 缓存:内存中保存一份,避免每次都读取 AsyncStorage
let inMemoryToken: string | null = null;
/**
* 设置认证 token
* 同时更新内存缓存和持久化存储
*/
export async function setAuthToken(token: string | null): Promise<void> {
inMemoryToken = token;
// 同步更新 AsyncStorage
if (token) {
await AsyncStorage.setItem(STORAGE_KEYS.authToken, token);
} else {
await AsyncStorage.removeItem(STORAGE_KEYS.authToken);
}
}
export function getAuthToken(): Promise<string | null> {
return AsyncStorage.getItem(STORAGE_KEYS.authToken);
/**
* 获取认证 token
* 优先使用内存缓存,若无则从 AsyncStorage 读取并缓存
*/
export async function getAuthToken(): Promise<string | null> {
// 如果内存中有,直接返回
if (inMemoryToken !== null) {
return inMemoryToken;
}
// 否则从 AsyncStorage 读取并缓存到内存
const token = await AsyncStorage.getItem(STORAGE_KEYS.authToken);
inMemoryToken = token;
return token;
}
export type ApiRequestOptions = {