Добавить смену профилей, пока не работает

This commit is contained in:
AidarKC
2026-09-03 12:51:46 +04:00
parent ebc9143593
commit e0295eebde
8 changed files with 227 additions and 43 deletions
+9 -4
View File
@@ -2,6 +2,8 @@ import { renderHeader } from '../components/header.js';
import {
authService,
authorizeSession,
consumeAuthReturnPage,
isAddingProfileLogin,
clearAuthMessages,
clearBrowserClientData,
refreshSessions,
@@ -205,10 +207,13 @@ export function render({ navigate }) {
try {
await authService.reconnect(state.entrySettings.shineServer);
const session = await authService.createSessionFromImportedSecrets(scannedTransfer.login, scannedTransfer.keys);
await terminateCurrentSession({ closeServerSession: true });
const addingProfile = isAddingProfileLogin();
if (!addingProfile) {
await terminateCurrentSession({ closeServerSession: true });
clearBrowserClientData();
await clearClientAuthData().catch(() => {});
}
await clearStoredMessages(session.login).catch(() => {});
clearBrowserClientData();
await clearClientAuthData().catch(() => {});
await saveEncryptedUserSecrets(session.login, session.storagePwd, scannedTransfer.keys);
await authService.persistSessionMaterial(session.login, session.sessionMaterial);
const resumed = await authService.resumeSession(session.login, session.sessionId);
@@ -221,7 +226,7 @@ export function render({ navigate }) {
state.loginDraft.password = '';
await refreshSessions();
setAuthInfo(`Вход по QR-коду выполнен для @${resumed.login || session.login}.`);
navigate('profile-view');
navigate(consumeAuthReturnPage('profile-view'));
} catch (error) {
const message = toUserMessage(error, 'Не удалось войти по QR-коду.');
setAuthError(message);
+16 -8
View File
@@ -1,6 +1,8 @@
import {
authService,
authorizeSession,
consumeAuthReturnPage,
isAddingProfileLogin,
clearAuthMessages,
clearBrowserClientData,
refreshSessions,
@@ -182,10 +184,13 @@ export function render({ navigate }) {
const finalizeAuthorizedLogin = async (keys, login) => {
const session = await authService.createSessionFromImportedSecrets(login, keys);
await terminateCurrentSession({ closeServerSession: true, notifySessionReset: false });
const addingProfile = isAddingProfileLogin();
if (!addingProfile) {
await terminateCurrentSession({ closeServerSession: true, notifySessionReset: false });
clearBrowserClientData();
await clearClientAuthData().catch(() => {});
}
await clearStoredMessages(session.login).catch(() => {});
clearBrowserClientData();
await clearClientAuthData().catch(() => {});
await saveEncryptedUserSecrets(session.login, session.storagePwd, keys);
await authService.persistSessionMaterial(session.login, session.sessionMaterial);
const resumed = await authService.resumeSession(session.login, session.sessionId);
@@ -199,7 +204,7 @@ export function render({ navigate }) {
await refreshSessions();
setAuthInfo(`Вход через другое устройство выполнен для @${resumed.login || session.login}.`);
showToast(`Устройство подключено для @${resumed.login || session.login}`);
navigate('profile-view');
navigate(consumeAuthReturnPage('profile-view'));
};
const finalizeAuthorizedSessionAttach = async (payloadSession, login, requesterKeys) => {
@@ -215,10 +220,13 @@ export function render({ navigate }) {
sessionType: Number(payloadSession?.sessionType || 50) || 50,
};
await terminateCurrentSession({ closeServerSession: true, notifySessionReset: false });
const addingProfile = isAddingProfileLogin();
if (!addingProfile) {
await terminateCurrentSession({ closeServerSession: true, notifySessionReset: false });
clearBrowserClientData();
await clearClientAuthData().catch(() => {});
}
await clearStoredMessages(login).catch(() => {});
clearBrowserClientData();
await clearClientAuthData().catch(() => {});
await authService.persistSessionMaterial(login, sessionMaterial);
const resumed = await authService.resumeSession(login, sessionId);
authorizeSession({
@@ -231,7 +239,7 @@ export function render({ navigate }) {
await refreshSessions();
setAuthInfo(`Session-only вход выполнен для @${resumed.login || login}.`);
showToast(`Wallet-session подключена для @${resumed.login || login}`);
navigate('profile-view');
navigate(consumeAuthReturnPage('profile-view'));
};
const schedulePoll = () => {
+12 -1
View File
@@ -1,6 +1,7 @@
import { renderHeader } from '../components/header.js';
import {
authService,
cancelAddProfileLogin,
clearAuthMessages,
setAuthBusy,
setAuthError,
@@ -155,7 +156,17 @@ export function render({ navigate }) {
screen.append(
renderHeader({
title: '',
leftAction: { label: '←', onClick: () => navigate('start-view') },
leftAction: {
label: '←',
onClick: async () => {
if (state.authReturnHash === '/profiles') {
await cancelAddProfileLogin();
navigate('profiles-view');
return;
}
navigate('start-view');
},
},
}),
panel,
);
+13 -3
View File
@@ -41,9 +41,19 @@ export function render({ navigate }) {
addButton.type = 'button';
addButton.className = 'secondary-btn';
addButton.textContent = 'Добавить профиль';
addButton.addEventListener('click', () => {
prepareAddProfileLogin();
navigate('login-view');
addButton.addEventListener('click', async () => {
addButton.disabled = true;
status.hidden = false;
status.className = 'status-line';
status.textContent = 'Подготавливаем вход в новый профиль…';
try {
await prepareAddProfileLogin();
navigate('login-view');
} catch (error) {
status.className = 'status-line is-unavailable';
status.textContent = `Не удалось начать добавление профиля: ${error?.message || 'unknown'}`;
addButton.disabled = false;
}
});
const closeAllButton = document.createElement('button');
+15 -9
View File
@@ -1,6 +1,8 @@
import { renderHeader } from '../components/header.js';
import {
authService,
cancelAddProfileLogin,
consumeAuthReturnPage,
authorizeSession,
refreshSessions,
resetRegistrationFlow,
@@ -103,7 +105,12 @@ export function render({ navigate }) {
cancelButton.className = 'ghost-btn';
cancelButton.type = 'button';
cancelButton.textContent = 'Отмена';
cancelButton.addEventListener('click', () => {
cancelButton.addEventListener('click', async () => {
if (state.authReturnHash === '/profiles') {
await cancelAddProfileLogin();
navigate('profiles-view');
return;
}
resetRegistrationFlow();
navigate('start-view');
});
@@ -174,13 +181,7 @@ export function render({ navigate }) {
setAuthInfo(isLoginFlow
? `Ключи сохранены. Вы вошли как @${state.registrationDraft.login}. Далее откройте вкладку «Каналы».`
: `Ключи сохранены. Регистрация завершена для @${state.registrationDraft.login}. Далее откройте вкладку «Каналы».`);
const nextHash = String(state.authReturnHash || '').trim();
state.authReturnHash = '';
if (nextHash.startsWith('/')) {
navigate(nextHash.slice(1));
} else {
navigate('profile-view');
}
navigate(consumeAuthReturnPage('profile-view'));
} catch (error) {
const message = toUserMessage(error, 'Не удалось сохранить ключи на устройстве.');
setAuthError(message);
@@ -196,7 +197,12 @@ export function render({ navigate }) {
title: 'Сохранение ключей',
leftAction: {
label: '←',
onClick: () => {
onClick: async () => {
if (state.authReturnHash === '/profiles') {
await cancelAddProfileLogin();
navigate('profiles-view');
return;
}
resetRegistrationFlow();
navigate('start-view');
},