import { useAccountStore, type AccountProfile } from '@/stores/accountStore' import { useRoomStore } from '@/stores/roomStore' import { SERVER_URL } from './config' import { storage } from './storage' function storeProfile(profile: AccountProfile): AccountProfile { useAccountStore.getState().setProfile(profile) storage.setUserId(profile.id) if (profile.nickname) storage.setNickname(profile.nickname) useRoomStore.getState().updateUserProfile(profile.id, profile) return profile } async function requestProfile(path: string, init?: RequestInit): Promise { const response = await fetch(`${SERVER_URL}${path}`, { ...init, credentials: 'include', headers: { 'Content-Type': 'application/json', ...init?.headers }, }) if (!response.ok) { const body = (await response.json().catch(() => null)) as { error?: string } | null throw new Error(body?.error ?? `Request failed: ${response.status}`) } if (response.status === 204) { useAccountStore.getState().setProfile(null) storage.clearUserId() return null } return storeProfile((await response.json()) as AccountProfile) } export function fetchCurrentProfile(): Promise { return requestProfile('/api/auth/me') } export async function updateCurrentNickname(nickname: string): Promise { const profile = await requestProfile('/api/auth/me', { method: 'PATCH', body: JSON.stringify({ nickname: nickname.trim() }), }) if (!profile) throw new Error('账号创建失败') return profile } export async function uploadCurrentAvatar(image: string): Promise { const profile = await requestProfile('/api/auth/me/avatar', { method: 'POST', body: JSON.stringify({ image }), }) if (!profile) throw new Error('头像保存失败') return profile } export function resolveAvatarUrl(avatarUrl?: string | null): string | undefined { if (!avatarUrl) return undefined return avatarUrl.startsWith('/uploads/') ? `${SERVER_URL}${avatarUrl}` : avatarUrl }