refactor: remove checkRateLimit and incrementApiCall completely
This commit is contained in:
+18
-8
@@ -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);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user