166 lines
6.0 KiB
JavaScript
166 lines
6.0 KiB
JavaScript
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
|
||
};
|
||
}
|