Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 20 additions & 14 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -215,21 +215,16 @@ var Template = `
<a href="/home"><img src="/home.png?` + Version + `"><span class="label">Home</span></a>
<a href="/blog"><img src="/post.png?` + Version + `"><span class="label">Blog</span></a>
<a href="/chat"><img src="/chat.png?` + Version + `"><span class="label">Chat</span></a>
<a id="nav-mail" href="/mail" style="display: none;"><img src="/mail.png?` + Version + `"><span class="label">Mail</span><span id="nav-mail-badge"></span></a>
<a id="nav-mail" href="/mail"><img src="/mail.png?` + Version + `"><span class="label">Mail</span><span id="nav-mail-badge"></span></a>
<a href="/news"><img src="/news.png?` + Version + `"><span class="label">News</span></a>
<a href="/video"><img src="/video.png?` + Version + `"><span class="label">Video</span></a>
<a href="/markets"><img src="/markets.png?` + Version + `"><span class="label">Markets</span></a>
<a href="/places"><img src="/places.png?` + Version + `"><span class="label">Places</span></a>
<a href="/weather"><img src="/weather.png?` + Version + `"><span class="label">Weather</span></a>
<a href="/reminder"><img src="/reminder.png?` + Version + `"><span class="label">Reminder</span></a>
<a id="nav-wallet" href="/wallet" style="display: none;"><img src="/wallet.png?` + Version + `"><span class="label">Wallet</span></a>
</div>
<div class="nav-bottom">
<div id="nav-username" style="display: none;"></div>
<a id="nav-account" href="/account" style="display: none;"><img src="/account.png?` + Version + `"><span class="label">Account</span></a>
<a id="nav-logout" href="/logout" style="display: none;"><img src="/logout.png?` + Version + `"><span class="label">Logout</span></a>
<a id="nav-login" href="/login"><img src="/account.png?` + Version + `"><span class="label">Login</span></a>
<a id="nav-wallet" href="/wallet"><img src="/wallet.png?` + Version + `"><span class="label">Wallet</span></a>
</div>
<div class="nav-bottom">%s</div>
</div>
<div id="content">
<h1 id="page-title">%s</h1>
Expand Down Expand Up @@ -263,6 +258,12 @@ var CardTemplate = `
</div>
`

var navBottomLogin = `<a id="nav-login" href="/login"><img src="/account.png?` + Version + `"><span class="label">Login</span></a>`

var navBottomAccount = `<div id="nav-username"></div>` +
`<a id="nav-account" href="/account"><img src="/account.png?` + Version + `"><span class="label">Account</span></a>` +
`<a id="nav-logout" href="/logout"><img src="/logout.png?` + Version + `"><span class="label">Logout</span></a>`

var LoginTemplate = `<html lang="en">
<head>
<title>Login | Mu</title>
Expand Down Expand Up @@ -657,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))
}

Expand Down Expand Up @@ -921,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
Expand All @@ -945,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 {
Expand Down
48 changes: 2 additions & 46 deletions app/html/mu.js
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand All @@ -612,44 +598,14 @@ 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();
})
.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();
});
Expand Down
6 changes: 3 additions & 3 deletions mail/mail.go
Original file line number Diff line number Diff line change
Expand Up @@ -921,7 +921,7 @@ func Handler(w http.ResponseWriter, r *http.Request) {
</div>
</div>
`, 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
}

Expand Down Expand Up @@ -954,7 +954,7 @@ func Handler(w http.ResponseWriter, r *http.Request) {
</div>
`, replyTo, to, subject, backLink, backLink)

w.Write([]byte(app.RenderHTML(pageTitle, "", composeForm)))
w.Write([]byte(app.RenderHTMLForRequest(pageTitle, "", composeForm, r)))
return
}

Expand Down Expand Up @@ -1099,7 +1099,7 @@ func Handler(w http.ResponseWriter, r *http.Request) {
Content: `<div id="mailbox">` + content + `</div>`,
})

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
Expand Down