"use client"; import { useState, useEffect } from "react"; import { motion } from "framer-motion"; import { FolderOpen, PlayCircle, CheckCircle2, Coins, Plus, ArrowUpRight, Clock, Sparkles, TrendingUp, Loader2, } from "lucide-react"; // X (Twitter) logosu — lucide-react'ta mevcut değil const XIcon = ({ size = 20, className = "" }: { size?: number; className?: string }) => ( ); import Link from "next/link"; import { DashboardCharts } from "@/components/dashboard/dashboard-charts"; import { RecentProjects } from "@/components/dashboard/recent-projects"; import { TweetImportCard } from "@/components/dashboard/tweet-import-card"; import { YoutubeImportCard } from "@/components/dashboard/youtube-import-card"; import { useDashboardStats, useCreditBalance } from "@/hooks/use-api"; const stagger = { hidden: { opacity: 0 }, show: { opacity: 1, transition: { staggerChildren: 0.08 }, }, }; const fadeUp = { hidden: { opacity: 0, y: 16 }, show: { opacity: 1, y: 0, transition: { duration: 0.5, ease: [0.16, 1, 0.3, 1] as const } }, }; // Mock-mode: Backend yokken statik veri kullan const isMockMode = process.env.NEXT_PUBLIC_ENABLE_MOCK_MODE === "true"; const MOCK_STATS = { totalProjects: 12, completedVideos: 8, activeRenderJobs: 2, totalCreditsUsed: 27, creditsRemaining: 47, }; function getStatCards(data?: typeof MOCK_STATS, creditBalance?: { balance: number; monthlyLimit: number }) { const stats = data ?? MOCK_STATS; const credits = creditBalance ?? { balance: stats.creditsRemaining, monthlyLimit: 50 }; return [ { label: "Toplam Proje", value: String(stats.totalProjects), change: `${stats.completedVideos} tamamlandı`, icon: FolderOpen, gradient: "from-neutral-500/12 to-neutral-600/5", iconBg: "bg-neutral-500/12", iconColor: "text-neutral-400", }, { label: "Devam Eden", value: String(stats.activeRenderJobs), change: "İşleniyor", icon: PlayCircle, gradient: "from-neutral-500/12 to-neutral-600/5", iconBg: "bg-neutral-500/12", iconColor: "text-neutral-400", }, { label: "Tamamlanan", value: String(stats.completedVideos), change: "Bu ay", icon: CheckCircle2, gradient: "from-neutral-500/12 to-neutral-600/5", iconBg: "bg-neutral-500/12", iconColor: "text-neutral-400", }, { label: "Kalan Kredi", value: String(credits.balance), change: `${credits.monthlyLimit} üzerinden`, icon: Coins, gradient: "from-neutral-500/12 to-neutral-600/5", iconBg: "bg-neutral-500/12", iconColor: "text-neutral-400", }, ]; } export default function DashboardPage() { const [mounted, setMounted] = useState(false); useEffect(() => { setMounted(true); }, []); // Real API hook'ları — mock modunda çağrılmaz const statsQuery = useDashboardStats(); const creditQuery = useCreditBalance(); // Mock/Real veri birleştir const isLoading = !isMockMode && (statsQuery.isLoading || creditQuery.isLoading); const statsData = isMockMode ? MOCK_STATS : (statsQuery.data as typeof MOCK_STATS | undefined); const creditData = isMockMode ? undefined : (creditQuery.data as { balance: number; monthlyLimit: number } | undefined); const statCards = getStatCards(statsData, creditData); if (!mounted) { return (
AI ile videolarını oluşturmaya devam et
Bir konu gir, gerisini AI halletsin
Topluluk şablonlarını kullan
İşlenen videolarını takip et
Viral tweet'leri videoya dönüştür