"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" import { WechatGroupMember } from "@/types/wechat" interface ApiResponse { code: number msg: string data: T } interface GroupMemberListResponse { list: any[] total: number } interface WechatGroupMemberSelectorProps { open: boolean onOpenChange: (open: boolean) => void groupId: string selectedMembers: WechatGroupMember[] onSelect: (members: WechatGroupMember[]) => void } export function WechatGroupMemberSelector({ open, onOpenChange, groupId, selectedMembers, onSelect }: WechatGroupMemberSelectorProps) { const [searchQuery, setSearchQuery] = useState("") const [members, setMembers] = useState([]) const [loading, setLoading] = useState(false) const [page, setPage] = useState(1) const [totalPages, setTotalPages] = useState(1) const [totalItems, setTotalItems] = useState(0) const [tempSelectedMembers, setTempSelectedMembers] = useState([]) const pageSize = 20 useEffect(() => { if (open && groupId) { fetchGroupMembers(1) // 过滤出当前群组的已选成员 const currentGroupSelectedMembers = selectedMembers.filter(member => member.groupId === groupId) setTempSelectedMembers(currentGroupSelectedMembers) } }, [open, groupId, selectedMembers]) const fetchGroupMembers = async (pageNum: number) => { setLoading(true) try { const queryParams = new URLSearchParams({ page: pageNum.toString(), limit: pageSize.toString(), groupId: groupId, ...(searchQuery ? { keyword: searchQuery } : {}) }) const response = await api.get>(`/v1/chatroom/getMemberList?${queryParams.toString()}`) if (response.code === 200 && response.data) { const membersList = response.data.list.map((item: any) => { // 确定角色类型 let role: "owner" | "admin" | "member" | undefined; if (item.isOwner) { role = "owner"; } else if (item.isAdmin) { role = "admin"; } else { role = "member"; } const memberId = item.id || `member-${Math.random()}`; // 创建成员对象 const member = { id: memberId, nickname: item.name || item.ownerNickname || '未知成员', wechatId: item.ownerWechatId || item.identifier || '', avatar: item.ownerAvatar || item.avatar || '/placeholder.svg', role: role, joinTime: item.createTime ? new Date(item.createTime * 1000).toLocaleString() : '--', groupId: groupId }; return member; }); // 处理已选择的成员 // 如果已选择的成员在新获取的成员列表中,更新其信息 const updatedTempSelected = tempSelectedMembers.map(selected => { const foundInNewList = membersList.find(m => m.id === selected.id); if (foundInNewList) { return { ...selected, nickname: foundInNewList.nickname, avatar: foundInNewList.avatar, wechatId: foundInNewList.wechatId, role: foundInNewList.role }; } return selected; }); setTempSelectedMembers(updatedTempSelected); setMembers(membersList) 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 = () => { fetchGroupMembers(1) } const handlePrevPage = () => { if (page > 1) { fetchGroupMembers(page - 1) } } const handleNextPage = () => { if (page < totalPages) { fetchGroupMembers(page + 1) } } const handleSelect = (member: WechatGroupMember, checked: boolean) => { if (checked) { // 添加成员 setTempSelectedMembers([...tempSelectedMembers, member]); } else { // 移除成员 setTempSelectedMembers(tempSelectedMembers.filter(m => m.id !== member.id)); } } return ( 选择群成员
setSearchQuery(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && handleSearch()} className="pl-9" />
{loading ? (
加载中...
) : members.length === 0 ? (
未找到匹配的群成员
) : ( members.map((member) => (
m.id === member.id)} onCheckedChange={(checked) => handleSelect(member, checked === true)} /> {member.nickname?.[0] || '?'}
{member.nickname} {member.role === 'owner' && (群主)} {member.role === 'admin' && (管理员)}
{member.wechatId &&
微信ID:{member.wechatId}
}
)) )}
{/* 分页控制 */} {totalPages > 1 && (
总计 {totalItems} 个成员
{page} / {totalPages}
)}
) }