"use client"; import { useEffect, useRef } from "react"; import { toast } from "sonner"; import { checkDeploymentVersion, shouldReloadPath, UPDATE_HASH, } from "@/lib/realtime/deployment-refresh"; import { sse } from "@/lib/realtime/sse"; const UPDATE_TOAST_ID = "deployment-update"; function reloadWithUpdateMarker() { window.location.hash = UPDATE_HASH; queueMicrotask(() => window.location.reload()); } export function VersionCheck() { const versionRef = useRef(null); useEffect(() => { let successTimer: ReturnType | undefined; if (window.location.hash === UPDATE_HASH) { const url = new URL(window.location.href); url.hash = ""; window.history.replaceState(null, "", url); successTimer = setTimeout( () => toast.success("คุณอยู่ในเวอร์ชั่นล่าสุดแล้ว"), 1_000, ); } const { clean } = sse.active.subMany( { version(incomingVersion) { const result = checkDeploymentVersion( versionRef.current, incomingVersion, ); versionRef.current = result.version; if (!result.hasUpdate) return; window.location.hash = UPDATE_HASH; toast("มีอัปเดตใหม่พร้อมใช้งาน", { id: UPDATE_TOAST_ID, description: "รีโหลดเพื่ออัปเดตเป็นเวอร์ชันล่าสุด", action: { label: "รีโหลด", onClick: () => window.location.reload(), }, duration: Infinity, }); }, refresh(prefix) { if (!shouldReloadPath(prefix, window.location.pathname)) return; reloadWithUpdateMarker(); }, }, { endpoint: "/api/active" }, ); return () => { if (successTimer) clearTimeout(successTimer); clean(); }; }, []); return null; }