refactor: remove checkRateLimit and incrementApiCall completely

This commit is contained in:
2026-03-29 23:38:54 +02:00
parent 2365a95f98
commit 5f47feaf32
12 changed files with 75 additions and 163 deletions
+18 -8
View File
@@ -8,6 +8,7 @@ import { getForestElements, getProgress, openDB, saveProgress } from "./storage/
import type { ScreenName } from "./types";
import { initParentScreen, showParentCodePrompt } from "./ui/parent";
import { initLessonScreen, initWelcomeScreen } from "./ui/screens";
import { levels } from "./game/levels";
let db: IDBDatabase;
let lessonCleanup: (() => void) | null = null;
@@ -26,8 +27,6 @@ export function getDB(): IDBDatabase {
return db;
}
const MAX_LEVEL = 6;
/**
* Ensure progress object has all fields (migration for older saved data).
*/
@@ -39,6 +38,16 @@ function migrateProgress(
if (progress.totalCorrect === undefined) progress.totalCorrect = 0;
if (progress.totalErrors === undefined) progress.totalErrors = 0;
if (progress.currentForestPage === undefined) progress.currentForestPage = 0;
// Migration: advance currentLevel if it was previously capped at a completed level.
// This fixes saved data from before levels 7-16 existed, where MAX_LEVEL was 6.
const maxLevel = levels[levels.length - 1]?.level ?? 16;
if (
progress.completedLevels.includes(progress.currentLevel) &&
progress.currentLevel < maxLevel
) {
progress.currentLevel = progress.currentLevel + 1;
}
}
async function handleLessonComplete(
@@ -74,10 +83,11 @@ async function handleLessonComplete(
}
// Advance to next level if this was the current level (LEVL-02, LEVL-03)
// Cap at MAX_LEVEL so we don't go beyond defined levels
// Cap at the total number of defined levels so we don't go beyond
const maxLevel = levels[levels.length - 1]?.level ?? 16;
if (
completedLevel === progress.currentLevel &&
completedLevel < MAX_LEVEL
completedLevel < maxLevel
) {
progress.currentLevel = completedLevel + 1;
}
@@ -114,9 +124,7 @@ async function handleLessonComplete(
progress.selectedCharacter,
() => {
// "Weiter üben" -- start next lesson
startLessonFromForest(
Math.min(progress.currentLevel, MAX_LEVEL),
);
startLessonFromForest(progress.currentLevel);
},
async () => {
// "Zurück zum Wald" -- navigate to page containing the new element
@@ -214,6 +222,8 @@ export async function initApp(): Promise<void> {
const progress = await getProgress(db);
if (progress && progress.selectedCharacter) {
migrateProgress(progress);
// Persist any migrations (e.g. currentLevel advancement) before rendering
await saveProgress(db, progress);
// Returning user -- init forest and go there
await initForestScreen(db, startLessonFromForest);
@@ -235,7 +245,7 @@ export async function initApp(): Promise<void> {
greetingEl.style.display = "flex";
// Fetch greeting async (shows immediately with avatar, text fills in)
getGreeting(progress.selectedCharacter, db).then((text) => {
getGreeting(progress.selectedCharacter).then((text) => {
textEl.innerHTML = renderInlineMarkdown(text);
speakText(text);
});