fix(lint): avoid effect self-references in async loaders

This commit is contained in:
zetaloop
2026-04-24 09:06:55 +08:00
parent d59f7c6dc8
commit 774c62ec1c
3 changed files with 96 additions and 42 deletions
+2 -2
View File
@@ -67,7 +67,7 @@ export default function NotificationsPage() {
const [loadingError, setLoadingError] = useState<string | null>(null) const [loadingError, setLoadingError] = useState<string | null>(null)
const [markingAll, setMarkingAll] = useState(false) const [markingAll, setMarkingAll] = useState(false)
const loadNotifications = useCallback(async () => { const loadNotifications = useCallback(async function loadNotifications() {
setLoading(true) setLoading(true)
setLoadingError(null) setLoadingError(null)
@@ -100,7 +100,7 @@ export default function NotificationsPage() {
} }
}, [loadNotifications]) }, [loadNotifications])
const markAllAsRead = useCallback(async () => { const markAllAsRead = useCallback(async function markAllAsRead() {
if (markAllPendingRef.current) return if (markAllPendingRef.current) return
markAllPendingRef.current = true markAllPendingRef.current = true
+58 -26
View File
@@ -59,36 +59,68 @@ export default function WalletPage() {
}) })
}, [isConsumer, transactions]) }, [isConsumer, transactions])
const loadWalletData = useCallback(async (options?: { showToast?: boolean }) => { const loadWalletData = useCallback(
setIsLoading(true) async (options?: { showToast?: boolean; silent?: boolean }) => {
setLoadError(null) if (!options?.silent) {
setIsLoading(true)
try { setLoadError(null)
const res = await requestWithAuth(async () => {
const [b, items] = await Promise.all([
getWalletBalance(),
listWalletTransactions({ offset: 0, limit: 1000 }),
])
return { balance: b, transactions: items }
})
if (!res) {
setLoadError("请先登录")
return
} }
setBalance(res.balance) try {
setTransactions(res.transactions) const res = await requestWithAuth(async () => {
if (options?.showToast) notifySuccess("交易记录已刷新") const [b, items] = await Promise.all([
} catch (error) { getWalletBalance(),
setLoadError(toApiError(error).msg) listWalletTransactions({ offset: 0, limit: 1000 }),
} finally { ])
setIsLoading(false) return { balance: b, transactions: items }
} })
}, []) if (!res) {
setLoadError("请先登录")
return
}
setBalance(res.balance)
setTransactions(res.transactions)
if (options?.showToast) notifySuccess("交易记录已刷新")
} catch (error) {
setLoadError(toApiError(error).msg)
} finally {
setIsLoading(false)
}
},
[],
)
useEffect(() => { useEffect(() => {
void loadWalletData() let cancelled = false
}, [loadWalletData])
void (async () => {
try {
const res = await requestWithAuth(async () => {
const [b, items] = await Promise.all([
getWalletBalance(),
listWalletTransactions({ offset: 0, limit: 100 }),
])
return { balance: b, transactions: items }
})
if (cancelled) return
if (!res) {
setLoadError("请先登录")
return
}
setBalance(res.balance)
setTransactions(res.transactions)
} catch (error) {
if (cancelled) return
setLoadError(toApiError(error).msg)
}
})()
return () => {
cancelled = true
}
}, [])
const handleTopUp = (rawAmount?: number) => { const handleTopUp = (rawAmount?: number) => {
const amount = rawAmount ?? Number(customAmount) const amount = rawAmount ?? Number(customAmount)
+36 -14
View File
@@ -24,22 +24,44 @@ export function PostComments({ postId }: PostCommentsProps) {
const [pendingLike, setPendingLike] = useState<Record<string, boolean>>({}) const [pendingLike, setPendingLike] = useState<Record<string, boolean>>({})
const { requireAuth } = useRequireAuth() const { requireAuth } = useRequireAuth()
const refresh = useCallback(async () => { const refresh = useCallback(
setLoading(true) async (showLoading = true) => {
setLoadError(null) if (showLoading) {
try { setLoading(true)
const items = await listCommentsByPost(postId) setLoadError(null)
setComments(items) }
} catch (err: unknown) { try {
setLoadError(toApiError(err).msg) const items = await listCommentsByPost(postId)
} finally { setComments(items)
setLoading(false) } catch (err: unknown) {
} setLoadError(toApiError(err).msg)
}, [postId]) } finally {
setLoading(false)
}
},
[postId],
)
useEffect(() => { useEffect(() => {
void refresh() let cancelled = false
}, [refresh])
void (async () => {
try {
const items = await listCommentsByPost(postId)
if (cancelled) return
setComments(items)
} catch (err: unknown) {
if (cancelled) return
setLoadError(toApiError(err).msg)
} finally {
if (!cancelled) setLoading(false)
}
})()
return () => {
cancelled = true
}
}, [postId])
return ( return (
<div className="space-y-4"> <div className="space-y-4">