Notifications, div fixes, kekse für last location
This commit is contained in:
@@ -132,12 +132,13 @@ async function checkLinkStatusAndLoadTimes() {
|
||||
|
||||
try {
|
||||
// Check if user has a linked player
|
||||
const response = await fetch(`/api/v1/public/user-player/${currentUser.id}`);
|
||||
const response = await fetch(`/api/v1/public/user-player/${currentUser.id}?t=${Date.now()}`);
|
||||
|
||||
if (response.ok) {
|
||||
const result = await response.json();
|
||||
// User is linked, load times
|
||||
await loadUserTimesSection(result.data);
|
||||
|
||||
} else {
|
||||
// User is not linked
|
||||
showTimesNotLinked();
|
||||
@@ -362,7 +363,7 @@ async function loadUserTimesSection(playerData) {
|
||||
showTimesLoading();
|
||||
|
||||
try {
|
||||
const response = await fetch(`/api/v1/public/user-times/${currentUser.id}`);
|
||||
const response = await fetch(`/api/v1/public/user-times/${currentUser.id}?t=${Date.now()}`);
|
||||
const result = await response.json();
|
||||
|
||||
if (!response.ok) {
|
||||
@@ -608,14 +609,15 @@ async function loadPlayerAchievements() {
|
||||
document.getElementById('achievementCategories').style.display = 'none';
|
||||
document.getElementById('achievementsNotAvailable').style.display = 'none';
|
||||
|
||||
// Load player achievements
|
||||
const response = await fetch(`/api/achievements/player/${currentPlayerId}`);
|
||||
// Load player achievements (includes all achievements with player status)
|
||||
const response = await fetch(`/api/achievements/player/${currentPlayerId}?t=${Date.now()}`);
|
||||
if (!response.ok) {
|
||||
throw new Error('Failed to load achievements');
|
||||
throw new Error('Failed to load player achievements');
|
||||
}
|
||||
|
||||
const result = await response.json();
|
||||
playerAchievements = result.data;
|
||||
window.allAchievements = result.data;
|
||||
playerAchievements = result.data.filter(achievement => achievement.is_completed);
|
||||
|
||||
// Load achievement statistics
|
||||
await loadAchievementStats();
|
||||
@@ -639,7 +641,7 @@ async function loadPlayerAchievements() {
|
||||
// Load achievement statistics
|
||||
async function loadAchievementStats() {
|
||||
try {
|
||||
const response = await fetch(`/api/achievements/player/${currentPlayerId}/stats`);
|
||||
const response = await fetch(`/api/achievements/player/${currentPlayerId}/stats?t=${Date.now()}`);
|
||||
if (response.ok) {
|
||||
const result = await response.json();
|
||||
window.achievementStats = result.data;
|
||||
@@ -665,7 +667,7 @@ function displayAchievementStats() {
|
||||
function displayAchievements() {
|
||||
const achievementsGrid = document.getElementById('achievementsGrid');
|
||||
|
||||
if (playerAchievements.length === 0) {
|
||||
if (!window.allAchievements || window.allAchievements.length === 0) {
|
||||
achievementsGrid.innerHTML = `
|
||||
<div class="no-achievements">
|
||||
<div class="no-achievements-icon">🏆</div>
|
||||
@@ -677,9 +679,9 @@ function displayAchievements() {
|
||||
}
|
||||
|
||||
// Filter achievements by category
|
||||
let filteredAchievements = playerAchievements;
|
||||
let filteredAchievements = window.allAchievements;
|
||||
if (currentAchievementCategory !== 'all') {
|
||||
filteredAchievements = playerAchievements.filter(achievement =>
|
||||
filteredAchievements = window.allAchievements.filter(achievement =>
|
||||
achievement.category === currentAchievementCategory
|
||||
);
|
||||
}
|
||||
@@ -690,6 +692,11 @@ function displayAchievements() {
|
||||
const progress = achievement.progress || 0;
|
||||
const earnedAt = achievement.earned_at;
|
||||
|
||||
// Debug logging
|
||||
if (achievement.name === 'Tageskönig') {
|
||||
console.log('Tageskönig Debug:', { isCompleted, progress, earnedAt });
|
||||
}
|
||||
|
||||
let progressText = '';
|
||||
if (isCompleted) {
|
||||
progressText = earnedAt ?
|
||||
@@ -780,7 +787,7 @@ async function checkPlayerAchievements() {
|
||||
if (!currentPlayerId) return;
|
||||
|
||||
try {
|
||||
const response = await fetch(`/api/achievements/check/${currentPlayerId}`, {
|
||||
const response = await fetch(`/api/achievements/check/${currentPlayerId}?t=${Date.now()}`, {
|
||||
method: 'POST'
|
||||
});
|
||||
|
||||
@@ -831,6 +838,109 @@ function initializeAchievements(playerId) {
|
||||
loadPlayerAchievements();
|
||||
}
|
||||
|
||||
// Web Notification Functions
|
||||
function showWebNotification(title, message, icon = '🏆') {
|
||||
if ('Notification' in window && Notification.permission === 'granted') {
|
||||
const notification = new Notification(title, {
|
||||
body: message,
|
||||
icon: '/pictures/favicon.ico',
|
||||
badge: '/pictures/favicon.ico',
|
||||
tag: 'ninjacross-achievement',
|
||||
requireInteraction: true
|
||||
});
|
||||
|
||||
// Auto-close after 10 seconds
|
||||
setTimeout(() => {
|
||||
notification.close();
|
||||
}, 10000);
|
||||
|
||||
// Handle click
|
||||
notification.onclick = function() {
|
||||
window.focus();
|
||||
notification.close();
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// Check for best time achievements and show notifications
|
||||
async function checkBestTimeNotifications() {
|
||||
try {
|
||||
const response = await fetch('/api/v1/public/best-times');
|
||||
const result = await response.json();
|
||||
|
||||
if (result.success && result.data) {
|
||||
const { daily, weekly, monthly } = result.data;
|
||||
|
||||
// Check if current player has best times
|
||||
if (currentPlayerId) {
|
||||
if (daily && daily.player_id === currentPlayerId) {
|
||||
showWebNotification(
|
||||
'🏆 Tageskönig!',
|
||||
`Glückwunsch! Du hast die beste Zeit des Tages mit ${daily.best_time} erreicht!`,
|
||||
'👑'
|
||||
);
|
||||
}
|
||||
|
||||
if (weekly && weekly.player_id === currentPlayerId) {
|
||||
showWebNotification(
|
||||
'🏆 Wochenchampion!',
|
||||
`Fantastisch! Du bist der Wochenchampion mit ${weekly.best_time}!`,
|
||||
'🏆'
|
||||
);
|
||||
}
|
||||
|
||||
if (monthly && monthly.player_id === currentPlayerId) {
|
||||
showWebNotification(
|
||||
'🏆 Monatsmeister!',
|
||||
`Unglaublich! Du bist der Monatsmeister mit ${monthly.best_time}!`,
|
||||
'🥇'
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error checking best time notifications:', error);
|
||||
}
|
||||
}
|
||||
|
||||
// Check for new achievements and show notifications
|
||||
async function checkAchievementNotifications() {
|
||||
try {
|
||||
if (!currentPlayerId) return;
|
||||
|
||||
const response = await fetch(`/api/achievements/player/${currentPlayerId}?t=${Date.now()}`);
|
||||
const result = await response.json();
|
||||
|
||||
if (result.success && result.data) {
|
||||
const newAchievements = result.data.filter(achievement => {
|
||||
// Check if achievement was earned in the last 5 minutes
|
||||
const earnedAt = new Date(achievement.earned_at);
|
||||
const fiveMinutesAgo = new Date(Date.now() - 5 * 60 * 1000);
|
||||
return earnedAt > fiveMinutesAgo;
|
||||
});
|
||||
|
||||
if (newAchievements.length > 0) {
|
||||
newAchievements.forEach(achievement => {
|
||||
showWebNotification(
|
||||
`🏆 ${achievement.name}`,
|
||||
achievement.description,
|
||||
achievement.icon || '🏆'
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error checking achievement notifications:', error);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Periodic check for notifications (every 30 seconds)
|
||||
setInterval(() => {
|
||||
checkBestTimeNotifications();
|
||||
checkAchievementNotifications();
|
||||
}, 30000);
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
// Add cookie settings button functionality
|
||||
const cookieSettingsBtn = document.getElementById('cookie-settings-footer');
|
||||
|
||||
Reference in New Issue
Block a user