116 lines
4.0 KiB
JavaScript
116 lines
4.0 KiB
JavaScript
import { emptyTaskForm, normalizeTask, sanitizeTaskForm } from "../appDefaults.js";
|
||
|
||
export default function useTaskLoaders({
|
||
taskAutosaveReady,
|
||
setTaskForm,
|
||
setCompetitorText,
|
||
setSelectedAccountIds,
|
||
setTaskAccountRoles,
|
||
setLogs,
|
||
setInvites,
|
||
setFallbackList,
|
||
setConfirmQueue,
|
||
setGroupVisibility,
|
||
setTaskStatus,
|
||
setMembershipStatus,
|
||
showNotification,
|
||
selectedTaskId
|
||
}) {
|
||
async function loadSelectedTask(taskId) {
|
||
taskAutosaveReady.current = false;
|
||
if (!taskId) {
|
||
setTaskForm(emptyTaskForm);
|
||
setCompetitorText("");
|
||
setSelectedAccountIds([]);
|
||
setTaskAccountRoles({});
|
||
setLogs([]);
|
||
setInvites([]);
|
||
setGroupVisibility([]);
|
||
setConfirmQueue([]);
|
||
setTaskStatus({
|
||
running: false,
|
||
queueCount: 0,
|
||
dailyRemaining: 0,
|
||
dailyUsed: 0,
|
||
dailyLimit: 0,
|
||
monitorInfo: { monitoring: false, accountId: 0, accountIds: [], groups: [], lastMessageAt: "", lastSource: "" },
|
||
nextRunAt: "",
|
||
nextInviteAccountId: 0,
|
||
lastInviteAccountId: 0,
|
||
pendingStats: { total: 0, withUsername: 0, withAccessHash: 0, withoutData: 0 }
|
||
});
|
||
taskAutosaveReady.current = true;
|
||
return;
|
||
}
|
||
const details = await window.api.getTask(taskId);
|
||
if (!details) {
|
||
taskAutosaveReady.current = true;
|
||
return;
|
||
}
|
||
setTaskForm(sanitizeTaskForm({ ...emptyTaskForm, ...normalizeTask(details.task) }));
|
||
setCompetitorText((details.competitors || []).join("\n"));
|
||
const roleMap = {};
|
||
const separateConfirmRoles = Boolean(details.task && details.task.separateConfirmRoles);
|
||
if (details.accountRoles && details.accountRoles.length) {
|
||
details.accountRoles.forEach((item) => {
|
||
const roleConfirm = item.roleConfirm != null ? item.roleConfirm : item.roleInvite;
|
||
const nextRoles = {
|
||
monitor: Boolean(item.roleMonitor),
|
||
invite: Boolean(item.roleInvite),
|
||
confirm: Boolean(roleConfirm),
|
||
inviteLimit: Number(item.inviteLimit || 0)
|
||
};
|
||
if (separateConfirmRoles && nextRoles.invite && nextRoles.confirm) {
|
||
nextRoles.confirm = false;
|
||
}
|
||
roleMap[item.accountId] = nextRoles;
|
||
});
|
||
} else {
|
||
(details.accountIds || []).forEach((accountId) => {
|
||
roleMap[accountId] = separateConfirmRoles
|
||
? { monitor: true, invite: true, confirm: false, inviteLimit: 7 }
|
||
: { monitor: true, invite: true, confirm: true, inviteLimit: 7 };
|
||
});
|
||
}
|
||
setTaskAccountRoles(roleMap);
|
||
setSelectedAccountIds(Object.keys(roleMap).map((id) => Number(id)));
|
||
setLogs(await window.api.listLogs({ limit: 100, taskId }));
|
||
setInvites(await window.api.listInvites({ limit: 200, taskId }));
|
||
setFallbackList(await window.api.listFallback({ limit: 500, taskId }));
|
||
setConfirmQueue(await window.api.listConfirmQueue({ limit: 500, taskId }));
|
||
setGroupVisibility([]);
|
||
setTaskStatus(await window.api.taskStatus(taskId));
|
||
taskAutosaveReady.current = true;
|
||
}
|
||
|
||
async function refreshMembership(source = "manual", showToast = false) {
|
||
if (!window.api) {
|
||
showNotification("Electron API недоступен. Откройте приложение в Electron.", "error");
|
||
return;
|
||
}
|
||
try {
|
||
const payload = selectedTaskId != null
|
||
? await window.api.membershipStatusByTask(selectedTaskId)
|
||
: await window.api.getMembershipStatus();
|
||
if (payload && payload.ok === false) {
|
||
showNotification(payload.error || "Не удалось проверить участие.", "error");
|
||
return;
|
||
}
|
||
const map = {};
|
||
(payload || []).forEach((item) => {
|
||
if (item && item.accountId != null) {
|
||
map[item.accountId] = item;
|
||
}
|
||
});
|
||
setMembershipStatus(map);
|
||
if (showToast) {
|
||
showNotification("Проверка участия завершена.", "success");
|
||
}
|
||
} catch (error) {
|
||
showNotification(error.message || String(error), "error");
|
||
}
|
||
}
|
||
|
||
return { loadSelectedTask, refreshMembership };
|
||
}
|