import { ChevronUp, ChevronDown, SquareArrowOutUpRight, Globe, } from "lucide-react"; import { useState, useEffect } from "react"; import { useTranslation } from "react-i18next"; import platformAdapter from "@/utils/platformAdapter"; import type { IChunkData } from "@/types/chat"; import RetrieveIcon from "@/icons/Retrieve"; interface FetchSourceProps { Detail?: any; ChunkData?: IChunkData; loading?: boolean; formatUrl?: (data: ISourceData) => string; } interface ISourceData { category: string; icon: string; id: string; size: number; source: { type: string; name: string; id: string; }; summary: string; thumbnail: string; title: string; updated: string | null; url: string; } export const FetchSource = ({ Detail, ChunkData, loading, formatUrl, }: FetchSourceProps) => { const { t } = useTranslation(); const [isSourceExpanded, setIsSourceExpanded] = useState(false); const [total, setTotal] = useState(0); const [data, setData] = useState([]); useEffect(() => { if (!Detail?.payload) return; // console.log("Detail?.payload", Detail?.payload); setData(Detail?.payload); setTotal(Detail?.payload.length); }, [Detail?.payload]); useEffect(() => { if (!ChunkData?.message_chunk) return; if (!loading) { try { const match = ChunkData.message_chunk.match( // /\u003cPayload total=(\d+)\u003e/ // ); if (match) { setTotal(Number(match[1])); } // const jsonMatch = ChunkData.message_chunk.match(/\[(.*)\]/s); const jsonMatch = ChunkData.message_chunk.match(/\[([\s\S]*)\]/); if (jsonMatch) { const jsonData = JSON.parse(jsonMatch[0]); setData(jsonData); } } catch (e) { console.error("Failed to parse fetch source data:", e); } } }, [ChunkData?.message_chunk, loading]); const sourceClick = (item: ISourceData) => () => { const url = (formatUrl && formatUrl(item)) || item.url; if (url) { platformAdapter.openUrl(url); } }; // Must be after hooks !!! if (!ChunkData && !Detail) return null; return (
{isSourceExpanded && ( <> {/* {prefix && (
{prefix}
)} */} {data?.map((item, idx) => (
{item.title || item.category}
{item.source?.name || item?.category}
))} )}
); };