Learning Journey (Student)
The Learning Journey is the student app's video curriculum. It mirrors the school syllabus but adds sequencing (you must finish video 1 before video 2 unlocks), progress tracking (per-video watch %, per-chapter % complete) and an end-of-chapter chapter test that unlocks once every video in the chapter is finished.
The companion read-only surface is the Syllabus page, which exposes the same subject → chapter → module hierarchy as text content (no locking, no progress).
At a glance
| Who can do this | Students only — view and progress |
| Where it lives | Student app /dashboard/learning-journey/* |
| Triggers notifications? | No — progress is silent. Chapter-test completion can trigger downstream notifications via Class Tests. |
| Related features | Chapter Tests · Syllabus · Coins & Credits |
Status lifecycle (per video module)
Step-by-step
1. Subjects hub
- App / route:
/dashboard/learning-journey - Loads the student's subjects (via
useSubjects— driven by the section's mapped subjects). - Renders one SubjectCard per subject with the subject's icon, brand color, name, and an overall % progress ring.
- Tapping a card →
/dashboard/learning-journey/:subjectsForSchoolClassId.
2. Subject detail (chapter list)
- App / route:
/dashboard/learning-journey/:subjectsForSchoolClassId - Lists every chapter mapped to that subject, in syllabus sequence.
- Locking rule:
- Chapter 1 is always unlocked.
- Chapter N+1 is locked until Chapter N has any progress (the locking is at the chapter list, but stricter sequential locking happens at the module level).
- Each chapter card shows progress %.
- Tapping a chapter →
/dashboard/learning-journey/:subjectsForSchoolClassId/:chapterId, with the chapter's junction id (chaptersForSchoolClassSubjectId) passed in route state.
3. Chapter detail (video module list)
- App / route:
/dashboard/learning-journey/:subjectsForSchoolClassId/:chapterId - Loads modules for the chapter (via
getModuleProgressByChapter). Each module has:- Title
- Duration (always shown as "1 hr" for Learning Journey; "Reading" in Syllabus mode)
- Per-student progress:
percentage,watchedDuration,isCompleted
- Sequential locking is enforced here:
- Module index 0 is unlocked.
- Module N (N > 0) is locked until module N-1
isCompleted. - Locked modules show a "Complete video N first" hint.
- Below the module list, a ChapterTestCard is rendered. See Chapter Tests for its full state machine.
- Tapping a module →
/dashboard/learning-journey/:subjectsForSchoolClassId/:chapterId/:videoId(prefixedvideo-, e.g.video-42).
4. Video player
- App / route:
/dashboard/learning-journey/:subjectsForSchoolClassId/:chapterId/:videoId - Embeds the Wistia player.
- Progress is reported back periodically:
percentage— current watch %.watchedDuration— seconds watched.- Max-progress wins: scrubbing back doesn't decrease saved progress; only forward progress counts.
- A "Mark complete" button appears once the student is near the end (or always, depending on UX rules).
- Marking complete:
- Persists
isCompleted: truefor the module. - Unlocks the next module on the chapter detail page.
- If this was the last module of the chapter, unlocks the Chapter Test (the ChapterTestCard re-evaluates eligibility on focus).
- Persists
5. Returning to the chapter
- Going back from the player auto-refreshes the chapter detail page (driven by
location.key), so the student sees fresh progress and the next module unlocks immediately.
6. Subject-level progress
- The subject card's overall progress is the rolled-up % across all chapters of that subject. So as videos complete, both the chapter % and the subject ring fill up.
7. Dashboard surfacing
- The student dashboard's "Explore" section can deep-link directly to a Learning Journey chapter (driven by recommendations, doubts, or upcoming tests).
Syllabus vs Learning Journey
The two share routes by structure but differ in behaviour:
Learning Journey (/dashboard/learning-journey/*) | Syllabus (/dashboard/syllabus/*) | |
|---|---|---|
| Content type | Videos (Wistia player) | Reading modules (text content via ModuleContentPage) |
| Locking | Sequential per module | None — anything can be opened |
| Progress | Tracked per video, saved live | Not tracked the same way |
| End-of-chapter test | Yes — ChapterTestCard | Same card surfaces, but flow is video-led |
| Module URL prefix | video-{id} | module-{id} |
The same ChapterDetailPage and SubjectDetailPage components serve both routes; the path determines whether locking + the video player or the reading flow is used.
Edge cases & things to test
- Sequential lock cheat: try to navigate directly to
/dashboard/learning-journey/:subjectId/:chapterId/video-42for a video that should be locked — page should reject or surface a "complete previous video first" state, not silently play. - Mark-complete immediately: student loads the player and immediately taps "Mark complete" before watching — should it block (require some watch %) or trust the tap?
- Scrubbing forward: student scrubs to 95 % and exits — saved progress should be 95 %, not 100 % until they actually mark complete.
- Scrubbing back: student watches 80 % then scrubs back to 10 % — saved progress must remain at 80 % (max-progress wins).
- Re-opening a completed video: completed videos remain accessible; reopening should not reset progress.
- Chapter unlock cascade: completing the last video of Chapter 1 should unlock Chapter 2 in the chapter list; verify with a refresh-less return navigation.
- Chapter test gating: completing all videos must trigger the ChapterTestCard to flip from "Locked" to "Eligible" without a manual refresh.
- Subject change mid-flow: student opens Math chapter 3, backs out, switches to Science — the previously visited chapter's progress must persist correctly.
- Network drop during progress save: video plays offline (cached) and progress saves fail — does the next save replay the missed progress, or is it lost?
- Empty subject: a subject with zero chapters mapped — list should render an empty state, not crash.
- Empty chapter: a chapter with zero modules — what does the chapter detail page show? Does the ChapterTestCard react sensibly?
- Wistia outage: video fails to load — UI should show a clear error, not a broken iframe.
- Switching device mid-video: progress saved on phone — opening the same video on another device should resume from saved % (server is the source of truth).
Related
- Chapter Tests — completing all chapter videos is what unlocks the chapter test
- Syllabus — same hierarchy, no locking, reading content instead of videos
- Coins & Credits — completing modules / chapters can award coins
- Student Analytics — Learning Journey progress feeds the analytics dashboard