From cd48c39b39a230410e66a2596cbdc6f0367b6e46 Mon Sep 17 00:00:00 2001 From: Toni Barth Date: Sun, 11 Aug 2024 19:22:29 +0200 Subject: [PATCH] current keystrokes state --- .github/workflows/push_docker.yaml | 7 + client/sfx/select_slot.opus | Bin 0 -> 6645 bytes client/sfx/slot_unavailable.opus | Bin 0 -> 35161 bytes client/src/events.ts | 14 +- client/src/hooks.ts | 18 +- client/src/locale/de.json | 28 ++- client/src/locale/en.json | 28 ++- client/src/navigation.tsx | 14 ++ client/src/notification-player.tsx | 9 +- client/src/pages/game.tsx | 60 +++-- client/src/pages/game/slot-selector.tsx | 295 +++++++++++++++++++++--- client/src/pages/lobby.tsx | 47 +++- client/src/sfx-player.tsx | 44 ++++ 13 files changed, 502 insertions(+), 62 deletions(-) create mode 100644 client/sfx/select_slot.opus create mode 100644 client/sfx/slot_unavailable.opus diff --git a/.github/workflows/push_docker.yaml b/.github/workflows/push_docker.yaml index 9e0094a..4e91a69 100644 --- a/.github/workflows/push_docker.yaml +++ b/.github/workflows/push_docker.yaml @@ -3,6 +3,8 @@ on: branches: - main - development + tags: + - '**' jobs: push_to_registry: @@ -10,6 +12,10 @@ jobs: runs-on: ubuntu-latest if: "!contains(github.event.head_commit.message, '[skip ci]')" steps: + - name: Dump job github var + env: + GITHUB_VAR: ${{ toJson(github) }} + run: echo "$GITHUB_VAR" - name: Checkout uses: actions/checkout@v3 @@ -28,6 +34,7 @@ jobs: password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build and push Docker dev image + if: startsWith(github.ref, 'refs/heads/development') uses: docker/build-push-action@v6 with: context: . diff --git a/client/sfx/select_slot.opus b/client/sfx/select_slot.opus new file mode 100644 index 0000000000000000000000000000000000000000..e7b776d70a4fe6aa1620d3e48059709630ce4848 GIT binary patch literal 6645 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 literal 0 HcmV?d00001 diff --git a/client/src/events.ts b/client/src/events.ts index be50eb5..0445800 100644 --- a/client/src/events.ts +++ b/client/src/events.ts @@ -1,4 +1,4 @@ -import { Game, GameMode, Hit, Player } from "./entities" +import { Game, GameMode, Hit, Player, Slot } from "./entities" export enum Sfx { joinGame, @@ -7,6 +7,8 @@ export enum Sfx { payToken, playHit, receiveToken, + selectSlot, + slotUnavailable, stopHit, youClaim, youFail, @@ -17,6 +19,7 @@ export enum Sfx { export interface SfxData { sfx: Sfx + pan?: number } export interface PlaySfxData extends SfxData {} @@ -77,6 +80,14 @@ export interface TokenReceivedData { game_mode: GameMode } +export interface SlotSelectedData { + slot: Slot | null + slot_count: number + from_year: number + to_year: number + unavailable: boolean +} + export enum Events { claimedHit = "Claimed hit", gameEnded = "Game ended", @@ -90,5 +101,6 @@ export enum Events { scored = "Scored", sfxEnded = "Sfx ended", skippedHit = "Skipped hit", + slotSelected = "Slot selected", tokenReceived = "Token received", } diff --git a/client/src/hooks.ts b/client/src/hooks.ts index 763338d..a11c35d 100644 --- a/client/src/hooks.ts +++ b/client/src/hooks.ts @@ -1,4 +1,4 @@ -import { useCallback, useEffect } from "react" +import { useCallback, useEffect, useState } from "react" import { useNavigate } from "react-router-dom" export const useRevalidate = () => { @@ -30,3 +30,19 @@ export const useRevalidateOnInterval = ({ [revalidate], ) } + +export const useModalShown = (): boolean => { + let [shown, setShown] = useState(false) + + useEffect(() => { + let id = setInterval(() => { + setShown(document.querySelector(".modal") !== null) + }, 50) + + return () => { + clearInterval(id) + } + }, []) + + return shown +} diff --git a/client/src/locale/de.json b/client/src/locale/de.json index 5546fe8..0aa6334 100644 --- a/client/src/locale/de.json +++ b/client/src/locale/de.json @@ -35,7 +35,9 @@ "confirmHeading": "Du musst nun bestätigen, ob <0>{{player}} den Titel und Interpreten korrekt erraten hat. Sei fair!", "confirmText": "Hat <0>{{player}} den Titel und Interpreten korrekt erraten?", "no": "Nein", + "noShortcut": "Alt+Umschalt+N", "yes": "Ja", + "yesShortcut": "Alt+Umschalt+Y", "guessText": "Wo, glaubst du, gehört dieser Hit hin?", "waitingText": "Dies sind die Möglichkeiten:", "dontIntercept": "Keine Vermutung äußern", @@ -43,14 +45,19 @@ "afterYear": "nach {{year}}", "betweenYears": "von {{year1}} bis {{year2}}", "submitGuess": "Vermutung abschicken", + "submitGuessShortcut": "Alt+Umschalt+Enter", "selectSlotFirst": "Wähle erst eine Möglichkeit", "cannotSubmitGuess": "Du kannst derzeit keine Vermutung abgeben", "game_one": "Spiel", "gameActions": "Spielaktionen:", "leaveGame": "Spiel verlassen", + "leaveGameShortcut": "Alt+Umschalt+Q", "joinGame": "Spiel beitreten", + "joinGameShortcut": "Alt+Umschalt+J", "stopGame": "Spiel stoppen", + "stopGameShortcut": "Alt+Umschalt+S", "startGame": "Spiel starten", + "startGameShortcut": "Alt+Umschalt+S", "name": "Name", "token_one": "Chip", "token_other": "Chips", @@ -110,8 +117,11 @@ "save": "Speichern", "sfxVolume": "Lautstärke der Sound Effekte", "publicGame": "Öffentliches Spiel", + "publicGameShortcut": "Alt+Umschalt+U", "privateGame": "Privates Spiel", + "privateGameShortcut": "Alt+Umschalt+R", "localGame": "Lokales Spiel", + "localGameShortcut": "Alt+Umschalt+L", "addPlayer": "Lokalen Spieler hinzufügen", "addPlayerNotLocalGame": "Du kannst lokale Spieler nur in einem lokalen Spiel hinzufügen", "addPlayerNotWaiting": "Du kannst lokale Spieler nur hinzufügen, während das Spiel gestoppt ist", @@ -144,6 +154,22 @@ "guessNothing": "{{player}} behauptet nichts Gegenteiliges", "guess": "{{player}} vermutet: {{guess}}", "youReceivedToken": "Du hast einen Token erhalten, da du Künstler und Titel dieses Hits wusstest", - "otherReceivedToken": "{{player}} hat einen Token erhalten, da der Künstler und Titel dieses Hits genannt wurde" + "otherReceivedToken": "{{player}} hat einen Token erhalten, da der Künstler und Titel dieses Hits genannt wurde", + "keyboardShortcut_one": "Tastenkombination", + "keyboardShortcut_other": "Tastenkombinationen", + "section": "Abschnitt", + "action": "Aktion", + "game": "Spiel", + "confirmYes": "Titel und Interpret des Hits wurde richtig erraten", + "confirmNo": "Titel und Interpret des Hits wurde nicht richtig erraten", + "selectPreviousSlot": "Vorherigen Slot auswählen", + "selectPreviousSlotShortcut": "Alt+Umschalt+Pfeil nach oben", + "selectNextSlot": "Nächsten Slot auswählen", + "selectNextSlotShortcut": "Alt+Umschalt+Pfeil nach unten", + "selectNoSlot": "Keinen Slot auswählen", + "selectNoSlotShortcut": "Alt+Umschalt+Rücktaste", + "playerStatsNotification": "{{player}}: {{hits}} Hits, {{tokens}} Chips", + "speakPlayerInfo": "Sprich wichtige Informationen zu Spieler {{player}}", + "speakPlayerInfoShortcut": "Alt+Umschalt+{{player}}" } } diff --git a/client/src/locale/en.json b/client/src/locale/en.json index 4a79e57..05109c9 100644 --- a/client/src/locale/en.json +++ b/client/src/locale/en.json @@ -35,7 +35,9 @@ "confirmHeading": "You now need to confirm if <0>{{player}} guessed title and artist of the song correctly. Be fair!", "confirmText": "Did <0>{{player}} guess artist and title correctly?", "no": "No", + "noShortcut": "Alt+Shift+N", "yes": "Yes", + "yesShortcut": "Alt+Shift+Y", "guessText": "Where do you think this hit belongs?", "waitingText": "These are the possible slots:", "dontIntercept": "Don't intercept", @@ -43,14 +45,19 @@ "afterYear": "after {{year}}", "betweenYears": "between {{year1}} and {{year2}}", "submitGuess": "Submit guess", + "submitGuessShortcut": "Alt+Shift+Return", "selectSlotFirst": "Select a slot first", "cannotSubmitGuess": "You cannot submit a guess right now", "game_one": "Game", "gameActions": "Game actions:", "leaveGame": "Leave game", + "leaveGameShortcut": "Alt+Shift+Q", "joinGame": "Join game", + "joinGameShortcut": "Alt+Shift+J", "stopGame": "Stop game", + "stopGameShortcut": "Alt+Shift+S", "startGame": "Start game", + "startGameShortcut": "Alt+Shift+S", "name": "Name", "token_one": "Token", "token_other": "Tokens", @@ -110,8 +117,11 @@ "save": "Save", "sfxVolume": "SFX Volume", "publicGame": "Public game", + "publicGameShortcut": "Alt+Shift+U", "privateGame": "Private game", + "privateGameShortcut": "Alt+Shift+R", "localGame": "Local game", + "localGameShortcut": "Alt+Shift+L", "addPlayer": "Add local player", "addPlayerNotLocalGame": "You can only add local players in a local game", "addPlayerNotWaiting": "You can only add local players while the game is stopped", @@ -144,6 +154,22 @@ "guessNothing": "{{player}} doesn't intercept", "guess": "{{player}} guesses: {{guess}}", "youReceivedToken": "You received a token for guessing artist and title of this hit correctly", - "otherReceivedToken": "{{player}} received a token for guessing artist and title of this hit correctly" + "otherReceivedToken": "{{player}} received a token for guessing artist and title of this hit correctly", + "keyboardShortcut_one": "Keyboard shortcut", + "keyboardShortcut_other": "Keyboard shortcuts", + "section": "Abschnitt", + "action": "Aktion", + "game": "Game", + "confirmYes": "title and artist of the hit was guessed correctly", + "confirmNo": "title and artist of the hit was guessed incorrectly", + "selectPreviousSlot": "Select previous slot", + "selectPreviousSlotShortcut": "Alt+Shift+Up arrow", + "selectNextSlot": "Select next slot", + "selectNextSlotShortcut": "Alt+Shift+Down arrow", + "selectNoSlot": "Select no slot", + "selectNoSlotShortcut": "Alt+Shift+Backspace", + "playerStatsNotification": "{{player}}: {{hits}} hits, {{tokens}} tokens", + "speakPlayerInfo": "Speak important information about player {{player}}", + "speakPlayerInfoShortcut": "Alt+Shift+{{player}}" } } diff --git a/client/src/navigation.tsx b/client/src/navigation.tsx index 2ae0a97..d55cd09 100644 --- a/client/src/navigation.tsx +++ b/client/src/navigation.tsx @@ -9,11 +9,13 @@ import { LinkContainer } from "react-router-bootstrap" import { useNavigate } from "react-router-dom" import { User } from "./entities" import Settings from "./settings" +import Shortcuts from "./shortcuts" export default function Navigation({ user }: { user: User | null }) { let navigate = useNavigate() const { t } = useTranslation() let [showSettings, setShowSettings] = useState(false) + let [showShortcuts, setShowShortcuts] = useState(false) let [_, setWelcome] = useLocalStorage("welcome") return ( @@ -48,6 +50,14 @@ export default function Navigation({ user }: { user: User | null }) { {t("welcome")} + + +