Skip to content

Commit ac37eff

Browse files
committed
完善用户信息查看
1 parent 20d40ae commit ac37eff

File tree

2 files changed

+37
-11
lines changed

2 files changed

+37
-11
lines changed

src/contents/topic/avatar.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ import type { CommentData, Member } from '../../types'
55
import { formatTimestamp } from '../../utils'
66
import { openTagsSetter } from './content'
77

8-
export const memberDataCache = new Map<Member['username'], Member>()
8+
const banned = Symbol()
9+
10+
export const memberDataCache = new Map<Member['username'], Member | typeof banned>()
911

1012
interface ProcessAvatar {
1113
/** 触发弹出框的元素。 */
@@ -84,16 +86,21 @@ export function processAvatar(params: ProcessAvatar) {
8486

8587
memberDataCache.set(memberName, memberData)
8688
} catch (err) {
87-
if (err && typeof err === 'object' && 'name' in err && err.name !== 'AbortError') {
88-
$content.html(`<span>获取用户信息失败</span>`)
89+
if (err instanceof Error) {
90+
$content.html(`<span>${err.message}</span>`)
91+
92+
if (err.cause === 404) {
93+
memberDataCache.set(memberName, banned)
94+
}
8995
}
96+
9097
return null
9198
}
9299
}
93100

94101
const data = memberDataCache.get(memberName)
95102

96-
if (data) {
103+
if (typeof data === 'object') {
97104
$content.find('.v2p-no').removeClass('v2p-loading').text(`V2EX 第 ${data.id} 号会员`)
98105

99106
$content
@@ -104,6 +111,8 @@ export function processAvatar(params: ProcessAvatar) {
104111
if (data.bio && data.bio.trim().length > 0) {
105112
$content.find('.v2p-bio').css('disply', 'block').text(data.bio)
106113
}
114+
} else if (typeof data === 'symbol' && data === banned) {
115+
$content.html('<span>查无此用户,疑似已被封禁</span>')
107116
}
108117
})()
109118
}

src/services.ts

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,32 @@ const V2EX_API = `${V2EX_ORIGIN}/api/v2`
3030
async function legacyRequest<Data>(url: string, options?: RequestInit): Promise<Data> {
3131
const res = await fetch(url, options)
3232

33-
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
34-
return res.json()
33+
if (res.ok) {
34+
return res.json() as Data
35+
}
36+
37+
throw new Error('调用 V2EX API v1 出错', { cause: res.status })
3538
}
3639

37-
export function fetchUserInfo(memberName: Member['username'], options?: RequestInit) {
38-
return legacyRequest<Member>(
39-
`${V2EX_LEGACY_API}/members/show.json?username=${memberName}`,
40-
options
41-
)
40+
export async function fetchUserInfo(memberName: Member['username'], options?: RequestInit) {
41+
try {
42+
const member = await legacyRequest<Member>(
43+
`${V2EX_LEGACY_API}/members/show.json?username=${memberName}`,
44+
options
45+
)
46+
47+
return member
48+
} catch (err) {
49+
if (err instanceof Error) {
50+
if (err.name === 'AbortError') {
51+
throw new Error('请求被取消')
52+
} else if (err.cause === 404) {
53+
throw new Error('查无此用户,疑似已被封禁', { cause: err.cause })
54+
}
55+
}
56+
57+
throw new Error('获取用户信息失败')
58+
}
4259
}
4360

4461
export function fetchLatestTopics(options?: RequestInit) {

0 commit comments

Comments
 (0)