feat(auth): 集成认证授权功能并优化API客户端
- 实现了完整的登录注册认证流程,包括密码验证和用户资料获取 - 集成了JWT令牌管理和自动刷新机制,支持设备ID生成和管理 - 添加了WebSocket连接配置和API基础URL环境变量设置 - 实现了API客户端的请求拦截器,包括令牌验证和错误处理逻辑 - 集成了MD5加密和认证令牌缓存机制,提升安全性 - 添加了多语言国际化支持,包括英语、中文、马来语和印尼语 - 实现了认证状态管理和本地存储持久化功能 - 添加了表单验证schema和错误处理机制,增强用户体验
This commit is contained in:
@@ -1,9 +1,10 @@
|
||||
import { CHIP_OPTIONS } from '@/constants'
|
||||
import { DEFAULT_CHIP_AMOUNTS } from '@/constants'
|
||||
import {
|
||||
DEFAULT_ACTIVE_CHIP_ID,
|
||||
DEFAULT_ANNOUNCEMENT_TTL_MS,
|
||||
DEFAULT_GAME_CHIP_COLORS,
|
||||
GAME_GRID_COLUMNS,
|
||||
GAME_MAX_SELECTION_CELLS,
|
||||
GAME_TOTAL_CELLS,
|
||||
} from './constants'
|
||||
import { deriveTrendEntries, getRoundCountdownMs } from './selectors'
|
||||
@@ -41,12 +42,12 @@ export function createGameCells() {
|
||||
}
|
||||
|
||||
export function createDefaultChips() {
|
||||
return CHIP_OPTIONS.map((chip, index) => ({
|
||||
amount: chip.value,
|
||||
return DEFAULT_CHIP_AMOUNTS.map((chip, index) => ({
|
||||
amount: chip.amount,
|
||||
color: DEFAULT_GAME_CHIP_COLORS[index],
|
||||
id: chip.id,
|
||||
isDefault: chip.id === DEFAULT_ACTIVE_CHIP_ID,
|
||||
label: chip.value >= 100 ? `${chip.value / 100}x` : String(chip.value),
|
||||
label: chip.amount >= 100 ? `${chip.amount / 100}x` : String(chip.amount),
|
||||
})) satisfies Chip[]
|
||||
}
|
||||
|
||||
@@ -76,36 +77,8 @@ export function createMockRoundSnapshot(baseIso = MOCK_GAME_BASE_TIME) {
|
||||
} satisfies RoundSnapshot
|
||||
}
|
||||
|
||||
export function createMockBetSelections(chips = createDefaultChips()) {
|
||||
const defaultChip =
|
||||
chips.find((chip) => chip.id === DEFAULT_ACTIVE_CHIP_ID) ?? chips[0]
|
||||
|
||||
return [
|
||||
{
|
||||
amount: defaultChip.amount,
|
||||
cellId: 8,
|
||||
chipId: defaultChip.id,
|
||||
id: 'bet-local-1',
|
||||
placedAt: offsetIso(MOCK_GAME_BASE_TIME, 4_000),
|
||||
source: 'local',
|
||||
},
|
||||
{
|
||||
amount: chips[1]?.amount ?? defaultChip.amount,
|
||||
cellId: 12,
|
||||
chipId: chips[1]?.id ?? defaultChip.id,
|
||||
id: 'bet-server-2',
|
||||
placedAt: offsetIso(MOCK_GAME_BASE_TIME, 7_000),
|
||||
source: 'server',
|
||||
},
|
||||
{
|
||||
amount: chips[3]?.amount ?? defaultChip.amount,
|
||||
cellId: 17,
|
||||
chipId: chips[3]?.id ?? defaultChip.id,
|
||||
id: 'bet-local-3',
|
||||
placedAt: offsetIso(MOCK_GAME_BASE_TIME, 10_000),
|
||||
source: 'local',
|
||||
},
|
||||
] satisfies BetSelection[]
|
||||
export function createMockBetSelections() {
|
||||
return [] satisfies BetSelection[]
|
||||
}
|
||||
|
||||
export function createMockAnnouncementState(baseIso = MOCK_GAME_BASE_TIME) {
|
||||
@@ -177,8 +150,9 @@ export function createMockGameBootstrapSnapshot(baseIso = MOCK_GAME_BASE_TIME) {
|
||||
connection: createMockConnectionState(baseIso),
|
||||
dashboard: createMockDashboardState(baseIso, round, history),
|
||||
history,
|
||||
maxSelectionCount: GAME_MAX_SELECTION_CELLS,
|
||||
round,
|
||||
selections: createMockBetSelections(chips),
|
||||
selections: createMockBetSelections(),
|
||||
trends: deriveTrendEntries(history),
|
||||
} satisfies GameBootstrapSnapshot
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user