"use client"; import { useState, useRef, useEffect, useMemo } from "react"; import { Table, AlignHorizontalSpaceAround, Loader2, Clapperboard, CircleArrowRight, } from "lucide-react"; import "./style/home-page2.css"; import { usePathname, useRouter } from "next/navigation"; import { Swiper, SwiperSlide } from "swiper/react"; import "swiper/swiper-bundle.css"; // 引入样式 import { Autoplay } from "swiper/modules"; import { VideoCarouselLayout } from "@/components/video-carousel-layout"; import { VideoGridLayout } from "@/components/video-grid-layout"; import { motion, AnimatePresence } from "framer-motion"; import { LiquidButton } from "@/components/ui/liquid-glass-button"; import { createScriptProject, CreateScriptProjectRequest, } from "@/api/script_project"; import { ProjectTypeEnum, ModeEnum, ResolutionEnum } from "@/app/model/enums"; import { getResourcesList, Resource } from "@/api/resources"; import { Carousel } from "antd"; import { TextCanvas } from "../common/TextCanvas"; import { fetchSubscriptionPlans, SubscriptionPlan } from "@/lib/stripe"; import { useCallbackModal } from "@/app/layout"; /** 视频预加载系统 - 后台静默运行 */ function useVideoPreloader() { /** 预加载单个视频 */ const preloadVideo = (src: string): Promise => { return new Promise((resolve) => { const video = document.createElement("video"); video.muted = true; video.preload = "auto"; // 设置超时,避免某个视频卡住整个预加载过程 const timeout = setTimeout(() => { console.warn(`视频预加载超时: ${src}`); resolve(); }, 10000); // 10秒超时 video.onloadeddata = () => { clearTimeout(timeout); resolve(); }; video.onerror = () => { clearTimeout(timeout); console.warn(`视频预加载失败: ${src}`); resolve(); // 即使失败也继续,不影响其他视频 }; video.src = src; video.load(); }); }; /** 预加载所有视频 */ const preloadAllVideos = async () => { const allVideos = [ // HomeModule1 - 首屏视频(最高优先级) "https://cdn.qikongjian.com/videos/home.mp4", // HomeModule2 - 核心价值视频(高优先级) "https://cdn.qikongjian.com/videos/module2 (1).mp4", "https://cdn.qikongjian.com/videos/module2 (2).mp4", "https://cdn.qikongjian.com/videos/module2 (3).mp4", // HomeModule4 - 制作工序视频(中优先级) "https://cdn.qikongjian.com/videos/module4 (3).mp4", "https://cdn.qikongjian.com/videos/module4 (1).mp4", "https://cdn.qikongjian.com/videos/module4 (4).mp4", "https://cdn.qikongjian.com/videos/module4 (2).mp4", // HomeModule3 - 案例展示视频(低优先级,数量多) "https://cdn.qikongjian.com/videos/show (1).mp4", "https://cdn.qikongjian.com/videos/show (2).mp4", "https://cdn.qikongjian.com/videos/show (3).mp4", "https://cdn.qikongjian.com/videos/show (4).mp4", "https://cdn.qikongjian.com/videos/show (5).mp4", "https://cdn.qikongjian.com/videos/show (6).mp4", "https://cdn.qikongjian.com/videos/show (7).mp4", "https://cdn.qikongjian.com/videos/show (8).mp4", "https://cdn.qikongjian.com/videos/show (9).mp4", "https://cdn.qikongjian.com/videos/show (10).mp4", "https://cdn.qikongjian.com/videos/show (11).mp4", "https://cdn.qikongjian.com/videos/show (12).mp4", "https://cdn.qikongjian.com/videos/show (13).mp4", "https://cdn.qikongjian.com/videos/show (14).mp4", "https://cdn.qikongjian.com/videos/show (15).mp4", ]; try { // 分阶段预加载:先加载关键视频,再加载其他视频 const criticalVideos = allVideos.slice(0, 8); // 前8个是关键视频 const otherVideos = allVideos.slice(8); // 第一阶段:预加载关键视频 for (let i = 0; i < criticalVideos.length; i += 2) { const batch = criticalVideos.slice(i, i + 2); await Promise.all(batch.map(preloadVideo)); } // 第二阶段:后台预加载其他视频 if (otherVideos.length > 0) { // 使用 requestIdleCallback 在浏览器空闲时预加载 const preloadRemaining = () => { let index = 0; const processBatch = () => { if (index >= otherVideos.length) return; const batch = otherVideos.slice( index, Math.min(index + 3, otherVideos.length) ); batch.forEach(preloadVideo); index += batch.length; if (index < otherVideos.length) { requestIdleCallback(processBatch, { timeout: 1000 }); } }; requestIdleCallback(processBatch, { timeout: 1000 }); }; // 如果浏览器不支持 requestIdleCallback,使用 setTimeout if (typeof requestIdleCallback !== "undefined") { preloadRemaining(); } else { setTimeout(() => { for (let i = 0; i < otherVideos.length; i += 3) { const batch = otherVideos.slice(i, i + 3); batch.forEach(preloadVideo); } }, 100); } } } catch (error) { console.error("视频预加载过程中出现错误:", error); } }; useEffect(() => { // 使用 requestIdleCallback 在浏览器空闲时开始预加载 // 如果浏览器不支持,则使用 setTimeout 延迟执行 if (typeof requestIdleCallback !== "undefined") { requestIdleCallback(() => preloadAllVideos(), { timeout: 2000 }); } else { setTimeout(() => preloadAllVideos(), 100); } }, []); // 这个 hook 不需要返回任何值,它只是后台静默运行 return; } export function HomePage2() { // 后台静默预加载视频,不显示任何加载界面 useVideoPreloader(); const [hPading, setHPading] = useState(0); useEffect(() => { // 获取当前窗口尺寸 const currentWidth = window.innerWidth; const currentHeight = window.innerHeight; // 计算缩放比例 (1920x1080) const wScale = currentWidth / 1920; const hScale = currentHeight / 1080; // 检查app节点是否存在 const homePage = document.getElementById("home-page"); if (!homePage) { console.error("未找到app节点"); return; } // setHPading((hScale || 1) * 10); // 创建样式元素 const style = document.createElement("style"); // 设置CSS样式 style.textContent = ` #home-page { transform-origin: top left; transform: scale(${wScale}, ${hScale}); width: 1920px; height: 1080px; } `; // 将样式添加到head document.head.appendChild(style); }, []); return ( //
); } /** 首屏 */ function HomeModule1() { const router = useRouter(); return (

Ideas Spark Movies

One line, one film—your story, your scene.

Everyone is a movie master.

{ if (localStorage.getItem("token")) { router.push("/create"); } else { router.push("/login"); } }} > Make a Movie
); } /**核心价值 */ function HomeModule2() { const videoList = [ { title: "Text to Movie", video: "https://cdn.qikongjian.com/videos/module2 (1).mp4", }, { title: "Image to Movie", video: "https://cdn.qikongjian.com/videos/module2 (2).mp4", }, { title: "Template to Movie", video: "https://cdn.qikongjian.com/videos/module2 (3).mp4", }, ]; return (

Just Drop A Thought

Say your idea in a single line,and MovieFlow will bring it to life.

{/* 第一个视频 */} {videoList.map((item, index) => (
))}
); } /**案例展示 */ function HomeModule3() { const videoList = [ [ "https://cdn.qikongjian.com/1756474023656_60twk5.mp4", "https://cdn.qikongjian.com/1756474023644_14n7is.mp4", "https://cdn.qikongjian.com/1756474023648_kocq6z.mp4", "https://cdn.qikongjian.com/1756474023657_w10boo.mp4", "https://cdn.qikongjian.com/1756474023657_nf8799.mp4", "https://cdn.qikongjian.com/1756474230992_vw0ubf.mp4", ], [ "https://cdn.qikongjian.com/1756474023655_pov4c3.mp4", "https://cdn.qikongjian.com/1756474023663_yohi7a.mp4", "https://cdn.qikongjian.com/1756474023661_348dx3.mp4", "https://cdn.qikongjian.com/1756474023683_xlb34s.mp4", "https://cdn.qikongjian.com/1756474023683_xlb34s.mp4", "https://cdn.qikongjian.com/1756474230987_63ooji.mp4", ], [ "https://cdn.qikongjian.com/1756474230997_zysje8.mp4", "https://cdn.qikongjian.com/1756474230988_tgqzln.mp4", "https://cdn.qikongjian.com/1756474231007_qneeia.mp4", "https://cdn.qikongjian.com/1756474231008_qyqtka.mp4", "https://cdn.qikongjian.com/1756474231009_vs49d9.mp4", "https://cdn.qikongjian.com/1756474231010_2a48p0.mp4", ], ]; // 定义内容样式 const contentStyle: React.CSSProperties = { height: "100%", lineHeight: "10rem", textAlign: "center", background: "#364d79", }; return (

Ideas Made Real

High-quality films, any style, made with MovieFlow.

{/* 3x3网格布局 */}
{/* 上方阴影遮罩 - 使用 mask 实现真正的渐变模糊,加重黑色 */}
{/* 下方阴影遮罩 - 使用 mask 实现真正的渐变模糊,加重黑色 */}
{videoList.map((column, columnIndex) => (
{column.map((video, videoIndex) => (
))}
))}
); } /**电影制作工序介绍 */ function HomeModule4() { const [activeTab, setActiveTab] = useState(0); const processSteps = [ { title: " The Story Agent", description: " From a single thought, it builds entire worlds and compelling plots.", video: "https://cdn.qikongjian.com/videos/module4 (3).mp4", }, { title: " AI Character Agent", description: "Cast your virtual actors. Lock them in once, for the entire story.", video: "https://cdn.qikongjian.com/videos/module4 (1).mp4", }, { title: " The Shot Agent", description: "It translates your aesthetic into art, light, and cinematography for every single shot.", video: "https://cdn.qikongjian.com/videos/module4 (4).mp4", }, { title: " Intelligent Clip Agent", description: "An editing AI drives the final cut, for a story told seamlessly.", video: "https://cdn.qikongjian.com/videos/module4 (2).mp4", }, ]; const handleTabClick = (index: number) => { setActiveTab(index); }; return (

Create Your Way

{/* 左侧四个切换tab */}
{processSteps.map((step, index) => (
handleTabClick(index)} className={`w-[31.75rem] h-[10.5rem] rounded-lg cursor-pointer transition-all duration-300 border ${ activeTab === index ? "bg-[#262626] border-white/20 hover:border-white/40" : "bg-black border-white/10 hover:border-white/40" }`} >

{step.title}

{step.description}

))}
{/* 右侧视频播放区域 */}
); } /**价格方案 */ function HomeModule5() { const [billingType, setBillingType] = useState<"month" | "year">("month"); const [plans, setPlans] = useState([]); const { setShowCallbackModal } = useCallbackModal(); const pathname = usePathname(); // 从后端获取订阅计划数据 useEffect(() => { const loadPlans = async () => { try { const plansData = await fetchSubscriptionPlans(); setPlans(plansData); } catch (err) { console.error("加载订阅计划失败:", err); } }; loadPlans(); }, []); const pricingPlans = useMemo< { title: string; price: number; credits: string; buttonText: string; features: string[]; }[] >(() => { return plans.map((plan) => { return { title: plan.display_name || plan.name, price: billingType === "month" ? plan.price_month / 100 : plan.price_year / 100, credits: plan.description, buttonText: plan.is_free ? "Try For Free" : "Subscribe Now", features: plan.features || [], }; }); }, [plans, billingType]); const handleSubscribe = async (planName: string) => { if (planName === "hobby") { return; } localStorage.setItem("callBackUrl", pathname); try { // 使用新的Checkout Session方案(更简单!) const { createCheckoutSession, redirectToCheckout } = await import( "@/lib/stripe" ); // 从localStorage获取当前用户信息 const User = JSON.parse(localStorage.getItem("currentUser") || "{}"); if (!User.id) { throw new Error("无法获取用户ID,请重新登录"); } // 1. 创建Checkout Session const result = await createCheckoutSession({ user_id: String(User.id), plan_name: planName, billing_cycle: billingType, }); if (!result.successful || !result.data) { throw new Error("create checkout session failed"); } setShowCallbackModal(true); window.open(result.data.checkout_url, "_blank"); } catch (error) { throw new Error("create checkout session failed, please try again later"); } }; return (

Pick a plan and make it yours

{/* 计费切换 */}
{/* 主要价格卡片 */}
{pricingPlans.map((plan, index) => (

{plan.title}

${plan.price} /{billingType === "month" ? "mo" : "year"}

{plan.credits}

* Billed monthly until cancelled

    {plan.features.map((feature, featureIndex) => (
  • {feature}
  • ))}
))}
); } function HomeModule6() { return (
© 2025 MovieFlow. All rights reserved.
); }