diff --git a/components/Game.tsx b/components/Game.tsx index 0ab0231..c916476 100644 --- a/components/Game.tsx +++ b/components/Game.tsx @@ -7,6 +7,13 @@ import Statistics from './Statistics'; import { useGameState } from '../lib/gameState'; import { sendGotifyNotification, submitRating } from '../app/actions'; +// Plausible Analytics +declare global { + interface Window { + plausible?: (eventName: string, options?: { props?: Record }) => void; + } +} + interface GameProps { dailyPuzzle: { id: number; @@ -103,6 +110,17 @@ export default function Game({ dailyPuzzle, genre = null, isSpecial = false, max if (song.id === dailyPuzzle.songId) { addGuess(song.title, true); setHasWon(true); + // Track puzzle solved event + if (typeof window !== 'undefined' && window.plausible) { + window.plausible('puzzle_solved', { + props: { + genre: genre || 'Global', + attempts: gameState.guesses.length + 1, + score: gameState.score + 20, // Include the win bonus + outcome: 'won' + } + }); + } // Notification sent after year guess or skip if (!dailyPuzzle.releaseYear) { sendGotifyNotification(gameState.guesses.length + 1, 'won', dailyPuzzle.id, genre, gameState.score); @@ -112,6 +130,17 @@ export default function Game({ dailyPuzzle, genre = null, isSpecial = false, max if (gameState.guesses.length + 1 >= maxAttempts) { setHasLost(true); setHasWon(false); + // Track puzzle lost event + if (typeof window !== 'undefined' && window.plausible) { + window.plausible('puzzle_solved', { + props: { + genre: genre || 'Global', + attempts: maxAttempts, + score: 0, + outcome: 'lost' + } + }); + } sendGotifyNotification(maxAttempts, 'lost', dailyPuzzle.id, genre, 0); // Score is 0 on failure } } @@ -138,6 +167,17 @@ export default function Game({ dailyPuzzle, genre = null, isSpecial = false, max if (gameState.guesses.length + 1 >= maxAttempts) { setHasLost(true); setHasWon(false); + // Track puzzle lost event + if (typeof window !== 'undefined' && window.plausible) { + window.plausible('puzzle_solved', { + props: { + genre: genre || 'Global', + attempts: maxAttempts, + score: 0, + outcome: 'lost' + } + }); + } sendGotifyNotification(maxAttempts, 'lost', dailyPuzzle.id, genre, 0); // Score is 0 on failure } }; @@ -148,6 +188,17 @@ export default function Game({ dailyPuzzle, genre = null, isSpecial = false, max giveUp(); // Ensure game is marked as failed and score reset to 0 setHasLost(true); setHasWon(false); + // Track puzzle lost event + if (typeof window !== 'undefined' && window.plausible) { + window.plausible('puzzle_solved', { + props: { + genre: genre || 'Global', + attempts: gameState.guesses.length + 1, + score: 0, + outcome: 'lost' + } + }); + } sendGotifyNotification(maxAttempts, 'lost', dailyPuzzle.id, genre, 0); }; @@ -156,6 +207,19 @@ export default function Game({ dailyPuzzle, genre = null, isSpecial = false, max addYearBonus(correct); setShowYearModal(false); + // Update the puzzle_solved event with year bonus result + if (typeof window !== 'undefined' && window.plausible) { + window.plausible('puzzle_solved', { + props: { + genre: genre || 'Global', + attempts: gameState.guesses.length, + score: gameState.score + (correct ? 30 : 20), // Include win + year bonus + outcome: 'won', + year_bonus: correct ? 'correct' : 'incorrect' + } + }); + } + // Send notification now that game is fully complete sendGotifyNotification(gameState.guesses.length, 'won', dailyPuzzle.id, genre, gameState.score + (correct ? 10 : 0)); }; @@ -163,6 +227,20 @@ export default function Game({ dailyPuzzle, genre = null, isSpecial = false, max const handleYearSkip = () => { skipYearBonus(); setShowYearModal(false); + + // Update the puzzle_solved event with year bonus result + if (typeof window !== 'undefined' && window.plausible) { + window.plausible('puzzle_solved', { + props: { + genre: genre || 'Global', + attempts: gameState.guesses.length, + score: gameState.score + 20, // Include win bonus only + outcome: 'won', + year_bonus: 'skipped' + } + }); + } + // Send notification now that game is fully complete sendGotifyNotification(gameState.guesses.length, 'won', dailyPuzzle.id, genre, gameState.score); };