"use client"; import { useCallback, useState } from "react"; import { useRouter } from "next/navigation"; import Link from "next/link"; import { AnimatePresence, motion } from "framer-motion"; import { ArrowRight } from "lucide-react"; import { useTranslations } from "next-intl"; import { cn } from "@/lib/utils"; import { createVideoProject } from "@/lib/create-video-project"; import { SectionReveal } from "./SectionReveal"; import { TemplateCard } from "./TemplateCard"; import { FILTER_TABS, filterTemplates, getTemplateImageSrc, type FilterTab, type TemplateItem, } from "./template-gallery-data"; export interface TemplateGalleryProps { className?: string; } export function TemplateGallery({ className }: TemplateGalleryProps) { const router = useRouter(); const t = useTranslations("templates"); const [activeTab, setActiveTab] = useState("All"); const [usingTemplateId, setUsingTemplateId] = useState(null); const filtered = filterTemplates(activeTab); /** Map filter tab key → translated label */ const tabLabel: Record = { All: t("tabAll"), Videos: t("tabVideos"), Images: t("tabImages"), "Social Media": t("tabSocial"), Business: t("tabBusiness"), }; const handleUseTemplate = useCallback( async (template: TemplateItem) => { if (usingTemplateId) return; setUsingTemplateId(template.id); // Image templates → create an image project (future) // All others → video project const isImage = template.category === "Images"; if (isImage) { router.push("/dashboard"); setUsingTemplateId(null); return; } const result = await createVideoProject({ name: template.name }); setUsingTemplateId(null); if (!result.ok) { // Dev mode: Supabase not configured → go to new-project onboarding if (result.error.includes("Supabase is not configured")) { router.push("/studio/video/new"); return; } // Any other failure (unauth, server error) → send to sign-in router.push(`/auth?next=${encodeURIComponent("/templates")}`); return; } router.push(`/studio/video/${result.projectId}`); }, [router, usingTemplateId] ); return (

{t("heading")}

{/* Filter tabs */} {FILTER_TABS.map((tab) => { const isActive = activeTab === tab; return ( ); })} {/* Card grid — flex + justify-center so partial rows are centred */} {filtered.map((template) => ( void handleUseTemplate(template)} isUsingTemplate={usingTemplateId === template.id} useTemplateLabel={t("useTemplate")} openingLabel={t("opening")} /> ))} {t("browseAll")}
); }