Implements user dropdown and the ability to log out.
This commit is contained in:
parent
4d115622d6
commit
a7b616e63a
5 changed files with 70 additions and 8 deletions
|
|
@ -1170,8 +1170,11 @@ routes:
|
||||||
|
|
||||||
get "/karax/status.json":
|
get "/karax/status.json":
|
||||||
createTFD()
|
createTFD()
|
||||||
|
|
||||||
let user =
|
let user =
|
||||||
if c.loggedIn():
|
if @"logout" == "true":
|
||||||
|
logout(c); none[threadlist.User]()
|
||||||
|
elif c.loggedIn():
|
||||||
some(threadlist.User(
|
some(threadlist.User(
|
||||||
name: c.username,
|
name: c.username,
|
||||||
avatarUrl: c.email.getGravatarUrl(),
|
avatarUrl: c.email.getGravatarUrl(),
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ when defined(js):
|
||||||
include karax/prelude
|
include karax/prelude
|
||||||
import karax / [kajax]
|
import karax / [kajax]
|
||||||
|
|
||||||
import login, signup
|
import login, signup, usermenu
|
||||||
import karaxutils
|
import karaxutils
|
||||||
|
|
||||||
from dom import setTimeout, window, document, getElementById, focus
|
from dom import setTimeout, window, document, getElementById, focus
|
||||||
|
|
@ -22,12 +22,13 @@ when defined(js):
|
||||||
lastUpdate: Time
|
lastUpdate: Time
|
||||||
loginModal: LoginModal
|
loginModal: LoginModal
|
||||||
signupModal: SignupModal
|
signupModal: SignupModal
|
||||||
|
userMenu: UserMenu
|
||||||
|
|
||||||
proc newState(): State
|
proc newState(): State
|
||||||
var
|
var
|
||||||
state = newState()
|
state = newState()
|
||||||
|
|
||||||
proc getStatus
|
proc getStatus(logout: bool=false)
|
||||||
proc newState(): State =
|
proc newState(): State =
|
||||||
State(
|
State(
|
||||||
data: none[UserStatus](),
|
data: none[UserStatus](),
|
||||||
|
|
@ -40,6 +41,9 @@ when defined(js):
|
||||||
signupModal: newSignupModal(
|
signupModal: newSignupModal(
|
||||||
() => (state.lastUpdate = fromUnix(0); getStatus()),
|
() => (state.lastUpdate = fromUnix(0); getStatus()),
|
||||||
() => state.loginModal.show()
|
() => state.loginModal.show()
|
||||||
|
),
|
||||||
|
userMenu: newUserMenu(
|
||||||
|
() => (state.lastUpdate = fromUnix(0); getStatus(logout=true))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -53,19 +57,19 @@ when defined(js):
|
||||||
|
|
||||||
state.lastUpdate = getTime()
|
state.lastUpdate = getTime()
|
||||||
|
|
||||||
proc getStatus =
|
proc getStatus(logout: bool=false) =
|
||||||
if state.loading: return
|
if state.loading: return
|
||||||
let diff = getTime() - state.lastUpdate
|
let diff = getTime() - state.lastUpdate
|
||||||
if diff.minutes < 5:
|
if diff.minutes < 5:
|
||||||
return
|
return
|
||||||
|
|
||||||
state.loading = true
|
state.loading = true
|
||||||
let uri = makeUri("status.json")
|
let uri = makeUri("status.json", [("logout", $logout)])
|
||||||
ajaxGet(uri, @[], onStatus)
|
ajaxGet(uri, @[], onStatus)
|
||||||
|
|
||||||
proc renderHeader*(): VNode =
|
proc renderHeader*(): VNode =
|
||||||
if state.data.isNone:
|
if state.data.isNone:
|
||||||
getStatus()
|
getStatus() # TODO: Call this every render?
|
||||||
|
|
||||||
let user = state.data.map(x => x.user).flatten
|
let user = state.data.map(x => x.user).flatten
|
||||||
result = buildHtml(tdiv()): # TODO: Why do some buildHtml's need this?
|
result = buildHtml(tdiv()): # TODO: Why do some buildHtml's need this?
|
||||||
|
|
@ -91,7 +95,7 @@ when defined(js):
|
||||||
italic(class="fas fa-sign-in-alt")
|
italic(class="fas fa-sign-in-alt")
|
||||||
text " Log in"
|
text " Log in"
|
||||||
else:
|
else:
|
||||||
render(user.get(), "avatar")
|
render(state.userMenu, user.get())
|
||||||
|
|
||||||
# Modals
|
# Modals
|
||||||
render(state.loginModal)
|
render(state.loginModal)
|
||||||
|
|
|
||||||
|
|
@ -81,6 +81,13 @@ $logo-height: $navbar-height - 20px;
|
||||||
height: $logo-height;
|
height: $logo-height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.menu-right {
|
||||||
|
// To make sure the user menu doesn't move off the screen.
|
||||||
|
left: auto;
|
||||||
|
right: 0;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
// - Main buttons
|
// - Main buttons
|
||||||
#main-buttons {
|
#main-buttons {
|
||||||
margin-top: $control-padding-y*2;
|
margin-top: $control-padding-y*2;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import strformat, times, options, json, httpcore
|
import strformat, times, options, json, httpcore, sugar
|
||||||
|
|
||||||
import category
|
import category
|
||||||
|
|
||||||
|
|
|
||||||
48
redesign/usermenu.nim
Normal file
48
redesign/usermenu.nim
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
|
||||||
|
when defined(js):
|
||||||
|
import sugar
|
||||||
|
|
||||||
|
include karax/prelude
|
||||||
|
import karax/[vstyles]
|
||||||
|
import karaxutils
|
||||||
|
|
||||||
|
import threadlist
|
||||||
|
type
|
||||||
|
UserMenu* = ref object
|
||||||
|
shown: bool
|
||||||
|
user: User
|
||||||
|
onLogout: proc ()
|
||||||
|
|
||||||
|
proc newUserMenu*(onLogout: proc ()): UserMenu =
|
||||||
|
UserMenu(
|
||||||
|
shown: false,
|
||||||
|
onLogout: onLogout
|
||||||
|
)
|
||||||
|
|
||||||
|
proc render*(state: UserMenu, user: User): VNode =
|
||||||
|
result = buildHtml():
|
||||||
|
tdiv():
|
||||||
|
figure(class="avatar c-hand",
|
||||||
|
onClick=(e: Event, n: VNode) => (state.shown = true)):
|
||||||
|
img(src=user.avatarUrl, title=user.name)
|
||||||
|
if user.isOnline:
|
||||||
|
italic(class="avatar-presense online")
|
||||||
|
|
||||||
|
ul(class="menu menu-right", style=style(
|
||||||
|
StyleAttr.display, if state.shown: "inherit" else: "none"
|
||||||
|
)):
|
||||||
|
li(class="menu-item"):
|
||||||
|
tdiv(class="tile tile-centered"):
|
||||||
|
tdiv(class="tile-icon"):
|
||||||
|
img(class="avatar", src=user.avatarUrl,
|
||||||
|
title=user.name)
|
||||||
|
tdiv(class="tile-content"):
|
||||||
|
text user.name
|
||||||
|
li(class="divider")
|
||||||
|
li(class="menu-item"):
|
||||||
|
a(href=makeUri("/profile/" & user.name)):
|
||||||
|
text "My profile"
|
||||||
|
li(class="menu-item c-hand"):
|
||||||
|
a(onClick = (e: Event, n: VNode) =>
|
||||||
|
(state.shown=false; state.onLogout())):
|
||||||
|
text "Logout"
|
||||||
Loading…
Add table
Add a link
Reference in a new issue