|
@@ -0,0 +1,62 @@
|
|
|
+import { useEffect, useState } from "react";
|
|
|
+import { dispatch, useGameId } from "../../../domain/gameStore";
|
|
|
+import { usePlayers } from "../../../hooks/useGameInfo";
|
|
|
+import styles from "./GamePanel.module.css";
|
|
|
+
|
|
|
+// okay, in an ideal world this would be part of the game store or something
|
|
|
+// and it would get properly managed by reactive state
|
|
|
+// but also, this totally works as is, and the only downside is it might potentially grow too big
|
|
|
+// but that only happens if someone plays that many gun games without ever leaving the window
|
|
|
+const shownItems = new Set();
|
|
|
+
|
|
|
+const KillFeed = () => {
|
|
|
+ const gameId = useGameId();
|
|
|
+ const players = usePlayers();
|
|
|
+ useEffect(() => {
|
|
|
+ if (players?.find(({ currentRound }) => currentRound === null)) {
|
|
|
+ dispatch.goToSummary();
|
|
|
+ }
|
|
|
+ }, [players]);
|
|
|
+ const [shownItemsState, setShownItemsState] = useState(shownItems);
|
|
|
+ const [display, setDisplay] = useState([]);
|
|
|
+ useEffect(() => {
|
|
|
+ const toDisplay =
|
|
|
+ players
|
|
|
+ ?.flatMap(({ name, guesses }) =>
|
|
|
+ Object.entries(guesses).map(([round, { score }]) => ({
|
|
|
+ name,
|
|
|
+ round,
|
|
|
+ score,
|
|
|
+ }))
|
|
|
+ )
|
|
|
+ ?.filter(
|
|
|
+ ({ name, round }) =>
|
|
|
+ !shownItemsState.has(`${gameId}-${name}-${round}`)
|
|
|
+ ) ?? [];
|
|
|
+ setDisplay(toDisplay);
|
|
|
+ const timeouts = [];
|
|
|
+ toDisplay.forEach(({ name, round }) => {
|
|
|
+ timeouts.push(
|
|
|
+ setTimeout(() => {
|
|
|
+ shownItems.add(`${gameId}-${name}-${round}`);
|
|
|
+ setShownItemsState(new Set(shownItems));
|
|
|
+ }, 5000)
|
|
|
+ );
|
|
|
+ });
|
|
|
+ return () => {
|
|
|
+ timeouts.forEach(t => clearTimeout(t));
|
|
|
+ };
|
|
|
+ }, [shownItemsState, gameId, players]);
|
|
|
+ return (
|
|
|
+ <div className={styles.killFeed}>
|
|
|
+ {display.map(({ name, round, score }) => (
|
|
|
+ <span key={`${name}-${round}`} className={styles.killFeedItem}>
|
|
|
+ <span className={styles.killFeedName}>{name}</span>{" "}
|
|
|
+ {score >= 4950 ? "🎯" : "🖱️"} 🗺️ {round}
|
|
|
+ </span>
|
|
|
+ ))}
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+};
|
|
|
+
|
|
|
+export default KillFeed;
|