From 72aaee98f7438f88781c04a548bbf033f94033c1 Mon Sep 17 00:00:00 2001 From: Henry Aviles Date: Tue, 14 Apr 2026 19:58:48 -0400 Subject: [PATCH 1/8] feat: add dialog and translations --- src/routes/lobby/LobbyView.vue | 3 + .../lobby/components/PlayTimeDialog.vue | 93 +++++++++++++++++++ src/translations/de.json | 10 ++ src/translations/en.json | 10 ++ src/translations/es.json | 10 ++ src/translations/fr.json | 10 ++ src/translations/ukr.json | 10 ++ utils/local-storage-utils.js | 9 +- 8 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 src/routes/lobby/components/PlayTimeDialog.vue diff --git a/src/routes/lobby/LobbyView.vue b/src/routes/lobby/LobbyView.vue index cd664b2ca..7c5b7b606 100644 --- a/src/routes/lobby/LobbyView.vue +++ b/src/routes/lobby/LobbyView.vue @@ -86,6 +86,8 @@ + + @@ -100,6 +102,7 @@ import { playAudio } from '@/util/audio.js'; import PlayerReadyIndicator from '@/components/PlayerReadyIndicator.vue'; import TheLanguageSelector from '@/components/TheLanguageSelector.vue'; import { ROUTE_NAME_GAME } from '_/src/router'; +import PlayTimeDialog from '@/routes/lobby/components/PlayTimeDialog.vue'; // Deps const { t } = useI18n(); diff --git a/src/routes/lobby/components/PlayTimeDialog.vue b/src/routes/lobby/components/PlayTimeDialog.vue new file mode 100644 index 000000000..136a50575 --- /dev/null +++ b/src/routes/lobby/components/PlayTimeDialog.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/src/translations/de.json b/src/translations/de.json index 8ace09773..e4b993327 100644 --- a/src/translations/de.json +++ b/src/translations/de.json @@ -68,6 +68,16 @@ "casual": "Spielmodus geändert zu Freizeit", "ranked": "Spielmodus geändert zu Rangliste" }, + "playTimeDialog": { + "title": "Finde ein Spiel", + "openPlaySessions": "Wir haben offene Spielsitzungen jeden Mittwoch um 20:30 Uhr ET und jeden Donnerstag um 12:00 Uhr ET. Wenn du zu diesen Zeiten auf die Seite kommst, findest du immer jemanden zum Spielen!", + "discord": "Wir haben einen {0} und du kannst den {1}-Kanal nutzen, um Mitspieler zu finden.", + "discordLink": "Discord-Kanal", + "findAGame": "#find-a-game", + "botPlay": "Du kannst von der Startseite aus gegen den Bot spielen.", + "goHome": "Zur Startseite", + "stay": "Im Lobby bleiben" + }, "error": { "fallback": "Ein unbekannter Fehler ist aufgetreten.", "forbidden": "Du bist kein Spieler in diesem Spiel!", diff --git a/src/translations/en.json b/src/translations/en.json index 1d30ce89e..7c938b570 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -68,6 +68,16 @@ "casual": "Game Mode changed to Casual", "ranked": "Game Mode changed to Ranked" }, + "playTimeDialog": { + "title": "Find a Game", + "openPlaySessions": "We have open play sessions every Wednesday at 8:30pm ET and every Thursday at 12pm ET. If you hop on the site at those times, you'll always have someone to play!", + "discord": "We have a {0} and you can use its {1} channel to find matches.", + "discordLink": "Discord channel", + "findAGame": "#find-a-game", + "botPlay": "You can play against the bot from the home page.", + "goHome": "Go Home", + "stay": "Stay in Lobby" + }, "error": { "fallback": "An unknown error has occurred.", "forbidden": "You are not a player in this game!", diff --git a/src/translations/es.json b/src/translations/es.json index 624aed3e6..b44e50d61 100644 --- a/src/translations/es.json +++ b/src/translations/es.json @@ -68,6 +68,16 @@ "casual": "El modo de juego cambió a Amistoso", "ranked": "El modo de juego cambió a Competitivo" }, + "playTimeDialog": { + "title": "Encuentra una partida", + "openPlaySessions": "Tenemos sesiones de juego abiertas todos los miércoles a las 8:30pm ET y todos los jueves a las 12pm ET. Si entras al sitio en esos horarios, ¡siempre habrá alguien con quien jugar!", + "discord": "Tenemos un {0} y puedes usar su canal {1} para encontrar partidas.", + "discordLink": "canal de Discord", + "findAGame": "#find-a-game", + "botPlay": "Puedes jugar contra el bot desde la página de inicio.", + "goHome": "Ir al inicio", + "stay": "Quedarme en el lobby" + }, "error": { "fallback": "Se ha producido un error desconocido.", "forbidden": "¡No eres un jugador en este juego!", diff --git a/src/translations/fr.json b/src/translations/fr.json index 8c01d57c6..585035987 100644 --- a/src/translations/fr.json +++ b/src/translations/fr.json @@ -68,6 +68,16 @@ "casual": "Mode de jeu modifié à Classique", "ranked": "Mode de jeu modifié à Classée" }, + "playTimeDialog": { + "title": "Trouver une partie", + "openPlaySessions": "Nous avons des sessions de jeu ouvertes tous les mercredis à 20h30 ET et tous les jeudis à 12h ET. Si vous vous connectez à ces horaires, vous trouverez toujours quelqu'un avec qui jouer !", + "discord": "Nous avons un {0} et vous pouvez utiliser son canal {1} pour trouver des adversaires.", + "discordLink": "canal Discord", + "findAGame": "#find-a-game", + "botPlay": "Vous pouvez jouer contre le bot depuis la page d'accueil.", + "goHome": "Retour à l'accueil", + "stay": "Rester dans le lobby" + }, "error": { "fallback": "Une erreur inconnue s'est produite.", "forbidden": "Vous n'êtes pas un joueur dans ce jeu !", diff --git a/src/translations/ukr.json b/src/translations/ukr.json index bb2eeb20d..ec292e9bf 100644 --- a/src/translations/ukr.json +++ b/src/translations/ukr.json @@ -68,6 +68,16 @@ "casual": "Режим гри змінено на Неофіційний", "ranked": "Режим гри змінено на Рейтинговий" }, + "playTimeDialog": { + "title": "Знайти гру", + "openPlaySessions": "У нас є відкриті ігрові сесії щосереди о 20:30 ET та щочетверга о 12:00 ET. Якщо ви зайдете на сайт у ці години, завжди знайдете з ким пограти!", + "discord": "У нас є {0}, і ви можете використовувати канал {1}, щоб знайти суперників.", + "discordLink": "канал Discord", + "findAGame": "#find-a-game", + "botPlay": "Ви можете грати проти бота з головної сторінки.", + "goHome": "На головну", + "stay": "Залишитися в лобі" + }, "error": { "fallback": "Сталася невідома помилка.", "forbidden": "Ви не гравець у цій грі!", diff --git a/utils/local-storage-utils.js b/utils/local-storage-utils.js index 2b8058c8f..fe89c5273 100644 --- a/utils/local-storage-utils.js +++ b/utils/local-storage-utils.js @@ -1,5 +1,6 @@ const LS_PREFERS_RANKED_NAME = 'prefersRanked'; const LS_IS_RETURNING_USER_NAME = 'isReturningUser'; +const LS_PLAY_TIME_DIALOG_DISMISSED = 'playTimeDialogDismissed'; const getLocalStorage = (key) => { try { @@ -17,4 +18,10 @@ const setLocalStorage = (key, value) => { } }; -export { getLocalStorage, setLocalStorage, LS_PREFERS_RANKED_NAME, LS_IS_RETURNING_USER_NAME }; +export { + getLocalStorage, + setLocalStorage, + LS_PREFERS_RANKED_NAME, + LS_IS_RETURNING_USER_NAME, + LS_PLAY_TIME_DIALOG_DISMISSED, +}; From d9acffe099f3b596e5031ba974db9e4981ddc3ed Mon Sep 17 00:00:00 2001 From: Henry Aviles Date: Tue, 14 Apr 2026 19:58:58 -0400 Subject: [PATCH 2/8] test: add test --- tests/e2e/specs/out-of-game/lobby.spec.js | 27 +++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/e2e/specs/out-of-game/lobby.spec.js b/tests/e2e/specs/out-of-game/lobby.spec.js index ffadc59e4..d2702c00b 100644 --- a/tests/e2e/specs/out-of-game/lobby.spec.js +++ b/tests/e2e/specs/out-of-game/lobby.spec.js @@ -626,6 +626,33 @@ describe('Lobby - P1 Perspective', () => { }); }); +describe('Lobby - Play Time Dialog', () => { + beforeEach(() => { + cy.wipeDatabase(); + cy.visit('/'); + window.localStorage.setItem('announcement', announcementData.id); + cy.signupPlayer(myUser); + cy.createGamePlayer({ gameName: 'Test Game', isRanked: false }).then((gameSummary) => { + cy.window() + .its('cuttle.gameStore') + .then((store) => store.requestSubscribe(gameSummary.gameId)); + cy.vueRoute(`/lobby/${gameSummary.gameId}`); + cy.wrap(gameSummary).as('gameSummary'); + }); + }); + + it('Dismisses dialog and sets localStorage when staying in lobby', () => { + cy.tick(60000); + cy.get('#play-time-dialog').should('be.visible'); + cy.get('[data-cy=play-time-dialog-stay]').click(); + cy.get('#play-time-dialog').should('not.exist'); + cy.window().then((win) => { + expect(win.localStorage.getItem('playTimeDialogDismissed')).to.eq('true'); + }); + }); + +}); + describe('Lobby invite links', () => { beforeEach(() => { cy.wipeDatabase(); From 5891257253eb7b276c2013595df1911082e64594 Mon Sep 17 00:00:00 2001 From: Henry Aviles Date: Tue, 14 Apr 2026 20:00:50 -0400 Subject: [PATCH 3/8] test: fix test --- tests/e2e/specs/out-of-game/lobby.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/e2e/specs/out-of-game/lobby.spec.js b/tests/e2e/specs/out-of-game/lobby.spec.js index d2702c00b..9f3d89f26 100644 --- a/tests/e2e/specs/out-of-game/lobby.spec.js +++ b/tests/e2e/specs/out-of-game/lobby.spec.js @@ -642,7 +642,7 @@ describe('Lobby - Play Time Dialog', () => { }); it('Dismisses dialog and sets localStorage when staying in lobby', () => { - cy.tick(60000); + cy.wait(61000); cy.get('#play-time-dialog').should('be.visible'); cy.get('[data-cy=play-time-dialog-stay]').click(); cy.get('#play-time-dialog').should('not.exist'); From 379a8d51fdec2c55fb917fc2037e786f08f2d33a Mon Sep 17 00:00:00 2001 From: Henry Aviles Date: Tue, 14 Apr 2026 20:18:58 -0400 Subject: [PATCH 4/8] fix: template first kids --- .../lobby/components/PlayTimeDialog.vue | 70 +++++++++---------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src/routes/lobby/components/PlayTimeDialog.vue b/src/routes/lobby/components/PlayTimeDialog.vue index 136a50575..e5a4c7b87 100644 --- a/src/routes/lobby/components/PlayTimeDialog.vue +++ b/src/routes/lobby/components/PlayTimeDialog.vue @@ -1,38 +1,3 @@ - - + +