From 2230ce66888cf0ee49ff09fd1a472fecba833c7a Mon Sep 17 00:00:00 2001 From: Tyler Renelle Date: Wed, 22 May 2013 00:40:46 +0100 Subject: [PATCH] habitpg-shared: move viewHelpers to misc, add hydrate() function (see https://github.com/codeparty/racer/issues/116) to prevent data-loss on user.get() --- src/app/index.coffee | 13 ++++++------- src/app/{viewHelpers.coffee => misc.coffee} | 16 ++++++++++++++-- src/app/tasks.coffee | 11 +++++++---- 3 files changed, 27 insertions(+), 13 deletions(-) rename src/app/{viewHelpers.coffee => misc.coffee} (80%) diff --git a/src/app/index.coffee b/src/app/index.coffee index 23e060dca9..58b760ac26 100644 --- a/src/app/index.coffee +++ b/src/app/index.coffee @@ -17,7 +17,7 @@ i18n.localize app, urlScheme: false checkHeader: true -require('./viewHelpers').setup view +require('./misc').viewHelpers view _ = require('lodash') algos = require 'habitrpg-shared/script/algos' @@ -135,11 +135,9 @@ ready (model) -> require('./unlock').app(exports, model) require('./filters').app(exports, model) - ### - Cron - ### - if algos.shouldCron(user) - uObj = _.cloneDeep user.get() # need to clone, else derby won't catch model.set()'s after obj property sets + cron = -> + #return setTimeout(cron, 1) if model._txnQueue.length > 0 + uObj = _.cloneDeep misc.hydrate(user.get()) # need to clone, else derby won't catch model.set()'s after obj property sets # habitrpg-shared/algos requires uObj.habits, uObj.dailys etc instead of uObj.tasks _.each ['habit','daily','todo','reward'], (type) -> uObj["#{type}s"] = _.where(uObj.tasks, {type:type}); true @@ -149,4 +147,5 @@ ready (model) -> _.each paths, (v,k) -> user.pass({cron:true}).set(k,helpers.dotGet(k, uObj)); true if lostHp browser.resetDom(model) - setTimeout (-> user.set('stats.hp', uObj.stats.hp)), 750 \ No newline at end of file + setTimeout (-> user.set('stats.hp', uObj.stats.hp)), 750 + cron() if algos.shouldCron {lastCron: user.get('lastCron'), preferences: user.get('preferences')} \ No newline at end of file diff --git a/src/app/viewHelpers.coffee b/src/app/misc.coffee similarity index 80% rename from src/app/viewHelpers.coffee rename to src/app/misc.coffee index 25a0d6af16..b39399aa97 100644 --- a/src/app/viewHelpers.coffee +++ b/src/app/misc.coffee @@ -1,9 +1,18 @@ -_ = require 'underscore' +_ = require 'lodash' algos = require 'habitrpg-shared/script/algos' items = require('habitrpg-shared/script/items').items helpers = require('habitrpg-shared/script/helpers') -module.exports.setup = (view) -> +### + Make sure model.get() returns all properties, see https://github.com/codeparty/racer/issues/116 +### +module.exports.hydrate = hydrate = (spec, hydrated={}) -> + if _.isPlainObject(spec) + hydrated[k] = hydrate(v, hydrated[k]) for k,v of spec + hydrated + else spec + +module.exports.viewHelpers = (view) -> #misc view.fn "percent", (x, y) -> @@ -23,6 +32,9 @@ module.exports.setup = (view) -> view.fn "or", -> _.reduce arguments, (cumm, curr) -> cumm || curr view.fn "truarr", (num) -> num-1 view.fn 'count', (arr) -> arr?.length or 0 + view.fn 'int', + get: (num) -> num + set: (num) -> parseInt(num) #iCal view.fn "encodeiCalLink", helpers.encodeiCalLink diff --git a/src/app/tasks.coffee b/src/app/tasks.coffee index caace2a741..2d18c95a77 100644 --- a/src/app/tasks.coffee +++ b/src/app/tasks.coffee @@ -2,6 +2,7 @@ algos = require 'habitrpg-shared/script/algos' helpers = require 'habitrpg-shared/script/helpers' _ = require 'lodash' moment = require 'moment' +misc = require './misc' ### @@ -18,12 +19,14 @@ module.exports.app = (appExports, model) -> perform the updates while tracking paths, then all the values at those paths ### score = (taskId, direction) -> - uObj = _.cloneDeep user.get() # need to clone, else derby won't catch model.set()'s after obj property sets +# return setTimeout( (-> score(taskId, direction)), 500) if model._txnQueue.length > 0 + + uObj = _.cloneDeep misc.hydrate(user.get()) # see https://github.com/codeparty/racer/issues/116 tObj = uObj.tasks[taskId] # Stuff for undo tObjBefore = _.cloneDeep tObj - tObjBefore.completed = !tObjBefore.completed if tObj.type in ['daily', 'todo'] + tObjBefore.completed = !tObj.completed if tObj.type in ['daily', 'todo'] setUndo uObj.stats, tObjBefore # set previous state for undo paths = {} @@ -134,9 +137,9 @@ module.exports.app = (appExports, model) -> Call scoring functions for habits & rewards (todos & dailies handled below) ### appExports.score = (e, el) -> - task = model.at $(el).parents('li')[0] + id = $(el).parents('li').attr('data-id') direction = $(el).attr('data-direction') - score(task.get('id'), direction) + score(id, direction) ### This is how we handle appExports.score for todos & dailies. Due to Derby's special handling of `checked={:task.completd}`,