71 lines
2.5 KiB
CoffeeScript
71 lines
2.5 KiB
CoffeeScript
class TeamStore extends Backbone.Collection
|
|
model: Team
|
|
|
|
initialize: ->
|
|
@on('add remove reset remoteSync', @saveLocally)
|
|
@loadLocally()
|
|
|
|
# Only locally save teams without an id or is trying to save.
|
|
unsavedTeams: =>
|
|
@filter((team) -> !team.id || team.get('saving'))
|
|
|
|
saveLocally: =>
|
|
teams = @unsavedTeams()
|
|
json = _.map(teams, (team) -> team.toJSON())
|
|
try
|
|
window.localStorage.setItem('local_teams', JSON.stringify(json))
|
|
catch
|
|
console.error("Failed to save teams locally.")
|
|
|
|
loadLocally: =>
|
|
try
|
|
json = window.localStorage.getItem('local_teams')
|
|
return unless json
|
|
teams = JSON.parse(json)
|
|
@add(teams) if teams.length > 0
|
|
catch
|
|
console.error("Failed to load teams locally.")
|
|
|
|
saveRemotely: =>
|
|
teams = @unsavedTeams()
|
|
team.save() for team in teams
|
|
|
|
PokeBattle.TeamStore = new TeamStore()
|
|
|
|
PokeBattle.primus.on 'receiveTeams', (remoteTeams) ->
|
|
remoteTeams = remoteTeams.map (team) ->
|
|
team.teambuilder = true
|
|
new Team(team)
|
|
|
|
# First, find teams that are already saved locally -- these exclude deleted
|
|
# teams on either side. The remote copy of the team is checked against the
|
|
# local copy of the team. If they differ, display a modal asking whether to
|
|
# override or keep the local changes.
|
|
ids = PokeBattle.TeamStore.pluck('id')
|
|
for remoteTeam in remoteTeams when remoteTeam.id in ids
|
|
remoteJSON = remoteTeam.toJSON()
|
|
localTeam = PokeBattle.TeamStore.get(remoteTeam.id)
|
|
unsavedTeam = localTeam.clone()
|
|
unsavedTeam.set(localTeam.previousAttributes(), silent: true)
|
|
localJSON = unsavedTeam.toJSON()
|
|
if !_.isEqual(remoteJSON, localJSON)
|
|
# Whoa! Versions are different! Let's ask the user what to do.
|
|
teamText = PokeBattle.exportTeam(remoteJSON.pokemon)
|
|
domId = "teams-differ-#{remoteTeam.id}"
|
|
$modal = PokeBattle.modal('modals/teams_differ', domId, {teamText})
|
|
$modal.find('textarea').first().focus()
|
|
do (localTeam, remoteJSON) ->
|
|
# We want to override the current version with the one on the server.
|
|
# This is extremely hacky due to hidden state and clones everywhere on
|
|
# the teambuilder.
|
|
$modal.find('.button_override').one 'click', ->
|
|
localTeam.set(remoteJSON, silent: true)
|
|
localTeam.trigger('render', localTeam)
|
|
$modal.modal('hide')
|
|
|
|
# Now, add teams we haven't seen yet to the store.
|
|
PokeBattle.TeamStore.add(remoteTeams)
|
|
|
|
PokeBattle.primus.on 'loginSuccess', ->
|
|
PokeBattle.primus.send('requestTeams')
|