"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 (
Tweet → Video pipeline
{preview.tweet.text}
Proje oluşturuldu!
{createdProject.title}