telegram-invite-automation/src/renderer/hooks/useAppPolling.js
2026-03-03 15:06:31 +04:00

144 lines
4.6 KiB
JavaScript

import { useEffect } from "react";
export default function useAppPolling({
activeTab,
selectedTaskId,
isVisible,
setIsVisible,
setNow,
tasksPollInFlight,
accountsPollInFlight,
logsPollInFlight,
eventsPollInFlight,
setTasks,
loadTaskStatuses,
setTaskStatus,
setAccounts,
setProxies,
setAccountAssignments,
setAccountStats,
setGlobalStatus,
setLogs,
setInvites,
setFallbackList,
setConfirmQueue,
setTaskAudit,
setAccountEvents,
setApiTraceLogs,
setQueueItems,
setQueueStats
}) {
useEffect(() => {
if (!window.api) return undefined;
const load = async () => {
if (!isVisible || tasksPollInFlight.current) return;
tasksPollInFlight.current = true;
try {
const tasksData = await window.api.listTasks();
setTasks(tasksData);
await loadTaskStatuses(tasksData);
if (selectedTaskId != null) {
setTaskStatus(await window.api.taskStatus(selectedTaskId));
}
} finally {
tasksPollInFlight.current = false;
}
};
load();
const interval = setInterval(async () => {
await load();
}, 5000);
return () => clearInterval(interval);
}, [selectedTaskId, isVisible]);
useEffect(() => {
if (!window.api) return undefined;
const load = async () => {
if (!isVisible || accountsPollInFlight.current) return;
accountsPollInFlight.current = true;
try {
setAccounts(await window.api.listAccounts());
setProxies(await window.api.listProxies());
setAccountAssignments(await window.api.listAccountAssignments());
const statusData = await window.api.getStatus();
setAccountStats(statusData.accountStats || []);
setGlobalStatus({
connectedSessions: statusData.connectedSessions || 0,
totalAccounts: statusData.totalAccounts || 0
});
} finally {
accountsPollInFlight.current = false;
}
};
load();
const interval = setInterval(load, 15000);
return () => clearInterval(interval);
}, [isVisible]);
useEffect(() => {
if (!window.api) return undefined;
const isLogsOrQueue = activeTab === "logs" || activeTab === "queue";
const isApiTrace = activeTab === "apiTrace";
if (!isLogsOrQueue && !isApiTrace) return undefined;
const load = async () => {
if (!isVisible || logsPollInFlight.current) return;
logsPollInFlight.current = true;
try {
if (isApiTrace) {
setApiTraceLogs(await window.api.listApiTrace({ limit: 300, taskId: selectedTaskId || 0 }));
return;
}
if (selectedTaskId == null) return;
setLogs(await window.api.listLogs({ limit: 100, taskId: selectedTaskId }));
setInvites(await window.api.listInvites({ limit: 200, taskId: selectedTaskId }));
setFallbackList(await window.api.listFallback({ limit: 500, taskId: selectedTaskId }));
setConfirmQueue(await window.api.listConfirmQueue({ limit: 500, taskId: selectedTaskId }));
setTaskAudit(await window.api.listTaskAudit(selectedTaskId));
const queueData = await window.api.listQueue({ limit: 200, taskId: selectedTaskId });
if (queueData && queueData.items) setQueueItems(queueData.items);
if (queueData && queueData.stats) setQueueStats(queueData.stats);
} finally {
logsPollInFlight.current = false;
}
};
load();
const interval = setInterval(load, 5000);
return () => clearInterval(interval);
}, [activeTab, selectedTaskId, isVisible]);
useEffect(() => {
if (!window.api || activeTab !== "events") return undefined;
const load = async () => {
if (!isVisible || eventsPollInFlight.current) return;
eventsPollInFlight.current = true;
try {
setAccountEvents(await window.api.listAccountEvents(200));
} finally {
eventsPollInFlight.current = false;
}
};
load();
const interval = setInterval(load, 10000);
return () => clearInterval(interval);
}, [activeTab, isVisible]);
useEffect(() => {
const timer = setInterval(() => setNow(Date.now()), 1000);
return () => clearInterval(timer);
}, [setNow]);
useEffect(() => {
const handleVisibility = () => {
setIsVisible(!document.hidden);
};
document.addEventListener("visibilitychange", handleVisibility);
window.addEventListener("focus", handleVisibility);
window.addEventListener("blur", handleVisibility);
return () => {
document.removeEventListener("visibilitychange", handleVisibility);
window.removeEventListener("focus", handleVisibility);
window.removeEventListener("blur", handleVisibility);
};
}, [setIsVisible]);
}