Refactor RelativeDates, and fix the last index refresh timer not being always updated.

This commit is contained in:
Mayhem 2013-11-19 11:55:39 +01:00
parent f12ba5ee64
commit a6d41a0de0
3 changed files with 35 additions and 46 deletions

View File

@ -1,4 +1,4 @@
[<a href="./catalog">Catalog</a>]&nbsp; [<a href="./catalog">Catalog</a>]&nbsp;
[<time id="index-last-refresh" title="Last index refresh" data-init="1">...</time>]&nbsp; [<time id="index-last-refresh" title="Last index refresh">...</time>]&nbsp;
<input type="search" id="index-search" class="field" placeholder="Search"> <input type="search" id="index-search" class="field" placeholder="Search">
<a id="index-search-clear" class="fa fa-times-circle" href="javascript:;"></a> <a id="index-search-clear" class="fa fa-times-circle" href="javascript:;"></a>

View File

@ -225,16 +225,7 @@ Index =
timeEl = $ '#index-last-refresh', Index.navLinks timeEl = $ '#index-last-refresh', Index.navLinks
timeEl.dataset.utc = e.timeStamp <% if (type === 'userscript') { %>/ 1000<% } %> timeEl.dataset.utc = e.timeStamp <% if (type === 'userscript') { %>/ 1000<% } %>
if timeEl.dataset.init RelativeDates.update timeEl
RelativeDates.setUpdate el: timeEl
<% if (type === 'userscript') { %>
# XXX https://github.com/greasemonkey/greasemonkey/issues/1571
timeEl.removeAttribute 'data-init'
<% } else { %>
delete timeEl.dataset.init
<% } %>
else
RelativeDates.flush()
Index.scrollToIndex() Index.scrollToIndex()
parse: (pages) -> parse: (pages) ->
Index.parseThreadList pages Index.parseThreadList pages

View File

@ -25,7 +25,7 @@ RelativeDates =
dateEl = @nodes.date dateEl = @nodes.date
dateEl.title = dateEl.textContent dateEl.title = dateEl.textContent
RelativeDates.setUpdate post: @ RelativeDates.update @
# diff is milliseconds from now. # diff is milliseconds from now.
relative: (diff, now, date) -> relative: (diff, now, date) ->
@ -75,18 +75,31 @@ RelativeDates =
return if d.hidden return if d.hidden
now = new Date() now = new Date()
update now for update in RelativeDates.stale RelativeDates.update data, now for data in RelativeDates.stale
RelativeDates.stale = [] RelativeDates.stale = []
# Reset automatic flush. # Reset automatic flush.
clearTimeout RelativeDates.timeout clearTimeout RelativeDates.timeout
RelativeDates.timeout = setTimeout RelativeDates.flush, RelativeDates.INTERVAL RelativeDates.timeout = setTimeout RelativeDates.flush, RelativeDates.INTERVAL
# Create function `update()`, closed over post, that, when called # `update()`, when called from `flush()`, updates the elements,
# from `flush()`, updates the elements, and re-calls `setOwnTimeout()` to # and re-calls `setOwnTimeout()` to re-add `data` to the stale list later.
# re-add `update()` to the stale list later. update: (data, now) ->
setUpdate: ({post, el}) -> isPost = data instanceof Post
setOwnTimeout = (diff) -> date = if isPost
data.info.date
else
new Date +data.dataset.utc
now or= new Date()
diff = now - date
relative = RelativeDates.relative diff, now, date
if isPost
for singlePost in [data].concat data.clones
singlePost.nodes.date.firstChild.textContent = relative
else
data.firstChild.textContent = relative
RelativeDates.setOwnTimeout diff, data
setOwnTimeout: (diff, data) ->
delay = if diff < $.MINUTE delay = if diff < $.MINUTE
$.SECOND - (diff + $.SECOND / 2) % $.SECOND $.SECOND - (diff + $.SECOND / 2) % $.SECOND
else if diff < $.HOUR else if diff < $.HOUR
@ -95,23 +108,8 @@ RelativeDates =
$.HOUR - (diff + $.HOUR / 2) % $.HOUR $.HOUR - (diff + $.HOUR / 2) % $.HOUR
else else
$.DAY - (diff + $.DAY / 2) % $.DAY $.DAY - (diff + $.DAY / 2) % $.DAY
setTimeout markStale, delay setTimeout RelativeDates.markStale, delay, data
markStale: (data) ->
update = (now) -> return if data in RelativeDates.stale # We can call RelativeDates.update() multiple times.
date = if post return if data instanceof Post and !g.posts[data.fullID] # collected post.
post.info.date RelativeDates.stale.push data
else
new Date +el.dataset.utc
diff = now - date
relative = RelativeDates.relative diff, now, date
if post
for singlePost in [post].concat post.clones
singlePost.nodes.date.firstChild.textContent = relative
else
el.firstChild.textContent = RelativeDates.relative diff, now, date
setOwnTimeout diff
markStale = -> RelativeDates.stale.push update
# Kick off initial timeout.
update new Date()