SHA256
Обновить UI каналов, логаут DM и документацию
- Исправлена вкладка Каналы: стабильные режимы Все/Мои, корректные кнопки и навигация назад. - Зафиксирована доработка по личным сообщениям: при logout очищается локальная база/кеш DM на устройстве. - Обновлены AGENTS/CLAUDE и документация Personal_Messages. - Обновлены версии в VERSION.properties (client 1.2.106, server 1.2.99).
This commit is contained in:
@@ -11,6 +11,7 @@ import {
|
||||
writeChannelNotificationsState,
|
||||
} from '../services/channels-ux.js';
|
||||
import { makeShineChannelRoute } from '../services/shine-routes.js';
|
||||
import { navigateBack } from '../router.js';
|
||||
|
||||
export const pageMeta = { id: 'channels-list', title: 'Каналы' };
|
||||
|
||||
@@ -1176,26 +1177,12 @@ export function render({ navigate, route }) {
|
||||
const topBarLeft = document.createElement('div');
|
||||
topBarLeft.className = 'channels-top-left';
|
||||
|
||||
const backToFeedBtn = document.createElement('button');
|
||||
backToFeedBtn.type = 'button';
|
||||
backToFeedBtn.className = 'icon-btn channels-top-back-btn';
|
||||
backToFeedBtn.textContent = '←';
|
||||
backToFeedBtn.setAttribute('aria-label', 'Назад');
|
||||
backToFeedBtn.addEventListener('click', () => {
|
||||
if (listState.activeTab === 'feed') return;
|
||||
listState.activeTab = 'feed';
|
||||
rerenderList();
|
||||
});
|
||||
|
||||
const allChannelsBtn = document.createElement('button');
|
||||
allChannelsBtn.type = 'button';
|
||||
allChannelsBtn.className = 'secondary-btn channels-top-switch-btn';
|
||||
allChannelsBtn.textContent = 'Все каналы';
|
||||
allChannelsBtn.addEventListener('click', () => {
|
||||
if (listState.activeTab === 'feed') return;
|
||||
listState.activeTab = 'feed';
|
||||
rerenderList();
|
||||
});
|
||||
const backBtn = document.createElement('button');
|
||||
backBtn.type = 'button';
|
||||
backBtn.className = 'icon-btn channels-top-back-btn';
|
||||
backBtn.textContent = '←';
|
||||
backBtn.setAttribute('aria-label', 'Назад');
|
||||
backBtn.addEventListener('click', () => navigateBack());
|
||||
|
||||
const topTitle = document.createElement('strong');
|
||||
topTitle.className = 'channels-top-title';
|
||||
@@ -1227,7 +1214,17 @@ export function render({ navigate, route }) {
|
||||
createInMyBtn.setAttribute('aria-label', 'Создать канал');
|
||||
createInMyBtn.addEventListener('click', () => navigate('add-channel-view'));
|
||||
|
||||
topBarLeft.append(backToFeedBtn, allChannelsBtn, topTitle);
|
||||
const switchToAllBtn = document.createElement('button');
|
||||
switchToAllBtn.type = 'button';
|
||||
switchToAllBtn.className = 'secondary-btn channels-top-switch-btn';
|
||||
switchToAllBtn.textContent = 'Все каналы';
|
||||
switchToAllBtn.addEventListener('click', () => {
|
||||
if (listState.activeTab === 'feed') return;
|
||||
listState.activeTab = 'feed';
|
||||
rerenderList();
|
||||
});
|
||||
|
||||
topBarLeft.append(backBtn, topTitle);
|
||||
topBarRight.append(myChannelsBtn, findChannelBtn, createInMyBtn);
|
||||
topBarEl.append(topBarLeft, topBarRight);
|
||||
|
||||
@@ -1259,19 +1256,21 @@ export function render({ navigate, route }) {
|
||||
});
|
||||
|
||||
if (listState.activeTab === 'my' && !isGuest) {
|
||||
backToFeedBtn.style.display = '';
|
||||
allChannelsBtn.style.display = '';
|
||||
myChannelsBtn.style.display = 'none';
|
||||
topTitle.textContent = 'Мои каналы';
|
||||
findChannelBtn.style.display = 'none';
|
||||
switchToAllBtn.style.display = '';
|
||||
createInMyBtn.style.display = '';
|
||||
if (!switchToAllBtn.isConnected) topBarLeft.append(switchToAllBtn);
|
||||
if (topTitle.parentElement !== topBarRight) topBarRight.prepend(topTitle);
|
||||
} else {
|
||||
backToFeedBtn.style.display = 'none';
|
||||
allChannelsBtn.style.display = 'none';
|
||||
myChannelsBtn.style.display = isGuest ? 'none' : '';
|
||||
topTitle.textContent = 'Все каналы';
|
||||
findChannelBtn.style.display = '';
|
||||
switchToAllBtn.style.display = 'none';
|
||||
createInMyBtn.style.display = 'none';
|
||||
if (switchToAllBtn.isConnected) switchToAllBtn.remove();
|
||||
if (topTitle.parentElement !== topBarLeft) topBarLeft.append(topTitle);
|
||||
}
|
||||
|
||||
updateBottomCta({
|
||||
@@ -1317,6 +1316,9 @@ export function render({ navigate, route }) {
|
||||
isTabEmpty: true,
|
||||
});
|
||||
|
||||
// Применяем корректное состояние хедера сразу на первом рендере,
|
||||
// чтобы не показывать лишние кнопки до первой перерисовки.
|
||||
rerenderList();
|
||||
loadFeedAndRender({ screen, listState, contentEl, navigate });
|
||||
|
||||
screen.cleanup = () => {
|
||||
|
||||
@@ -7,6 +7,7 @@ import {
|
||||
setAuthInfo,
|
||||
state,
|
||||
} from '../state.js';
|
||||
import { clearStoredMessages } from '../services/message-store.js';
|
||||
import { toUserMessage } from '../services/ui-error-texts.js';
|
||||
|
||||
export const pageMeta = { id: 'registration-keys-view', title: 'Сохранение ключей', showAppChrome: false };
|
||||
@@ -111,6 +112,8 @@ export function render({ navigate }) {
|
||||
state.registrationDraft.pendingKeyBundle.blockchainPair = null;
|
||||
}
|
||||
|
||||
await clearStoredMessages().catch(() => {});
|
||||
|
||||
authorizeSession({
|
||||
login: state.registrationDraft.login,
|
||||
sessionId: state.registrationDraft.sessionId,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { AuthService } from './services/auth-service.js';
|
||||
import { listStoredMessages, putStoredMessage } from './services/message-store.js';
|
||||
import { listStoredMessages, putStoredMessage, clearStoredMessages } from './services/message-store.js';
|
||||
import { SOLANA_ENDPOINT_DEFAULT } from './solana-programs.js';
|
||||
|
||||
const clone = (value) => JSON.parse(JSON.stringify(value));
|
||||
@@ -752,6 +752,7 @@ function resetStateForSignedOut() {
|
||||
export async function terminateCurrentSession({ infoMessage = '' } = {}) {
|
||||
clearStoredSession();
|
||||
resetStateForSignedOut();
|
||||
await clearStoredMessages().catch(() => {});
|
||||
authService.close();
|
||||
if (infoMessage) {
|
||||
state.startHint = infoMessage;
|
||||
|
||||
Reference in New Issue
Block a user