69 lines
2.5 KiB
JavaScript
69 lines
2.5 KiB
JavaScript
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 });
|
|
});
|
|
}
|
|
});
|