修复账号管理好友列表标签好友统计错误或不统计的问题

This commit is contained in:
柳清爽
2025-04-03 10:43:42 +08:00
parent 170192c7a3
commit 505a7c53d4

View File

@@ -129,6 +129,7 @@ export default function WechatAccountDetailPage({ params }: { params: { id: stri
const [friendsTotal, setFriendsTotal] = useState(0) const [friendsTotal, setFriendsTotal] = useState(0)
const [hasMoreFriends, setHasMoreFriends] = useState(true) const [hasMoreFriends, setHasMoreFriends] = useState(true)
const [isFetchingFriends, setIsFetchingFriends] = useState(false) const [isFetchingFriends, setIsFetchingFriends] = useState(false)
const [hasFriendLoadError, setHasFriendLoadError] = useState(false)
const friendsObserver = useRef<IntersectionObserver | null>(null) const friendsObserver = useRef<IntersectionObserver | null>(null)
const friendsLoadingRef = useRef<HTMLDivElement | null>(null) const friendsLoadingRef = useRef<HTMLDivElement | null>(null)
const friendsContainerRef = useRef<HTMLDivElement | null>(null) const friendsContainerRef = useRef<HTMLDivElement | null>(null)
@@ -293,11 +294,17 @@ export default function WechatAccountDetailPage({ params }: { params: { id: stri
try { try {
setIsFetchingFriends(true); setIsFetchingFriends(true);
setHasFriendLoadError(false);
// 调用API获取好友列表 // 调用API获取好友列表
const response = await fetchWechatFriends(account.wechatId, page, 20, searchQuery); const response = await fetchWechatFriends(account.wechatId, page, 20, searchQuery);
if (response && response.code === 200) { if (response && response.code === 200) {
// 更新总数计数,确保在第一次加载时设置
if (isNewSearch || friendsTotal === 0) {
setFriendsTotal(response.data.total || 0);
}
const newFriends = response.data.list.map((friend: any) => ({ const newFriends = response.data.list.map((friend: any) => ({
id: friend.wechatId, id: friend.wechatId,
avatar: friend.avatar, avatar: friend.avatar,
@@ -323,10 +330,13 @@ export default function WechatAccountDetailPage({ params }: { params: { id: stri
setFriends(prev => [...prev, ...newFriends]); setFriends(prev => [...prev, ...newFriends]);
} }
setFriendsTotal(response.data.total);
setFriendsPage(page); setFriendsPage(page);
// 判断是否还有更多数据
setHasMoreFriends(page * 20 < response.data.total); setHasMoreFriends(page * 20 < response.data.total);
console.log("好友列表加载成功,总数:", response.data.total);
} else { } else {
setHasFriendLoadError(true);
toast({ toast({
title: "获取好友列表失败", title: "获取好友列表失败",
description: response?.msg || "请稍后再试", description: response?.msg || "请稍后再试",
@@ -334,6 +344,7 @@ export default function WechatAccountDetailPage({ params }: { params: { id: stri
}); });
} }
} catch (error) { } catch (error) {
setHasFriendLoadError(true);
console.error("获取好友列表失败:", error); console.error("获取好友列表失败:", error);
toast({ toast({
title: "获取好友列表失败", title: "获取好友列表失败",
@@ -343,7 +354,7 @@ export default function WechatAccountDetailPage({ params }: { params: { id: stri
} finally { } finally {
setIsFetchingFriends(false); setIsFetchingFriends(false);
} }
}, [account, searchQuery]); }, [account, searchQuery, friendsTotal]);
// 处理搜索 // 处理搜索
const handleSearch = useCallback(() => { const handleSearch = useCallback(() => {
@@ -355,10 +366,10 @@ export default function WechatAccountDetailPage({ params }: { params: { id: stri
// 处理标签切换 // 处理标签切换
useEffect(() => { useEffect(() => {
if (activeTab === "friends" && account && friends.length === 0) { if (account && friends.length === 0) {
fetchFriends(1, true); fetchFriends(1, true);
} }
}, [activeTab, account, friends.length, fetchFriends]); }, [account, friends.length, fetchFriends]);
// 设置IntersectionObserver用于懒加载 // 设置IntersectionObserver用于懒加载
useEffect(() => { useEffect(() => {
@@ -401,6 +412,11 @@ export default function WechatAccountDetailPage({ params }: { params: { id: stri
// 转换数据格式 // 转换数据格式
const transformedAccount = transformWechatAccountDetail(response) const transformedAccount = transformWechatAccountDetail(response)
setAccount(transformedAccount) setAccount(transformedAccount)
// 如果有好友总数更新friendsTotal状态
if (transformedAccount && transformedAccount.friendCount > 0) {
setFriendsTotal(transformedAccount.friendCount);
}
} else { } else {
toast({ toast({
title: "获取微信账号详情失败", title: "获取微信账号详情失败",
@@ -408,7 +424,10 @@ export default function WechatAccountDetailPage({ params }: { params: { id: stri
variant: "destructive" variant: "destructive"
}) })
// 获取失败时使用模拟数据 // 获取失败时使用模拟数据
setAccount(generateMockAccountData()) const mockData = generateMockAccountData();
setAccount(mockData);
// 更新好友总数
setFriendsTotal(mockData.friendCount);
} }
} catch (error) { } catch (error) {
console.error("获取微信账号详情失败:", error) console.error("获取微信账号详情失败:", error)
@@ -418,7 +437,10 @@ export default function WechatAccountDetailPage({ params }: { params: { id: stri
variant: "destructive" variant: "destructive"
}) })
// 请求出错时使用模拟数据 // 请求出错时使用模拟数据
setAccount(generateMockAccountData()) const mockData = generateMockAccountData();
setAccount(mockData);
// 更新好友总数
setFriendsTotal(mockData.friendCount);
} finally { } finally {
setIsLoading(false) setIsLoading(false)
} }
@@ -542,7 +564,9 @@ export default function WechatAccountDetailPage({ params }: { params: { id: stri
<Tabs value={activeTab} onValueChange={setActiveTab} className="w-full"> <Tabs value={activeTab} onValueChange={setActiveTab} className="w-full">
<TabsList className="grid w-full grid-cols-2"> <TabsList className="grid w-full grid-cols-2">
<TabsTrigger value="overview"></TabsTrigger> <TabsTrigger value="overview"></TabsTrigger>
<TabsTrigger value="friends"> ({account.friendCount})</TabsTrigger> <TabsTrigger value="friends">
({friendsTotal > 0 ? friendsTotal : account.friendCount})
</TabsTrigger>
</TabsList> </TabsList>
<TabsContent value="overview" className="space-y-4 mt-4"> <TabsContent value="overview" className="space-y-4 mt-4">
@@ -699,7 +723,18 @@ export default function WechatAccountDetailPage({ params }: { params: { id: stri
overflowY: 'auto' overflowY: 'auto'
}} }}
> >
{friends.length === 0 && !isFetchingFriends ? ( {isFetchingFriends && friends.length === 0 ? (
<div className="flex justify-center items-center py-8">
<Loader2 className="h-6 w-6 animate-spin text-blue-500" />
</div>
) : friends.length === 0 && hasFriendLoadError ? (
<div className="text-center py-8 text-gray-500">
<p></p>
<Button variant="outline" size="sm" className="mt-2" onClick={() => fetchFriends(1, true)}>
</Button>
</div>
) : friends.length === 0 ? (
<div className="text-center py-8 text-gray-500"></div> <div className="text-center py-8 text-gray-500"></div>
) : ( ) : (
<> <>
@@ -750,11 +785,15 @@ export default function WechatAccountDetailPage({ params }: { params: { id: stri
{/* 显示加载状态和总数 */} {/* 显示加载状态和总数 */}
<div className="text-sm text-gray-500 text-center"> <div className="text-sm text-gray-500 text-center">
{friendsTotal > 0 && ( {friendsTotal > 0 ? (
<span> <span>
{Math.min(friends.length, friendsTotal)} / {friendsTotal} {Math.min(friends.length, friendsTotal)} / {friendsTotal}
</span> </span>
)} ) : !isFetchingFriends && !hasFriendLoadError && account ? (
<span>
{account.friendCount}
</span>
) : null}
</div> </div>
</div> </div>
</Card> </Card>