From 04742c596e83abfb0595e5154ec34ab1eef68570 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E6=B0=B8=E5=B9=B3?= Date: Sat, 5 Jul 2025 16:16:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BF=AE=E5=A4=8D=E7=96=AF=E7=8B=82?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nkebao/src/api/wechat-accounts.ts | 21 ++++- .../wechat-accounts/WechatAccountDetail.tsx | 87 +++++++++++++++++-- 2 files changed, 98 insertions(+), 10 deletions(-) diff --git a/nkebao/src/api/wechat-accounts.ts b/nkebao/src/api/wechat-accounts.ts index 7527870f..53a1a527 100644 --- a/nkebao/src/api/wechat-accounts.ts +++ b/nkebao/src/api/wechat-accounts.ts @@ -154,9 +154,26 @@ export const transformWechatAccount = (serverAccount: any): any => { * @param searchQuery 搜索关键词 * @returns 好友列表数据 */ -export const fetchWechatFriends = async (wechatId: string, page: number = 1, pageSize: number = 20, searchQuery: string = '') => { +export const fetchWechatFriends = async (wechatId: string, page: number = 1, pageSize: number = 20, searchQuery: string = ''): Promise> => { try { - return get(`/v1/wechats/${wechatId}/friends?page=${page}&limit=${pageSize}${searchQuery ? `&search=${searchQuery}` : ''}`); + const queryParams = new URLSearchParams(); + queryParams.append('page', page.toString()); + queryParams.append('limit', pageSize.toString()); + if (searchQuery) { + queryParams.append('search', searchQuery); + } + + return get>(`/v1/wechats/${wechatId}/friends?${queryParams.toString()}`); } catch (error) { console.error("获取好友列表失败:", error); throw error; diff --git a/nkebao/src/pages/wechat-accounts/WechatAccountDetail.tsx b/nkebao/src/pages/wechat-accounts/WechatAccountDetail.tsx index 0cdf54f6..5c187072 100644 --- a/nkebao/src/pages/wechat-accounts/WechatAccountDetail.tsx +++ b/nkebao/src/pages/wechat-accounts/WechatAccountDetail.tsx @@ -101,6 +101,8 @@ export default function WechatAccountDetail() { const [friendsTotal, setFriendsTotal] = useState(0); const [hasMoreFriends, setHasMoreFriends] = useState(true); const [isFetchingFriends, setIsFetchingFriends] = useState(false); + const [hasFriendLoadError, setHasFriendLoadError] = useState(false); + const [isFriendsEmpty, setIsFriendsEmpty] = useState(false); const friendsObserver = useRef(null); const friendsLoadingRef = useRef(null); const friendsContainerRef = useRef(null); @@ -149,12 +151,20 @@ export default function WechatAccountDetail() { // 获取好友列表 const fetchFriends = useCallback(async (page: number = 1, isNewSearch: boolean = false) => { - if (!id || isFetchingFriends) return; + console.log('fetchFriends called:', { page, isNewSearch, isFetchingFriends, id, searchQuery }); + if (!id || isFetchingFriends) { + console.log('fetchFriends early return:', { id, isFetchingFriends }); + return; + } try { setIsFetchingFriends(true); + setHasFriendLoadError(false); + console.log('Making API request for friends:', { id, page, searchQuery }); const response = await fetchWechatFriends(id, page, 20, searchQuery); + console.log('API response:', response); + if (response && response.code === 200 && response.data) { const newFriends = response.data.list.map((friend: any) => ({ id: friend.id.toString(), @@ -174,16 +184,35 @@ export default function WechatAccountDetail() { notes: friend.notes || "" })); + console.log('Processed friends:', { newFriendsCount: newFriends.length, isNewSearch }); + if (isNewSearch) { setFriends(newFriends); + // 如果是新搜索且数据为空,设置空状态 + if (newFriends.length === 0) { + console.log('Setting empty state for new search'); + setIsFriendsEmpty(true); + setHasMoreFriends(false); + } else { + console.log('Setting normal state for new search'); + setIsFriendsEmpty(false); + setHasMoreFriends(newFriends.length === 20); + } } else { setFriends(prev => [...prev, ...newFriends]); + setHasMoreFriends(newFriends.length === 20); } setFriendsTotal(response.data.total); - setHasMoreFriends(newFriends.length === 20); setFriendsPage(page); } else { + console.log('API response error:', response); + setHasFriendLoadError(true); + if (isNewSearch) { + setFriends([]); + setIsFriendsEmpty(true); + setHasMoreFriends(false); + } toast({ title: "获取好友列表失败", description: response?.message || "请稍后重试", @@ -192,15 +221,22 @@ export default function WechatAccountDetail() { } } catch (error) { console.error("获取好友列表失败:", error); + setHasFriendLoadError(true); + if (isNewSearch) { + setFriends([]); + setIsFriendsEmpty(true); + setHasMoreFriends(false); + } toast({ title: "获取好友列表失败", description: "请检查网络连接后重试", variant: "destructive" }); } finally { + console.log('Setting isFetchingFriends to false'); setIsFetchingFriends(false); } - }, [id, searchQuery, isFetchingFriends, toast]); + }, [id, searchQuery, toast]); // 初始化数据 useEffect(() => { @@ -215,17 +251,20 @@ export default function WechatAccountDetail() { // 监听标签切换 useEffect(() => { if (activeTab === "friends" && id) { + // 重置空状态,允许重新加载 + setIsFriendsEmpty(false); + setHasFriendLoadError(false); fetchFriends(1, true); } }, [activeTab, id, fetchFriends]); // 无限滚动加载好友 useEffect(() => { - if (!friendsLoadingRef.current || !hasMoreFriends || isFetchingFriends) return; + if (!friendsLoadingRef.current || !hasMoreFriends || isFetchingFriends || isFriendsEmpty) return; friendsObserver.current = new IntersectionObserver( (entries) => { - if (entries[0].isIntersecting && hasMoreFriends && !isFetchingFriends) { + if (entries[0].isIntersecting && hasMoreFriends && !isFetchingFriends && !isFriendsEmpty) { fetchFriends(friendsPage + 1, false); } }, @@ -239,7 +278,7 @@ export default function WechatAccountDetail() { friendsObserver.current.disconnect(); } }; - }, [hasMoreFriends, isFetchingFriends, friendsPage, fetchFriends]); + }, [hasMoreFriends, isFetchingFriends, friendsPage, fetchFriends, isFriendsEmpty]); // 工具函数 const getRandomTagColor = (): string => { @@ -347,6 +386,9 @@ export default function WechatAccountDetail() { }; const handleSearch = () => { + // 搜索时重置空状态 + setIsFriendsEmpty(false); + setHasFriendLoadError(false); fetchFriends(1, true); }; @@ -645,8 +687,37 @@ export default function WechatAccountDetail() {
+ ) : hasFriendLoadError ? ( +
+

加载失败,请稍后重试

+ +
+ ) : isFriendsEmpty ? ( +
+

未找到匹配的好友

+ {searchQuery && ( + + )} +
) : friends.length === 0 ? ( -
未找到匹配的好友
+
暂无好友数据
) : ( <> {friends.map((friend) => ( @@ -682,7 +753,7 @@ export default function WechatAccountDetail() { ))} - {hasMoreFriends && ( + {hasMoreFriends && !isFriendsEmpty && (