This commit is contained in:
parent
f1bace981c
commit
658da375a7
|
|
@ -409,11 +409,18 @@ export function DetailPageHeader({ data }: { data: any }) {
|
||||||
const [statusText, setStatusText] = useState(data?.statusText || "加载中...");
|
const [statusText, setStatusText] = useState(data?.statusText || "加载中...");
|
||||||
const [progress, setProgress] = useState(data?.progress || "0%");
|
const [progress, setProgress] = useState(data?.progress || "0%");
|
||||||
const [showDelete, setShowDelete] = useState(true);
|
const [showDelete, setShowDelete] = useState(true);
|
||||||
|
const [hasWSConnected, setHasWSConnected] = useState(false);
|
||||||
|
const socketRef = useRef<WebSocket | null>(null); // ✅ 引用存 WebSocket 实例
|
||||||
|
|
||||||
// ✅ 提取 WebSocket 初始化逻辑
|
// ✅ 提取 WebSocket 初始化逻辑
|
||||||
const initWebSocket = (userName: string, id: number) => {
|
const initWebSocket = (userName: string, id: number) => {
|
||||||
|
if (socketRef.current) {
|
||||||
|
socketRef.current.close(); // 关闭旧连接
|
||||||
|
}
|
||||||
|
|
||||||
const wsBase = process.env.NEXT_PUBLIC_CLIENT_BASE_WS;
|
const wsBase = process.env.NEXT_PUBLIC_CLIENT_BASE_WS;
|
||||||
const socket = new WebSocket(`${wsBase}/status/${userName}/${id}`);
|
const socket = new WebSocket(`${wsBase}/status/${userName}/${id}`);
|
||||||
|
socketRef.current = socket;
|
||||||
|
|
||||||
socket.onopen = () => {
|
socket.onopen = () => {
|
||||||
console.log("WebSocket 已连接");
|
console.log("WebSocket 已连接");
|
||||||
|
|
@ -438,16 +445,21 @@ export function DetailPageHeader({ data }: { data: any }) {
|
||||||
|
|
||||||
socket.onclose = () => {
|
socket.onclose = () => {
|
||||||
console.log("🔌 WebSocket 连接已关闭");
|
console.log("🔌 WebSocket 连接已关闭");
|
||||||
|
setHasWSConnected(false);
|
||||||
|
socketRef.current = null;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
setHasWSConnected(true);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// ✅ 部署请求
|
||||||
const handleClick = async (source: "icon" | "info") => {
|
const handleClick = async (source: "icon" | "info") => {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
setStatusText(source === "icon" ? "正在处理图标操作..." : "正在处理信息操作...");
|
setStatusText(source === "icon" ? "正在处理图标操作..." : "正在处理信息操作...");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const userData = JSON.parse(localStorage.getItem("UserData") || "null");
|
const userData = JSON.parse(localStorage.getItem("UserData") || "null");
|
||||||
if (!userData || !userData.user_name) {
|
if (!userData?.user_name) {
|
||||||
setStatusText("未登录,正在跳转登录页面...");
|
setStatusText("未登录,正在跳转登录页面...");
|
||||||
window.location.href = "/auth/sign-in/";
|
window.location.href = "/auth/sign-in/";
|
||||||
return;
|
return;
|
||||||
|
|
@ -493,6 +505,7 @@ export function DetailPageHeader({ data }: { data: any }) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// ✅ 页面加载时自动拉状态 & 触发 WebSocket(如 status 为 deploying)
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const fetchDeployStatus = async () => {
|
const fetchDeployStatus = async () => {
|
||||||
try {
|
try {
|
||||||
|
|
@ -509,7 +522,7 @@ export function DetailPageHeader({ data }: { data: any }) {
|
||||||
const userName = userData?.user_name;
|
const userName = userData?.user_name;
|
||||||
const id = data?.id;
|
const id = data?.id;
|
||||||
|
|
||||||
if (status === "deploying" && userName && id) {
|
if (status === "deploying" && userName && id && !hasWSConnected) {
|
||||||
setStatusText("检测到正在部署,连接中...");
|
setStatusText("检测到正在部署,连接中...");
|
||||||
initWebSocket(userName, id);
|
initWebSocket(userName, id);
|
||||||
}
|
}
|
||||||
|
|
@ -540,6 +553,15 @@ export function DetailPageHeader({ data }: { data: any }) {
|
||||||
fetchDeployStatus();
|
fetchDeployStatus();
|
||||||
}, [data?.id]);
|
}, [data?.id]);
|
||||||
|
|
||||||
|
// ✅ 页面卸载时关闭 WebSocket
|
||||||
|
useEffect(() => {
|
||||||
|
return () => {
|
||||||
|
if (socketRef.current) {
|
||||||
|
socketRef.current.close();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}, []);
|
||||||
|
|
||||||
const isImagePath =
|
const isImagePath =
|
||||||
typeof data?.icon === "string" &&
|
typeof data?.icon === "string" &&
|
||||||
(data.icon.startsWith("http") || data.icon.startsWith("/"));
|
(data.icon.startsWith("http") || data.icon.startsWith("/"));
|
||||||
|
|
@ -598,7 +620,7 @@ export function DetailPageHeader({ data }: { data: any }) {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{(data?.progress !== "0%" || statusText) && (
|
{(progress !== "0%" || statusText) && (
|
||||||
<div className="w-full mt-4 bg-gray-200 h-6">
|
<div className="w-full mt-4 bg-gray-200 h-6">
|
||||||
<div
|
<div
|
||||||
className="bg-blue-500 h-full text-white text-center text-sm flex items-center justify-center transition-all duration-300 px-2 overflow-hidden whitespace-nowrap text-ellipsis"
|
className="bg-blue-500 h-full text-white text-center text-sm flex items-center justify-center transition-all duration-300 px-2 overflow-hidden whitespace-nowrap text-ellipsis"
|
||||||
|
|
@ -614,9 +636,6 @@ export function DetailPageHeader({ data }: { data: any }) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// export function Header() {
|
// export function Header() {
|
||||||
|
|
||||||
// const router = useRouter();
|
// const router = useRouter();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue