From 8114fda4d20d4ae0f5be0aad18a8a95f1bf9e9ae Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Feb 2026 10:11:36 +0000 Subject: [PATCH 1/3] Initial plan From 234e129ca6564a341d2ecdb8b051d463219f9c52 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Feb 2026 10:19:03 +0000 Subject: [PATCH 2/3] Remove sidebar flickering by always showing all nav links Co-authored-by: asim <17530+asim@users.noreply.github.com> --- app/app.go | 11 +++++------ app/html/mu.js | 48 ++---------------------------------------------- 2 files changed, 7 insertions(+), 52 deletions(-) diff --git a/app/app.go b/app/app.go index d3823575..71c1f737 100644 --- a/app/app.go +++ b/app/app.go @@ -215,20 +215,19 @@ var Template = ` Home Blog Chat - + Mail News Video Markets Places Weather Reminder - + Wallet
diff --git a/app/html/mu.js b/app/html/mu.js index 47b9013d..8268d17f 100644 --- a/app/html/mu.js +++ b/app/html/mu.js @@ -575,27 +575,13 @@ function setSession() { }); }) .then(sess => { - console.log('Success:', sess); - // Nav elements (sidebar) - var navMail = document.getElementById("nav-mail"); - var navWallet = document.getElementById("nav-wallet"); - var navAccount = document.getElementById("nav-account"); - var navLogout = document.getElementById("nav-logout"); - var navLogin = document.getElementById("nav-login"); var navMailBadge = document.getElementById("nav-mail-badge"); var navUsername = document.getElementById("nav-username"); - + if (sess.type == "account") { isAuthenticated = true; - // Show authenticated nav items - if (navMail) navMail.style.display = 'flex'; - if (navWallet) navWallet.style.display = 'flex'; - if (navAccount) navAccount.style.display = 'flex'; - if (navLogout) navLogout.style.display = 'flex'; - if (navLogin) navLogin.style.display = 'none'; if (navUsername && sess.account) { navUsername.textContent = 'Signed in as @' + sess.account; - navUsername.style.display = 'block'; } // Fetch unread mail count for badge fetch('/mail?unread=count') @@ -612,19 +598,7 @@ function setSession() { } } else { isAuthenticated = false; - // Hide authenticated nav items, show login - if (navMail) navMail.style.display = 'none'; - if (navWallet) navWallet.style.display = 'none'; - if (navAccount) navAccount.style.display = 'none'; - if (navLogout) navLogout.style.display = 'none'; - if (navLogin) { - navLogin.style.display = 'flex'; - // Update login link to include redirect parameter - if (window.location.pathname !== '/login' && window.location.pathname !== '/signup' && window.location.pathname !== '/') { - const redirectUrl = encodeURIComponent(window.location.pathname + window.location.search); - navLogin.href = '/login?redirect=' + redirectUrl; - } - } + if (navUsername) navUsername.textContent = ''; } updateChatFormState(); updateSearchFormsState(); @@ -632,24 +606,6 @@ function setSession() { .catch(error => { console.error('Error:', error); isAuthenticated = false; - var navMail = document.getElementById("nav-mail"); - var navWallet = document.getElementById("nav-wallet"); - var navAccount = document.getElementById("nav-account"); - var navLogout = document.getElementById("nav-logout"); - var navLogin = document.getElementById("nav-login"); - if (navMail) navMail.style.display = 'none'; - if (navWallet) navWallet.style.display = 'none'; - if (navAccount) navAccount.style.display = 'none'; - if (navLogout) navLogout.style.display = 'none'; - if (navLogin) { - navLogin.style.display = 'flex'; - // Update login link to include redirect parameter - if (window.location.pathname !== '/login' && window.location.pathname !== '/signup' && window.location.pathname !== '/') { - const redirectUrl = encodeURIComponent(window.location.pathname + window.location.search); - navLogin.href = '/login?redirect=' + redirectUrl; - } - } - updateChatFormState(); updateSearchFormsState(); }); From b7f3b5a75e57c0d583365ae0e2c9049fb8e3df75 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Feb 2026 13:45:47 +0000 Subject: [PATCH 3/3] Server-side render Login vs Account/Logout in nav-bottom based on session Co-authored-by: asim <17530+asim@users.noreply.github.com> --- app/app.go | 29 ++++++++++++++++++----------- mail/mail.go | 6 +++--- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/app/app.go b/app/app.go index 71c1f737..503a6576 100644 --- a/app/app.go +++ b/app/app.go @@ -224,11 +224,7 @@ var Template = ` Reminder Wallet
- +

%s

@@ -262,6 +258,12 @@ var CardTemplate = `
` +var navBottomLogin = `Login` + +var navBottomAccount = `` + + `Account` + + `Logout` + var LoginTemplate = ` Login | Mu @@ -656,7 +658,7 @@ func Account(w http.ResponseWriter, r *http.Request) { adminLinks, ) - html := RenderHTML("Account", "Account", content) + html := RenderHTMLForRequest("Account", "Account", content, r) w.Write([]byte(html)) } @@ -920,21 +922,26 @@ func GetUserLanguage(r *http.Request) string { // RenderHTML renders the given html in a template with default language (English) func RenderHTML(title, desc, html string) string { - return RenderHTMLWithLang(title, desc, html, "en") + return RenderHTMLWithLang(title, desc, html, "en", navBottomLogin) } // RenderHTMLForRequest renders the given html in a template using the user's language preference +// and server-side session check to render the correct nav-bottom (login or account/logout). func RenderHTMLForRequest(title, desc, html string, r *http.Request) string { lang := GetUserLanguage(r) - return RenderHTMLWithLang(title, desc, html, lang) + _, acc := auth.TrySession(r) + if acc != nil { + return RenderHTMLWithLang(title, desc, html, lang, navBottomAccount) + } + return RenderHTMLWithLang(title, desc, html, lang, navBottomLogin) } // RenderHTMLWithLang renders the given html in a template with specified language -func RenderHTMLWithLang(title, desc, html, lang string) string { +func RenderHTMLWithLang(title, desc, html, lang, navBottom string) string { if lang == "" { lang = "en" } - return fmt.Sprintf(Template, lang, title, desc, "", title, html) + return fmt.Sprintf(Template, lang, title, desc, "", navBottom, title, html) } // RenderString renders a markdown string as html @@ -944,7 +951,7 @@ func RenderString(v string) string { // RenderTemplate renders a markdown string in a html template func RenderTemplate(title string, desc, text string) string { - return fmt.Sprintf(Template, "en", title, desc, "", title, RenderString(text)) + return fmt.Sprintf(Template, "en", title, desc, "", navBottomLogin, title, RenderString(text)) } func ServeHTML(html string) http.Handler { diff --git a/mail/mail.go b/mail/mail.go index c60d9e19..393e718a 100644 --- a/mail/mail.go +++ b/mail/mail.go @@ -921,7 +921,7 @@ func Handler(w http.ResponseWriter, r *http.Request) { `, otherPartyDisplay, threadHTML.String(), msgID, otherParty, replySubject, replyToID, msg.ID, blockButton) - w.Write([]byte(app.RenderHTML(decodedSubject, "", messageView))) + w.Write([]byte(app.RenderHTMLForRequest(decodedSubject, "", messageView, r))) return } @@ -954,7 +954,7 @@ func Handler(w http.ResponseWriter, r *http.Request) { `, replyTo, to, subject, backLink, backLink) - w.Write([]byte(app.RenderHTML(pageTitle, "", composeForm))) + w.Write([]byte(app.RenderHTMLForRequest(pageTitle, "", composeForm, r))) return } @@ -1099,7 +1099,7 @@ func Handler(w http.ResponseWriter, r *http.Request) { Content: `
` + content + `
`, }) - w.Write([]byte(app.RenderHTML(title, "Your messages", pageHTML))) + w.Write([]byte(app.RenderHTMLForRequest(title, "Your messages", pageHTML, r))) } // renderThreadPreview renders a thread preview showing the latest message but linking to root