import { useState, useEffect } from "react"; import { useVideoGen } from "../stores/videoGenStore"; import track from "../lib/track"; import { useDirty } from "../stores/dirtyStore"; import { IcVideo } from "../components/Icons"; import { jget, jpost, request } from "../api"; export default function CreateVideo() { const { connected, url, connect, disconnect } = useVideoGen(); const { makeDirty, makeClean } = useDirty(); const [connectUrl, setConnectUrl] = useState(url || ""); const [busy, setBusy] = useState(false); useEffect(() => { jget("/api/video/status") .then(data => { if (data.connected && data.url) { setConnectUrl(data.url); connect(data.url, data); } }) .catch(() => {}); }, []); const handleConnect = async () => { makeDirty("Bạn đang kết nối tạo video. Mất tiến trình nếu rời đi."); if (!connectUrl.trim()) return; setBusy(true); // Tool này chỉ bàn giao sang app ngoài: đo được tới đây là hết, KHÔNG có // output nội bộ để đo (spec §4.8). const t0 = Date.now(); track.runClick({ phase: "connect" }); try { const data = await jpost("/api/video/connect", { url: connectUrl }); connect(connectUrl, data); track.step("connect_success", "output", { latency_ms_client: Date.now() - t0 }); } catch (e) { track.abandon("connect_failed", "run"); alert("Lỗi kết nối: " + e.message); } finally { setBusy(false); } }; const handleDisconnect = async () => { makeClean(); setBusy(true); try { await request("/api/video/disconnect", { method: "POST" }); disconnect(); } catch (e) { alert("Lỗi: " + e.message); } finally { setBusy(false); } }; return ( <>
{connected ? "Đã kết nối" : "Chưa kết nối"} {!connected ? ( <> setConnectUrl(e.target.value)} placeholder="https://xxxx.gradio.live/" style={{ flex: 1, maxWidth: 400, padding: "7px 12px", fontSize: 13, border: "2px solid var(--line)", borderRadius: "var(--radius-sm)", background: "#fff" }} /> ) : ( <> {url} )}
{/* Hướng dẫn khi chưa kết nối */} {!connected && (

Tạo video với AI

Kết nối tới server WanGP đang chạy để dùng giao diện tạo video gốc ngay trong trang.

    {[ ["Chạy WanGP", "Khởi động công cụ sinh video WanGP và lấy link Gradio công khai của nó (dạng https://xxxx.gradio.live/)."], ["Dán link & Kết nối", "Dán link vào ô phía trên rồi bấm “🔌 Kết nối”. Trạng thái sẽ chuyển sang “Đã kết nối”."], ["Tạo video", "Giao diện WanGP gốc hiện ngay trong trang — nhập prompt và tạo video như bình thường."], ["Ngắt kết nối", "Xong việc bấm “🔌 Ngắt kết nối”. Link được ghi nhớ để lần sau vào lại nhanh."], ].map(([t, d], i) => (
  1. {i + 1} {t}. {d}
  2. ))}
)} ); }