Reset states properly when navigating to new url.
This commit is contained in:
parent
2fbebfa3f9
commit
0a53392258
4 changed files with 34 additions and 6 deletions
|
|
@ -58,10 +58,14 @@ when defined(js):
|
||||||
(s: int, r: kstring) => onEditPost(s, r, state))
|
(s: int, r: kstring) => onEditPost(s, r, state))
|
||||||
|
|
||||||
proc render*(state: EditBox, post: Post): VNode =
|
proc render*(state: EditBox, post: Post): VNode =
|
||||||
|
if state.post.id != post.id:
|
||||||
|
state.rawContent = none[kstring]()
|
||||||
|
state.status = Http200
|
||||||
|
|
||||||
if state.status != Http200:
|
if state.status != Http200:
|
||||||
return renderError("Couldn't retrieve raw post", state.status)
|
return renderError("Couldn't retrieve raw post", state.status)
|
||||||
|
|
||||||
if state.rawContent.isNone() or state.post.id != post.id:
|
if state.rawContent.isNone():
|
||||||
state.post = post
|
state.post = post
|
||||||
state.rawContent = none[kstring]()
|
state.rawContent = none[kstring]()
|
||||||
var params = @[("id", $post.id)]
|
var params = @[("id", $post.id)]
|
||||||
|
|
|
||||||
|
|
@ -13,9 +13,22 @@ type
|
||||||
profile: ProfileState
|
profile: ProfileState
|
||||||
newThread: NewThread
|
newThread: NewThread
|
||||||
|
|
||||||
|
proc copyLocation(loc: Location): Location =
|
||||||
|
# TODO: It sucks that I had to do this. We need a nice way to deep copy in JS.
|
||||||
|
Location(
|
||||||
|
hash: loc.hash,
|
||||||
|
host: loc.host,
|
||||||
|
hostname: loc.hostname,
|
||||||
|
href: loc.href,
|
||||||
|
pathname: loc.pathname,
|
||||||
|
port: loc.port,
|
||||||
|
protocol: loc.protocol,
|
||||||
|
search: loc.search
|
||||||
|
)
|
||||||
|
|
||||||
proc newState(): State =
|
proc newState(): State =
|
||||||
State(
|
State(
|
||||||
url: window.location,
|
url: copyLocation(window.location),
|
||||||
profile: newProfileState(),
|
profile: newProfileState(),
|
||||||
newThread: newNewThread()
|
newThread: newNewThread()
|
||||||
)
|
)
|
||||||
|
|
@ -25,8 +38,11 @@ proc onPopState(event: dom.Event) =
|
||||||
# This event is usually only called when the user moves back in their
|
# This event is usually only called when the user moves back in their
|
||||||
# history. I fire it in karaxutils.anchorCB as well to ensure the URL is
|
# history. I fire it in karaxutils.anchorCB as well to ensure the URL is
|
||||||
# always updated. This should be moved into Karax in the future.
|
# always updated. This should be moved into Karax in the future.
|
||||||
kout(kstring"New URL: ", window.location.href)
|
kout(kstring"New URL: ", window.location.href, " ", state.url.href)
|
||||||
state.url = window.location
|
if state.url.href != window.location.href:
|
||||||
|
state = newState() # Reload the state to remove stale data.
|
||||||
|
state.url = copyLocation(window.location)
|
||||||
|
|
||||||
redraw()
|
redraw()
|
||||||
|
|
||||||
type Params = Table[string, string]
|
type Params = Table[string, string]
|
||||||
|
|
|
||||||
|
|
@ -307,10 +307,14 @@ when defined(js):
|
||||||
|
|
||||||
proc renderPostList*(threadId: int, postId: Option[int],
|
proc renderPostList*(threadId: int, postId: Option[int],
|
||||||
currentUser: Option[User]): VNode =
|
currentUser: Option[User]): VNode =
|
||||||
|
if state.list.isSome() and state.list.get().thread.id != threadId:
|
||||||
|
state.list = none[PostList]()
|
||||||
|
state.status = Http200
|
||||||
|
|
||||||
if state.status != Http200:
|
if state.status != Http200:
|
||||||
return renderError("Couldn't retrieve posts.", state.status)
|
return renderError("Couldn't retrieve posts.", state.status)
|
||||||
|
|
||||||
if state.list.isNone or state.list.get().thread.id != threadId:
|
if state.list.isNone:
|
||||||
var params = @[("id", $threadId)]
|
var params = @[("id", $threadId)]
|
||||||
if postId.isSome():
|
if postId.isSome():
|
||||||
params.add(("anchor", $postId.get()))
|
params.add(("anchor", $postId.get()))
|
||||||
|
|
|
||||||
|
|
@ -57,10 +57,14 @@ when defined(js):
|
||||||
username: string,
|
username: string,
|
||||||
currentUser: Option[User]
|
currentUser: Option[User]
|
||||||
): VNode =
|
): VNode =
|
||||||
|
if state.profile.isSome() and state.profile.get().user.name != username:
|
||||||
|
state.profile = none[Profile]()
|
||||||
|
state.status = Http200
|
||||||
|
|
||||||
if state.status != Http200:
|
if state.status != Http200:
|
||||||
return renderError("Couldn't retrieve profile.", state.status)
|
return renderError("Couldn't retrieve profile.", state.status)
|
||||||
|
|
||||||
if state.profile.isNone or state.profile.get().user.name != username:
|
if state.profile.isNone:
|
||||||
let uri = makeUri("profile.json", ("username", username))
|
let uri = makeUri("profile.json", ("username", username))
|
||||||
ajaxGet(uri, @[], (s: int, r: kstring) => onProfile(s, r, state))
|
ajaxGet(uri, @[], (s: int, r: kstring) => onProfile(s, r, state))
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue