import React, { useCallback, useEffect, useState } from "react"; import { Popup, Checkbox } from "antd-mobile"; import Layout from "@/components/Layout/Layout"; import PopupHeader from "@/components/PopuLayout/header"; import PopupFooter from "@/components/PopuLayout/footer"; import { getFriendList } from "./api"; import style from "./index.module.scss"; import type { FriendSelectionItem } from "./data"; interface SelectionPopupProps { visible: boolean; onVisibleChange: (visible: boolean) => void; selectedOptions: FriendSelectionItem[]; onSelect: (friends: FriendSelectionItem[]) => void; deviceIds?: string[]; enableDeviceFilter?: boolean; readonly?: boolean; onConfirm?: ( selectedIds: number[], selectedItems: FriendSelectionItem[], ) => void; } const SelectionPopup: React.FC = ({ visible, onVisibleChange, selectedOptions, onSelect, deviceIds = [], enableDeviceFilter = true, readonly = false, onConfirm, }) => { const [friends, setFriends] = useState([]); const [searchQuery, setSearchQuery] = useState(""); const [currentPage, setCurrentPage] = useState(1); const [totalPages, setTotalPages] = useState(1); const [totalFriends, setTotalFriends] = useState(0); const [loading, setLoading] = useState(false); // 获取好友列表API const fetchFriends = useCallback( async (page: number, keyword: string = "") => { setLoading(true); try { const params: any = { page, limit: 20, }; if (keyword.trim()) { params.keyword = keyword.trim(); } if (enableDeviceFilter && deviceIds.length > 0) { params.deviceIds = deviceIds.join(","); } const response = await getFriendList(params); if (response && response.list) { setFriends(response.list); setTotalFriends(response.total || 0); setTotalPages(Math.ceil((response.total || 0) / 20)); } } catch (error) { console.error("获取好友列表失败:", error); } finally { setLoading(false); } }, [deviceIds, enableDeviceFilter], ); // 处理好友选择 const handleFriendToggle = (friend: FriendSelectionItem) => { if (readonly) return; const newSelectedFriends = selectedOptions.some(f => f.id === friend.id) ? selectedOptions.filter(f => f.id !== friend.id) : selectedOptions.concat(friend); onSelect(newSelectedFriends); }; // 确认选择 const handleConfirm = () => { if (onConfirm) { onConfirm( selectedOptions.map(v => v.id), selectedOptions, ); } onVisibleChange(false); }; // 弹窗打开时初始化 useEffect(() => { if (visible) { setCurrentPage(1); setSearchQuery(""); fetchFriends(1, ""); } }, [visible]); // 只在弹窗开启时请求 // 搜索防抖(只在弹窗打开且搜索词变化时执行) useEffect(() => { if (!visible || searchQuery === "") return; // 弹窗关闭或搜索词为空时不请求 const timer = setTimeout(() => { setCurrentPage(1); fetchFriends(1, searchQuery); }, 500); return () => clearTimeout(timer); }, [searchQuery, visible]); // 页码变化时请求数据(只在弹窗打开且页码不是1时执行) useEffect(() => { if (!visible || currentPage === 1) return; // 弹窗关闭或第一页时不请求 fetchFriends(currentPage, searchQuery); }, [currentPage, visible, searchQuery]); return ( onVisibleChange(false)} position="bottom" bodyStyle={{ height: "100vh" }} > fetchFriends(currentPage, searchQuery)} /> } footer={ onVisibleChange(false)} onConfirm={handleConfirm} /> } >
{loading ? (
加载中...
) : friends.length > 0 ? (
{friends.map(friend => (
f.id === friend.id)} onChange={() => !readonly && handleFriendToggle(friend)} disabled={readonly} style={{ marginRight: 12 }} />
{friend.avatar ? ( {friend.nickname} ) : ( friend.nickname.charAt(0) )}
{friend.nickname}
微信ID: {friend.wechatId}
{friend.customer && (
归属客户: {friend.customer}
)}
))}
) : (
{deviceIds.length === 0 ? "请先选择设备" : searchQuery ? `没有找到包含"${searchQuery}"的好友` : "没有找到好友"}
)}
); }; export default SelectionPopup;