Sync source to CNB / Sync Git ref (push) Skipped
- 房间列表:头像、名称、可见性、类型、语音标记、前置权限、创建时间 - 创建/编辑房间:名称、简介、公开或私有、普通或聚落、前置条件判定与所需权限 - 房间头像:上传、更换、移除,支持 PNG/JPEG/WebP,5 MB 限制 - 删除房间带二次确认 - 新增 RoomAvatar 与 RoomAvatarEditor 组件,头像按附件 id 缓存 Blob URL - 补充聊天室相关 API:房间列表、创建、更新、删除、头像更新、附件上传、头像获取 - 管理台导航接入聊天室入口 - 中英文各补 37 个文案
31 lines
886 B
TypeScript
31 lines
886 B
TypeScript
import { skinSiteChatRoomAvatarFetch } from '@/helpers/skin-site-api'
|
|
|
|
const avatarUrls = new Map<number, string>()
|
|
const pending = new Map<number, Promise<string | null>>()
|
|
|
|
export function loadCachedRoomAvatar(
|
|
roomId: number,
|
|
attachmentId: number,
|
|
): Promise<string | null> {
|
|
const cached = avatarUrls.get(attachmentId)
|
|
if (cached) return Promise.resolve(cached)
|
|
const running = pending.get(attachmentId)
|
|
if (running) return running
|
|
|
|
const request = skinSiteChatRoomAvatarFetch(roomId).then((blob) => {
|
|
pending.delete(attachmentId)
|
|
if (!blob) return null
|
|
const url = URL.createObjectURL(blob)
|
|
avatarUrls.set(attachmentId, url)
|
|
return url
|
|
})
|
|
pending.set(attachmentId, request)
|
|
return request
|
|
}
|
|
|
|
export function forgetRoomAvatar(attachmentId: number) {
|
|
const url = avatarUrls.get(attachmentId)
|
|
if (url) URL.revokeObjectURL(url)
|
|
avatarUrls.delete(attachmentId)
|
|
}
|