habitica/src/app/party.coffee

151 lines
4.9 KiB
CoffeeScript
Raw Normal View History

_ = require('underscore')
2013-02-05 21:11:28 +00:00
schema = require './schema'
browser = require './browser'
_subscriptions =
party:
query: null
id: null
members:
query: null
ids: null
module.exports.partySubscribe = partySubscribe = (model, id, cb) ->
s = _subscriptions
###
# Note, this tries to unsubscribe from previous similar subscriptions so we don't have a memory leak. However,
# This causes the page to crash on refresh. We need to fix this in the future. Same goes for membersSubscribe
if s.party.query? and id == s.party.id
# No need to resubscribe, same parameters
return cb(model.at('_party'))
# already have a subscription, but we want a new one
if s.party.query? and s.party.id != id
s.party.query.unsubscribe()
s.party.query = null
###
# subscripe
s.party.query = model.query('parties').withId(id)
s.party.id = id
s.party.query.subscribe (err, res) ->
throw err if err
p = res.at(0)
model.ref '_party', p
2013-02-06 06:59:02 +00:00
# FIXME this is the kicker right here. This isn't getting triggered, and it's the reason why we have to refresh
# after every event. Get this working
# p.on '*', 'members', (ids) ->
# console.log("members listener got called")
# membersSubscribe model, ids
ids = p.get('members')
if !_.isEmpty(ids)
membersSubscribe model, ids, (m) ->
browser.resetDom(model) if window?
cb(p) if cb?
else
browser.resetDom(model) if window?
2013-02-06 06:59:02 +00:00
cb(p) if cb?
module.exports.membersSubscribe = membersSubscribe = (model, ids, cb) ->
s = _subscriptions
### @see above
if s.members.query? and !_.isEmpty(_.difference(s.members.ids, ids))
# No need to resubscribe, same parameters
return cb(model.at('_partyMembers'))
# already have a subscription, but we want a new one
if s.members.query? and _.isEmpty(_.difference(s.members.ids, ids))
s.members.query.unsubscribe()
s.members.query = null
###
# subscripe
s.members.query = model.query('users').party(ids)
s.members.ids = ids
s.members.query.subscribe (err, m) ->
throw err if err
model.ref '_partyMembers', m
# Here's a hack we need to get fixed (hopefully Lever will) - later model.queries override previous model.queries'
# returned fields. Aka, we need this here otherwise we only get the "public" fields for the current user, which
# are defined in model.query('users')party()
selfQ = model.query('users').withId(model.get('_userId') or model.session.userId)
model.subscribe selfQ, (err, users) ->
model.ref '_user', users.at(0)
cb(m) if cb?
module.exports.app = (appExports, model) ->
user = model.at('_user')
model.on 'set', '_user.party.invitation', (id) ->
2013-02-06 06:59:02 +00:00
partySubscribe(model, id) if id?
appExports.partyCreate = ->
newParty = model.get("_newParty")
id = model.add 'parties', { name: newParty, leader: user.get('id'), members: [user.get('id')], invites:[] }
user.set 'party', {current: id, invitation: null, leader: true}
partySubscribe model, id, -> $('#party-modal').modal('show')
appExports.partyInvite = ->
id = model.get('_newPartyMember').replace(/[\s"]/g, '')
return if _.isEmpty(id)
obj = user.get()
query = model.query('users').party([id])
model.fetch query, (err, res) ->
2013-02-05 21:11:28 +00:00
throw err if err
u = res.at(0).get()
if !u?.id?
model.set "_view.partyError", "User with id #{id} not found."
return
else if u.party.current? or u.party.invitation?
model.set "_view.partyError", "User already in a party or pending invitation."
return
else
p = model.at '_party'
p.push "invites", id
model.set "users.#{id}.party.invitation", p.get('id')
$.bootstrapGrowl "Invitation Sent."
$('#party-modal').modal('hide')
model.set '_newPartyMember', ''
membersSubscribe model, p.get('members'), ->
#window.location.reload(true)
appExports.partyAccept = ->
invitation = user.get('party.invitation')
partySubscribe model, invitation, (p) ->
p.push 'members', user.get('id')
user.set 'party.invitation', null
user.set 'party.current', p.get('id')
membersSubscribe model, p.get('members'), (m) ->
window.location.reload(true)
appExports.partyReject = ->
user.set 'party.invitation', null
model.set '_party', null
browser.resetDom(model)
2013-02-05 21:11:28 +00:00
# TODO splice parties.*.invites[key]
# TODO notify sender
appExports.partyLeave = ->
2013-02-05 23:52:29 +00:00
id = user.set 'party.current', null
p = model.at '_party'
members = p.get('members')
index = members.indexOf(user.get('id'))
2013-02-06 03:27:19 +00:00
members.splice(index,1)
p.set 'members', members
2013-02-05 23:23:56 +00:00
if (members.length == 0)
# last member out, kill the party
2013-02-05 23:52:29 +00:00
model.del "parties.#{id}"
#_subscriptions.party.query.unsubscribe()
#model.set '_party', null
#model.set '_partyMembers', null
#browser.resetDom()
setTimeout (-> window.location.reload true), 1
#exports.partyDisband = ->