"use client"; import { useState } from "react"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Button } from "@/components/ui/button"; import { PLATFORM_MAP } from "@/lib/platforms"; import { Check, X, Quote, Filter } from "lucide-react"; import { useApi } from "@/lib/hooks/use-api"; import { LoadingState } from "@/components/ui/api-states"; interface CitationItem { id: string; query_id: string; platform: string; cited: boolean; citation_position: number | null; citation_text: string | null; competitor_brands: string[]; queried_at: string; } interface QueryOption { id: string; keyword: string; } export default function CitationsPage() { const [selectedQuery, setSelectedQuery] = useState("all"); const [selectedPlatform, setSelectedPlatform] = useState("all"); const [startDate, setStartDate] = useState(""); const [endDate, setEndDate] = useState(""); // 用于手动触发筛选 const [filterKey, setFilterKey] = useState(0); // 构建引用记录查询 URL const citationsUrl = (() => { const params = new URLSearchParams(); if (selectedQuery && selectedQuery !== "all") params.append("query_id", selectedQuery); if (selectedPlatform && selectedPlatform !== "all") params.append("platform", selectedPlatform); if (startDate) params.append("start_date", startDate); if (endDate) params.append("end_date", endDate); const qs = params.toString(); // filterKey 作为虚拟参数,即使筛选条件不变也允许重新请求 return `/api/v1/citations/${qs ? `?${qs}&_k=${filterKey}` : `?_k=${filterKey}`}`; })(); const { data: citationsData, isLoading, error: citationsError, refresh: refreshCitations, } = useApi<{ items: CitationItem[] }>( citationsUrl, { dedupingInterval: 0 } ); const { data: queriesData, } = useApi<{ items: QueryOption[] }>("/api/v1/queries/"); const citations: CitationItem[] = citationsData?.items ?? []; const queries: QueryOption[] = queriesData?.items ?? []; function handleFilter() { setFilterKey((k) => k + 1); } function handleReset() { setSelectedQuery("all"); setSelectedPlatform("all"); setStartDate(""); setEndDate(""); setFilterKey((k) => k + 1); } if (isLoading && citations.length === 0) { return (

引用记录

查看各平台的引用检测结果

); } return (

引用记录

查看各平台的引用检测结果

筛选条件
setStartDate(e.target.value)} />
setEndDate(e.target.value)} />
{citationsError && (
{citationsError.message}
)} 引用记录列表 {citations.length === 0 ? (

暂无引用记录

添加查询词并执行查询后将在此显示结果

) : (
平台 是否引用 引用位置 引用文本片段 竞争品牌 查询时间 {citations.map((item) => ( {PLATFORM_MAP[item.platform] || item.platform} {item.cited ? (
已引用
) : (
未引用
)}
{item.citation_position !== null ? `第 ${item.citation_position} 位` : "—"} {item.citation_text || "—"}
{item.competitor_brands?.length > 0 ? ( item.competitor_brands.map((brand) => ( {brand} )) ) : ( )}
{new Date(item.queried_at).toLocaleString("zh-CN")}
))}
)}
); }