From c49bc397705dca78f2c05da816aa83e2ff28e1ed Mon Sep 17 00:00:00 2001 From: David Ralph Date: Sat, 24 Jan 2026 15:43:58 +0000 Subject: [PATCH] fix: stat timestamps, resetting achievements --- .../stats/api/achievements/condition.js | 27 ++++++++++++++----- src/features/stats/options/StatsOptions.jsx | 10 ++++--- src/utils/data/achievements.json | 2 +- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/features/stats/api/achievements/condition.js b/src/features/stats/api/achievements/condition.js index 25ea4504..b957f22c 100644 --- a/src/features/stats/api/achievements/condition.js +++ b/src/features/stats/api/achievements/condition.js @@ -1,31 +1,41 @@ import { achievements } from './index'; export function checkAchievements(stats) { - achievements.forEach((achievement) => { + const oldAchievements = JSON.parse(localStorage.getItem('achievements')) || []; + const achievementTimestamps = JSON.parse(localStorage.getItem('achievementTimestamps')) || {}; + + return achievements.map((achievement) => { + let achieved = oldAchievements.includes(achievement.id); + switch (achievement.condition.type) { case 'tabsOpened': if (stats['tabs-opened'] >= achievement.condition.amount) { - achievement.achieved = true; + achieved = true; } break; case 'addonInstall': if (stats.marketplace) { if (stats.marketplace['install'] >= achievement.condition.amount) { - achievement.achieved = true; + achieved = true; } } break; default: break; } - }); - return achievements; + return { + ...achievement, + achieved, + timestamp: achievementTimestamps[achievement.id], + }; + }); } export function newAchievements(stats) { // calculate new achievements const oldAchievements = JSON.parse(localStorage.getItem('achievements')) || []; + const achievementTimestamps = JSON.parse(localStorage.getItem('achievementTimestamps')) || {}; const checkedAchievements = checkAchievements(stats); const newAchievements = []; @@ -36,15 +46,18 @@ export function newAchievements(stats) { }); // add timestamp to new achievements + const now = Date.now(); newAchievements.forEach((achievement) => { - achievement.timestamp = Date.now(); + achievement.timestamp = now; + achievementTimestamps[achievement.id] = now; }); - // save new achievements to local storage + // save new achievements and timestamps to local storage localStorage.setItem( 'achievements', JSON.stringify([...oldAchievements, ...newAchievements.map((achievement) => achievement.id)]), ); + localStorage.setItem('achievementTimestamps', JSON.stringify(achievementTimestamps)); return newAchievements; } diff --git a/src/features/stats/options/StatsOptions.jsx b/src/features/stats/options/StatsOptions.jsx index 9d6b0675..7e7b705f 100644 --- a/src/features/stats/options/StatsOptions.jsx +++ b/src/features/stats/options/StatsOptions.jsx @@ -30,8 +30,7 @@ const Stats = () => { const [clearmodal, setClearmodal] = useState(false); const updateAchievements = useCallback(() => { - const achieved = checkAchievements(stats); - setAchievements(achieved); + setAchievements(checkAchievements(stats)); }, [stats]); useEffect(() => { @@ -45,11 +44,14 @@ const Stats = () => { const resetStats = () => { const emptyStats = {}; localStorage.setItem('statsData', JSON.stringify(emptyStats)); - localStorage.setItem('achievements', JSON.stringify(initialAchievements)); + localStorage.setItem('achievements', JSON.stringify([])); + localStorage.setItem('achievementTimestamps', JSON.stringify({})); setStats(emptyStats); + // Reset achievements to initial state (all locked, no timestamps) + const resetAchievements = initialAchievements.map((a) => ({ ...a, achieved: false, timestamp: undefined })); + setAchievements(resetAchievements); setClearmodal(false); toast(variables.getMessage('toasts.stats_reset')); - updateAchievements(); // Call updateAchievements to refresh achievements after reset }; const downloadStats = () => { diff --git a/src/utils/data/achievements.json b/src/utils/data/achievements.json index 47f04c5d..242b76b4 100644 --- a/src/utils/data/achievements.json +++ b/src/utils/data/achievements.json @@ -3,7 +3,7 @@ "id": "tentabs", "condition": { "type": "tabsOpened", - "amount": 3 + "amount": 10 } }, {