"use client" import { useState, useEffect } from "react" import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog" import { Input } from "@/components/ui/input" import { Button } from "@/components/ui/button" import { Search, ChevronLeft, ChevronRight } from "lucide-react" import { Checkbox } from "@/components/ui/checkbox" import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" import { api } from "@/lib/api" import { showToast } from "@/lib/toast" interface WechatFriend { id: string nickname: string wechatId: string avatar: string gender?: "male" | "female" customer?: string alias?: string ownerNickname?: string ownerAlias?: string createTime?: string } interface ApiResponse { code: number msg: string data: T } interface FriendListResponse { list: any[] total: number } interface WechatFriendSelectorProps { open: boolean onOpenChange: (open: boolean) => void selectedFriends: WechatFriend[] onSelect: (friends: WechatFriend[]) => void } export function WechatFriendSelector({ open, onOpenChange, selectedFriends, onSelect }: WechatFriendSelectorProps) { const [searchQuery, setSearchQuery] = useState("") const [friends, setFriends] = useState([]) const [loading, setLoading] = useState(false) const [page, setPage] = useState(1) const [totalPages, setTotalPages] = useState(1) const [totalItems, setTotalItems] = useState(0) const [tempSelectedFriends, setTempSelectedFriends] = useState([]) const pageSize = 20 useEffect(() => { if (open) { fetchFriends(1) setTempSelectedFriends([...selectedFriends]) } }, [open, selectedFriends]) const fetchFriends = async (pageNum: number) => { setLoading(true) try { const queryParams = new URLSearchParams({ page: pageNum.toString(), limit: pageSize.toString(), ...(searchQuery ? { keyword: searchQuery } : {}) }) const response = await api.get>(`/v1/friend?${queryParams.toString()}`) if (response.code === 200 && response.data) { const friendsList = response.data.list.map(item => ({ id: item.id || item.wechatId || `${item.nickname}-${Math.random()}`, nickname: item.nickname || '未知好友', wechatId: item.wechatId || '', avatar: item.avatar || '/placeholder.svg', alias: item.alias || '', ownerNickname: item.ownerNickname || '', ownerAlias: item.ownerAlias || item.ownerWechatId || '', createTime: item.createTime || '--' })) setFriends(friendsList) setTotalItems(response.data.total) setTotalPages(Math.ceil(response.data.total / pageSize)) setPage(pageNum) } else { showToast(response.msg || "获取好友列表失败", "error") } } catch (error: any) { console.error("获取好友列表失败:", error) showToast(error?.message || "请检查网络连接", "error") } finally { setLoading(false) } } const handleSearch = () => { fetchFriends(1) } const handlePrevPage = () => { if (page > 1) { fetchFriends(page - 1) } } const handleNextPage = () => { if (page < totalPages) { fetchFriends(page + 1) } } return ( 选择微信好友
setSearchQuery(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && handleSearch()} className="pl-9" />
{loading ? (
加载中...
) : friends.length === 0 ? (
未找到匹配的好友
) : ( friends.map((friend) => (
f.id === friend.id)} onCheckedChange={(checked) => { if (checked) { setTempSelectedFriends([...tempSelectedFriends, friend]) } else { setTempSelectedFriends(tempSelectedFriends.filter((f) => f.id !== friend.id)) } }} /> {friend.nickname?.[0] || '?'}
{friend.nickname}
{friend.wechatId &&
微信ID:{friend.alias || friend.wechatId}
} {friend.ownerNickname &&
归属客户:{friend.ownerNickname} ({friend.ownerAlias || '--'})
}
)) )}
{/* 分页控制 */} {totalPages > 1 && (
总计 {totalItems} 个好友
{page} / {totalPages}
)}
) }