telegram-invite-automation/src/renderer/hooks/useAccountImport.js
2026-02-01 14:39:30 +04:00

166 lines
6.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { useState } from "react";
export default function useAccountImport({
selectedTaskId,
hasSelectedTask,
assignAccountsToTask,
setAccounts,
showNotification,
explainTdataError,
setTdataNotice
}) {
const [loginForm, setLoginForm] = useState({
apiId: "",
apiHash: "",
phone: "",
code: "",
password: ""
});
const [tdataForm, setTdataForm] = useState({
apiId: "2040",
apiHash: "b18441a1ff607e10a989891a5462e627"
});
const [loginId, setLoginId] = useState("");
const [loginStatus, setLoginStatus] = useState("");
const [tdataResult, setTdataResult] = useState(null);
const [tdataLoading, setTdataLoading] = useState(false);
const startLogin = async () => {
if (!window.api) {
setLoginStatus("Electron API недоступен. Откройте приложение в Electron.");
showNotification("Electron API недоступен. Откройте приложение в Electron.", "error");
return;
}
if (selectedTaskId == null) {
setLoginStatus("Сначала выберите задачу.");
showNotification("Сначала выберите задачу.", "error");
return;
}
setLoginStatus("Отправляем код...");
showNotification("Отправляем код...", "info");
try {
const result = await window.api.startLogin({
apiId: loginForm.apiId,
apiHash: loginForm.apiHash,
phone: loginForm.phone
});
setLoginId(result.loginId);
setLoginStatus("Код отправлен. Введите код для входа.");
showNotification("Код отправлен. Введите код для входа.", "success");
} catch (error) {
const message = error.message || String(error);
setLoginStatus(message);
showNotification(message, "error");
}
};
const completeLogin = async () => {
if (!window.api) {
setLoginStatus("Electron API недоступен. Откройте приложение в Electron.");
showNotification("Electron API недоступен. Откройте приложение в Electron.", "error");
return;
}
if (selectedTaskId == null) {
setLoginStatus("Сначала выберите задачу.");
showNotification("Сначала выберите задачу.", "error");
return;
}
setLoginStatus("Завершаем вход...");
showNotification("Завершаем вход...", "info");
const result = await window.api.completeLogin({
loginId,
code: loginForm.code,
password: loginForm.password
});
if (result.ok) {
setLoginStatus("Аккаунт добавлен.");
setLoginId("");
setLoginForm({ apiId: "", apiHash: "", phone: "", code: "", password: "" });
await assignAccountsToTask([result.accountId].filter(Boolean));
setAccounts(await window.api.listAccounts());
return;
}
if (result.error === "DUPLICATE_ACCOUNT") {
setLoginStatus("Аккаунт уже добавлен. Привязан к задаче.");
setLoginId("");
setLoginForm({ apiId: "", apiHash: "", phone: "", code: "", password: "" });
await assignAccountsToTask([result.accountId].filter(Boolean));
setAccounts(await window.api.listAccounts());
return;
}
if (result.error === "PASSWORD_REQUIRED") {
setLoginStatus("Нужен пароль 2FA. Введите пароль.");
showNotification("Нужен пароль 2FA. Введите пароль.", "info");
return;
}
setLoginStatus(result.error || "Ошибка входа");
showNotification(result.error || "Ошибка входа", "error");
};
const importTdata = async () => {
if (!window.api) {
showNotification("Electron API недоступен. Откройте приложение в Electron.", "error");
return;
}
showNotification("Импортируем tdata...", "info");
setTdataLoading(true);
try {
const result = await window.api.importTdata({
apiId: tdataForm.apiId,
apiHash: tdataForm.apiHash,
taskId: selectedTaskId || undefined
});
if (result && result.canceled) return;
if (!result.ok) {
const hint = explainTdataError(result.error || "");
showNotification(hint ? `${result.error}. ${hint}` : (result.error || "Ошибка импорта tdata"), "error");
return;
}
setTdataResult(result);
const importedCount = (result.imported || []).length;
const skippedCount = (result.skipped || []).length;
const failedCount = (result.failed || []).length;
const importedIds = (result.imported || []).map((item) => item.accountId).filter(Boolean);
const skippedIds = (result.skipped || []).map((item) => item.accountId).filter(Boolean);
if ((importedIds.length || skippedIds.length) && hasSelectedTask) {
await assignAccountsToTask([...importedIds, ...skippedIds]);
}
if (result.authKeyDuplicatedCount) {
setTdataNotice({
text: `AUTH_KEY_DUPLICATED: ${result.authKeyDuplicatedCount}. Сессии сброшены после импорта.`,
tone: "warn"
});
} else if (importedCount > 0) {
setTdataNotice({ text: `Импортировано аккаунтов: ${importedCount}`, tone: "success" });
} else if (skippedCount > 0 && failedCount === 0) {
setTdataNotice({ text: `Пропущено дубликатов: ${skippedCount}`, tone: "success" });
}
if (failedCount > 0) {
showNotification(`Не удалось импортировать: ${failedCount}`, "error");
}
setAccounts(await window.api.listAccounts());
} catch (error) {
showNotification(error.message || String(error), "error");
} finally {
setTdataLoading(false);
}
};
return {
loginForm,
setLoginForm,
tdataForm,
setTdataForm,
loginStatus,
tdataResult,
tdataLoading,
startLogin,
completeLogin,
importTdata
};
}