var api = require('../../utils/api'); var bracket = require('../../utils/bracket'); Page({ data: { loading: true, error: '', test: null, left: null, right: null, round: 1, progress: 0, completed: 0, totalDecisions: 0 }, onLoad: function (options) { this.slug = options.slug; this.load(); }, load: function () { var self = this; api.request('/api/v1/tests/' + this.slug).then(function (test) { self.test = test; self.state = bracket.create(test.candidates); self.totalDecisions = test.candidates.length - 1; self.refreshPair(); self.setData({ loading: false, test: test, totalDecisions: self.totalDecisions }); }).catch(function (error) { self.setData({ loading: false, error: error.message || '加载失败' }); }); }, refreshPair: function () { var pair = bracket.current(this.state); this.setData({ left: pair && pair[0], right: pair && pair[1], round: this.state.round, completed: this.state.decisions.length, progress: Math.round(this.state.decisions.length / this.totalDecisions * 100) }); }, choose: function (event) { if (this.choosing) return; this.choosing = true; var side = event.currentTarget.dataset.side; var winner = side === 'left' ? this.data.left : this.data.right; var finished = bracket.choose(this.state, winner); if (finished) this.complete(); else { this.refreshPair(); this.choosing = false; } }, complete: function () { var self = this; var champion = this.state.pool[0]; var finalDecision = this.state.decisions[this.state.decisions.length - 1]; var runnerUpId = finalDecision.left_id === champion.id ? finalDecision.right_id : finalDecision.left_id; this.setData({ progress: 100, submitting: true }); api.ensureLogin().then(function () { return api.request('/api/v1/tests/' + self.slug + '/runs', { method: 'POST', data: { app_key: 'hub', champion_id: champion.id, runner_up_id: runnerUpId, ranking_ids: bracket.ranking(self.state), decisions: self.state.decisions } }); }).then(function (result) { xhs.setStorageSync('pk_last_result', result); xhs.redirectTo({ url: '/pages/result/result?id=' + result.id }); }).catch(function (error) { self.choosing = false; self.setData({ submitting: false }); xhs.showModal({ title: '结果保存失败', content: error.message || '请检查网络后重试', showCancel: false }); }); } });