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 }; }