diff --git a/apps/web/src/assets/sounds/README.md b/apps/web/src/assets/sounds/README.md new file mode 100644 index 0000000..771c890 --- /dev/null +++ b/apps/web/src/assets/sounds/README.md @@ -0,0 +1,10 @@ +# Sons du jeu + +Dépose ici les effets sonores (détectés automatiquement au build). + +- **`victory.mp3`** → jingle joué sur l'écran de fin de partie. + (formats acceptés : `.mp3`, `.ogg`, `.wav` — nomme le fichier `victory.*`) + +Si aucun fichier n'est présent, le son est simplement ignoré (pas d'erreur). + +> ⚠️ N'utilise que des sons dont tu as les droits (libres / CC0). diff --git a/apps/web/src/assets/sounds/victory.mp3 b/apps/web/src/assets/sounds/victory.mp3 new file mode 100644 index 0000000..a96779f Binary files /dev/null and b/apps/web/src/assets/sounds/victory.mp3 differ diff --git a/apps/web/src/components/game-end-view.tsx b/apps/web/src/components/game-end-view.tsx index 5c52039..67a67be 100644 --- a/apps/web/src/components/game-end-view.tsx +++ b/apps/web/src/components/game-end-view.tsx @@ -8,6 +8,7 @@ import { Button } from "@workspace/ui/components/button" import { useRoomStore } from "@/store/room" import { Avatar } from "@/components/avatar" import { celebrate } from "@/lib/confetti" +import { playVictory } from "@/lib/sound" /** Lien de recherche Spotify (le titre vidéo contient en général artiste + chanson). */ function spotifySearch(track: BlindtestTrackInfo): string { @@ -132,6 +133,7 @@ export function GameEndView({ snapshot }: { snapshot: RoomSnapshot }) { if (!celebrated.current) { celebrated.current = true celebrate() + playVictory() } }, []) diff --git a/apps/web/src/lib/sound.ts b/apps/web/src/lib/sound.ts new file mode 100644 index 0000000..f0b4763 --- /dev/null +++ b/apps/web/src/lib/sound.ts @@ -0,0 +1,24 @@ +// Sons du jeu. Dépose les fichiers dans src/assets/sounds/ (voir le README). +// Tout est optionnel : si le fichier est absent, la lecture est ignorée. + +const victorySources = Object.values( + import.meta.glob("../assets/sounds/victory.{mp3,ogg,wav}", { + eager: true, + import: "default", + }) +) as string[] + +const victoryUrl: string | null = victorySources[0] ?? null +let victoryAudio: HTMLAudioElement | null = null + +/** Joue le jingle de victoire (si présent). Nécessite une interaction préalable. */ +export function playVictory(volume = 0.6): void { + if (!victoryUrl) { + return + } + victoryAudio ??= new Audio(victoryUrl) + victoryAudio.volume = volume + victoryAudio.currentTime = 0 + // L'autoplay peut être bloqué tant qu'aucun geste utilisateur n'a eu lieu. + void victoryAudio.play().catch(() => {}) +}