]> git.cworth.org Git - lmno.games/blobdiff - empathy/empathy.jsx
Add animated, bouncing/fading ellipses to indicate activity
[lmno.games] / empathy / empathy.jsx
index 163b977cbb8c474560a4dfa9cf24c1a03926e56b..143acd930824a564af6a7153cbbd3b37006a54fc 100644 (file)
@@ -585,9 +585,14 @@ class Ambiguities extends React.PureComponent {
                 <li
                   key={player}
                 >
-                  {player}
-                  {this.props.players_judging[player] ?
-                   <span className="typing"/> : null }
+                  {player}{' '}
+                  <span className=
+                  {this.props.players_judging[player].active ?
+                   "typing active"
+                   :
+                   "typing idle"}>
+                    <span>{'.'}</span><span>{'.'}</span><span>{'.'}</span>
+                  </span>
                 </li>
               );
             })}
@@ -760,9 +765,14 @@ class ActivePrompt extends React.PureComponent {
                 <li
                   key={player}
                 >
-                  {player}
-                  {this.props.players_answering[player] ?
-                   <span className="typing"/> : null }
+                  {player}{' '}
+                  <span className=
+                  {this.props.players_answering[player].active ?
+                   "typing active"
+                   :
+                   "typing idle"}>
+                    <span>{'.'}</span><span>{'.'}</span><span>{'.'}</span>
+                  </span>
                 </li>
               );
             })}
@@ -954,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) {
@@ -1019,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) {