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,43 +75,41 @@ 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
delay = if diff < $.MINUTE data.info.date
$.SECOND - (diff + $.SECOND / 2) % $.SECOND else
else if diff < $.HOUR new Date +data.dataset.utc
$.MINUTE - (diff + $.MINUTE / 2) % $.MINUTE now or= new Date()
else if diff < $.DAY diff = now - date
$.HOUR - (diff + $.HOUR / 2) % $.HOUR relative = RelativeDates.relative diff, now, date
else if isPost
$.DAY - (diff + $.DAY / 2) % $.DAY for singlePost in [data].concat data.clones
setTimeout markStale, delay singlePost.nodes.date.firstChild.textContent = relative
else
update = (now) -> data.firstChild.textContent = relative
date = if post RelativeDates.setOwnTimeout diff, data
post.info.date setOwnTimeout: (diff, data) ->
else delay = if diff < $.MINUTE
new Date +el.dataset.utc $.SECOND - (diff + $.SECOND / 2) % $.SECOND
diff = now - date else if diff < $.HOUR
relative = RelativeDates.relative diff, now, date $.MINUTE - (diff + $.MINUTE / 2) % $.MINUTE
if post else if diff < $.DAY
for singlePost in [post].concat post.clones $.HOUR - (diff + $.HOUR / 2) % $.HOUR
singlePost.nodes.date.firstChild.textContent = relative else
else $.DAY - (diff + $.DAY / 2) % $.DAY
el.firstChild.textContent = RelativeDates.relative diff, now, date setTimeout RelativeDates.markStale, delay, data
setOwnTimeout diff markStale: (data) ->
return if data in RelativeDates.stale # We can call RelativeDates.update() multiple times.
markStale = -> RelativeDates.stale.push update return if data instanceof Post and !g.posts[data.fullID] # collected post.
RelativeDates.stale.push data
# Kick off initial timeout.
update new Date()