habitica-self-host/src/app/index.coffee

67 lines
2 KiB
CoffeeScript
Raw Normal View History

{get, view, ready} = require('derby').createApp module
## ROUTES ##
start = +new Date()
# Derby routes can be rendered on the client and the server
get '/:roomName?', (page, model, {roomName}) ->
roomName ||= 'home'
# Subscribes the model to any updates on this room's object. Calls back
# with a scoped model equivalent to:
# room = model.at "rooms.#{roomName}"
model.subscribe "rooms.#{roomName}", (err, room) ->
model.ref '_room', room
# setNull will set a value if the object is currently null or undefined
room.setNull 'welcome', "Welcome to #{roomName}!"
room.incr 'visits'
# This value is set for when the page initially renders
model.set '_timer', '0.0'
# Reset the counter when visiting a new route client-side
start = +new Date()
# Render will use the model data as well as an optional context object
page.render
roomName: roomName
randomUrl: parseInt(Math.random() * 1e9).toString(36)
## CONTROLLER FUNCTIONS ##
ready (model) ->
timer = null
# Expose the model as a global variable in the browser. This is fun in
# development, but it should be removed when writing an app
window.model = model
# Exported functions are exposed as a global in the browser with the same
# name as the module that includes Derby. They can also be bound to DOM
# events using the "x-bind" attribute in a template.
exports.stop = ->
# Any path name that starts with an underscore is private to the current
# client. Nothing set under a private path is synced back to the server.
model.set '_stopped', true
clearInterval timer
do exports.start = ->
model.set '_stopped', false
timer = setInterval ->
model.set '_timer', (((+new Date()) - start) / 1000).toFixed(1)
, 100
model.set '_showReconnect', true
exports.connect = ->
# Hide the reconnect link for a second after clicking it
model.set '_showReconnect', false
setTimeout (-> model.set '_showReconnect', true), 1000
model.socket.socket.connect()
exports.reload = -> window.location.reload()