diff --git a/containers/marketplace/resources/site/index.html b/containers/marketplace/resources/site/index.html index 28bc8a4..c5e0c26 100644 --- a/containers/marketplace/resources/site/index.html +++ b/containers/marketplace/resources/site/index.html @@ -278,11 +278,15 @@ // their own marketplace set this to their repo (a wins). var REPO_URL = (document.querySelector('meta[name="lp-repo"]') || {}).content || 'https://github.com/librelad/LibrePortal'; - function readFocus() { + // The hash is either a view (#view=submit) or an app focus (#). + function parseHash() { var h = (window.location.hash || '').replace(/^#/, ''); - return /^[a-z0-9][a-z0-9_]{0,31}$/.test(h) ? h : ''; + if (/^view=(howto|submit|submissions)$/.test(h)) return { view: h.slice(5), focus: '' }; + if (/^[a-z0-9][a-z0-9_]{0,31}$/.test(h)) return { view: 'browse', focus: h }; + return { view: 'browse', focus: '' }; } - var state = { view: 'browse', apps: [], cat: 'all', q: '', focus: readFocus(), + var _ph = parseHash(); + var state = { view: _ph.view, apps: [], cat: 'all', q: '', focus: _ph.focus, idx: null, channel: 'stable', signed: false, submissions: null }; var main = document.getElementById('main'); var cats = document.getElementById('cats'); @@ -430,12 +434,20 @@ else if (state.view === 'submissions') main.innerHTML = submissionsHtml(); else renderBrowse(); } - function go(view) { state.view = view; window.scrollTo(0, 0); render(); } + function setHash(h) { + try { history.replaceState(null, '', h ? ('#' + h) : (window.location.pathname + window.location.search)); } + catch (_) { window.location.hash = h; } + } + function go(view) { + state.view = view; state.focus = ''; + setHash(view === 'browse' ? '' : ('view=' + view)); + window.scrollTo(0, 0); render(); + } function toBrowse() { state.view = 'browse'; } function clearFocus() { - if (!state.focus) return; + if (!state.focus && state.view === 'browse') return; state.focus = ''; - if (window.location.hash) { try { history.replaceState(null, '', window.location.pathname + window.location.search); } catch (_) { window.location.hash = ''; } } + if (window.location.hash) setHash(''); } // ---- data ---- @@ -503,7 +515,7 @@ if (e.target.closest('#showall')) { clearFocus(); render(); } }); document.getElementById('q').addEventListener('input', function (e) { clearFocus(); toBrowse(); state.q = e.target.value; render(); }); - window.addEventListener('hashchange', function () { state.focus = readFocus(); if (state.focus) toBrowse(); render(); }); + window.addEventListener('hashchange', function () { var ph = parseHash(); state.view = ph.view; state.focus = ph.focus; render(); }); render(); load();