// Copyright (c) 2025 Bytedance Ltd. and/or its affiliates // SPDX-License-Identifier: MIT import { Check, Copy, Headphones, X } from "lucide-react"; import { useCallback, useEffect, useState } from "react"; import { Button } from "~/components/ui/button"; import { Card } from "~/components/ui/card"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "~/components/ui/tabs"; import { useReplay } from "~/core/replay"; import { listenToPodcast, openResearch, useStore } from "~/core/store"; import { cn } from "~/lib/utils"; import { ResearchActivitiesBlock } from "./research-activities-block"; import { ResearchReportBlock } from "./research-report-block"; import { ScrollContainer } from "./scroll-container"; import { Tooltip } from "./tooltip"; export function ResearchBlock({ className, researchId = null, }: { className?: string; researchId: string | null; }) { const reportId = useStore((state) => researchId ? state.researchReportIds.get(researchId) : undefined, ); const [activeTab, setActiveTab] = useState("activities"); const hasReport = useStore((state) => researchId ? state.researchReportIds.has(researchId) : false, ); const reportStreaming = useStore((state) => reportId ? (state.messages.get(reportId)?.isStreaming ?? false) : false, ); const { isReplay } = useReplay(); useEffect(() => { if (hasReport) { setActiveTab("report"); } }, [hasReport]); const handleGeneratePodcast = useCallback(async () => { if (!researchId) { return; } await listenToPodcast(researchId); }, [researchId]); const [copied, setCopied] = useState(false); const handleCopy = useCallback(() => { if (!reportId) { return; } const report = useStore.getState().messages.get(reportId); if (!report) { return; } void navigator.clipboard.writeText(report.content); setCopied(true); setTimeout(() => { setCopied(false); }, 1000); }, [reportId]); return (