SIGN IN SIGN UP

refactor: convert progress tab from Redux to React Query (#2001)

Make ProgressTab self-wrapping — it owns useCourseHomeMeta + a new
useProgressTabData query and renders TabWithTimer itself, mirroring the
dates- and outline-tab conversions. The body moves into a ProgressTabContent
component so the reads never run against empty data during the loading phase.

Every progress-subtree reader — the grade/certificate components, the
ProgressTabGradeBreakdownSlot, ProgressHeader, and ProgressTabContent — stops
calling useModel('progress') and reads the tab data from useProgressTabData via
a new useProgressData() hook. Their courseId reads move from useContextId() to
useParams, since the progress route no longer runs a fetch thunk to populate
state.courseHome.courseId.

useProgressTabData keeps a scoped meta: { modelType: 'progress' } so the
model-store bridge still feeds the one shared, tab-generic reader that resolves
to 'progress' — useAccessExpirationMasqueradeBanner, rendered via
InstructorToolbar; that reader migrates with the model-store dissolution (#1977,
tracked in #1999). The fetchProgressTab thunk and the now-dead isProgressTab
branch of TabContainer are deleted. The examsData exam-attempts write stays in
Redux, a separate surface to retire later.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
B
Brian Smith committed
e0851986182596b58341c8b501654963c8262ddc
Parent: 591d116
Committed by GitHub <noreply@github.com> on 8/21/2026, 7:14:56 PM