feat: cache lesson content for instant restore on reload

Store lesson title, description, and task in localStorage after each
lesson load. On page reload, immediately restore the cached content
to avoid showing "Loading..." placeholder text.
This commit is contained in:
2025-12-30 20:50:25 +01:00
parent 0fc5af959f
commit d601ae5286

View File

@@ -205,6 +205,31 @@ function saveUserSettings() {
localStorage.setItem("codeCrispies.settings", JSON.stringify(state.userSettings));
}
// ================= LESSON CACHE =================
function restoreLessonCache() {
try {
const cached = localStorage.getItem("codeCrispies.lessonCache");
if (cached) {
const data = JSON.parse(cached);
if (data.moduleTitle && elements.moduleName) {
elements.moduleName.textContent = data.moduleTitle;
}
if (data.lessonTitle && elements.lessonTitle) {
elements.lessonTitle.textContent = data.lessonTitle;
}
if (data.lessonDescription && elements.lessonDescription) {
elements.lessonDescription.innerHTML = data.lessonDescription;
}
if (data.taskInstruction && elements.taskInstruction) {
elements.taskInstruction.innerHTML = data.taskInstruction;
}
}
} catch (e) {
// Ignore cache errors
}
}
// ================= MODULE INITIALIZATION =================
async function initializeModules() {
@@ -406,6 +431,21 @@ function loadCurrentLesson() {
requestAnimationFrame(() => {
elements.editorSection?.classList.remove("transitioning");
});
// Cache lesson display data for instant restore on reload
try {
localStorage.setItem(
"codeCrispies.lessonCache",
JSON.stringify({
moduleTitle: engineState.module?.title,
lessonTitle: lesson.title,
lessonDescription: lesson.description,
taskInstruction: lesson.task
})
);
} catch (e) {
// Ignore storage errors
}
}
// ================= LIVE PREVIEW =================
@@ -603,6 +643,9 @@ function init() {
loadUserSettings();
// Restore cached lesson content immediately to avoid "Loading..." flash
restoreLessonCache();
// Initialize CodeMirror editor
initCodeEditor();