"use client" import type React from "react" import { useEffect, useState } from "react" import { X } from "lucide-react" import TemplatePreviewModal from "@/components/common/TemplatePreviewModal" import { PcTemplateModal } from "@/components/ChatInputBox/PcTemplateModal" import { useTemplateStoryServiceHook } from "@/app/service/Interaction/templateStoryService" import { useAppDispatch } from "@/lib/store/hooks" import { selectTemplateById } from "@/lib/store/creationTemplateSlice" import { useDeviceType } from "@/hooks/useDeviceType" /** * A compact template showcase with a header and link to all templates. * Shows first 12 templates, in 3 columns, each with thumbnail, name and brief. * @param {object} props - Component props. * @param {boolean} [props.showTabs=true] - Whether to show category tabs. * @returns {JSX.Element} - FamousTemplate component */ interface FamousTemplateProps { showTabs?: boolean } const FamousTemplate: React.FC = ({ showTabs = true }) => { const { templateStoryList, getTemplateStoryList, isLoading } = useTemplateStoryServiceHook() const dispatch = useAppDispatch() const { isDesktop } = useDeviceType() const [isModalOpen, setIsModalOpen] = useState(false) const [initialTemplateId, setInitialTemplateId] = useState(undefined) const [isTemplateCreating, setIsTemplateCreating] = useState(false) const [isRoleGenerating, setIsRoleGenerating] = useState<{ [key: string]: boolean }>({}) const [isItemGenerating, setIsItemGenerating] = useState<{ [key: string]: boolean }>({}) const [activeTemplateId, setActiveTemplateId] = useState(null) const [isPreviewReady, setIsPreviewReady] = useState(false) const [activeTab, setActiveTab] = useState<"all" | "music" | "animation" | "fantasy">("all") useEffect(() => { void getTemplateStoryList() }, [getTemplateStoryList]) const filteredTemplates = templateStoryList.filter((t) => { if (activeTab === "all") return true const categories = (t.category || "").split(",").map((s) => s.trim().toLowerCase()) return categories.includes(activeTab) }).slice(0, 10) const topTemplates = filteredTemplates return (

Hot Templates

{showTabs && (
{(["all", "music", "animation", "fantasy"] as const).map((tab) => ( ))}
)}
{isLoading ? (
Loading...
) : (
{topTemplates.map((t) => { return (
{ const v = e.currentTarget.querySelector('video') as HTMLVideoElement | null // @ts-ignore v?.play?.() }} onMouseLeave={(e) => { const v = e.currentTarget.querySelector('video') as HTMLVideoElement | null // @ts-ignore v?.pause?.() if (v) { // @ts-ignore v.currentTime = 0 } }} >
{t.name}
{t.name}
{ const id = t.id || t.template_id if (t.show_url) { if (activeTemplateId === id) { setActiveTemplateId(null) } else { setIsPreviewReady(false) setActiveTemplateId(id) } } else { setInitialTemplateId(id) setIsModalOpen(true) } }} >
) })}
)} {/* Centered modal for active template preview */} {activeTemplateId && (() => { const active = topTemplates.find((x) => (x.id || x.template_id) === activeTemplateId) if (!active || !active.show_url) return null return ( setActiveTemplateId(null)} title={active.name} description={active.generateText || active.name} onPrimaryAction={() => { const id = active.id || active.template_id dispatch(selectTemplateById(id)) setActiveTemplateId(null) }} primaryLabel="Try this" /> ) })()} setIsModalOpen(false)} initialTemplateId={initialTemplateId} configOptions={{ mode: "auto", resolution: "720p", language: "english", videoDuration: "auto" }} />
) } export default FamousTemplate