Reconcile the authenticated Hop homepage link with the concurrent prompt UI cache-busting update.

Hop-State: A_06FN8H69P46VDF0HK6YF5QR
Hop-Proposal: R_06FN8H5RRQKVJVY2JNSFBM0
Hop-Task: T_06FN8GMDFCS0GKTW2RRDQ70
Hop-Attempt: AT_06FN8H33JB50J4M5WD37BCR
This commit is contained in:
2026-07-11 20:00:22 -07:00
committed by Hop
parent 5d7bd57bea
commit 56755a77fd
4 changed files with 60 additions and 0 deletions
@@ -0,0 +1,17 @@
{
"id": "P_06FN8GMDFDHV1G2BH5CC6X0",
"task_id": "T_06FN8GMDFCS0GKTW2RRDQ70",
"attempt_id": "AT_06FN8GMDFF85Q3R6MQ1PSW0",
"state_id": "P_06FN8GMDFDHV1G2BH5CC6X0",
"prompt": "Can we add a Hop link to the nav bar only for authenticated users, that when clicked loads the Homepage that unathenticated users see",
"agent_name": "codex",
"status": "proposed",
"response_summary": "Add an authenticated-only Hop navbar link that displays the public landing homepage while preserving the signed-in navigation.",
"created_at": "2026-07-12T02:57:55.579767Z",
"metadata": {
"source_tree": "8de4a24376935a4fb3f5791b017591bd2fbc2848",
"git_commit": "67321dd93a25d30bddb0083706db2695bdabe622",
"attempt_head": "C_06FN8H1TPEWCZT16VNZPF0R",
"attempt_head_kind": "checkpoint"
}
}
+3
View File
@@ -23,6 +23,9 @@ docker compose --env-file "$env_file" cp \
docker compose --env-file "$env_file" cp \ docker compose --env-file "$env_file" cp \
deploy/gitea/templates/custom/footer.tmpl \ deploy/gitea/templates/custom/footer.tmpl \
gitea:/data/gitea/templates/custom/footer.tmpl gitea:/data/gitea/templates/custom/footer.tmpl
docker compose --env-file "$env_file" cp \
deploy/gitea/templates/custom/extra_links.tmpl \
gitea:/data/gitea/templates/custom/extra_links.tmpl
docker compose --env-file "$env_file" cp \ docker compose --env-file "$env_file" cp \
deploy/gitea/public/assets/js/hop-native.js \ deploy/gitea/public/assets/js/hop-native.js \
gitea:/data/gitea/public/assets/js/hop-native.js gitea:/data/gitea/public/assets/js/hop-native.js
@@ -372,6 +372,42 @@
} }
} }
function publicHomepageRequested() {
return new URLSearchParams(window.location.search).get('hop') === 'home';
}
async function loadPublicHomepage() {
const link = document.querySelector('[data-hop-public-home-link]');
if (link) link.classList.toggle('active', publicHomepageRequested());
if (!link || !publicHomepageRequested() || document.documentElement.dataset.hopPublicHome) return;
document.documentElement.dataset.hopPublicHome = 'loading';
try {
const publicURL = new URL(link.href, window.location.origin);
publicURL.search = '';
const response = await fetch(publicURL, {credentials: 'omit'});
if (!response.ok) throw new Error(`Could not load the Hop homepage (${response.status})`);
const publicDocument = new DOMParser().parseFromString(await response.text(), 'text/html');
const publicMain = publicDocument.querySelector('#hop-main');
const currentMain = document.querySelector('[role="main"]');
if (!publicMain || !currentMain) throw new Error('The Hop homepage was not present in the response');
for (const style of publicMain.parentElement?.querySelectorAll(':scope > style') || []) {
style.dataset.hopPublicHomeStyle = 'true';
document.head.append(style);
}
currentMain.replaceWith(publicMain);
document.title = publicDocument.title;
document.documentElement.dataset.hopPublicHome = 'rendered';
bindInstallationSwitchers();
bindInstallationCopyButtons();
} catch (error) {
delete document.documentElement.dataset.hopPublicHome;
console.error(error);
}
}
function applyHopSemantics() { function applyHopSemantics() {
const brandLogo = document.querySelector('#navbar-logo img'); const brandLogo = document.querySelector('#navbar-logo img');
if (brandLogo) brandLogo.src = brandLogo.src.replace(/\/img\/(?:logo|hop)\.svg(?:\?.*)?$/, '/img/hop.svg?v=4'); if (brandLogo) brandLogo.src = brandLogo.src.replace(/\/img\/(?:logo|hop)\.svg(?:\?.*)?$/, '/img/hop.svg?v=4');
@@ -383,6 +419,7 @@
renderPromptPage(); renderPromptPage();
bindInstallationSwitchers(); bindInstallationSwitchers();
bindInstallationCopyButtons(); bindInstallationCopyButtons();
void loadPublicHomepage();
document.documentElement.dataset.hopNative = 'true'; document.documentElement.dataset.hopNative = 'true';
} }
@@ -0,0 +1,3 @@
{{if .IsSigned}}
<a class="item" data-hop-public-home-link href="{{AppSubUrl}}/?hop=home">Hop</a>
{{end}}