|
1 |
| -define(['components/signalr', 'knockout'], function (signalr, ko) { |
2 |
| - |
3 |
| - // state 'enum' |
4 |
| - var stateInit = 0; |
5 |
| - var stateRunning = 1; |
6 |
| - var statePaused = 2; |
7 |
| - var stateStopped = 3; |
8 |
| - var stateFinished = 4; |
9 |
| - |
10 |
| - function TimeManager() { |
11 |
| - |
12 |
| - var scale = Math.pow(10, 7); |
13 |
| - var remaining = 120; |
14 |
| - var self = this; |
15 |
| - |
16 |
| - this.hostState = stateInit; |
17 |
| - this.timerId = null; |
18 |
| - this.endTime = null; |
19 |
| - |
20 |
| - this.totalDuration = remaining; |
21 |
| - this.plannedDuration = ko.observable(remaining.toString()); |
22 |
| - this.remainingDuration = ko.observable(""); |
23 |
| - this.progress = ko.observable(0); |
24 |
| - |
25 |
| - formatDuration = function (duration) { |
26 |
| - |
27 |
| - var remainingMinutes = parseInt(duration / 60); |
28 |
| - var remainingSeconds = parseInt(duration % 60); |
29 |
| - |
30 |
| - self.totalDuration = duration; |
31 |
| - return remainingMinutes + ":" + (remainingSeconds < 10 ? "0" : "") + remainingSeconds; |
32 |
| - }; |
33 |
| - |
34 |
| - this.getTicks = function (dateTime) { |
35 |
| - |
36 |
| - return ((dateTime.getTime() * 10000) + 621355968000000000); |
37 |
| - } |
38 |
| - |
39 |
| - this.updateTime = function () { |
40 |
| - |
41 |
| - var duration = 0; |
42 |
| - |
43 |
| - switch (self.hostState) { |
44 |
| - |
45 |
| - case stateInit: |
46 |
| - duration = parseInt(self.plannedDuration()); |
47 |
| - break; |
48 |
| - |
49 |
| - case stateRunning: |
50 |
| - |
51 |
| - var nowTicks = self.getTicks(new Date()); |
52 |
| - var endTicks = self.getTicks(new Date(self.endTime)); |
53 |
| - duration = parseInt((endTicks - nowTicks) / scale); |
54 |
| - break; |
55 |
| - |
56 |
| - case stateStopped: |
57 |
| - case statePaused: |
58 |
| - duration = self.totalDuration; |
59 |
| - break; |
60 |
| - } |
61 |
| - |
62 |
| - var totalDuration = parseInt(self.plannedDuration()); |
63 |
| - var remainingDuration = duration; |
64 |
| - var progression = (100 - (100 * (duration / totalDuration))) + "%"; |
65 |
| - self.progress(progression); |
66 |
| - self.remainingDuration(formatDuration(duration)); |
67 |
| - }; |
68 |
| - |
69 |
| - this.updateState = function (state) { |
70 |
| - |
71 |
| - self.hostState = state; |
72 |
| - |
73 |
| - if (state != stateFinished) |
74 |
| - timerId = setInterval(self.updateTime, 1000); |
75 |
| - else |
76 |
| - clearInterval(timerId); |
77 |
| - |
78 |
| - }; |
79 |
| - |
80 |
| - this.formattedPlannedDuration = function () { |
81 |
| - |
82 |
| - return formatDuration(parseInt(self.plannedDuration())); |
83 |
| - }; |
84 |
| - |
85 |
| - this.updateRemainingTime = function () { |
86 |
| - |
87 |
| - self.remainingDuration(self.formattedPlannedDuration()); |
88 |
| - }; |
89 |
| - }; |
| 1 | +define(['components/signalr', 'components/timeManager', 'components/states', 'knockout'], function (signalr, timer, states, ko) { |
90 | 2 |
|
91 | 3 | function Host() {
|
92 | 4 |
|
93 | 5 | var self = this;
|
94 | 6 |
|
95 | 7 | this.topClassName = ko.observable("");
|
96 | 8 | this.bottomClassName = ko.observable("hide");
|
97 |
| - this.groupName = ko.observable("Violet Team"); |
98 | 9 | this.pauseTitle = ko.observable("Pause");
|
| 10 | + this.groupName = ko.observable("Violet Team"); |
99 | 11 |
|
100 |
| - this.state = stateInit; |
| 12 | + this.state = states.Init; |
101 | 13 | this.canStart = ko.observable();
|
102 | 14 | this.canStop = ko.observable();
|
103 | 15 | this.canPause = ko.observable();
|
104 | 16 | this.canReset = ko.observable();
|
105 | 17 |
|
106 | 18 | this.participating = ko.observable(false);
|
107 | 19 | this.playerName = ko.observable("");
|
| 20 | + this.players = ko.observableArray([]); |
108 | 21 |
|
109 | 22 | this.playerNameShow = ko.computed(
|
| 23 | + |
110 | 24 | function () { return self.participating() ? "" : "hide"; },
|
111 | 25 | self
|
112 | 26 | );
|
113 | 27 |
|
114 |
| - this.players = ko.observableArray(); |
115 |
| - this.players().push({ name: "Ben", score: "?" }); |
116 |
| - this.players().push({ name: "Lin", score: "?" }); |
117 |
| - this.players().push({ name: "Lily", score: "?" }); |
118 |
| - this.players().push({ name: "Aiden", score: "?" }); |
119 |
| - this.players().push({ name: "Dog", score: "?" }); |
120 |
| - this.players().push({ name: "Cat", score: "?" }); |
| 28 | + // copy observables from timer for ease of knockout binding |
| 29 | + this.plannedDuration = timer.plannedDuration; |
| 30 | + this.remainingDuration = timer.remainingDuration; |
| 31 | + this.progress = timer.progress; |
121 | 32 |
|
122 |
| - this.timer = new TimeManager(); |
| 33 | + // delegate button actions to the signalr client proxy.. |
| 34 | + this.start = signalr.start; |
| 35 | + this.stop = signalr.stop; |
| 36 | + this.pause = signalr.pause; |
| 37 | + this.newRound = signalr.newRound; |
123 | 38 |
|
124 | 39 | this.updateState = function (state) {
|
125 | 40 |
|
126 | 41 | self.state = state;
|
127 |
| - self.canStart(state == stateInit); |
128 |
| - self.canStop(state == stateRunning || state == statePaused); |
129 |
| - self.canPause(state == stateRunning || state == statePaused); |
130 |
| - self.canReset(state == stateStopped || state == stateFinished || state == statePaused); |
| 42 | + self.canStart(state == states.Init); |
| 43 | + self.canStop(state == states.Running || state == states.Paused); |
| 44 | + self.canPause(state == states.Running || state == states.Paused); |
| 45 | + self.canReset(state == states.Stopped || state == states.Finished || state == states.Paused); |
131 | 46 |
|
132 |
| - self.pauseTitle(state == statePaused ? "Resume" : "Pause "); |
| 47 | + self.pauseTitle(state == states.Paused ? "Resume" : "Pause"); |
133 | 48 |
|
134 |
| - self.timer.updateState(self.state); |
| 49 | + timer.updateState(self.state); |
135 | 50 | };
|
136 | 51 |
|
137 | 52 | this.submit = function () {
|
138 | 53 |
|
139 |
| - signalr.newTeam(this.groupName(), parseInt(self.timer.plannedDuration())); |
| 54 | + signalr.newTeam(this.groupName(), parseInt(timer.plannedDuration()), this.participating()); |
140 | 55 |
|
141 |
| - if (this.participating()) |
142 |
| - signalr.newPlayer(this.groupName(), this.playerName()); |
143 |
| - else |
144 |
| - signalr.newViewer(this.groupName(), this.groupName() + "Host"); |
145 |
| - |
146 |
| - this.topClassName("hide"); |
147 |
| - this.bottomClassName(""); |
148 |
| - this.timer.updateRemainingTime(); |
| 56 | + self.topClassName("hide"); |
| 57 | + self.bottomClassName(""); |
149 | 58 | };
|
150 | 59 |
|
151 |
| - this.start = signalr.start; |
152 |
| - this.stop = signalr.stop; |
153 |
| - this.pause = signalr.pause; |
154 |
| - this.newRound = signalr.newRound; |
155 |
| - |
156 | 60 | signalr.client.started = function (endTime) {
|
157 | 61 |
|
158 |
| - self.timer.endTime = endTime; |
159 |
| - self.updateState(stateRunning); |
| 62 | + timer.endTime = endTime; |
| 63 | + self.updateState(states.Running); |
160 | 64 | };
|
161 | 65 |
|
162 | 66 | signalr.client.stopped = function () {
|
163 | 67 |
|
164 |
| - self.timer.totalDuration = 0; |
165 |
| - self.updateState(stateFinished); |
| 68 | + timer.totalDuration = 0; |
| 69 | + self.updateState(states.Finished); |
166 | 70 | };
|
167 | 71 |
|
168 | 72 | signalr.client.paused = function (endTime, durationRemaining) {
|
169 | 73 |
|
170 |
| - self.timer.endTime = endTime; |
171 |
| - self.timer.duration = durationRemaining; |
172 |
| - |
173 |
| - self.updateState(self.state == statePaused ? stateRunning : statePaused); |
| 74 | + timer.updateEndTime(endTime, durationRemaining); |
| 75 | + self.updateState(self.state == states.Paused ? states.Running : states.Paused); |
174 | 76 | };
|
175 | 77 |
|
176 | 78 | signalr.client.reset = function () {
|
177 | 79 |
|
178 |
| - updateState(stateInit); |
179 |
| - self.pauseTitle("Pause"); |
| 80 | + self.updateState(states.Init); |
| 81 | + }; |
| 82 | + |
| 83 | + signalr.client.addPlayer = function (playerName) { |
| 84 | + |
| 85 | + self.players.push({ name: playerName, score: "?" }); |
| 86 | + }; |
| 87 | + |
| 88 | + signalr.client.removePlayer = function (playerName) { |
| 89 | + |
| 90 | + self.players.remove(function (p) { p.name == playerName; }); |
180 | 91 | };
|
181 | 92 |
|
182 | 93 | this.updateState(this.state);
|
|
0 commit comments