"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 { WechatGroup } from "@/types/wechat" interface ApiResponse { code: number msg: string data: T } interface GroupListResponse { list: any[] total: number } interface WechatGroupSelectorProps { open: boolean onOpenChange: (open: boolean) => void selectedGroups: WechatGroup[] onSelect: (groups: WechatGroup[]) => void } export function WechatGroupSelector({ open, onOpenChange, selectedGroups, onSelect }: WechatGroupSelectorProps) { const [searchQuery, setSearchQuery] = useState("") const [groups, setGroups] = useState([]) const [loading, setLoading] = useState(false) const [page, setPage] = useState(1) const [totalPages, setTotalPages] = useState(1) const [totalItems, setTotalItems] = useState(0) const [tempSelectedGroups, setTempSelectedGroups] = useState([]) const pageSize = 20 useEffect(() => { if (open) { fetchGroups(1) setTempSelectedGroups([...selectedGroups]) } }, [open, selectedGroups]) const fetchGroups = 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/chatroom?${queryParams.toString()}`) if (response.code === 200 && response.data) { const groupsList = response.data.list.map(item => ({ id: item.id || `group-${Math.random()}`, name: item.name || item.chatroomName || '未知群聊', memberCount: item.memberCount || 0, avatar: item.avatar || '/placeholder.svg', customer: item.ownerNickname || '--' })) setGroups(groupsList) 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 = () => { fetchGroups(1) } const handlePrevPage = () => { if (page > 1) { fetchGroups(page - 1) } } const handleNextPage = () => { if (page < totalPages) { fetchGroups(page + 1) } } return ( 选择聊天群
setSearchQuery(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && handleSearch()} className="pl-9" />
{loading ? (
加载中...
) : groups.length === 0 ? (
未找到匹配的群聊
) : ( groups.map((group) => (
g.id === group.id)} onCheckedChange={(checked) => { if (checked) { setTempSelectedGroups([...tempSelectedGroups, group]) } else { setTempSelectedGroups(tempSelectedGroups.filter((g) => g.id !== group.id)) } }} /> {group.name?.[0] || '群'}
{group.name}
归属客户:{group.customer}
)) )}
{/* 分页控制 */} {totalPages > 1 && (
总计 {totalItems} 个群聊
{page} / {totalPages}
)}
) }