"use client"; import { useState, useCallback } from "react"; import { motion, AnimatePresence } from "framer-motion"; import { Twitter, Loader2, Heart, Repeat2, Eye, MessageCircle, Sparkles, ArrowRight, CheckCircle2, XCircle, Flame, Image as ImageIcon, Link2, Zap, } from "lucide-react"; import { useTweet } from "@/hooks/use-tweet"; import { cn } from "@/lib/utils"; interface TweetImportCardProps { onProjectCreated?: (projectId: string) => void; } export function TweetImportCard({ onProjectCreated }: TweetImportCardProps) { const { preview, isLoadingPreview, isCreatingProject, error, createdProject, isValidTweetUrl, previewTweet, createProjectFromTweet, reset, } = useTweet(); const [tweetUrl, setTweetUrl] = useState(""); const [customTitle, setCustomTitle] = useState(""); const handlePreview = useCallback(async () => { if (!tweetUrl.trim()) return; await previewTweet(tweetUrl.trim()); }, [tweetUrl, previewTweet]); const handleCreate = useCallback(async () => { if (!tweetUrl.trim()) return; const project = await createProjectFromTweet({ tweetUrl: tweetUrl.trim(), title: customTitle.trim() || undefined, }); if (project && onProjectCreated) { onProjectCreated(project.id); } }, [tweetUrl, customTitle, createProjectFromTweet, onProjectCreated]); const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === "Enter" && !e.shiftKey) { e.preventDefault(); if (!preview) { handlePreview(); } else { handleCreate(); } } }; const isUrlValid = tweetUrl.trim().length > 0 && isValidTweetUrl(tweetUrl.trim()); const formatNumber = (num: number): string => { if (num >= 1_000_000) return `${(num / 1_000_000).toFixed(1)}M`; if (num >= 1_000) return `${(num / 1_000).toFixed(1)}K`; return num.toString(); }; const viralColor = (score: number) => { if (score >= 70) return "text-emerald-400"; if (score >= 40) return "text-amber-400"; return "text-[var(--color-text-muted)]"; }; const viralBg = (score: number) => { if (score >= 70) return "bg-emerald-500/10 border-emerald-500/30"; if (score >= 40) return "bg-amber-500/10 border-amber-500/30"; return "bg-[var(--color-bg-elevated)] border-[var(--color-border-faint)]"; }; return (
{/* Header */}

X/Twitter Import

Tweet → Video pipeline

{/* URL Input */}
{ setTweetUrl(e.target.value); if (preview) reset(); }} onKeyDown={handleKeyDown} placeholder="https://x.com/user/status/123..." className="w-full h-11 pl-10 pr-24 rounded-xl bg-[var(--color-bg-elevated)] border border-[var(--color-border-faint)] text-sm text-[var(--color-text-primary)] placeholder:text-[var(--color-text-ghost)] focus:border-sky-500/50 focus:ring-1 focus:ring-sky-500/25 outline-none transition-all" />
{/* Error */} {error && ( {error} )} {/* Preview Card */} {preview && ( {/* Author + Viral Score */}
{preview.tweet.author.avatarUrl ? ( {preview.tweet.author.name} ) : ( )}
{preview.tweet.author.name} {preview.tweet.author.verified && ( )}
@{preview.tweet.author.username}
{/* Viral Score Badge */}
{preview.viralScore}/100
{/* Tweet Text */}

{preview.tweet.text}

{/* Media preview */} {preview.tweet.media.length > 0 && (
{preview.tweet.media.slice(0, 4).map((m, i) => (
{m.type === "photo" ? ( {`Media ) : (
)}
))}
)} {/* Metrics */}
{[ { icon: Heart, value: preview.tweet.metrics.likes, color: "text-rose-400", }, { icon: Repeat2, value: preview.tweet.metrics.retweets, color: "text-emerald-400", }, { icon: Eye, value: preview.tweet.metrics.views, color: "text-sky-400", }, { icon: MessageCircle, value: preview.tweet.metrics.replies, color: "text-amber-400", }, ].map(({ icon: Icon, value, color }, i) => (
{formatNumber(value)}
))}
{/* Info badges */}
{preview.contentType === "thread" ? "Thread" : preview.contentType === "quote_tweet" ? "Alıntı" : "Tweet"} ~{preview.estimatedDuration}s video {preview.tweet.media.length > 0 && ( {preview.tweet.media.length} medya )}
{/* Custom Title */} setCustomTitle(e.target.value)} placeholder={preview.suggestedTitle} className="w-full h-10 px-3 rounded-xl bg-[var(--color-bg-elevated)] border border-[var(--color-border-faint)] text-sm text-[var(--color-text-primary)] placeholder:text-[var(--color-text-ghost)]/50 focus:border-violet-500/50 focus:ring-1 focus:ring-violet-500/25 outline-none transition-all" /> {/* Create Button */}
)}
{/* Success */} {createdProject && (

Proje oluşturuldu!

{createdProject.title}

)}
); }