UI: отключение вкладки чатов и исправление загрузки каналов

This commit is contained in:
AidarKC 2026-05-19 00:04:34 +03:00
parent ab31ccf6d8
commit a332ddc828
6 changed files with 56 additions and 8 deletions

View File

@ -1,2 +1,2 @@
client.version=1.2.57
server.version=1.2.51
client.version=1.2.58
server.version=1.2.52

View File

@ -49,6 +49,11 @@ function toSafeInt(value) {
return Number.isFinite(parsed) ? parsed : null;
}
function looksLikeBlockchainName(value) {
const raw = String(value || '').trim();
return /^[^-]+-\d+$/.test(raw);
}
function makeReactionActionKey(messageRef) {
const login = String(state.session.login || '').trim().toLowerCase();
const blockchainName = String(messageRef?.blockchainName || '').trim();
@ -581,10 +586,33 @@ export function render({ navigate, route }) {
...(Array.isArray(ownFeed?.followedUsersChannels) ? ownFeed.followedUsersChannels : []),
...(Array.isArray(ownFeed?.followedChannels) ? ownFeed.followedChannels : []),
];
const channel = allRows.find((item) => (
String(item?.channel?.ownerBlockchainName || '').trim() === selector.short.ownerBlockchainName
&& String(item?.channel?.channelName || '').trim().toLowerCase() === selector.short.channelName.toLowerCase()
const ownerRaw = String(selector.short.ownerBlockchainName || '').trim();
const ownerNormalized = ownerRaw.toLowerCase();
const channelNameNormalized = String(selector.short.channelName || '').trim().toLowerCase();
let channel = allRows.find((item) => (
String(item?.channel?.ownerBlockchainName || '').trim().toLowerCase() === ownerNormalized
&& String(item?.channel?.channelName || '').trim().toLowerCase() === channelNameNormalized
));
if (!channel) {
channel = allRows.find((item) => (
String(item?.channel?.ownerLogin || '').trim().toLowerCase() === ownerNormalized
&& String(item?.channel?.channelName || '').trim().toLowerCase() === channelNameNormalized
));
}
if (!channel && !looksLikeBlockchainName(ownerRaw)) {
try {
const ownerUser = await authService.getUser(ownerRaw);
const ownerBch = String(ownerUser?.blockchainName || '').trim().toLowerCase();
if (ownerBch) {
channel = allRows.find((item) => (
String(item?.channel?.ownerBlockchainName || '').trim().toLowerCase() === ownerBch
&& String(item?.channel?.channelName || '').trim().toLowerCase() === channelNameNormalized
));
}
} catch {
// ignore fallback lookup errors
}
}
const ownerBch = String(channel?.channel?.ownerBlockchainName || '').trim();
const rootNo = Number(channel?.channel?.channelRoot?.blockNumber);
const rootHash = normalizeRouteHash(channel?.channel?.channelRoot?.blockHash);

View File

@ -55,6 +55,11 @@ function toSafeInt(value) {
return Number.isFinite(parsed) ? parsed : null;
}
function looksLikeBlockchainName(value) {
const raw = String(value || '').trim();
return /^[^-]+-\d+$/.test(raw);
}
function makeReactionActionKey(messageRef) {
const login = String(state.session.login || '').trim().toLowerCase();
const blockchainName = String(messageRef?.blockchainName || '').trim();
@ -439,7 +444,7 @@ async function loadFromApi(route, channelId) {
&& String(item?.channel?.channelName || '').trim().toLowerCase() === selector.channelName.toLowerCase()
));
}
if (!channel) {
if (!channel && !looksLikeBlockchainName(routeOwnerRaw)) {
try {
const ownerUser = await authService.getUser(routeOwnerRaw);
const ownerBch = String(ownerUser?.blockchainName || '').trim().toLowerCase();

View File

@ -692,7 +692,7 @@ function renderEmptyState(activeTab, navigate) {
if (activeTab === 'feed') {
text.textContent = 'Нет подписок и найденных каналов.';
} else if (activeTab === 'dialogs') {
text.textContent = 'У вас пока нет персональных каналов.';
text.textContent = 'Чаты пока не работают.';
} else if (activeTab === 'my') {
text.textContent = 'У вас пока нет каналов.';
} else {
@ -1148,6 +1148,10 @@ export function render({ navigate, route }) {
tabBtn.type = 'button';
tabBtn.className = `channels-tab-btn${listState.activeTab === tabKey ? ' is-active' : ''}`;
tabBtn.textContent = tabLabels[tabKey] || tabKey;
if (tabKey === 'dialogs') {
tabBtn.classList.add('is-disabled');
tabBtn.title = 'Чаты пока не работают';
}
tabBtn.addEventListener('click', () => {
if (listState.activeTab === tabKey) return;
listState.activeTab = tabKey;

View File

@ -1234,10 +1234,15 @@ export class AuthService {
const latestMessage = Array.isArray(latestPayload?.messages) ? latestPayload.messages[0] : null;
const latestBlockNumber = Number(latestMessage?.messageRef?.blockNumber);
const latestBlockHash = normalizeHex32(latestMessage?.messageRef?.blockHash, '');
const latestVersionsTotal = Number(latestMessage?.versionsTotal);
if (Number.isFinite(latestBlockNumber) && latestBlockNumber >= 0 && latestBlockHash) {
prevLineNumber = latestBlockNumber;
prevLineHashHex = latestBlockHash;
thisLineNumber = latestBlockNumber + 1;
// В line-цепочке thisLineNumber — это номер шага линии, а не глобальный blockNumber.
// Для следующего POST берем шаг после последней известной версии сообщения.
thisLineNumber = Number.isFinite(latestVersionsTotal) && latestVersionsTotal > 0
? Math.max(0, latestVersionsTotal)
: 1;
}
} catch {
// fallback to root anchor

View File

@ -3545,6 +3545,12 @@ textarea.input {
box-shadow: inset 0 1px 0 rgba(255, 238, 197, 0.3);
}
.channels-screen--list .channels-tab-btn.is-disabled {
text-decoration: line-through;
text-decoration-thickness: 1.5px;
opacity: 0.72;
}
.toolbar {
background: rgba(18, 24, 38, 0.4);
backdrop-filter: blur(25px);