feat: shareable URLs for channels — update URL on selection, accept route param

- selectChannel updates URL to #/channels/<hash>
- init accepts routeParam and auto-selects channel
- Search results use new URL format instead of ?ch= query param
This commit is contained in:
you
2026-03-20 06:51:54 +00:00
parent fceff15e2f
commit 2a076dfb1d
2 changed files with 6 additions and 3 deletions
+1 -1
View File
@@ -464,7 +464,7 @@ window.addEventListener('DOMContentLoaded', () => {
const chList = Array.isArray(channels) ? channels : [];
for (const c of chList) {
if (c.name && c.name.toLowerCase().includes(q.toLowerCase())) {
html += `<div class="search-result-item" onclick="location.hash='#/channels?ch=${c.channel_hash}';document.getElementById('searchOverlay').classList.add('hidden')">
html += `<div class="search-result-item" onclick="location.hash='#/channels/${c.channel_hash}';document.getElementById('searchOverlay').classList.add('hidden')">
<span class="search-result-type">Channel</span>${c.name}</div>`;
}
}
+5 -2
View File
@@ -211,7 +211,7 @@
});
}
function init(app) {
function init(app, routeParam) {
app.innerHTML = `<div class="ch-layout">
<div class="ch-sidebar" aria-label="Channel list">
<div class="ch-sidebar-header">
@@ -235,7 +235,9 @@
</div>
</div>`;
loadChannels();
loadChannels().then(() => {
if (routeParam) selectChannel(routeParam);
});
// #89: Sidebar resize handle
(function () {
@@ -438,6 +440,7 @@
async function selectChannel(hash) {
selectedHash = hash;
history.replaceState(null, '', `#/channels/${hash}`);
renderChannelList();
const ch = channels.find(c => c.hash === hash);
const name = ch?.name || `Channel ${hash}`;