fix(course): treat null isUnlocked as unlocked in progression logic

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.
This commit is contained in:
Rotimi Best
2026-06-30 09:25:40 +01:00
parent a61942feb9
commit c72558f8f1
2 changed files with 2 additions and 2 deletions
@@ -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;
@@ -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;