fix: stat timestamps, resetting achievements

This commit is contained in:
David Ralph
2026-01-24 15:43:58 +00:00
parent 8beda77a76
commit c49bc39770
3 changed files with 27 additions and 12 deletions

View File

@@ -1,31 +1,41 @@
import { achievements } from './index'; import { achievements } from './index';
export function checkAchievements(stats) { 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) { switch (achievement.condition.type) {
case 'tabsOpened': case 'tabsOpened':
if (stats['tabs-opened'] >= achievement.condition.amount) { if (stats['tabs-opened'] >= achievement.condition.amount) {
achievement.achieved = true; achieved = true;
} }
break; break;
case 'addonInstall': case 'addonInstall':
if (stats.marketplace) { if (stats.marketplace) {
if (stats.marketplace['install'] >= achievement.condition.amount) { if (stats.marketplace['install'] >= achievement.condition.amount) {
achievement.achieved = true; achieved = true;
} }
} }
break; break;
default: default:
break; break;
} }
});
return achievements; return {
...achievement,
achieved,
timestamp: achievementTimestamps[achievement.id],
};
});
} }
export function newAchievements(stats) { export function newAchievements(stats) {
// calculate new achievements // calculate new achievements
const oldAchievements = JSON.parse(localStorage.getItem('achievements')) || []; const oldAchievements = JSON.parse(localStorage.getItem('achievements')) || [];
const achievementTimestamps = JSON.parse(localStorage.getItem('achievementTimestamps')) || {};
const checkedAchievements = checkAchievements(stats); const checkedAchievements = checkAchievements(stats);
const newAchievements = []; const newAchievements = [];
@@ -36,15 +46,18 @@ export function newAchievements(stats) {
}); });
// add timestamp to new achievements // add timestamp to new achievements
const now = Date.now();
newAchievements.forEach((achievement) => { 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( localStorage.setItem(
'achievements', 'achievements',
JSON.stringify([...oldAchievements, ...newAchievements.map((achievement) => achievement.id)]), JSON.stringify([...oldAchievements, ...newAchievements.map((achievement) => achievement.id)]),
); );
localStorage.setItem('achievementTimestamps', JSON.stringify(achievementTimestamps));
return newAchievements; return newAchievements;
} }

View File

@@ -30,8 +30,7 @@ const Stats = () => {
const [clearmodal, setClearmodal] = useState(false); const [clearmodal, setClearmodal] = useState(false);
const updateAchievements = useCallback(() => { const updateAchievements = useCallback(() => {
const achieved = checkAchievements(stats); setAchievements(checkAchievements(stats));
setAchievements(achieved);
}, [stats]); }, [stats]);
useEffect(() => { useEffect(() => {
@@ -45,11 +44,14 @@ const Stats = () => {
const resetStats = () => { const resetStats = () => {
const emptyStats = {}; const emptyStats = {};
localStorage.setItem('statsData', JSON.stringify(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); 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); setClearmodal(false);
toast(variables.getMessage('toasts.stats_reset')); toast(variables.getMessage('toasts.stats_reset'));
updateAchievements(); // Call updateAchievements to refresh achievements after reset
}; };
const downloadStats = () => { const downloadStats = () => {

View File

@@ -3,7 +3,7 @@
"id": "tentabs", "id": "tentabs",
"condition": { "condition": {
"type": "tabsOpened", "type": "tabsOpened",
"amount": 3 "amount": 10
} }
}, },
{ {