"use client"; import { useEffect, useState } from "react"; import { Copy, Flame, ImageIcon, Loader2, MessageCircle } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { notify } from "@/lib/notifications/store"; import type { ViralAnalysis } from "@/lib/types/viral"; interface ViralAnalysisPanelProps { scanItemId: string; mediaUrls?: string[]; viralAnalysis?: ViralAnalysis | null; onUpdate: () => void; } export function ViralAnalysisPanel({ scanItemId, mediaUrls = [], viralAnalysis, onUpdate, }: ViralAnalysisPanelProps) { const [analyzing, setAnalyzing] = useState(false); const [replicating, setReplicating] = useState(false); const [analysis, setAnalysis] = useState(viralAnalysis ?? null); useEffect(() => { setAnalysis(viralAnalysis ?? null); }, [viralAnalysis, scanItemId]); async function handleAnalyze() { setAnalyzing(true); try { const res = await fetch("/api/analyze-viral", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ scanItemId }), }); const data = await res.json().catch(() => ({})); if (!res.ok) { notify({ type: "error", title: "爆款分析失敗", message: data.error }); return; } setAnalysis(data.analysis); onUpdate(); } catch { notify({ type: "error", title: "爆款分析失敗", message: "網路連線異常,請稍後再試" }); } finally { setAnalyzing(false); } } async function handleReplicate() { setReplicating(true); try { const res = await fetch("/api/replicate-viral", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ scanItemId }), }); const data = await res.json().catch(() => ({})); if (!res.ok) { notify({ type: "error", title: "複製爆款失敗", message: data.error }); return; } notify({ type: "success", title: "複製版草稿已生成", href: "/" }); onUpdate(); } catch { notify({ type: "error", title: "複製爆款失敗", message: "網路連線異常,請稍後再試" }); } finally { setReplicating(false); } } return (
{mediaUrls.length > 0 && (
{mediaUrls.slice(0, 4).map((url) => (
{/* eslint-disable-next-line @next/next/no-img-element */} 貼文附圖
))}
)}
{analysis && ( )}
{analysis && (

為什麼會紅

    {analysis.whyViral.map((reason) => (
  • {reason}
  • ))}

Hook 手法

{analysis.hookPattern}

結構節奏

{analysis.structurePattern}

情緒觸發

{analysis.emotionalTrigger}

時機切角

{analysis.timingAngle}

留言洞察(為什麼大家買單)

{analysis.commentInsights.whyPeopleEngage}

{analysis.commentInsights.themes.map((t) => ( {t} ))}
{analysis.commentInsights.audienceQuestions.length > 0 && (

常見疑問:{analysis.commentInsights.audienceQuestions.join("、")}

)}
{analysis.visualAnalysis.hasImages && (

圖文分析

{analysis.visualAnalysis.layout} · {analysis.visualAnalysis.colorMood}

視覺 hook:{analysis.visualAnalysis.visualHook}

    {analysis.visualAnalysis.replicationTips.map((tip) => (
  • {tip}
  • ))}
{analysis.visualAnalysis.imageGenPrompt && (

AI 繪圖 Prompt

{analysis.visualAnalysis.imageGenPrompt}

)}
)}

複製策略

{analysis.replicationStrategy}

)}
); }