X-Git-Url: https://git.cworth.org/git?p=lmno.games;a=blobdiff_plain;f=empathy%2Fempathy.jsx;h=143acd930824a564af6a7153cbbd3b37006a54fc;hp=6133463f35a7a9d6ba4d58cbe8e4188bf4af48a9;hb=182083e7c5284b7e373a133dce71eac86cb365f7;hpb=f8b6dc7aef51ccc82d163f015612c7640f0be365
diff --git a/empathy/empathy.jsx b/empathy/empathy.jsx
index 6133463..143acd9 100644
--- a/empathy/empathy.jsx
+++ b/empathy/empathy.jsx
@@ -569,30 +569,47 @@ class Ambiguities extends React.PureComponent {
);
}
- if (this.props.players_judged.has(this.props.player.name)) {
- return (
-
-
Submission received
+ let still_waiting = null;
+ const judging_players = Object.keys(this.props.players_judging);
+ if (judging_players.length) {
+ still_waiting = (
+
- The following players have completed judging:{' '}
- {[...this.props.players_judged].join(', ')}
-
-
- Still waiting for the following players:
+ Still waiting for the following player
+ {judging_players.length > 1 ? 's' : '' }
+ :
- {Object.keys(this.props.players_judging).map(player => {
+ {judging_players.map(player => {
return (
-
- {player}
- {this.props.players_judging[player] ?
- : null }
+ {player}{' '}
+
+ {'.'}{'.'}{'.'}
+
);
})}
+
+ );
+ }
+
+ if (this.props.players_judged.has(this.props.player.name)) {
+ return (
+
+
Submission received
+
+ The following players have completed judging:{' '}
+ {[...this.props.players_judged].join(', ')}
+
+ {still_waiting}
{move_on_button}
@@ -732,30 +749,47 @@ class ActivePrompt extends React.PureComponent {
);
}
- if (this.props.players_answered.has(this.props.player.name)) {
- return (
-
-
Submission received
+ let still_waiting = null;
+ const answering_players = Object.keys(this.props.players_answering);;
+ if (answering_players.length) {
+ still_waiting = (
+
- The following players have submitted their answers:{' '}
- {[...this.props.players_answered].join(', ')}
-
-
- Still waiting for the following players:
+ Still waiting for the following player
+ {answering_players.length > 1 ? 's' : ''}
+ :
- {Object.keys(this.props.players_answering).map(player => {
+ {answering_players.map(player => {
return (
-
- {player}
- {this.props.players_answering[player] ?
- : null }
+ {player}{' '}
+
+ {'.'}{'.'}{'.'}
+
);
})}
+
+ );
+ }
+
+ if (this.props.players_answered.has(this.props.player.name)) {
+ return (
+
+
Submission received
+
+ The following players have submitted their answers:{' '}
+ {[...this.props.players_answered].join(', ')}
+
+ {still_waiting}
{move_on_button}
@@ -930,12 +964,29 @@ class Game extends React.PureComponent {
}
set_player_answering(player) {
+ /* Set the player as actively answering now. */
this.setState({
players_answering: {
...this.state.players_answering,
[player]: {active: true}
}
});
+ /* And arrange to have them marked idle very shortly.
+ *
+ * Note: This timeout is intentionally very, very short. We only
+ * need it long enough that the browser has latched onto the state
+ * change to "active" above. We actually use a CSS transition
+ * delay to control the user-perceptible length of time after
+ * which an active player appears inactive.
+ */
+ setTimeout(() => {
+ this.setState({
+ players_answering: {
+ ...this.state.players_answering,
+ [player]: {active: false}
+ }
+ });
+ }, 100);
}
set_answering_idle(value) {
@@ -995,12 +1046,30 @@ class Game extends React.PureComponent {
}
set_player_judging(player) {
+ /* Set the player as actively judging now. */
this.setState({
players_judging: {
...this.state.players_judging,
[player]: {active: true}
}
});
+ /* And arrange to have them marked idle very shortly.
+ *
+ * Note: This timeout is intentionally very, very short. We only
+ * need it long enough that the browser has latched onto the state
+ * change to "active" above. We actually use a CSS transition
+ * delay to control the user-perceptible length of time after
+ * which an active player appears inactive.
+ */
+ setTimeout(() => {
+ this.setState({
+ players_judging: {
+ ...this.state.players_judging,
+ [player]: {active: false}
+ }
+ });
+ }, 100);
+
}
set_judging_idle(value) {