From c72558f8f12c97dcbb66256517300a4aa44b063c Mon Sep 17 00:00:00 2001 From: Rotimi Best Date: Tue, 30 Jun 2026 09:16:50 +0100 Subject: [PATCH] fix(course): treat null isUnlocked as unlocked in progression logic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Items with isUnlocked = null were evaluated as teacher-locked due to `?? false` defaulting to false before negation. This caused content to appear locked immediately after a student marked a lesson complete, even in free-mode courses. Changed to `?? true` in both client-side (progression-utils.ts) and server-side (core/progression.ts) so null/undefined isUnlocked defaults to unlocked — consistent with the sidebar's own `?? true` guard. --- .../src/lib/features/course/utils/progression-utils.ts | 2 +- packages/core/src/services/course/progression.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/dashboard/src/lib/features/course/utils/progression-utils.ts b/apps/dashboard/src/lib/features/course/utils/progression-utils.ts index b7331e28..7fb6e98f 100644 --- a/apps/dashboard/src/lib/features/course/utils/progression-utils.ts +++ b/apps/dashboard/src/lib/features/course/utils/progression-utils.ts @@ -43,7 +43,7 @@ function computeProgressionAccess( let priorBlockingComplete = true; for (const item of navigableItems) { - const teacherLocked = !(item.isUnlocked ?? false); + const teacherLocked = !(item.isUnlocked ?? true); const progressionLocked = progressionMode === 'sequential' && !priorBlockingComplete; let accessible = !teacherLocked && !progressionLocked; diff --git a/packages/core/src/services/course/progression.ts b/packages/core/src/services/course/progression.ts index 442fd323..8bd5d4c7 100644 --- a/packages/core/src/services/course/progression.ts +++ b/packages/core/src/services/course/progression.ts @@ -105,7 +105,7 @@ function annotateNavigableAccess(params: { for (const item of params.navigableItems) { const lessonPolicy = params.lessonPolicyById.get(item.id); const exercisePolicy = params.exercisePolicyById.get(item.id); - const teacherLocked = !(item.isUnlocked ?? false); + const teacherLocked = !(item.isUnlocked ?? true); const progressionLocked = params.progressionMode === 'sequential' && !priorBlockingComplete; let accessible = !teacherLocked && !progressionLocked;