"use client"; import { useState } from "react"; import { motion } from "framer-motion"; import { FolderOpen, Search, Trash2, ChevronLeft, ChevronRight, Loader2, RefreshCw, ExternalLink, } from "lucide-react"; import Link from "next/link"; import { useAdminProjects, useAdminDeleteProject } from "@/hooks/use-api"; const STATUS_LABELS: Record = { DRAFT: { label: "Taslak", color: "bg-[var(--color-bg-surface)] text-[var(--color-text-ghost)] border border-[var(--color-border-faint)]" }, GENERATING_SCRIPT: { label: "Senaryo Üretiliyor", color: "bg-neutral-500/10 text-neutral-400 border border-neutral-500/20" }, PENDING: { label: "Kuyrukta", color: "bg-neutral-500/10 text-neutral-400 border border-neutral-500/20" }, GENERATING_MEDIA: { label: "Medya Üretiliyor", color: "bg-neutral-500/10 text-neutral-400 border border-neutral-500/20" }, RENDERING: { label: "Render", color: "bg-neutral-500/10 text-neutral-400 border border-neutral-500/20" }, COMPLETED: { label: "Tamamlandı", color: "bg-neutral-500/10 text-neutral-400 border border-neutral-500/20" }, FAILED: { label: "Başarısız", color: "bg-neutral-500/10 text-neutral-400 border border-neutral-500/20" }, }; const fadeUp = { hidden: { opacity: 0, y: 14 }, show: { opacity: 1, y: 0, transition: { duration: 0.4 } }, }; export default function AdminProjectsPage() { const [page, setPage] = useState(1); const [statusFilter, setStatusFilter] = useState(""); const [search, setSearch] = useState(""); const { data, isLoading, refetch } = useAdminProjects({ page, limit: 20, status: statusFilter || undefined, }); const deleteProject = useAdminDeleteProject(); // eslint-disable-next-line @typescript-eslint/no-explicit-any const response = (data as any)?.data ?? data; // eslint-disable-next-line @typescript-eslint/no-explicit-any const projects = (response?.data ?? []) as any[]; const meta = response?.meta ?? {}; const filtered = search ? projects.filter( (p) => p.title?.toLowerCase().includes(search.toLowerCase()) || p.user?.email?.toLowerCase().includes(search.toLowerCase()) ) : projects; return (

Proje Yönetimi

Toplam {meta.total ?? "—"} proje

{/* Filtreler */}
setSearch(e.target.value)} className="input pl-10" />
{isLoading ? (
) : (
{filtered.map((project) => { const st = STATUS_LABELS[project.status] ?? { label: project.status, color: "bg-gray-500/10 text-gray-400" }; return ( ); })}
Proje Kullanıcı Durum Kredi Kaynak Tarih İşlem
{project.title}
{project.language} · {project._count?.scenes ?? 0} sahne
{project.user?.email} {st.label} {project.status !== "DRAFT" && project.status !== "COMPLETED" && project.status !== "FAILED" && (
)}
{project.creditsUsed} {project.sourceType === "X_TWEET" ? "𝕏 Tweet" : project.sourceType === "YOUTUBE" ? "YouTube" : "Manuel"} {new Date(project.createdAt).toLocaleDateString("tr")}
)}
{meta.totalPages > 1 && ( {page} / {meta.totalPages} )}
); }