修复账号管理好友列表标签好友统计错误或不统计的问题
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user