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 ( <>
Kết nối tới server WanGP đang chạy để dùng giao diện tạo video gốc ngay trong trang.