diff --git a/src/app.js b/src/app.js index 8c578be..7948fc8 100644 --- a/src/app.js +++ b/src/app.js @@ -9,7 +9,10 @@ const state = { currentLessonIndex: 0, modules: [], userProgress: {}, // Format: { moduleId: { completed: [0, 2, 3], current: 4 } } - userCodeBeforeValidation: "" // Track user code state before validation + userCodeBeforeValidation: "", // Track user code state before validation + userSettings: { + disableFeedbackErrors: false + } }; // DOM elements @@ -36,7 +39,8 @@ const elements = { lessonContainer: document.querySelector(".lesson-container"), editorContent: document.querySelector(".editor-content"), codeEditor: document.querySelector(".code-editor"), - validationIndicators: document.querySelector(".validation-indicators-container") + validationIndicators: document.querySelector(".validation-indicators-container"), + disableFeedbackToggle: document.getElementById("disable-feedback-toggle") }; // Initialize the lesson engine @@ -55,6 +59,32 @@ function saveUserProgress() { localStorage.setItem("codeCrispies.Progress", JSON.stringify(state.userProgress)); } +function loadUserSettings() { + const savedSettings = localStorage.getItem("codeCrispies.settings"); + if (savedSettings) { + try { + const settings = JSON.parse(savedSettings); + state.userSettings = { ...state.userSettings, ...settings }; + + // Apply saved settings to UI + elements.disableFeedbackToggle.checked = !state.userSettings.disableFeedbackErrors; + } catch (e) { + console.error("Error loading user settings:", e); + } + } +} + +function saveUserSettings() { + localStorage.setItem("codeCrispies.settings", JSON.stringify(state.userSettings)); +} + +function initFeedbackToggle() { + elements.disableFeedbackToggle.addEventListener("change", (e) => { + state.userSettings.disableFeedbackErrors = !e.target.checked; + saveUserSettings(); + }); +} + // Initialize the module list async function initializeModules() { try { @@ -102,9 +132,9 @@ function updateModuleSelectorButtonProgress() { position: absolute; bottom: 0; left: 0; - height: 3px; + height: 2px; width: ${percentComplete}%; - background-color: var(--success-color); + background-color: var(--primary-color); border-radius: 0 3px 3px 0; `; @@ -545,7 +575,9 @@ function handleTabKey(e) { // Initialize the application function init() { loadUserProgress(); - initializeModules(); + loadUserSettings(); + initializeModules().catch(console.error); + initFeedbackToggle(); // Event listeners elements.prevBtn.addEventListener("click", prevLesson); @@ -562,6 +594,12 @@ function init() { elements.codeInput.focus(); }); + // Load user settings + elements.disableFeedbackToggle.addEventListener("change", (e) => { + state.userSettings.disableFeedbackErrors = !e.target.checked; + saveUserSettings(); + }); + // Add tab key handler for the code input elements.codeInput.addEventListener("keydown", handleTabKey); diff --git a/src/helpers/renderer.js b/src/helpers/renderer.js index e76d552..707a370 100644 --- a/src/helpers/renderer.js +++ b/src/helpers/renderer.js @@ -94,6 +94,15 @@ export function showFeedback(isSuccess, message) { // Clear any existing feedback clearFeedback(); + // Check if error feedback is disabled in user settings + if (!isSuccess) { + const disableFeedbackErrors = !document.getElementById("disable-feedback-toggle").checked; + if (disableFeedbackErrors) { + // Skip showing error feedback if disabled + return; + } + } + // Create feedback element feedbackElement = document.createElement("div"); feedbackElement.classList.add(isSuccess ? "feedback-success" : "feedback-error"); diff --git a/src/index.html b/src/index.html index d5379ca..f089ec5 100644 --- a/src/index.html +++ b/src/index.html @@ -16,6 +16,13 @@