UI: переход на history-router без # и короткие ссылки тредов

This commit is contained in:
AidarKC
2026-05-19 10:15:15 +03:00
parent 3a0899bcfe
commit db2d9a666b
9 changed files with 61 additions and 28 deletions
+4 -4
View File
@@ -81,7 +81,8 @@ function messageRefKey(messageRef) {
function buildAbsoluteRouteUrl(routePath = '') {
const cleanRoute = String(routePath || '').replace(/^#?\/?/, '');
const url = new URL(window.location.href);
url.hash = `#/${cleanRoute}`;
url.pathname = `/${cleanRoute}`;
url.hash = '';
return url.toString();
}
@@ -213,7 +214,6 @@ function buildThreadRouteFromTarget(target, selector) {
'm',
encodeRoutePart(target.blockchainName),
target.blockNumber,
normalizeRouteHash(target.blockHash),
].join('/');
}
@@ -525,7 +525,7 @@ export function render({ navigate, route }) {
const next = render({ navigate, route });
current.replaceWith(next);
} catch (error) {
logThreadRuntimeError('rerender', error, { routeHash: window.location.hash });
logThreadRuntimeError('rerender', error, { routePath: window.location.pathname });
}
};
@@ -543,7 +543,7 @@ export function render({ navigate, route }) {
const login = state.session.login;
const storagePwd = state.session.storagePwdInMemory;
if (!login || !storagePwd) {
state.authReturnHash = window.location.hash || '#/channels-list';
state.authReturnHash = window.location.pathname || '/channels-list';
navigate('login-view');
throw new Error('Для этого действия нужно войти');
}
+3 -3
View File
@@ -110,7 +110,8 @@ function blockRefToMessageKey(blockRef, fallbackBch = '') {
function buildAbsoluteRouteUrl(routePath = '') {
const cleanRoute = String(routePath || '').replace(/^#?\/?/, '');
const url = new URL(window.location.href);
url.hash = `#/${cleanRoute}`;
url.pathname = `/${cleanRoute}`;
url.hash = '';
return url.toString();
}
@@ -150,7 +151,6 @@ function buildThreadRoute(messageRef, selector) {
'm',
encodeRoutePart(messageRef.blockchainName),
messageRef.blockNumber,
normalizeRouteHash(messageRef.blockHash),
].join('/');
}
@@ -890,7 +890,7 @@ export function render({ navigate, route }) {
const login = state.session.login;
const storagePwd = state.session.storagePwdInMemory;
if (!login || !storagePwd) {
state.authReturnHash = window.location.hash || '#/channels-list';
state.authReturnHash = window.location.pathname || '/channels-list';
navigate('login-view');
throw new Error('Для этого действия нужно войти');
}
+3 -3
View File
@@ -1167,9 +1167,9 @@ export function render({ navigate, route }) {
const rerenderList = () => {
try {
const expectedHash = `#/channels-list/${listState.activeTab}`;
if (window.location.hash !== expectedHash) {
window.history.replaceState({}, '', expectedHash);
const expectedPath = `/channels-list/${listState.activeTab}`;
if (window.location.pathname !== expectedPath) {
window.history.replaceState({}, '', expectedPath);
}
} catch {
// ignore history errors
+2 -1
View File
@@ -184,7 +184,8 @@ function openDeveloperAvatarUploadModal({ walletLogin, storagePwd, gateway } = {
async function forceUiUpdateNow() {
try {
window.location.hash = '#/settings-view';
window.history.replaceState({}, '', '/settings-view');
window.dispatchEvent(new PopStateEvent('popstate'));
} catch {}
if (!('serviceWorker' in navigator)) {
window.location.reload();
+2 -2
View File
@@ -132,8 +132,8 @@ export function render({ navigate }) {
: `Ключи сохранены. Регистрация завершена для @${state.registrationDraft.login}. Далее откройте вкладку «Каналы».`);
const nextHash = String(state.authReturnHash || '').trim();
state.authReturnHash = '';
if (nextHash.startsWith('#/')) {
navigate(nextHash.slice(2));
if (nextHash.startsWith('/')) {
navigate(nextHash.slice(1));
} else {
navigate('profile-view');
}