From 133f352aa7ef7853121fe0cffec44bcf35945c73 Mon Sep 17 00:00:00 2001 From: cjs8487 Date: Mon, 10 Aug 2026 00:51:29 -0500 Subject: [PATCH 1/4] basic setup for a credits/attributions page --- web/src/app/(main)/legal/credits/page.tsx | 54 +++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 web/src/app/(main)/legal/credits/page.tsx diff --git a/web/src/app/(main)/legal/credits/page.tsx b/web/src/app/(main)/legal/credits/page.tsx new file mode 100644 index 00000000..b69168a4 --- /dev/null +++ b/web/src/app/(main)/legal/credits/page.tsx @@ -0,0 +1,54 @@ +import { GitHub } from '@mui/icons-material'; +import { Box, Container, Typography } from '@mui/material'; +import Link from 'next/link'; + +const contributors = [ + { + name: 'cjs07', + github: 'https://github.com/cjs8487', + }, + { + name: 'Floha258', + github: 'https://github.com/floha258', + }, + { + name: 'lepelog', + github: 'https://github.com/lepelog', + }, + { + name: 'tricksnl', + github: 'https://github.com/devbeoservice', + }, +]; + +export default function Credits() { + return ( + + + Credits + + + PlayBingo would not be possible without the contributions our + community. + + {contributors.map((contributor) => ( + + {contributor.name} + + + + + + + ))} + + + A special shoutout to all the community members who have + helped make PlayBingo better by providing feedback, finding + bugs, and working with us to make PlayBingo the best it can + be. + + + + ); +} From dcda534aaed2e158d4df85a559ba9538eb2fdaf8 Mon Sep 17 00:00:00 2001 From: cjs8487 Date: Mon, 10 Aug 2026 23:47:25 -0500 Subject: [PATCH 2/4] add goal mark notification sound --- web/package-lock.json | 4 ++-- web/public/goal_ping.ogg | Bin 0 -> 12997 bytes web/src/app/(main)/legal/credits/page.tsx | 17 +++++++++++++++ web/src/components/board/Cell.tsx | 1 + web/src/context/RoomContext.tsx | 25 +++++++++++++++++++++- 5 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 web/public/goal_ping.ogg diff --git a/web/package-lock.json b/web/package-lock.json index 2cc7803f..c6632523 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,12 +1,12 @@ { "name": "web", - "version": "0.10.2", + "version": "0.11.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "web", - "version": "0.10.2", + "version": "0.11.1", "dependencies": { "@base-ui/react": "^1.6.0", "@codemirror/lang-json": "^6.0.2", diff --git a/web/public/goal_ping.ogg b/web/public/goal_ping.ogg new file mode 100644 index 0000000000000000000000000000000000000000..7fa299c3b4a8b17152fe489afab4f117ffc6f0d7 GIT binary patch literal 12997 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 ClY1Wk literal 0 HcmV?d00001 diff --git a/web/src/app/(main)/legal/credits/page.tsx b/web/src/app/(main)/legal/credits/page.tsx index b69168a4..0daf06cb 100644 --- a/web/src/app/(main)/legal/credits/page.tsx +++ b/web/src/app/(main)/legal/credits/page.tsx @@ -49,6 +49,23 @@ export default function Credits() { be. + + + PlayBingo makes use of parts of the following works made + available under the Creative Commons license. + + + Sound Effects + + + + UI Sound Effects by lolurio (CC BY 4.0) + + + ); } diff --git a/web/src/components/board/Cell.tsx b/web/src/components/board/Cell.tsx index c6a2ebd8..e82cc87d 100644 --- a/web/src/components/board/Cell.tsx +++ b/web/src/components/board/Cell.tsx @@ -57,6 +57,7 @@ radial-gradient(circle at 40% 30%, rgba(147, 137, 137, 0.13) 0%, rgba(0,0,0,0) 9 pointerEvents: 'none', }, }; + interface BoardCellProps { goal?: Goal; completedPlayers: string[]; diff --git a/web/src/context/RoomContext.tsx b/web/src/context/RoomContext.tsx index c2d707f3..f5fe0d65 100644 --- a/web/src/context/RoomContext.tsx +++ b/web/src/context/RoomContext.tsx @@ -42,6 +42,8 @@ export enum ConnectionStatus { CLOSED, // connection was manually closed, and the user is completely disconnected } +const notificationSound = new Audio('/goal_ping.ogg'); + interface CardRegenerateOptions { seed?: number; generationMode?: string; @@ -264,7 +266,28 @@ export function RoomContextProvider({ !payload.cell ) return; - onCellUpdate(payload.row, payload.col, payload.cell); + if (!board.hidden) { + const newMarks = + payload.cell.completedPlayers.filter( + (player) => + !board.board[payload.row][ + payload.col + ].completedPlayers.includes(player), + ); + if ( + newMarks.length > 0 && + (newMarks.length > 1 || + newMarks[0] !== connectedPlayer?.id) + ) { + notificationSound.play(); + } + + onCellUpdate( + payload.row, + payload.col, + payload.cell, + ); + } break; case 'syncBoard': if (!payload.board) return; From 990fcefda13fdb71eb56d53c3626c2fbbe373bc1 Mon Sep 17 00:00:00 2001 From: cjs8487 Date: Tue, 11 Aug 2026 00:09:02 -0500 Subject: [PATCH 3/4] adjust credits page --- web/src/app/(main)/legal/credits/page.tsx | 28 ++++++++++++----------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/web/src/app/(main)/legal/credits/page.tsx b/web/src/app/(main)/legal/credits/page.tsx index 0daf06cb..fa020da0 100644 --- a/web/src/app/(main)/legal/credits/page.tsx +++ b/web/src/app/(main)/legal/credits/page.tsx @@ -31,22 +31,24 @@ export default function Credits() { PlayBingo would not be possible without the contributions our community. - {contributors.map((contributor) => ( - - {contributor.name} - - - - + + {contributors.map((contributor) => ( + + {contributor.name} + + + + + - - ))} + ))} + - A special shoutout to all the community members who have - helped make PlayBingo better by providing feedback, finding - bugs, and working with us to make PlayBingo the best it can - be. + An additional, special rhanks to all the community members + who have helped make PlayBingo better by providing feedback, + finding bugs, and working with us to make PlayBingo the best + it can be. From f91a2f2d78c78ce780434c641c6c45c4f79e2459 Mon Sep 17 00:00:00 2001 From: cjs8487 Date: Tue, 11 Aug 2026 00:10:01 -0500 Subject: [PATCH 4/4] add credits link to footer --- web/src/components/footer/Footer.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/web/src/components/footer/Footer.tsx b/web/src/components/footer/Footer.tsx index c64d80c3..b9ec2a2e 100644 --- a/web/src/components/footer/Footer.tsx +++ b/web/src/components/footer/Footer.tsx @@ -85,6 +85,10 @@ function LargeFooter() { | All Rights Reserved |{' '} Privacy Policy + {' '} + |{' '} + + Credits