|
|
|
|
@@ -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<string, string | number> }) => 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 ? 10 : 0), // Include year bonus if correct
|
|
|
|
|
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, // Score already includes win bonus
|
|
|
|
|
outcome: 'won',
|
|
|
|
|
year_bonus: 'skipped'
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Send notification now that game is fully complete
|
|
|
|
|
sendGotifyNotification(gameState.guesses.length, 'won', dailyPuzzle.id, genre, gameState.score);
|
|
|
|
|
};
|
|
|
|
|
|