"use client" import { useState, useEffect, useCallback } from "react" import { ChevronLeft, Filter, Search, RefreshCw, Plus, Edit, Trash2, Eye, MoreVertical, Users } from "lucide-react" import { Card } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Badge } from "@/components/ui/badge" import { useRouter } from "next/navigation" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" import Image from "next/image" import { api } from "@/lib/api" import { showToast } from "@/lib/toast" import { WechatGroupMemberSelector } from "@/components/WechatGroupMemberSelector" interface ApiResponse { code: number msg: string data: T } interface LibraryListResponse { list: ContentLibrary[] total: number } interface WechatGroupMember { id: string nickname: string wechatId: string avatar: string gender?: "male" | "female" role?: "owner" | "admin" | "member" joinTime?: string } interface ContentLibrary { id: string name: string source: "friends" | "groups" targetAudience: { id: string nickname: string avatar: string }[] creator: string creatorName?: string itemCount: number lastUpdated: string enabled: boolean // 新增字段 sourceFriends: string[] sourceGroups: string[] friendsData?: any[] groupsData?: any[] keywordInclude: string[] keywordExclude: string[] isEnabled: number aiPrompt: string timeEnabled: number timeStart: string timeEnd: string status: number createTime: string updateTime: string sourceType: number selectedGroupMembers?: WechatGroupMember[] } export default function ContentLibraryPage() { const router = useRouter() const [libraries, setLibraries] = useState([]) const [searchQuery, setSearchQuery] = useState("") const [activeTab, setActiveTab] = useState("all") const [loading, setLoading] = useState(false) const [isGroupMemberSelectorOpen, setIsGroupMemberSelectorOpen] = useState(false) const [currentGroupId, setCurrentGroupId] = useState("") const [selectedGroupMembers, setSelectedGroupMembers] = useState([]) // 获取内容库列表 const fetchLibraries = useCallback(async () => { setLoading(true) try { const queryParams = new URLSearchParams({ page: '1', limit: '100', ...(searchQuery ? { keyword: searchQuery } : {}), ...(activeTab !== 'all' ? { sourceType: activeTab === 'friends' ? '1' : '2' } : {}) }) const response = await api.get>(`/v1/content/library/list?${queryParams.toString()}`) if (response.code === 200 && response.data) { // 转换数据格式以匹配原有UI const transformedLibraries = response.data.list.map((item: any) => { // 提取好友数据,确保有头像 const friendsData = Array.isArray(item.selectedFriends) ? item.selectedFriends : []; const groupsData = Array.isArray(item.selectedGroups) ? item.selectedGroups : []; const transformedItem: ContentLibrary = { id: item.id, name: item.name, source: item.sourceType === 1 ? "friends" : "groups", targetAudience: [ ...friendsData.map((friend: any) => ({ id: friend.id, nickname: friend.nickname || `好友${friend.id}`, avatar: friend.avatar || "/placeholder.svg" })), ...groupsData.map((group: any) => ({ id: group.id, nickname: group.name || `群组${group.id}`, avatar: group.avatar || "/placeholder.svg" })) ], creator: item.creatorName || "系统", creatorName: item.creatorName, itemCount: item.itemCount, lastUpdated: item.updateTime, enabled: item.isEnabled === 1, // 新增字段 sourceFriends: item.sourceFriends || [], sourceGroups: item.sourceGroups || [], friendsData: friendsData, groupsData: groupsData, keywordInclude: item.keywordInclude || [], keywordExclude: item.keywordExclude || [], isEnabled: item.isEnabled, aiPrompt: item.aiPrompt || '', timeEnabled: item.timeEnabled, timeStart: item.timeStart || '', timeEnd: item.timeEnd || '', status: item.status, createTime: item.createTime, updateTime: item.updateTime, sourceType: item.sourceType, selectedGroupMembers: item.selectedGroupMembers || [] } return transformedItem }) setLibraries(transformedLibraries) } else { showToast(response.msg || "获取内容库列表失败", "error") } } catch (error: any) { console.error("获取内容库列表失败:", error) showToast(error?.message || "请检查网络连接", "error") } finally { setLoading(false) } }, [searchQuery, activeTab]) // 首次加载和搜索条件变化时获取列表 useEffect(() => { fetchLibraries() }, [searchQuery, activeTab, fetchLibraries]) const handleCreateNew = () => { router.push('/content/new') } const handleEdit = (id: string) => { router.push(`/content/${id}/edit`) } const handleDelete = async (id: string) => { try { const response = await api.delete(`/v1/content/library/delete?id=${id}`) if (response.code === 200) { showToast("删除成功", "success") fetchLibraries() } else { showToast(response.msg || "删除失败", "error") } } catch (error: any) { console.error("删除内容库失败:", error) showToast(error?.message || "请检查网络连接", "error") } } const handleViewMaterials = (id: string) => { router.push(`/content/${id}/materials`) } const handleSearch = () => { fetchLibraries() } const handleRefresh = () => { fetchLibraries() } const handleSelectGroupMembers = (groupId: string) => { setCurrentGroupId(groupId) setSelectedGroupMembers([]) setIsGroupMemberSelectorOpen(true) } const handleSaveSelectedMembers = (members: WechatGroupMember[]) => { setSelectedGroupMembers(members) showToast(`已选择 ${members.length} 名群成员`, "success") } const filteredLibraries = libraries.filter( (library) => library.name.toLowerCase().includes(searchQuery.toLowerCase()) || library.targetAudience.some((target) => target.nickname.toLowerCase().includes(searchQuery.toLowerCase())) ) return (

内容库

setSearchQuery(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && handleSearch()} className="pl-9" />
全部 微信好友 聊天群
{loading ? (
) : filteredLibraries.length === 0 ? (

暂无数据

) : ( filteredLibraries.map((library) => (

{library.name}

已启用
来源: {library.sourceType === 1 && library.sourceFriends?.length > 0 ? (
{(library.friendsData || []).slice(0, 3).map((friend) => ( {friend.nickname ))} {library.sourceFriends.length > 3 && ( +{library.sourceFriends.length - 3} )}
) : library.sourceType === 2 && library.sourceGroups?.length > 0 ? (
{(library.groupsData || []).slice(0, 3).map((group) => ( {group.name ))} {library.sourceGroups.length > 3 && ( +{library.sourceGroups.length - 3} )}
) : (
)}
创建人:{library.creator}
内容数量:{library.itemCount}
更新时间:{new Date(library.updateTime).toLocaleString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' })}
handleEdit(library.id)}> 编辑 handleDelete(library.id)}> 删除 handleViewMaterials(library.id)}> 查看素材
)) )}
) }