"use client" import { useState, useEffect, use } from "react" import { ChevronLeft, X, Users } from "lucide-react" import { Button } from "@/components/ui/button" import { Card } from "@/components/ui/card" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Switch } from "@/components/ui/switch" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Textarea } from "@/components/ui/textarea" import { useRouter } from "next/navigation" import { DateRangePicker } from "@/components/ui/date-range-picker" import { WechatFriendSelector } from "@/components/WechatFriendSelector" import { WechatGroupSelector } from "@/components/WechatGroupSelector" import { WechatGroupMemberSelector } from "@/components/WechatGroupMemberSelector" import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "@/components/ui/accordion" import { api } from "@/lib/api" import { showToast } from "@/lib/toast" import { format, parse } from "date-fns" import { Avatar, AvatarImage, AvatarFallback } from "@/components/ui/avatar" import { WechatFriend, WechatGroup, WechatGroupMember } from "@/types/wechat" interface ContentLibraryDetail { id: string name: string sourceType: number status: number sourceFriends: any[] sourceGroups: any[] selectedFriends?: WechatFriend[] selectedGroups?: WechatGroup[] selectedGroupMembers?: WechatGroupMember[] groupMembers?: Record keywordInclude: string[] keywordExclude: string[] isEnabled: number aiPrompt: string timeEnabled: number timeStart: string timeEnd: string createTime: string updateTime: string } interface ApiResponse { code: number msg: string data: T } export default function EditContentLibraryPage({ params }: { params: Promise<{ id: string }> }) { const resolvedParams = use(params) const router = useRouter() const [formData, setFormData] = useState({ name: "", sourceType: "friends" as "friends" | "groups", keywordsInclude: "", keywordsExclude: "", startDate: "", endDate: "", selectedFriends: [] as WechatFriend[], selectedGroups: [] as WechatGroup[], selectedGroupMembers: [] as WechatGroupMember[], useAI: false, aiPrompt: "", enabled: true, }) const [isWechatFriendSelectorOpen, setIsWechatFriendSelectorOpen] = useState(false) const [isWechatGroupSelectorOpen, setIsWechatGroupSelectorOpen] = useState(false) const [isWechatGroupMemberSelectorOpen, setIsWechatGroupMemberSelectorOpen] = useState(false) const [currentGroupId, setCurrentGroupId] = useState("") const [loading, setLoading] = useState(false) const [isLoadingData, setIsLoadingData] = useState(true) // 获取内容库详情 useEffect(() => { const fetchLibraryDetail = async () => { setIsLoadingData(true) const loadingToast = showToast("正在加载内容库数据...", "loading", true); try { const response = await api.get>(`/v1/content/library/detail?id=${resolvedParams.id}`) if (response.code === 200 && response.data) { const data = response.data // 直接使用API返回的好友和群组数据 const friends = data.selectedFriends || []; const groups = data.selectedGroups || []; // 根据接口返回的groupMembers字段构建selectedGroupMembers数组 let groupMembers: WechatGroupMember[] = []; // 检查是否有groupMembers数据 if (data.groupMembers) { // 将 {"813941": [262439]} 格式转换为 WechatGroupMember[] 数组 Object.entries(data.groupMembers).forEach(([groupId, memberIds]) => { // 确保memberIds是数组 if (Array.isArray(memberIds)) { memberIds.forEach(memberId => { // 在groups中查找对应的group信息 const group = groups.find(g => g.id === groupId); if (group) { // 将group信息与member ID组合成 WechatGroupMember 对象 groupMembers.push({ id: String(memberId), groupId: groupId, nickname: "", // 默认为空,实际使用时会由WechatGroupMemberSelector填充 avatar: "", // 默认为空,实际使用时会由WechatGroupMemberSelector填充 wechatId: "" // 添加必要的wechatId字段 }); } }); } }); } else if (data.selectedGroupMembers) { // 如果有selectedGroupMembers字段,则直接使用 groupMembers = data.selectedGroupMembers; } setFormData({ name: data.name, sourceType: data.sourceType === 1 ? "friends" : "groups", keywordsInclude: data.keywordInclude ? data.keywordInclude.join(", ") : "", keywordsExclude: data.keywordExclude ? data.keywordExclude.join(", ") : "", startDate: data.timeStart || "", endDate: data.timeEnd || "", selectedFriends: friends, selectedGroups: groups, selectedGroupMembers: groupMembers, useAI: !!data.aiPrompt, aiPrompt: data.aiPrompt || "", enabled: data.status === 1, }) } else { showToast(response.msg || "获取内容库详情失败", "error") router.back() } } catch (error: any) { console.error("获取内容库详情失败:", error) showToast(error?.message || "请检查网络连接", "error") router.back() } finally { setIsLoadingData(false) loadingToast.remove() } } fetchLibraryDetail() }, [resolvedParams.id, router]) const removeFriend = (friendId: string) => { setFormData((prev) => ({ ...prev, selectedFriends: prev.selectedFriends.filter((friend) => friend.id !== friendId), })) } const removeGroup = (groupId: string) => { setFormData((prev) => ({ ...prev, selectedGroups: prev.selectedGroups.filter((group) => group.id !== groupId), })) } const handleSelectGroupMembers = (groupId: string) => { setCurrentGroupId(groupId) setIsWechatGroupMemberSelectorOpen(true) } const handleSubmit = async () => { if (!formData.name) { showToast("请输入内容库名称", "error") return } if (formData.sourceType === "friends" && formData.selectedFriends.length === 0) { showToast("请选择微信好友", "error") return } if (formData.sourceType === "groups" && formData.selectedGroups.length === 0) { showToast("请选择聊天群", "error") return } setLoading(true) const loadingToast = showToast("正在更新内容库...", "loading", true); try { // 将群成员数据转换为{"813941": [262439]}格式 const groupMembersMap: Record = {} formData.selectedGroupMembers.forEach(member => { if (member.groupId) { if (!groupMembersMap[member.groupId]) { groupMembersMap[member.groupId] = [] } groupMembersMap[member.groupId].push(member.id) } }) const payload = { id: resolvedParams.id, name: formData.name, sourceType: formData.sourceType === "friends" ? 1 : 2, friends: formData.selectedFriends.map(f => f.id), groups: formData.selectedGroups.map(g => g.id), groupMembers: groupMembersMap, // 使用JSON字符串传递群成员数据 keywordInclude: formData.keywordsInclude.split(",").map(k => k.trim()).filter(Boolean), keywordExclude: formData.keywordsExclude.split(",").map(k => k.trim()).filter(Boolean), aiPrompt: formData.useAI ? formData.aiPrompt : "", timeEnabled: formData.startDate && formData.endDate ? 1 : 0, startTime: formData.startDate || "", endTime: formData.endDate || "", status: formData.enabled ? 1 : 0 } const response = await api.post("/v1/content/library/update", payload) if (response.code === 200) { loadingToast.remove() showToast("更新成功", "success") router.push("/content") } else { loadingToast.remove() showToast(response.msg || "更新失败", "error") } } catch (error: any) { console.error("更新内容库失败:", error) loadingToast.remove() showToast(error?.message || "请检查网络连接", "error") } finally { setLoading(false) } } if (isLoadingData) { return (

加载中...

) } return (

编辑内容库

setFormData({ ...formData, name: e.target.value })} placeholder="请输入内容库名称" required className="mt-1.5" />
setFormData({ ...formData, sourceType: value as "friends" | "groups" })} className="mt-1.5" > 选择微信好友 选择聊天群 {formData.selectedFriends.length > 0 && (
{formData.selectedFriends.map((friend) => (
{friend.nickname} {friend.nickname}
))}
)}
{formData.selectedGroups.length > 0 && (
{formData.selectedGroups.map((group) => (
{group.name} {group.name}
))}
)}
关键字设置